一句话定位:本地部署的企业文档 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)  # 生成可读报告

评估指标

  1. 检索召回率 (Retrieval Recall):期望来源是否出现在检索结果中

  2. 关键词召回率 (Keyword Recall):回答是否包含预期关键词

  3. 响应延迟 (Latency):检索耗时 + 生成耗时

  4. 综合通过率 (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 界面 — 评估标签页

在这里插入图片描述

操作步骤

  1. 点击 “Use Default eval.json” 或上传自定义评估文件

  2. 选择要评估的知识库类别(默认全部)

  3. 调整 Top K 和 LLM 参数

  4. 点击 “Run Evaluation”

  5. 查看汇总结果和详细报告


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: 检索不准确怎么办?

  1. 优化分块:增大 CHUNK_SIZE 到 1000,重叠 200

  2. 增加文档质量:确保文档有明确的章节结构

  3. 使用重排序:在检索后加一个 cross-encoder 重排序步骤

  4. 测试不同嵌入模型ollama pull nomic-embed-text

Q3: 关键词召回率低怎么办?

  1. 检查 eval.json 中的关键词是否过于严格

  2. 使用同义词扩展关键词列表

  3. 考虑用 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|本地模型推理]]


Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐