☰
从零搭建Agent知识库:RAG与向量检索实战指南
2026/10/4 14:11:52 网站建设 项目流程

不知道你有没有遇到过这种情况:花了一下午把Agent搭好了,模型也换成了市面上最强的,结果一问它“咱们公司的报销流程是什么”,它答得头头是道,但里面的审批金额上限根本是错的——它发现自己答得不对,还会换一种语气继续编。这不能怪模型,模型本来就不认识你公司那套制度,它只是在按“像不像答案”来补全内容。想解决这个问题,靠换模型没用,真正缺的是一个Agent能查询的知识库,把那些散落在公司群文件、公众号文章、内部Wiki里的资料,整理成AI检索起来不费劲的形态。这篇文章就讲清楚知识库到底在做什么、为什么不是把文件传上去就行、以及怎么把一个真实知识库从零搭起来。

1. 为什么你的Agent回答总在“一本正经地胡说八道”

先说清楚一个很多人没意识到的点:Agent的能力上限,从来不在“模型有多聪明”,而在“它提问时能查到什么”。

1.1 裸Agent的两个天花板:知识截止和幻觉

大模型的知识是在训练时被“冻结”的,它记的是训练语料里那些千万人写过的公开内容,而且还有个时间截止点。公司内部制度、某款产品的最新参数、你上周刚沉淀的复盘文档,这类东西模型连见都没见过。你硬问它,它只能从“报销”这个主题词去联想其他公司报销长什么样,然后把内容拼装起来。这就是第一层天花板:知识盲区。

但更麻烦的是第二层,幻觉。模型在生成回答时,本质上是在做概率预测——哪个词后面最可能接哪个词。当它没有真实依据时,它不会停下来告诉你“我不知道”,它会按照最“像知识”的方式继续输出。这就导致了一个结果:AI用非常自信的语气,编了一个你差点就信了的答案。我见过一个团队去查Agent给的KPI设定建议,Agent说得头头是道,还带公式推导,最后对的时候发现它把两个概念压根搞混了。它不是故意的,它是真的不知道。

1.2 知识库补上的那一环:把资料变成“上下文”

既然大模型只能根据上下文来生成,那我们就给它“喂”正确的上下文——这恰恰是知识库要干的事。知识库技术上的核心叫RAG(Retrieval-Augmented Generation,检索增强生成),流程就三步:先根据用户问题,从资料库里找回相关的片段,再把片段拼到提示词里,最后让模型只基于这些内容做回答。

用大白话讲:你让AI考试时能翻书了。你不用换一个更聪明的AI,你只需要在它答题前,把和这道题相关的教材页码翻到它面前,明确告诉它“一切以这几页为准”。

对比维度裸Agent接入知识库的Agent
训练数据外的私有资料不知道,只能瞎猜从知识库检索,按需召回
答错时的表现自信地编造细节可以设定为“查不到就说不知道”
回答依据概率补全真实文档片段
知识更新等模型升级,遥遥无期更新知识库,即时生效

看到这你应该明白了:知识库不是锦上添花,它是Agent从“玩具”走向“能用”的关键一跃。下面来看,把资料放进去这件事,远没有“上传文件”那么简单。

2. 知识库不是文件夹搬家:从“存资料”到“能查到”的四次转化

很多人的第一反应是:知识库嘛,我把文件夹传上去不就行了?你要是这么干,大概率会得到一个看起来建好了、检索时却什么都找不到的“死库”。原因是,让资料“能查到”需要经历四次转化,缺一步都不行。

2.1 第一转:清洗——从“一坨文件”到“干净文本”

大模型和知识库系统读不懂PDF里那张被边框截断的表格,也看不懂图片里的截图文字。你上传进去的资料如果本身是扫描件、带页眉页脚的网页文件、或者排版混乱的PPT导出PDF,那么知识库切出来的文本本身就是一堆乱码和噪音。

清洗干的事很朴素:把内容变成纯文本,把噪音剔除。比如扫描件要OCR文字识别,网页要抓正文并去掉导航和广告,公众号文章要转成结构化Markdown。这一步枯燥,但直接影响后面所有环节的质量。你给知识库塞一堆垃圾文本,它检索出的自然也是垃圾。我自己的习惯是,入库前先问自己一句:“这页内容如果只留下纯文字,还有没有可读性?”没有就先处理。

2.2 第二转:切分——决定检索精度的“颗粒度”

清洗完的知识往往是一个长文档,比如一份20页的产品手册。你不能把整本手册作为一个整体丢进去,因为用户提问时,召回的是“一个片段”,而不是整本书。所以要把长文档切成很多个片段,这个动作专业叫Chunking。

切分的颗粒度非常讲究。切太大了,比如一刀切5000字,召回回来一坨大杂烩,真正和问题相关的那句话被淹没在无关内容里,模型反而抓不住重点。切太小了,比如一句话一切,语义被切碎,召回回来的片段往往只有半句话,缺少上下文。

拿切排骨打比方:你要做小炒肉,切太小一炒就老,切太大半天不入味。文本切分也一样。我常用的策略是:优先按文档本身的标题层级和段落来切,保持语义完整性;如果文档没有清晰结构,再退回到固定长度切分,一般分段长度定在300~500个token(大约几百到一千字),重叠50个token左右,让相邻片段之间保留一点上下文衔接。

切分方式优点缺点适用场景
按标题/章节切语义完整,定位准确章节长短不一结构规范的制度、教程
固定长度切大小均匀,方便控制容易切断句子无结构的长文本
按句子边界切语义相对完整长度不可控问答型文档
父子切分粗粒度定位+细粒度回答实现复杂大文档精准问答

2.3 第三转:向量化——让文字变成可以“找”的坐标

切分完的片段,下一步是转化成一种让计算机能“找得到”的表示。你可以把每个文本片段想象成高维空间里的一个点,这个点用一个数字数组来表示,专业叫向量或Embedding(嵌入)。

向量化干的事很神奇:把“报销流程”和“费用报销单怎么填”这两段文字,即使没有任何一个词重合,它们的向量在高维空间里也离得很近。这就是语义检索和关键词搜索的本质区别,搜“报销流程”能命中“费用管理制度”,因为语义相似。

所以向量模型的选择很关键。中英文混杂的内容要用支持中英双语的模型,专业领域含量高的要选领域语料训练过的模型。不然你文字转出来的向量是“歪”的,后面的检索再努力也白搭。

2.4 第四转:检索与重排——把“相关的”排到最前面

知识库建好后,用户每次提问时,系统会把问题也转成一个向量,然后在库里找离它最近的N个文本片段。这个动作叫召回(Recall),N通常叫TopK。但召回只是第一步,召回回来的结果往往是“看着相关,实际不精准”。

所以有些成熟方案还会加一层重排(Rerank):用更精细的模型把召回结果重新打分排序,把最契合的排到第一位。如果没有重排,你就得在TopK上面做文章:设太小,漏掉关键答案;设太大,模型被一堆边缘内容干扰,更容易答偏。

我之前很少在一开始就追求复杂架构,而是先用“三步走”跑通基础链路:先把资料洗干净、切好并向量化入库,然后直接连到Agent上做问答测试,看哪些问题答不上来或答不对,再回头调切分和检索参数。知识库优化的核心路径,永远是从“结果不对”倒推到“某个环节没做好”。

3. 一次完整搭建:把公众号文章变成Agent可查的知识源

光讲原理太虚,我直接拿一个非常典型的场景走一遍完整流程:你平时在微信公众号看到很多好文章,想在Agent里问他“那篇讲用户增长的体验设计文章里,具体提到了哪几个案例”,都能问到答案。很多人问公众号文章怎么存进知识库,下面就是完整链路。

3.1 场景设定与工具选型

我们选一个上面的列表里大家反复在找的场景:如何把公众号文章保存到知识库。

准备的东西不多:

  • 一个知识库平台,Dify社区版或云端版都可以
  • 公众号文章链接,以及能抓取正文的工具
  • 一个支持嵌入的模型,比如DashScope、OpenAI或本地BGE-M3

为什么选Dify作为首站?因为Dify把“传文档、切分、向量化、建索引、关联Agent”全部可视化做了,你不用一上来就写代码调RAG框架,可以把精力放在数据质量和检索效果上。等你完全理解了这套流水线,再去读LangChain源码或自研流程,几乎是一马平川的事。

3.2 采集与清洗:从文章链接到干净Markdown

公众号文章和普通网页有点区别,它没有公开的HTML结构,有些抓取工具拿到的是带样式噪音的内容。我的做法是:

  1. 在浏览器里打开公众号文章,用“阅读模式”看正文;
  2. 用专业的正文提取工具(比如一些浏览器插件,或Jina Reader这类在线服务)把正文转成干净的Markdown;
  3. 把Markdown里的图片单独存下来,图片里的文字信息抽出来放成文本注释。

这里必须多提一嘴图片处理。很多人上传公众号文章后,发现知识库对“图里的表格数据”一无所知。原因很简单:向量化是对文本做的,图片本身不会参与语义检索。所以,要么把图片里的关键文字用OCR转成文本,要么为每张图写一句描述,再把描述和正文放一起。这一步做了,你的知识库召回效果会立刻上一个台阶。

3.3 配置知识库:切分参数与索引方式

打开Dify,创建知识库,把清洗后的Markdown传进去。这里有两个关键配置:

  • 索引方式:Dify会问你要用高质量索引还是经济索引。高质量索引会单独做一次Embedding,召回更准,但要消耗更多计算;经济索引主要是关键词召回,省钱但语义能力弱。我建议第一次建库选高质量,否则你后面排查问题时会分不清是数据问题还是索引方式问题。

  • 分段设置:Dify的默认分段长度是500个token,重叠长度是50。如果你的内容是公众号文章这种段落明确的,我建议选择“按标题/段落自动分段”,这样切出来的是语义完整的块,而不是机械的500字一刀切。

配置完后,Dify会对每个分段跑一遍Embedding,然后把向量写进向量数据库。这个过程可能有个“排队中”的状态,很多人看到就慌了,其实那是索引任务在处理,等它跑完就行(排队的具体问题下一篇细说)。

3.4 接入Agent并做一次端到端验证

知识库建立后,下一步就是把它挂到Agent应用上。在Dify里创建Agent,在“工具”或“知识库”区里选你刚建好的库,然后写一段很关键的系统提示词。我会在里面明确加一句:

“在回答问题时,必须先查阅知识库内容,并严格依据知识库回答;如果知识库中没有相关信息,请直接告知用户,不要自行推测。”

这一步很多人会忽略,但它直接决定了会不会产生幻觉。你不告诉模型“以知识库为准”,模型很可能还是会忍不住用自己的固有知识来圆场。

挂好之后,我习惯拿十个真实问题去砸一遍,其中至少包括三种:完全能从库里找到答案的、库里没有但常识能答的、库里只有部分相关的。通过这三类问题的回答质量,你能快速判断出知识库的边界和毛病在哪。

4. 检索效果翻车排查:命中率低、答非所问的五个常见原因

知识库建好之后,真正的磨人才刚刚开始。我见过太多人建库当天很兴奋,第二天就被Agent的低质量回答泼了一盆冷水。下面这几个问题是我排查时遇到最多的,按出现概率排序。

4.1 分段太粗,关键答案被淹没

现象很典型:用户问“这个项目的验收标准是什么”,Agent回复了一大段“项目背景和目的”,翻到最后一句话才带出验收标准。

原因:文档被切成了几个超大段落,召回的片段很长,相关语句只占其中很小比例。模型的注意力被无关内容稀释了。

排查方法:去知识库的“召回测试/预览”里,直接搜索这个问题,看看召回出来的是不是一段几百字的“大杂烩”。如果是这样,把分段长度调小,或者改成按章节切分。我的经验值是超过800 token的片段命中率会明显下降。

4.2 同义表达问题,关键词不匹配导致召回失败

这是最隐蔽的坑。用户在内部习惯说“报销单”,你库里文档标题写的是“费用支出申请流程”。关键词检索肯定玩完,但向量检索理论上能靠语义匹配,可如果你的向量模型没那么强,或者文本太短、上下文不足,照样匹配不上。

解决办法有两条路:

  • 在文档里增加同义字段,比如开头加一句“本制度适用于报销单、费用支出申请”,让向量模型有更多可关联的信息。
  • 单独建一个“术语同义词”知识库,把常见叫法和官方叫法列成对照表,Agent在检索前先用这个库理解用户问题。

我是一个比较务实的人,经常会直接给用户侧的高频说法做一层“问题改写”,让用户问题先变成文档里会出现的说法,再进检索。

4.3 脏数据入库,乱码和表格截断是元凶

很多人觉得“上传PDF就行”,结果PDF是从系统导出的一堆图片,或者文字复制出来是乱码。这种情况下,知识库切出来的内容可能是一行行毫无意义的字符,检索效果自然灾难。

这里我不建议在知识库系统里去强行修,源头才是最应该把关的地方。把PDF先转成文本,肉眼扫一下开头结尾是否干净,再入库。如果文件是扫描件,先跑一遍OCR;如果表格太复杂,就转成Markdown表格或干脆把表格每一行转成一句带关键字段的话。

4.4 上传大文件后索引排队,Dify卡在“处理中”

Dify里上传超大PDF后出现“排队中”,是好多人一上手就会撞上的问题。原因不外乎两个:同时建索引的任务太多,或者嵌入模型API有速率限制。还有不少人用免费额度时,上传几百页的PDF后索引任务反复失败。

我建议的策略:

  • 大文件先拆分,比如按章节拆成多个小于50页的子文档,分开上传;
  • 错峰操作,避免上午十点所有人都挤在在线API上;
  • 如果用的本地模型,检查一下显存和并发数,别一次塞太多任务。

注意:Dify的“排队中”不代表失败,它只代表索引任务还没开始执行。但如果排队超过十几分钟还没动静,去后台看日志,多半是API key过期或额度用尽。

4.5 TopK和Score阈值设置不当

最后这个原因最不起眼,但影响特别大。你给Agent配知识库时,它会问TopK和Score阈值。TopK定太大,每问一个问题都塞回七八个无关片段,模型直接被干扰;Score阈值定太低,一些相关的片段又会被过滤掉。

我的调参经验是:初始TopK设置为3,Score阈值设为0.5左右,然后拿真实问题测试,看召回的片段是不是带“垃圾”。如果相关片段没召回,就降低阈值或调大TopK;如果召回了一堆无关内容,就提高阈值。记住一个原则:宁可让Agent查不到后说“不知道”,也不要让它查到了一堆无关内容然后硬编。

5. 进阶问题:多人协作、图片存储与小模型做知识库

基础链路跑通之后,你一定会开始琢磨这些更复杂的问题:图片到底能不能存?小公司的小模型能做知识库吗?一个团队的人怎么共用一套库?

5.1 图片到底能不能存知识库?

这个问题的答案得掰开说。在纯RAG链路里,向量化的是文本,不是图片文件本身。所以如果你直接往知识库里传一堆产品截图,检索时是搜不到的。

但是,你完全可以把图片“翻译”成文本再入库。具体做法:

  • 截图上的文字和表格,用OCR工具识别;
  • 图表和流程图,写一段描述性文字,比如“这张图是用户从注册到下单的路径,包含四个步骤:...”
  • 图片本身的语义信息,用多模态模型生成一句图片说明。

把这些文本附在原图的上下文里,再一起入库。这样用户问“那个流程图里的第四步是什么”,模型就能从文字描述里找到答案,然后还可以在回答时引用原图。所以严格来说:存的不是图片,是图片的可检索描述。

5.2 用小模型做RAG,可行吗?

很多人有一个误解:得用很强的模型才能搭知识库。其实RAG链路里真正决定“能不能找到”的是嵌入模型(Embedding)而不是生成模型。一个小体量的向量模型,比如BGE-M3这种可以在本地跑的中型模型,在检索召回这个环节表现已经相当够用。

如果你只有一台普通服务器,完全可行的方案是:用本地嵌入模型做知识库索引和召回,再配合一个较小的生成模型(比如量化后的7B~14B模型)基于召回内容做回答。这样对显存要求不高,还避开了外网API的依赖。唯一要接受的是:生成模型的表达能力弱一些,回答会显得“很照本宣科”。这不一定是坏事,至少它不会像大模型那样自由发挥。

我自己在本地部署过的经验是,先用BGE-M3把几千个文档切片向量化,跑起来很快;再让Qwen2.5-7B根据召回片段作答,知识库问答完全够用,成本几乎为零。所以“卡帕西说知识库可以用小模型做吗”,答案是:可以,而且理解这个思路对搭RAG至关重要。

5.3 多人协作、权限隔离和知识库的“衰老”

团队一起用知识库时,问题就变了:怎么让不同部门的资料互相不干扰?怎么防止有人误删共享库?怎么让旧资料不“污染”新答案?

我建议按业务边界拆库,而不是搞一个超级大库。比如按部门拆成“市场知识库”“客服知识库”“研发知识库”,每个库配不同的读写权限管理。这样既能隔离,又能让每个库的检索范围更聚焦,召回精度反而上升。

同时,知识库有个容易忽略的问题叫“知识衰老”。公司更新了报销制度,但库里还有旧制度全文,Agent当然更倾向于召回最新的,但如果新旧版本并存,切片又不够明确,回答就可能是“根据A制度...B制度又写...”。所以每一次文档更新,都要在文件名或文档首行标注生效日期和版本号,旧版本该下线就下线,别舍不得。一个长期不维护的知识库,最后会变成一个“看起来能用、用起来就翻车”的陷阱。

在我实际搭建和维护知识库的这段时间里,最大的体会是:知识库的本质不是“存储”,而是“加工”。资料进库前要清洗、要切分、要向量化,进库后要持续调检索、回答策略和更新节奏。它像养一盆花,不是种下去就完事,你得定期浇水、换土、修剪。等你真的把知识库和Agent调顺了,你会发现之前那些“模型不聪明”的抱怨,其实有一大半是“没给它一个好好查资料的机会”。从今天开始,别再上传一堆原文件就完事,先想清楚这四个转化,再动手。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询