LangChain + llamaFactory + Qwen2-7b-VL 构建本地RAG问答系统

server/2025/1/24 6:30:01/

单纯仅靠LLM会产生误导性的 “幻觉”,训练数据会过时,处理特定知识时效率不高,缺乏专业领域的深度洞察,同时在推理能力上也有所欠缺。

正是在这样的背景下,检索增强生成技术(Retrieval-Augmented Generation,RAG)应时而生,成为大模型时代的一大趋势。

RAG通过在语言模型生成答案之前,先从广泛的专业文档数据库中检索相关信息,然后利用这些专业信息来引导大模型生成的结果,极大地提升了内容的准确性和相关性。

RAG整体技术路线可分为3大块8个小点见图1,其中包含知识库构建、知识检索和知识问答。

参考连接:

langchain框架轻松实现本地RAG_langchain实现rag-CSDN博客

https://www.zhihu.com/question/652674711/answer/3617998488

https://zhuanlan.zhihu.com/p/695287607

https://zhuanlan.zhihu.com/p/692327769

1,Linux 安装llamaFactory

git clone https://github.com/hiyouga/LLaMA-Factory.git
conda create -n llama_factory python=3.10
conda activate llama_factory
cd LLaMA-Factory
pip install -e '.[torch,metrics]'

2, 安装Qwen2-7b-VL模型

pip install modelscope 
modelscope download --model Qwen/Qwen2-VL-7B-Instruct --local_dir ./Qwen2-VL-7B-Instruct

 3,用llamaFactory启动Qwen2-7b-VL 【启动server端,端口8000】

# 启动黑框api
CUDA_VISIBLE_DEVICES=0 API_PORT=8000 llamafactory-cli api \--model_name_or_path /home/xxx/Qwen2-VL-7B-Instruct \--template qwen2_vl \--infer_backend huggingface \--trust_remote_code true# 后端运行,启动对话页面
nohup llamafactory-cli webchat \--model_name_or_path /home/xxx/Qwen2-VL-2B-Instruct \--template qwen2_vl \--infer_backend huggingface \--trust_remote_code true &

4, 安装Embedding库

modelscope download --model BAAI/bge-large-zh --local_dir ./bge-large-zh

5,自定义langchain Client代码【Client端,端口8000】;将搜集的文档放在目录langchain_dataset下

import os
from langchain_community.document_loaders import TextLoader
from langchain.prompts import ChatPromptTemplate
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.vectorstores import Chroma
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough
from langchain.llms.base import LLM
from openai import OpenAI
import base64
from langchain.llms.utils import enforce_stop_tokens
from langchain_huggingface import HuggingFaceEmbeddings# 定义LLM模型
class MyGame(LLM):def __init__(self):super().__init__()print("construct MyGame")def _llm_type(self) -> str:return "MyGame"def encode_image(self, image_path):with open(image_path, "rb") as image_file:return base64.b64encode(image_file.read()).decode('utf-8')def mygame_completion(self, message):client = OpenAI(api_key="0",base_url="http://localhost:{}/v1".format(os.environ.get("API_PORT", 8000)),)response = client.chat.completions.create(model="gpt-4o-mini",messages=message,stream=False,temperature=0.1)return response.choices[0].message.contentdef _call(self, prompt, stop=None, image_path=None):if image_path is None:messages = [{"role": "user", "content": prompt}]else:base64_image = self.encode_image(image_path)messages = [{"role": "user","content": [{"type": "text","text": prompt},{"type": "image_url","image_url": {"url":f"data:image/jpeg;base64,{base64_image}"},}]}]response = self.mygame_completion(messages)if stop is not None:response = enforce_stop_tokens(response, stop)return responseBGE_MODEL_PATH = "/home/xxx/bge-large-zh"
root_dir = "./langchain_dataset"def extract_docs_from_directory(directory):docs = []  # 初始化文档列表for root, dirs, files in os.walk(directory):  # 遍历目录for file in files:file_path = os.path.join(root, file)  # 获取文件的完整路径try:loader = TextLoader(file_path)    # 创建TextLoader实例docs.extend(loader.load())        # 加载文件内容并追加到文档列表except Exception as e:print(f"Error loading file {file_path}: {e}")  # 捕获并打印加载错误return docsdocs = extract_docs_from_directory(root_dir)
text_splitter = RecursiveCharacterTextSplitter(chunk_size=150, chunk_overlap=20)
documents = text_splitter.split_documents(docs)
huggingface_bge_embedding = HuggingFaceEmbeddings(model_name=BGE_MODEL_PATH)
vectorstore = Chroma.from_documents(documents, huggingface_bge_embedding, persist_directory="./vectorstore")query="80cm是多少米."
result = vectorstore.similarity_search(query, k=3)for doc in result:print(doc.page_content)print("********")retriever = vectorstore.as_retriever()template = """Answer the question based only on the following context:{context}Question: {question},请用中文输出答案。
"""
prompt = ChatPromptTemplate.from_template(template)
llm = MyGame()def format_docs(docs):return "\n\n".join([d.page_content for d in docs])chain = ({"context": retriever | format_docs, "question": RunnablePassthrough()}| prompt| llm| StrOutputParser()
)response = chain.invoke(query)
print("RAG 输出结果:",response)print("LLM 输出结果:",llm(query))

6,图文测试代码

if __name__ == "__main__":llm = MyGame()     # 上面代码有定义print(llm("这张图里的是什么。", image_path="E:\code_llm_workspace\static\images\\xxx.jpeg"))


http://www.ppmy.cn/server/160961.html

相关文章

Linux 高级路由与流量控制-用 tc qdisc 管理 Linux 网络带宽

大家读完记得觉得有帮助记得关注和点赞!!! 此分享内容比较专业,很多与硬件和通讯规则及队列,比较底层需要有技术功底人员深入解读。 Linux 的带宽管理能力 足以媲美许多高端、专用的带宽管理系统。 1 队列&#xff0…

vue2的$el.querySelector在vue3中怎么写

这个也属于直接操作 dom 了,不建议在项目中这样操作,不过我是在vue2升级vue3的时候遇到的,是以前同事写的代码,也没办法 先来看一下对比 在vue2中获取实例是直接通过 this.$refs.xxx 获取绑定属性 refxxx 的实例,并且…

流媒体服务器选择以及评估

让我为您分析几个主流的流媒体服务器方案: 1. **Nginx-RTMP** 优势: - 轻量级,资源占用少 - 配置简单,易于部署 - 支持RTMP/HLS/DASH - 高并发性能好 - 免费开源 劣势: - 功能相对基础 - 缺乏管理界面 - 监控功能有…

Java设计模式 十三 代理模式 (Proxy Pattern)

代理模式 (Proxy Pattern) 代理模式是一种结构型设计模式,它为其他对象提供一种代理(或占位符)以控制对该对象的访问。通过代理模式,我们可以在不修改目标对象的情况下,控制对其的访问,添加额外的功能&…

基于STM32的智能门锁安防系统(开源)

目录 项目演示 项目概述 硬件组成: 功能实现 1. 开锁模式 1.1 按键密码开锁 1.2 门禁卡开锁 1.3 指纹开锁 2. 功能备注 3. 硬件模块工作流程 3.1 步进电机控制 3.2 蜂鸣器提示 3.3 OLED显示 3.4 指纹与卡片管理 项目源代码分析 1. 主程序流程 (main…

iptables和ipvs差异

iptables和ipvs都是Linux内核中用于网络流量管理的工具,它们在实现方式、功能、性能以及使用场景上存在一些显著的差异。以下是对两者的详细比较: 一、实现方式 iptables: 基于Netfilter框架。使用链表(chain)和规则&…

大华相机DH-IPC-HFW3237M支持的ONVIF协议

使用libONVIF C库。 先发现相机。 配置 lib目录 包含 编译提示缺的文件&#xff0c;到libonvif里面拷贝过来。 改UDP端口 代码 使用msvc 2022的向导生成空项目&#xff0c;从项目的main示例拷贝过来。 CameraOnvif.h #pragma once#include <QObject> #include &l…

连接 OpenAI 模型:基础操作

在这一部分中&#xff0c;我们将介绍如何连接 OpenAI 模型&#xff0c;设置 API 密钥&#xff0c;并使用 Spring AI 的 ChatClient 与 OpenAI 模型进行简单的对话。Spring AI 为集成 OpenAI 模型提供了方便的工具&#xff0c;使得开发者能够更轻松地与 GPT 系列模型进行交互。 …