AI自动回复机器人 RAG 系统搭建指南
AI自动回复机器人 RAG 系统搭建指南
一句话定位:本地部署的企业文档 RAG 问答机器人,支持多知识库管理 + 自动化评估。
技术栈:Ollama + Qwen2.5 + BGE-m3 + LangChain + Chroma + Gradio
目录
1. 项目概览
解决什么问题
企业有大量的内部文档(产品介绍、员工手册、技术文档),员工/客户问问题时:
-
人工回复效率低
-
回答不一致
-
文档更新后没人知道
RAG 方案:让 AI 先查文档,再基于文档内容回答。保证回答有据可依、不编造。
核心功能
| 功能 | 说明 |
|------|------|
| 💬 智能问答 | 基于企业文档的 RAG 问答,回答附带引用来源 |
| 📂 多知识库 | 按类别管理不同知识库(公司 info / HR 政策 / 技术文档) |
| 📊 评估系统 | 自动评估检索质量和回答质量 |
| 🌐 Web 界面 | Gradio 构建,三标签页一站式管理 |
| 🤖 命令行版 | 纯终端也可用,适合自动化脚本 |
2. 架构设计
系统架构总览

三层架构:
┌─────────────────────────────────────────────────┐
│ 用户层 (Presentation) │
│ Web UI (Gradio, port 7860) + 命令行 rag_bot.py │
└──────────────────┬──────────────────────────────┘
│ 用户提问
┌──────────────────▼──────────────────────────────┐
│ RAG 处理层 (Pipeline) │
│ 1. 向量检索 2. 检索评估 3. Prompt组装 4. LLM │
└──────────────────┬──────────────────────────────┘
│ 跨类别检索
┌──────────────────▼──────────────────────────────┐
│ 数据存储层 (Storage) │
│ company_info / hr_policies / tech_docs (各独立) │
│ Chroma 向量库 + 原始文档 │
└──────────────────┬──────────────────────────────┘
│
┌──────────────────▼──────────────────────────────┐
│ 基础设施层 (Infrastructure) │
│ Ollama (LLM+Embedding) + Chroma + LangChain │
└─────────────────────────────────────────────────┘
RAG 查询处理流程(5 步)
1. 用户提问 ──→ "产品怎么收费?"
↓
2. 向量检索 ──→ bge-m3 将问题编码 → Chroma 相似度匹配
↓
3. 组装 Prompt ──→ {context: 检索到的文档} + {question} → 模板
↓
4. LLM 生成 ──→ qwen2.5:7b 基于文档生成回答(流式输出)
↓
5. 返回回答 ──→ 回答 + 引用来源
技术选型对比
| 组件 | 选择 | 替代方案 | 选择理由 |
|------|------|----------|----------|
| LLM 推理 | Ollama | llama.cpp, vLLM | 一键安装,OpenAI API 兼容 |
| 对话模型 | Qwen2.5-7B | DeepSeek-V3, Llama-3.2 | 中文能力最强,体积小 |
| 嵌入模型 | BGE-m3 | text-embedding-3-large | 中文多语言能力好 |
| RAG 框架 | LangChain | LlamaIndex | 生态成熟,文档丰富 |
| 向量库 | Chroma | FAISS, pgvector | 轻量无需配置,文件存储 |
| Web UI | Gradio | Streamlit, FastAPI+Vue | 快速原型,开箱即用 |
3. 硬件要求
| 配置 | 最低要求 | 推荐配置 | 本项目实际 |
|------|----------|----------|-----------|
| 内存 | 16 GB | 32 GB | ✅ 32 GB DDR5 |
| 显卡 | 无 (纯 CPU) | NVIDIA RTX 4060+ | Intel Arc 140T (辅助) |
| 硬盘 | 30 GB 可用 | 100 GB+ | ✅ 400 GB 可用 |
| CPU | 4 核 | 8 核+ | ✅ Ultra 7 255H (带 NPU) |
实际表现(Qwen2.5-7B, CPU 模式):
-
检索耗时:~0.37s
-
生成耗时:~7.78s(流式输出,感知快)
-
综合通过率:90%
4. 快速部署 (5 步走)
前置条件
-
Windows 10/11
-
Python 3.10+
-
Ollama 已安装
Step 1: 安装 Ollama
# Windows: 下载 https://ollama.com/download 并安装
# 或
winget install Ollama.Ollama
Step 2: 拉取模型
ollama pull qwen2.5:7b # 对话模型
ollama pull bge-m3 # 嵌入模型
Step 3: 安装 Python 依赖
pip install langchain langchain-ollama langchain-chroma \
langchain-text-splitters langchain-community \
chromadb pypdf python-docx gradio
Step 4: 准备文档
# 创建项目目录
mkdir D:\Personal\RAG-Robot
cd D:\Personal\RAG-Robot
# 创建知识库分类
mkdir docs\company_info
mkdir docs\hr_policies
mkdir docs\tech_docs
# 放入文档(支持 .pdf / .docx / .txt / .md)
copy "公司介绍.pdf" docs\company_info\
copy "员工手册.docx" docs\hr_policies\
Step 5: 启动服务
python web_ui.py
# 浏览器访问 http://127.0.0.1:7860
5. 代码架构详解
项目文件结构
D:\Personal\RAG-Robot\
├── web_ui.py # Web 界面入口 (Gradio, 三标签页)
├── rag_bot.py # 命令行版 RAG 问答
├── kb_manager.py # 多类别知识库管理器
├── evaluator.py # RAG 评估器
├── eval_data\
│ └── eval.json # 评估数据集
├── docs\
│ ├── company_info\ # 公司知识库 (3 文件)
│ ├── hr_policies\ # HR 政策 (1 文件)
│ └── tech_docs\ # 技术文档 (1 文件)
└── .rag_db\ # 向量库缓存(自动生成)
├── company_info\
├── hr_policies\
└── tech_docs\
核心模块说明
kb_manager.py — 多类别知识库管理器
# 核心能力
class KBManager:
get_categories() # 列出所有知识库类别
create_category(name) # 创建新类别
delete_category(name) # 删除类别 + 向量库
upload_file(path, cat) # 上传文件 → 自动重建索引
remove_file(name, cat) # 移除文件 → 自动重建索引
retrieve(query, cats, top_k) # 跨类别检索
get_category_info(cat) # 查看类别详情
reload_all() # 重建所有索引
目录映射规则:
docs/
company_info/ ← 类别目录(手动创建)
公司介绍.txt ← 原始文档
产品信息.txt
.rag_db/
company_info/ ← 对应向量库(自动生成)
chroma.sqlite3
evaluator.py — RAG 评估器
class RAGEvaluator:
run_evaluation(eval_dataset, categories, top_k, llm_model, llm_temp)
load_eval_dataset(path) # 加载 JSON 评估集
save_eval_dataset(data, path) # 保存评估集
build_report_text(summary, results) # 生成可读报告
评估指标:
-
检索召回率 (Retrieval Recall):期望来源是否出现在检索结果中
-
关键词召回率 (Keyword Recall):回答是否包含预期关键词
-
响应延迟 (Latency):检索耗时 + 生成耗时
-
综合通过率 (Pass Rate):两项召回率均 ≥ 50%
6. 多知识库管理
Web 界面 — 知识库管理标签页

操作流程:
1. 创建类别
输入名称 "sales_docs" → 点击 "Create Category"
2. 上传文件
选择目标类别 → 拖拽文件到上传区 → 点击 "Upload & Rebuild Index"
→ 自动构建向量索引 → 显示上传结果
3. 查看状态
点击 "Refresh KB Status" → 显示所有类别的文件列表和分块数
4. 移除文件
选择类别 → 输入文件名 → 点击 "Remove File"
→ 自动重建索引
5. 删除类别
从下拉选择 → 点击 "Delete Category" → 文档 + 向量库一起删除
跨类别检索原理
用户: "员工的工作时间和薪资结构是怎样的?"
检索分配 (Top K=4):
hr_policies → 2 个 chunk (k_per_cat = 4 // 3 ≈ 1)
company_info → 2 个 chunk
tech_docs → 2 个 chunk
合并排序 → 返回最相关的 4 个 chunk
→ 拼接上下文 → LLM 生成跨领域回答
7. RAG 评估体系
评估流程

评估数据集格式 (eval.json)
[
{
"id": "pricing_1",
"query": "产品怎么收费?",
"expected_keywords": ["500元", "1500元", "基础版", "专业版"],
"expected_sources": ["产品信息.txt"],
"categories": ["company_info"]
},
{
"id": "hr_worktime_1",
"query": "工作时间是几点到几点?",
"expected_keywords": ["9:00", "18:00", "周一至周五"],
"expected_sources": ["员工手册.txt"],
"categories": ["hr_policies"]
}
]
字段说明:
| 字段 | 必需 | 说明 |
|------|------|------|
| id | ✅ | 测试用例唯一标识 |
| query | ✅ | 用户问题 |
| expected_keywords | ✅ | 回答中应包含的关键词列表 |
| expected_sources | 可选 | 期望检索到的文档文件名 |
| categories | 可选 | 限制检索的类别,None 则检索全部 |
Web 界面 — 评估标签页

操作步骤:
-
点击 “Use Default eval.json” 或上传自定义评估文件
-
选择要评估的知识库类别(默认全部)
-
调整 Top K 和 LLM 参数
-
点击 “Run Evaluation”
-
查看汇总结果和详细报告
8. 实测评估结果
测试环境
| 项目 | 配置 |
|------|------|
| 模型 | qwen2.5:7b |
| 嵌入 | bge-m3 |
| 知识库 | 3 类别 / 5 文档 / 6 chunks |
| 测试集 | 10 个测试用例 |
| Top K | 4 |
| Temperature | 0.3 |
汇总指标
| 指标 | 值 | 说明 |
|------|-----|------|
| 综合通过率 | 90% (9/10) | 两项召回率均 ≥ 50% |
| 检索召回率 | 100% | 所有测试都检索到了期望来源 |
| 关键词召回率 | 88.3% | 平均关键词命中 |
| 平均检索耗时 | 0.37s | Chroma 向量检索 |
| 平均生成耗时 | 7.78s | Qwen2.5-7B CPU 推理 |
| 平均总耗时 | 8.15s | 端到端延迟 |
逐题详细结果
| ID | 问题 | 检索召回 | 关键词召回 | 总耗时 |
|----|------|----------|-----------|--------|
| pricing_1 | 产品怎么收费? | 100% | 50% ⚠️ | 17.2s |
| company_intro_1 | 公司成立于哪一年? | 100% | 100% ✅ | 1.8s |
| product_feature_1 | AI客服机器人有什么功能? | 100% | 100% ✅ | 5.7s |
| hr_worktime_1 | 工作时间是几点到几点? | 100% | 100% ✅ | 4.4s |
| hr_annual_leave_1 | 年假有多少天? | 100% | 100% ✅ | 7.1s |
| hr_salary_1 | 薪资是怎么组成的? | 100% | 100% ✅ | 7.0s |
| tech_architecture_1 | 系统使用什么架构? | 100% | 67% ⚠️ | 2.4s |
| tech_performance_1 | 系统的响应延迟是多少? | 100% | 67% ⚠️ | 2.1s |
| cross_domain_1 | 工作时间和薪资结构? | N/A | 100% ✅ | 16.1s |
| cross_domain_2 | 有几个主要产品和功能? | 100% | 100% ✅ | 17.8s |
分析:
-
✅ HR 政策类表现最好(5/5 全通过),因为文档结构清晰、关键词明确
-
⚠️ 定价问题关键词召回只有 50%,因为模型回答时改变了表述方式
-
⚠️ 技术文档关键词召回 67%,因为术语表述存在同义词差异
-
⚠️ 跨域问题耗时较长(16s+),因为跨类检索 + 长上下文
9. 常见问题与优化
Q1: 生成太慢怎么办?
方案 A — 换大模型 + GPU:
ollama pull qwen2.5:32b # 更聪明但更慢
ollama pull deepseek-v3 # 推理能力强
# 如果有 NVIDIA 显卡:
pip install langchain-ollama --force-reinstall
# 用 nvidia-ml-py 确认 CUDA 可用
方案 B — 纯 CPU 优化:
-
使用 Q4_K_M 量化版本减少内存占用
-
降低
top_k(从 4 改为 2)减少上下文长度 -
增大
chunk_size(从 500 改为 1000)减少检索文档数
Q2: 检索不准确怎么办?
-
优化分块:增大
CHUNK_SIZE到 1000,重叠 200 -
增加文档质量:确保文档有明确的章节结构
-
使用重排序:在检索后加一个 cross-encoder 重排序步骤
-
测试不同嵌入模型:
ollama pull nomic-embed-text
Q3: 关键词召回率低怎么办?
-
检查
eval.json中的关键词是否过于严格 -
使用同义词扩展关键词列表
-
考虑用 LLM 自动评估(基于语义相似度而非精确匹配)
Q4: 内存不足怎么办?
-
删除不用的
.rag_db/向量库释放空间 -
使用量化模型(Q4_K_M 约 4.7GB vs Q8_0 约 9.4GB)
-
一次只加载一个类别的向量库
10. 扩展方向
短期(1-2 周)
-
多轮对话:基于对话历史的上下文感知
-
文档解析增强:支持图片 OCR、表格提取
-
用户认证:不同用户访问不同知识库
中期(1 个月)
-
部署到 Katabump:Web 服务化,多设备访问
-
RAG 管道可视化:显示检索过程、命中分块
-
A/B 测试:对比不同模型/参数组合的效果
-
自动关键词生成:用 LLM 从文档自动生成测试用例
长期(3 个月+)
-
Agent 工作流:多步推理,调用工具
-
知识库增量更新:文档变更后自动增量更新索引
-
反馈学习:用户点赞/踩数据用于优化
-
多模态 RAG:图片、PDF 表格、视频字幕
附录 A:一键启动脚本
#!/bin/bash
# start_rag.sh - 一键启动 RAG 问答机器人
cd /d/Personal/RAG-Robot
python web_ui.py
# 访问 http://127.0.0.1:7860
附录 B:相关概念
-
[[wiki/concepts/ai-knowledge-base|AI 知识库]]
-
[[wiki/concepts/rag-architecture|RAG 架构原理]]
-
[[wiki/concepts/reranker-model|重排序模型]]
-
[[llama-cpp|本地模型推理]]
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐



所有评论(0)