为什么我要做这个项目?

作为一名软件工程专业的学生,我一直对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。

核心流程:数据是如何流转的?

入库阶段

  1. 用户上传PDF/Markdown/Word文档

  2. Unstructured解析出纯文本

  3. chunk_size=512, overlap=128递归切分

  4. 调用BGE Embedding模型生成向量

  5. 存入Chroma向量数据库

问答阶段

  1. 用户输入自然语言问题

  2. 问题同样转为向量,从Chroma检索Top-20

  3. 用BGE Reranker对20个片段重排序,取Top-5

  4. 构造Prompt:系统指令 + 检索片段 + 用户问题

  5. 调用DeepSeek API生成答案

  6. 解析答案中的引用标记(如[来源: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超时,建议按以下步骤排查:

  1. 检查后端服务是否存活[来源:API网关配置手册_第3章]

  2. 查看网关的超时阈值配置,默认为30秒[来源:API网关配置手册_第5章]

  3. 如果后端处理时间长,考虑调整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容器化:写一个Dockerfiledocker-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工程实践,欢迎关注

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐