EnterpriseRAG——从零开始用AI做企业级RAG知识库问答系统
为什么我要做这个项目?
作为一名软件工程专业的学生,我一直对AI工程化充满兴趣。但市面上大多数课程要么只讲理论,要么只是调API做个聊天机器人,很难真正学到“能写进简历、能打动面试官”的东西。
直到我遇到了RAG(检索增强生成)——这个在企业内部被广泛应用的AI工程范式。它不追求训练大模型,而是用检索+生成的方式,让通用大模型“学会”企业私有知识,同时还能告诉你答案来自哪份文档。
于是我决定:从零开始,做一个企业级RAG知识库问答系统,并把这个项目的完整过程分享出来。希望能给同样想在AI工程方向积累实战经验的同学一些启发。
项目要解决什么问题?
想象一下:你所在的公司有成千上万份内部文档——技术规范、项目复盘、员工手册、API文档……想找到一个问题的答案,往往要翻好几个文件夹、打开几十份PDF。
通用大模型(比如ChatGPT)没见过这些内部文档,问它就会胡编乱造。而RAG的思路非常巧妙:
用户提问 → 先从知识库中检索相关片段 → 把片段和问题一起交给大模型 → 大模型基于“证据”生成答案
这样既能保证答案基于真实文档,又能利用大模型的推理和生成能力。
技术栈:我选了哪些组件?
| 组件 | 我的选择 | 理由 |
|---|---|---|
| 编排框架 | LangChain 0.3+ | RAG流程标准化,快速迭代 |
| 嵌入模型 | BAAI/bge-large-zh-v1.5 | 中文SOTA,HuggingFace高下载量 |
| 向量数据库 | Chroma | 轻量无依赖,适合学习 |
| 重排序模型 | BAAI/bge-reranker-v2-m3 | 提升检索精度的关键 |
| 大语言模型 | DeepSeek API | 便宜(新用户送500万tokens),中文好 |
| 前端框架 | Vue3 + Vite + Axios | 组件化、响应式,更接近真实企业项目 |
整个项目用Python 3.10开发,依赖管理用pip,版本控制用Git。
核心流程:数据是如何流转的?
入库阶段
-
用户上传PDF/Markdown/Word文档
-
用
Unstructured解析出纯文本 -
按
chunk_size=512, overlap=128递归切分 -
调用BGE Embedding模型生成向量
-
存入Chroma向量数据库
问答阶段
-
用户输入自然语言问题
-
问题同样转为向量,从Chroma检索Top-20
-
用BGE Reranker对20个片段重排序,取Top-5
-
构造Prompt:系统指令 + 检索片段 + 用户问题
-
调用DeepSeek API生成答案
-
解析答案中的引用标记(如
[来源:xxx.pdf]),返回给用户
踩坑与优化:那些值得记住的时刻
坑1:分块太大导致检索不准,太小导致语义割裂
一开始我直接用chunk_size=1000,结果发现问“系统超时怎么配置”,检索出来的片段包含了很多无关的日志配置信息。
解决:我写了一个小脚本来统计文档的段落长度分布,最终选择chunk_size=512, overlap=128。同时按照标题(Markdown的#、##)优先切分,保证每个块尽量是一个完整的语义单元。
坑2:没有Rerank时,Top-5里经常混入不相关的内容
向量检索本质是“语义相似”,但相似不等于相关。比如问“如何部署”,可能会召回“部署失败回滚方案”,看起来相似但并不是用户想要的。
解决:我引入了BGE Reranker。先向量检索Top-20(快但不精),再用Reranker对这20条计算精细相关度分数,重新排序后取Top-5。效果立竿见影——在我的50个问题测试集上,Recall@5从78%提升到了92%。
坑3:LLM经常不按要求输出引用格式
Prompt里明明写了“请在每个事实后面附上[来源:文件名]”,但DeepSeek有时会漏掉,或者自己编一个不存在的文件名。
解决:我在Prompt里用了few-shot示例,并且强制要求输出格式为JSON。同时在后端加了正则解析,如果LLM忘了加引用,就自动从检索到的片段中匹配最可能的来源。
坑4:API调用偶尔超时或限流
DeepSeek API免费额度很香,但偶尔会网络波动。
解决:用tenacity库加装饰器,实现指数退避重试(最多3次)。同时我把超时时间从默认的10秒调到了30秒,避免频繁失败。
成果展示:它到底能干什么?
我上传了10份内部技术文档(约8万字),包括一份《API网关配置手册》、一份《故障排查SOP》。然后问它:
用户问题:如果网关返回504超时,我应该怎么排查?
系统回答:
当API网关返回504超时,建议按以下步骤排查:
检查后端服务是否存活[来源:API网关配置手册_第3章]
查看网关的超时阈值配置,默认为30秒[来源:API网关配置手册_第5章]
如果后端处理时间长,考虑调整
proxy_read_timeout参数[来源:故障排查SOP_v2.3]
每个引用都能点开查看具体片段,用户可以验证答案的真实性。
简历上怎么写?
如果你也想把这个项目写进简历,可以直接参考这段:
企业级RAG知识库问答系统
设计并实现基于LangChain + Chroma + BGE Embedding + DeepSeek API的文档问答系统,支持PDF/Markdown上传与自动索引。
引入BGE-Reranker重排序模型,将检索准确率(Recall@5)从78%提升至92%,显著减少LLM幻觉。
实现答案溯源功能,自动标注每个回答引用的文档来源,增强回答可信度。
使用Streamlit搭建交互式前端,支持实时问答和检索片段可视化,项目已部署在GitHub并提供详细文档。
系统平均响应延迟2.8秒,可支撑中小团队内部知识库场景。
你可以继续做的加分项
这个项目只是MVP,如果你想让它更亮眼,还可以加这些:
-
Docker容器化:写一个
Dockerfile和docker-compose.yml,一键启动全部服务 -
支持更多文档格式:PPT、Excel、甚至Confluence导出文件
-
混合检索:向量检索 + 关键词检索(BM25),用
EnsembleRetriever融合 -
缓存机制:对相同或相似的问题,直接返回缓存答案,降低API成本
-
写一篇技术博客:就像你现在看到的这篇,把你的思考和过程分享出来
总结:这个项目让我学到了什么?
通过这次实践,我真正理解了“AI工程”和“调API”的区别:
-
系统工程思维:不是选最好的模型就行,要在准确率、延迟、成本之间做权衡
-
调试能力:RAG系统的错误往往是隐性的(检索不对、块切得不好),需要设计实验来定位
-
工程落地:从原型到可演示的MVP,需要裁剪需求、处理异常、写好文档
如果你也是一名正在寻找AI工程方向实战项目的学生,我强烈推荐你从RAG开始。它不需要你训练大模型,不需要海量GPU,甚至只用免费API就能完成一个完整、可演示、能写进简历的项目。
源码和文档都在我的GitHub(链接见文末),欢迎clone、star、提issue。也欢迎在评论区交流你的RAG实践心得。
项目地址:https://github.com/enen323/EnterpriseRAG
我的技术博客:持续分享AI工程实践,欢迎关注
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)