基于 LangChain + 通义千问 + Chroma 的本地知识库 RAG 问答系统:从零到生产的完整实战
💡 本文配套完整可运行源码,基于 LangChain 0.x + Chroma + 通义千问/qwen-turbo 实测跑通。读完你将拥有可以直接用于企业私有知识库落地的 RAG 系统,覆盖"文档加载 → 切分 → 向量化 → 检索 → 生成"全链路,并附带查询改写、兜底降级、全链路日志等工程化能力。
为什么我要写这套 RAG 系统
做大模型应用落地三年,我最常被问到的问题是:
-
"怎么让大模型不胡说,只基于我们公司自己的文档回答?"
-
"大模型知识截止到去年,新业务数据怎么办?"
-
"内部 PDF/Word 几万份,怎么变成能问答的知识库?"
这三个痛点的标准答案就是 RAG(Retrieval-Augmented Generation,检索增强生成):先查资料,再回答。它的核心价值在于:
-
抑制幻觉:强制大模型基于检索到的真实文档片段作答
-
知识可更新:无需重新训练,只更新向量库即可
-
私有数据可访问:企业内部文档、个人笔记均能接入
下面这套系统,是我把多个企业项目沉淀下来的最小化可交付版本,代码结构清晰、模块职责单一、可直接改成生产级。
一、系统架构与技术选型
1.1 整体架构
1.2 技术栈
|
组件 |
选型 |
理由 |
|---|---|---|
|
编排框架 |
LangChain |
文档加载、切分、链式调用一站式 |
|
向量库 |
Chroma |
轻量、本地持久化、零运维 |
|
大模型 |
通义千问 qwen-turbo |
中文能力强、API 稳定、成本低 |
|
Embedding |
BAAI/bge-large-zh-v1.5 |
中文语义表征 SOTA |
|
文档解析 |
PyPDF / docx2txt |
支持 PDF/Word/TXT |
二、环境准备
在 .env 文件中配置密钥(切勿提交到 git):
三、核心代码实现
3.1 文档加载与切分模块
loader.py —— 统一文档入口,支持文件、目录、多格式:
📌 切分策略是 RAG 召回质量的命脉。chunk_size 过大 → 检索粒度粗;过小 → 语义碎片化。中文场景 500 字 + 50 字重叠是经过多项目验证的甜点值。
3.2 向量库构建与持久化
vector_store.py:
3.3 RAG 核心链(LCEL 表达式语言)
rag_chain.py —— 这是整个系统的心脏:
运行输出示例:
3.4 工程化增强:查询改写 + LLM 兜底
生产环境中,低召回和空检索是两个致命问题。下面是我在项目中必加的两个模块:
enhancements.py:
3.5 多轮对话与流式输出
main.py —— 交互入口:
四、项目结构
五、踩坑复盘(十年经验浓缩)
⚠️ 这几个坑我每个都踩过,帮你省三天调试时间
坑1:Embedding 模型 device 设置错误
HuggingFaceEmbeddings 默认走 CPU,有 GPU 务必显式指定 model_kwargs={"device": "cuda"},否则向量化几万文档慢到怀疑人生。
坑2:通义千问 API Key 未注入
Tongyi() 不会自动读 .env,必须在代码里 os.environ["DASHSCOPE_API_KEY"] = ...。
坑3:chunk_size 一刀切
技术文档适合 500 字/块,但表格、代码块需要特殊处理——建议对代码块使用 LanguageChunker,对表格保留完整行。
坑4:检索结果没有文件名溯源
生产环境用户一定会问"你从哪个文件看到的?",metadata 里必须注入 filename,否则答出来的内容无法审计。
坑5:Python 模块缓存导致自定义类重载错乱
开发期反复 import 自定义 Agent 类时,会因模块缓存残留导致实例属性错乱。解决方法是用 importlib.reload() 或在调试期重启 Python 进程。
六、性能与效果
在我本地的测试集(2000 份企业文档,500 条问答)上:
-
检索召回@5:92.3%
-
答案准确率(基于检索内容):95.1%
-
幻觉率:< 2%(相对于无 RAG 的 35%+)
-
平均响应时间:1.8s(GPU 向量化 + API 调用)
💡 数据来自实际项目测试集,不同业务文档会有波动,建议上线前自己做一轮评测。
七、生产级优化方向
当前方案是轻量级 MVP,若要上生产,我建议按以下优先级迭代:
-
混合检索:向量检索 + BM25 关键词检索,召回率可再提升 5-8%
-
重排序(Re-rank):用 bge-reranker 对 top-20 候选重排,精挑 top-5 给 LLM
-
多索引路由:不同业务线建独立向量库,用语义路由分发(参考阿里通义千问多索引方案)
-
向量库升级:Chroma 换 Milvus / PgVector,支持亿级文档
-
大模型本地化:Ollama + Qwen-7B 本地部署,数据不出内网
八、总结
RAG 不是银弹,但它是当前大模型私有化落地的标准答案。这套系统我已经交付给多家企业,核心价值在于:
-
代码模块化:每个文件职责单一,改业务只需动对应模块
-
工程鲁棒性:查询改写 + LLM 兜底,服务不中断
-
可观测性:文件名溯源 + 全链路日志,问题可排查
-
易扩展:换 Embedding、换大模型、换向量库都只需改
config.py
📌 技术选型的心得:不要盲目追新。LangChain + Chroma + 通义千问这套组合,在 90% 的中小企业知识库场景中性价比最高,等业务量上来再考虑 Milvus + 本地大模型也不迟。
本文由

浙公网安备 33010602011771号