我用RAG技术给公司做了个内部知识库,全过程记录
2026-07-24
我用RAG技术给公司做了个内部知识库,全过程记录
上个月,我们公司的技术总监突然找到我,说新来的几个同事每天要花大量时间在群里问各种重复的问题——"开发环境的数据库地址是多少?""部署流程文档在哪里?""这个接口的API密钥怎么申请?"——搞得大家都挺烦的。
他问我能不能搞个类似ChatGPT的东西,能直接回答这些内部问题。我第一反应是:那得训练个模型?成本太高了吧。后来转念一想,RAG(检索增强生成)不就是干这个的吗?
于是我就接下了这个活,整个过程花了大概两周时间,从零到一落地了一个内部知识库。今天就把完整的实践过程分享出来,希望能给有类似需求的朋友一些参考。
为什么要用RAG而不是直接训练模型
很多人一听到"企业内部AI知识库",第一反应就是微调一个LLM。说实话,我之前也这么想过,但仔细算了一笔账就放弃了。
| 方案 | 成本 | 更新难度 | 准确性 | 部署复杂度 |
|---|---|---|---|---|
| 微调模型 | 数万元起(GPU+训练费用) | 每次更新需重新训练 | 可能产生幻觉 | 高 |
| RAG方案 | 几百元(向量数据库+API调用) | 直接更新文档库即可 | 基于原文,幻觉少 | 中等 |
| 纯搜索方案 | 零成本 | 容易 | 需要用户自行筛选 | 低 |
微调一个大模型,光租GPU训练就得花好几千,而且一旦公司内部文档更新了,你还得重新训练。RAG就灵活多了——文档改了,直接把新内容扔进向量数据库就行,完全不用动模型。
更重要的是,RAG的回答是基于你提供的文档生成的,所以不会出现模型自己编造公司内部信息的情况。比如我问"公司VPN的地址是什么",RAG会从文档库里找到对应的配置文档,然后基于这段文字生成回答,不可能凭空捏造一个地址出来。
技术选型:我用的是这些工具
我选的技术栈其实挺常见的,都是开源或者有免费额度的方案:
- LLM:用了智谱AI的GLM-4,主要是中文效果好,而且API价格便宜(每百万token才几块钱)
- 向量数据库:ChromaDB,轻量级,部署简单,适合中小规模的知识库
- 文档解析:Unstructured库,支持PDF、Word、Markdown、TXT多种格式
- Embedding模型:BAAI/bge-large-zh-v1.5,中文语义理解不错,免费开源
- 框架:LangChain,主要是为了快速搭建pipeline,不用自己写太多胶水代码
说实话,选型的时候我也纠结过要不要用Milvus或者Pinecone,但考虑到公司内部文档总共也就几百份,ChromaDB完全够用了,而且它可以直接跑在服务器上,不需要额外维护集群。
落地过程:从文档清洗到上线
第一步其实是最痛苦的——文档清洗。公司内部文档散落在各个地方:飞书文档、GitLab Wiki、本地Markdown文件,甚至还有几个同事的Word文档。我写了一个脚本,把飞书文档通过API导出来,然后统一转成Markdown格式。
文档清洗的核心就是分块(chunking)。我试了两种策略:
- 固定长度分块:每512个token切一块,重叠128个token
- 语义分块:根据Markdown的标题层级来切,每个二级标题下的内容作为一个块
测试下来,语义分块的效果明显更好。因为固定长度分块经常把一段完整的技术说明切断,导致检索的时候上下文不完整。比如一个"数据库连接配置"的说明被切成两半,RAG只拿到前半段,回答自然就不对了。
分块之后,我把每一块用bge模型转成向量,存到ChromaDB里。整个知识库大概有800多份文档,分成了3000多个块,建索引花了大概10分钟。
检索和生成的调优过程
这部分是我花时间最多的。刚开始直接用最基础的"检索+拼接prompt"方式,效果惨不忍睹。举个例子,我问"怎么部署生产环境",RAG返回了"测试环境部署文档"和"开发环境部署文档"的片段,然后模型就把两者混在一起回答,完全没法用。
我做了三个关键优化:
第一,检索策略改用MMR(最大边际相关性)。普通的相似度检索会返回最相似的top-k个块,但可能这k个块都来自同一份文档,信息量不够。MMR在保证相关性的同时,会尽量选择多样化的结果。这样我就能同时拿到"部署流程"和"环境配置"两个不同维度的信息。
第二,重排序(Re-ranking)。ChromaDB第一次检索返回30个候选块,再用一个cross-encoder模型(BAAI/bge-reranker-large)重新排序,只取前5个。这一步大概增加了100ms的延迟,但准确率提升了将近20%。
第三,prompt模板里加了一层"引用格式"约束。我让模型在回答的时候必须注明信息来源,格式是[来源: 文档标题 - 章节名称]。这样用户看到回答的时候,可以直接去原文确认,也方便追责。比如:
生产环境的数据库地址是
192.168.1.100:3306,用户名prod_user,密码请向运维组申请。[来源: 运维手册 - 数据库配置]
上线后的效果和踩坑
部署了两周,目前公司有30多个同事在用这个知识库。后台统计了一下,平均每天有150次左右的查询,其中80%的问题都能在5秒内给出满意的回答。
但也有几个坑:
- PDF里的表格:Unstructured库解析PDF表格的时候经常乱掉,导致RAG拿到的是乱七八糟的数据。后来我干脆把重要的表格单独提取出来,转成Markdown格式再入库。
- 图片和流程图:这个目前还是无解,RAG只能处理文字。公司有些文档是"架构图+说明文字"的形式,图里的信息完全抓不到。我的临时方案是让人工在图片下面写详细的文字描述。
- 权限问题:有些文档涉及敏感信息(比如数据库密码),不能对所有同事开放。我目前的做法是在ChromaDB里给每个块打上标签(如"公开/运维组/管理层"),检索的时候根据用户的角色过滤。
现在这个知识库已经跑了三周,同事们的反馈还不错,至少群里问重复问题的人少了很多。下一步我打算接入企业微信,让同事可以直接在聊天里@机器人提问,不用再打开网页。
RAG这个技术真的挺适合做内部知识库的,成本低、效果好、更新灵活。如果你公司也有类似的需求,不妨试试看,不用一上来就想着训练大模型。