这是一个基于 RAG (Retrieval-Augmented Generation) 算法的本地化 AI 智能客服系统。该系统完全运行于本地环境,利用 Ollama 部署大语言模型(Qwen)和嵌入模型(BGE),结合 ChromaDB 向量数据库构建私有知识库。系统严格遵循“基于知识库回答”的原则,拒绝回答与文档无关的内容(如闲聊、讲笑话等),确保回答的专业性和准确性。
graph TD
subgraph A["用户界面层 - Gradio"]
A1[Gradio Web UI]
A2[文件上传组件]
A3[聊天交互组件]
end
subgraph B["RAG 核心引擎 - LangChain"]
B1[文档加载器<br/>PDF/TXT]
B2[文本分割器<br/>RecursiveSplitter]
B3[向量数据库<br/>ChromaDB]
B4[检索器<br/>Retriever]
B5[LLM 调用<br/>Ollama/Qwen]
end
subgraph C["本地模型服务 - Ollama"]
C1[嵌入模型<br/>BGE-Large]
C2[大语言模型<br/>Qwen 3.5:4b]
end
A2 -->|上传文件| B1
B1 --> B2
B2 -->|生成 Embedding| C1
C1 --> B3
B3 --> B4
A3 -->|用户提问| B4
B4 -->|检索相关片段| B5
B5 -->|生成回答| A3
C2 --> B5
在开始之前,请确保您的环境中已正确安装以下组件。
-
安装 Ollama 及拉取模型 本项目依赖 Ollama 在本地运行模型。请确保 Ollama 服务已启动,并已拉取所需的 LLM 和 Embedding 模型。
# 安装 Ollama (macOS / Linux) curl -fsSL https://ollama.com/install.sh | sh # 拉取大语言模型 (用于生成回答) ollama pull qwen3.5:4b # 拉取嵌入模型 (用于构建知识库) ollama pull bge-large
-
安装 Python 依赖库 在项目根目录下安装所需的 Python 包:
pip install langchain langchain-chroma langchain-ollama langchain-community gradio pypdf
按照以下步骤在本地运行 RAG 智能客服系统:
-
启动应用程序 在项目根目录下运行
app.py启动 Gradio 服务:python app.py
-
访问 Web 界面 启动成功后,在浏览器中打开
http://127.0.0.1:7860。 -
构建知识库
- 点击顶部的 📁 上传文档 Tab。
- 上传您的
.pdf或.txt格式的知识库文件。 - 点击“上传并构建知识库”按钮,等待后台处理完成(终端会显示处理进度)。
-
开始问答
- 切换到 💬 开始问答 Tab。
- 在聊天框中输入您的问题,系统将仅基于刚刚上传的文档内容给出回答。
python app.py --server_port 8080 📜 许可证 本项目采用 MIT License 开源。
本项目内置了严格的提示词约束 (STRICT_PROMPT_TEMPLATE),旨在消除模型幻觉:
- 基于事实:模型被强制要求只能使用检索到的上下文信息,不能依赖预训练时的通用知识进行编造。
- 拒绝无关请求:如果用户提问与知识库无关(例如“讲个笑话”、“你叫什么名字”或“写一首诗”),系统会统一回复:
根据知识库无法回答。
代码针对消费级显卡(约 6GB 显存)进行了优化:
- 分批处理:在
process_and_store_documents函数中,文档切片会分批(batch_size=5)存入向量库,防止一次性加载过多数据导致显存溢出(OOM)。 - 自动回退:如果
OllamaEmbeddings(GPU) 初始化失败,系统会自动捕获异常并切换至 CPU 版本的HuggingFaceEmbeddings,确保程序在资源受限的环境下仍能运行。
| 函数名 | 参数 | 返回值 | 说明 |
|---|---|---|---|
process_and_store_documents |
file_path: str, batch_size: int = 50 |
str |
加载文档,切分文本,生成向量并存入 ChromaDB。支持 PDF/TXT。 |
rag_chat_stream |
question: str |
Generator[str, None, None] |
流式 RAG 问答接口,用于 Gradio 实时响应。 |
rag_chat |
question: str |
str |
非流式问答接口,返回包含检索详情的文本。 |
load_vector_store |
- |
Chroma | None |
从磁盘加载已持久化的向量数据库。 |
| 类名 | 属性/初始化参数 | 说明 |
|---|---|---|
OllamaLLM |
model="qwen3.5:4b", temperature=0.1, etc. |
封装 Ollama 大语言模型调用,配置了上下文窗口和重复惩罚。 |
Chroma |
collection_name="documents", persist_directory |
ChromaDB 向量存储实例,用于文档检索。 |