从66页工业库到知识库Agent:RAG、图谱与结构化实战

发布时间:2026/10/27 8:38:35
从66页工业库到知识库Agent:RAG、图谱与结构化实战

事情是从一份66页的工业资料库开始的,当时客户丢给我一份PDF,里面全是设备操作规范、故障代码对照表、工艺参数、备件清单,页码看起来不多,但信息密度极高。我一开始的想法很简单,给这份工业库挂上一个问答界面,用大模型做知识库Agent,让企业员工能直接问“这台设备最近为什么老报警”。真正动手才发现,知识库Agent不是把文档扔进向量数据库再配个聊天框就完事的,这份66页的工业库只是起点,后面长出来的整个体系,才是这条主线的全部价值。这篇内容就是复盘我从一份小文件起步,如何把它拆成RAG知识库、知识图谱和结构化知识库三条支线,再挂上Agent调度、记忆、权限和工具调用,最终形成一套可落地的知识库Agent方案。适合正在做知识库项目、想入坑Agent开发,或者手上也有一堆领域资料不知道怎么处理的人。

1. 拿到66页工业库以后,我先想清楚了一件事

1.1 这份工业库到底缺什么

先说这份资料的问题。它叫“工业库”,听着很宏大,实际就是几十种设备的技术文档合集:有操作手册、维修指南、故障码表格、工艺参数表,甚至还有几页手写的巡检记录扫描件。内容零散,格式不统一,但有一个共同点——它们都是面向领域内人员使用的原始资料,不是面向大模型设计过的干净数据集。

我当时做了一个小小的摸底,把66页里主要的“知识形态”列了一遍:第一种是连续文本,比如操作流程、故障排除思路,占了大概一半篇幅;第二种是表格数据,比如报警代码和备件型号,占了三分之一;第三种是图片和扫描件,比如设备结构图、仪表盘照片,有将近十张。这个比例非常典型,绝大多数工业领域资料库都是这种混乱构成。

所以这份工业库缺的不是信息,而是结构。用户真实问法往往是“3号产线的液压站换什么型号的滤芯”“哪些故障会导致主轴温度飙升”,这些问题横跨文本、表格、图片三类数据,单纯做全文检索根本答不上来。更麻烦的是,文档里有些关系是隐含的,比如故障代码A和备件B出现关联,仅在某一页的备注栏里出现过一次,靠关键字根本搜不到。

基于这个判断,我给自己定了一条主线:先把66页资料按形态拆开,分别加工成不同形态的知识库,再用Agent把它串起来。这条主线后来一直没变过,后面每接入一批新文档,都走同一套流程。

1.2 知识库Agent不是套壳聊天机器人

很多朋友一听到“知识库Agent”,第一反应是给大模型接个API,再塞个检索功能,就问就答。我自己的理解更偏向另一种说法:知识库负责记忆,Agent负责使用。知识库解决“知道什么”的问题,Agent解决“怎么用、何时调用、调完再做什么”的问题。

用个生活化的类比,知识库像一座图书馆,大模型像一个读者,而Agent是那个能替你查书、做笔记、再帮你跑腿办事的图书馆管理员。没有Agent的时候,你问一个复杂问题,大模型只能凭文档里的片段强行拼答案,拼错了也不知道。有了Agent以后,系统会先拆解任务,判定该去哪个知识库查,查到结果再推理,需要计算时调计算工具,需要确认现场情况时调设备数据接口,最后组织语言回答。

知道这个区别之后,很多选型问题就顺了:Dify这类平台解决的是知识库入库和Agent编排的流水线问题,开源知识库组件解决的是存储和召回问题,而Agent框架解决的是工具调用和状态管理问题。它们各管一段,别指望一套工具干完所有事。我在这个项目里也没有迷信单一框架,而是把知识库、Agent调度逻辑、权限控制分三层写,到后面对接新场景时,每层都能单独替换。

2. 三种知识库各管一段:RAG、KG、结构化库怎么分工

2.1 RAG知识库:负责“从文档里找答案”

RAG知识库,也就是检索增强生成,是目前最主流的知识库Agent底座。它的原理通俗讲就是三步:把文档切成小块,用嵌入模型转成向量存储;用户提问时把问题也转成向量,在库里找最相似的若干块;把这些块拼进提示词,让大模型基于资料回答。

这套方案最适合“答案藏在某段文档里”的场景。工业库里的设备操作步骤、故障处理思路、安全注意事项,都属于这一类。比如用户问“更换液压油时要注意什么”,如果资料第41页有一条操作规范,RAG能把它捞出来,再交给大模型整理成流畅回答,效果就很好。

我在接入这部分时做了点改造,没有直接用现成RAG的默认配置。原因后面会细说,核心是切分策略和召回方式都要匹配领域资料的特征。比如设备手册里的“注意”“警告”这类提示语,很容易被切分规则拦腰截断,所以我给这部分单独设计了切分逻辑,凡是带警示关键词的段落,强制作为一个完整语义块入库。

2.2 KG知识库:负责“沿着关系找线索”

知识图谱(KG)知识库跟RAG完全是另一套逻辑。它不存文档片段,而是存实体和关系:把“液压站”“滤芯”“型号FX-32”分别建成节点,再连接成“液压站使用滤芯”的关系。用户问“哪些设备共用同一个型号滤芯”,RAG很可能摸不着头脑,但知识图谱遍历一遍关系就能给出准确名单。

更关键的是,这类问题在工业场景里非常高频。故障影响分析、备件通用性判断、工艺参数上下游联动,本质都是沿着关系链查找。我从66页工业库里手工抽了几十个核心实体,包括设备、部件、故障现象、备件、材料、参数六类,又建了“使用”“导致”“替代”“关联”四种关系,建成一个小规模知识图谱。

但我必须泼一盆冷水:知识图谱的构建成本极高,66页这种量级,抽出几十个实体就是极限了,信息量再大就需要NLP工具自动抽取加人工校对,否则准确率会很惨。我的建议是图谱不要贪全,只建你最常问的那几类关系,其余场景留给另外两种知识库。

2.3 结构化知识库:负责“精确计算和规则触发”

第三种知识库最容易被忽视,但工业场景下它的价值甚至超过前两者,就是结构化知识库。所谓结构化,就是干净的表格、参数库、规则库,能够被程序精确读取和使用,不是靠向量相似度去猜。

临时举几个例子:报警代码表,每一行是一个故障码和它对应的处置建议,这是典型结构化数据;设备参数表,额定电压、额定功率、运行温度区间,必须精确;备件清单,型号、厂商、库存数量,一个字符都不能错。这类数据如果塞进RAG,用户问“某台设备额定功率是多少”,大模型检索到相似段落,很可能把类似设备的参数混进来,属于典型的“差不多先生”,这在工业场景是不可接受的。

所以在架构里,结构化知识库被设计成一个独立模块,Agent在处理精确性问题时直接走SQL或API去查,而不是走向量检索。它跟RAG的分工可以形象点说:RAG读散文,结构化库查账本,各干各的,别混着来。

2.4 为什么不能只建一个万能知识库

很多项目组刚开始总想偷懒,把所有资料塞进一个RAG库里,寄希望于大模型自己“悟”出关系和参数。我最初也这么干过,后来被三个问题打脸。

第一,检索精度不够。同一份文档里液压站和润滑站内容挨得很近,向量空间里天然接近,用户问润滑站问题时,检索结果经常混入液压站内容。第二,关系无法还原。文档里从头到尾没出现过“A替代B”这句话,只是在某张表里把A和B放在同一行,RAG就答不出这层关系。第三,无法执行精确逻辑。入库的文本是字符串,查不了“大于”“小于”“等于”。

所以结论很明确:知识库不是建一个,而是按场景把知识分成三种形态再各建一套。这其实也是行业里常讨论的“RAG知识库、KG知识库和结构知识库的区分以及应用场景”最朴素的答案:它们不是替代关系,是配合关系。66页工业库量级虽然不大,但我仍然按这个思路做了三层架构,正因为规模小,切换成本低,后面体系一旦长起来,容错空间反而更大。

3. 66页工业库的清洗、切分与入库实操

3.1 文档解析:表格、图片和乱码是第一关

真正处理这66页资料时,第一关不是模型,不是向量库,而是最土的内容抽取。原始PDF里大量表格被跨页切断,表头在上一页,数据在下一页;扫描页的OCR结果基本是灾难;还有一些从CAD导出后变成图片的参数表,文字根本抠不出来。

我把处理流程固定成了四步。先用PDF解析库把每页文本和图片分别抽出;然后写正则规则把页眉、页脚、页码这些噪声剔除,把跨页表格的断裂行合并;对识别质量差的扫描页,单独走OCR流程,人工核对关键数字;最后把图片统一压缩处理,单张压到256KB以内,同时生成一段语义描述,比如“图12:液压站结构示意图,从左到右依次是油箱、泵组、控制阀组”。

这里要专门回答一个大家常问的问题:“RAG知识库能存图片嘛?”我的答案是能,但别直接把图片扔给向量库去匹配,效果很差。正确做法是图片走“双轨”:图片本身作为附件存档供前端展示,图片的描述文字作为向量入库供检索。用户搜“液压站结构”时,检索命中的是描述文字,回答时再调出图片,这样既命中准确又不损失信息。这也是“知识库图片怎么处理”的实战标准答案。

3.2 切分策略:按语义块切,不按字数切

知识库切分是整个链路里最容易被低估的一步。新手最容易犯的错,是随便定一个“每500字切一块”的规则,然后等着看效果。我一开始也这么干过,结果工业文档里术语密集、表格和段落交错,很多块切开以后语义不完整,检索出来的片段经常是半句话。

后来我把切分逻辑从“按字数”改成了“按语义块”,优先级从高到低是:表格整体、标题及其下级内容、带警示标签的段落、普通连续文本。简单说就是,遇到表格,整个表格作为一块,无论多长都不切开,因为表头一旦丢了,表格数据就是天书。遇到“注意”“警告”“严禁”这类标签,连同后面的正文作为一块。遇到明显章节结构,按标题层级切。最后剩下的纯文本,才按预设的最大长度切分并保留重叠。

参数我用的是chunk_size=512、overlap=50、min_chunk=200,但这只是基线值,具体还是看内容。这些数值是基于“中文工业文档术语密集,代码和数字多,Vector检索对语义完整度敏感”的经验推出来的,如果你的领域完全不同,千万别照抄。

3.3 向量化与元数据:检索质量的隐形拐点

切完块之后进入向量化。嵌入模型的选择直接影响检索质量,在中文工业领域尤其明显。通用嵌入模型对“液压”“主轴”“变频器”这些词的语义把握还行,但对领域内同义词和缩写就很吃力,比如“空载”和“无负荷”在向量空间里不一定近。如果团队有条件,优先选在垂直语料上微调过的嵌入模型;没有条件,就老老实实在元数据上下功夫。

我在每个知识块上都挂了一套元数据:来源页码、所在章节路径、文档类型、目标设备型号、更新日期、权限级别。这些元数据有两个关键用处:一是检索时做过滤,比如用户只问3号产线,可以先把设备和产线的过滤条件加上,大幅缩小检索范围;二是供Agent判断知识块的身份,回答问题时能注明“依据某文档第几页”,这在工业场景非常重要,因为操作人员需要能溯源,不能凭空回答。

我体会最深的是,向量化之前先想清楚元数据,比换一个更强的嵌入模型带来的提升更大。很多项目死在“检索不到”上,换了好几个模型还是不行,最后发现是过滤条件把答案全挡掉了,或者切块时把关键信息切成了碎片。

3.4 入库与双路召回:实测一个关键对比

入库我用的是开源自建方案,底层用向量数据库,上层用Dify做知识库流水线。Dify的好处是管理界面现成,支持文档批量导入、切分预览、检索测试,对中小项目非常友好。把前面清洗好、切好的数据导进去,等于一套“知识库加工流水线”就通了。

入库之后我专门做了一组对比测试,同一批问题,纯向量召回一种结果,向量召回加关键词召回双路融合又是另一种结果。这里解释一下双路召回:向量负责语义相似,关键词负责精确匹配,两者分数加权融合后再排序。对故障码、设备型号这类精确串,关键词召回的命中率远高于向量;对“设备老是过热”这类模糊描述,向量又明显占优。实测下来,纯向量的一轮命中率大概六成,双路召回能到八成五以上。

这个对比告诉我,知识库Agent的检索层不能只依赖一种召回手段,尤其是工业领域,精确匹配和语义模糊匹配并存,必须两手抓。后来我把双路召回固化成知识库接入Agent的标准接口,不管底层是哪套向量库,上层都暴露同一套检索服务。

4. Agent层:把知识库变成会干活的人

4.1 Agent不是搜索引擎,而是一个会“查、想、做”的工作流

知识库建完,还只是有了藏书,Agent是那个真正站在台前跟你打交道的角色。我理解的Agent架构,核心就是一个循环:拆解需求、检索知识、调用工具、生成结果。跟浏览器搜索的本质区别在于,Agent能根据检索结果做决策,还能触发下一步动作。

我在设计时把Agent拆成了三层。最外层是通信层,负责接收用户提问、判断意图、控制对话状态;中间层是路由层,根据问题类型决定走RAG、知识图谱还是结构化查询,也可以组合调用;最底层是执行层,封装了一组工具,包括检索知识库、查询报警记录、计算参数、查备件库存。每层各司其职,改动某一层不会牵动全局,后续接更多业务系统时,只需在执行层加工具。

开发语言上我最终用了Python写编排层,因为它对接各种Agent框架和知识库SDK最方便,function calling的原生支持也最好。如果完全从零开始又不想维护太复杂,可以直接用Dify的可视化编排,把各知识库配置成工具节点,Agent流程用画布连出来。我的建议是:先小规模用手工编排把逻辑跑通,再决定要不要上重型框架,别一开始就为了架构而架构。

4.2 Agent怎么调用知识库:检索工具设计

知识库要真正被Agent用起来,不能是“把所有内容一股脑塞进上下文”,而是做成一个可调用的检索工具,Agent只取自己需要的那几块内容。我敲定了这样一个工具描述,Agent理解起来很简单:“输入一个查询语句,返回与该查询最相关的知识片段列表,每条包含内容、来源、相似度、元数据”。

在实现时,这个检索工具内部其实干了很多事:先做意图预处理,从问题里抽取设备型号、故障码等实体,用于元数据过滤;然后同时发起向量检索和关键词检索,做分数加权融合;最后对拿到的知识块做一次重排序,把最相关的排前面。这样设计的好处是,Agent不需要关心底层是RAG还是图谱还是结构化库,它只需要调用同一个检索接口,剩下的路由和融合逻辑全部收口在工具内部。

这里要提醒一个很实际的问题:工具返回的结果不能太大,否则大模型的上下文窗口会被无关内容塞满,导致注意力分散。我给检索工具设了硬性上限,最多返回8条知识块,每条不超过500字,再加一个总字节数限制,超了就丢弃低分结果。工具调用返回格式我用严格的JSON结构,字段固定为id、text、source、score,这样Agent解析时出错概率最低。

4.3 记忆系统:长期记忆才是最容易被忽略的

Agent跑起来之后,我发现最影响体验的除了检索质量,还有记忆。这里说的记忆分两种:短期记忆是当前会话里的对话记录,让Agent知道用户刚才问过什么,这个主流框架都自带;长期记忆是跨会话、跨用户的知识沉淀,比如某条经验被验证有效、某个问题频繁出现但知识库里没有答案,这类信息应该写回知识库,让Agent越用越聪明。

前期我把长期记忆做成一个单独的知识库通道:当Agent在会话中发现“高频问题但检索无答案”时,就自动生成一条待确认记录,人审后写入补充知识库,并挂上对应的设备型号标签。这样实现了一个闭环,知识库不再是一次性建设,而是随着业务运转持续生长。这也是我非常认可的一句话:知识库Agent的主线,是从资料库长出来的,但长起来之后还要靠使用去喂它。

实现上我用本地Markdown仓库作为记忆文件的存储层,用Obsidian做人工管理和审核。Obsidian和Trae这套组合很好用,因为Trae这类终端Agent可以直接读取本地的Markdown文件,通过检索工具或直接索引的方式把它们接进记忆管线。好处是文件格式开放、可git版本管理、人工审核方便,不用专门开发一套管理后台。实测下来,本地笔记库当Agent的“外部记忆硬盘”,比塞在数据库里更灵活。

4.4 编排与多Agent:当不同知识库需要不同角色

知识库分成三种形态以后,一个问题随之而来:是让一个全能Agent去路由调用三个知识库,还是让三种知识库各配一个Agent再统一调度?我两种都试过,最后采用了折中方案:一个主Agent做全局路由,三个子Agent分别负责RAG问答、图谱关系查询、结构化参数查询。

这样做的理由很实际:三种知识库的查询逻辑差异太大。RAG子Agent要擅长归纳语言,从多条文本片段里组织答案;图谱子Agent要擅长把问题转成路径搜索,比如“查出所有替代型号为X的备件”;结构化子Agent要擅长把自然语言问句转成精确的查询条件。各自专业化的结果就是,每个Agent的提示词和工具集都很精简,调试成本低,回答质量反而更高。

主Agent的工作则变成“调度员”:判断问题类型、分发任务、汇总结果、处理失败。这套编排逻辑现在很多Agent框架都支持,我在Dify流水线里做了一个简化版本,但真要精细化控制,还是自己写编排逻辑更顺手。要提醒的是,多Agent不是越多越好,每个Agent都是一层延迟、一个出错点,初期完全可以用单Agent加灵活工具集起步。

4.5 安全与权限:Agent越强,越要管住手

Agent能调用工具、能查知识库、能自动写回记忆,能力一强,安全问题就躲不开。我在这个项目里从三个维度做了控制。

检索层权限:每个知识块挂权限级别,用户在哪个角色组,Agent检索时就只能取对应级别的数据。内部维修文档和对外常见问题分开放库,避免低权限用户问出高权限内容。工具层限制:Agent可调用的工具不是无限开放,写入操作全部要二次确认,参数查询只读,不允许Agent自行修改数据。输出层脱敏:如果知识块里有人员姓名、手机号等信息,生成回答前统一打码。

从项目第一天就把权限设计进去,后面省了很多事。有朋友说数据量大了再搞安全,我强烈不建议,知识库Agent的权限泄漏是无声的,用户如果问出不该问的内容,他自己都未必意识到,所以必须在链路源头挡住。这不是工业场景独有的需求,但我确实在这个项目里体会更深,因为设备参数和处置规范直接影响生产安全,答错和泄漏都担不起。

5. 常见问题与排查技巧实录

5.1 五个高频事故与解决方案

做知识库Agent半年多,踩过的坑可以整理成一份速查表。先把最典型的五个问题列出来,基本覆盖了从入库到推理的全链路。

现象根因解决方案
Dify知识库一直排队中切分和向量化的任务并发过高,嵌入模型API速率受限拆小批次提交任务,降低并发数,批量大小调小,给任务加退避重试
检索结果明显跑偏切分策略不合理,关键词所在块被切碎检查知识库的切分预览,把表格、警示段落提升为不可切割块
精确型号和故障码答错数据被当成文本走向量检索,没有走精确匹配把精确查询数据抽出来放结构化知识库,Agent优先走查询工具
Agent报错“execution terminated due to error”工具返回格式不符合大模型的解析预期限制工具输出为严格JSON,增加输出字符长度上限,给每个工具返回示例
用户问关系类问题答不出RAG库里没有显式关系信息对高频关系建小规模知识图谱,问题路由到图谱子Agent

其中“Agent执行中断”这个报错,我排查过很多次,绝大多数不是模型坏了,而是工具返回了非预期格式,大模型解析不了,只能终止执行。解决方式很笨但有效:每个工具都定义死返回结构,并且在工具描述里给一个成功和失败的示例,让模型照着路径走。

5.2 排查思路:先怀疑召回,再怀疑模型

很多人遇到知识库Agent回答不对,第一反应是换更大的模型,其实大多数问题的根子在召回。我的固定排查顺序是这样的:先查检索阶段,把用户问题跑一遍检索工具,直接看返回的知识块列表,如果列表里根本没有正确答案,那说明问题出在切分、向量化或过滤条件上,换模型没用;如果列表里有答案,但最终回答不对,那才是生成阶段的问题,再考虑调提示词或换模型。

这个顺序帮我省了大量无用功。有一次用户反馈“查不到某型号参数”,我打开检索记录一看,知识库里确实有这条数据,但元数据里的设备型号字段写的是“3号液压站”,用户问的是“液压站”,检索过滤条件把这一条滤掉了。这种问题光看回答内容根本定位不了,必须深入到检索日志里看。

所以给所有知识库Agent项目加日志是必须的。我在检索工具和生成阶段都埋了日志,检索日志记录查询词、过滤条件、召回结果和得分;生成日志记录提示词、模型输出、工具调用链。出问题时先翻日志,基本能定位八成以上的故障。

5.3 避坑清单

最后列几条被反复验证的避坑经验。第一,不要让Agent一次加载整个知识库,一次问答只应该携带必要片段,不是把库都塞进上下文。第二,文字描述加图片附件才是工业文档的正确姿势,别指望模型直接“看”清楚扫描件。第三,切分规则要适配内容形态,表格、警示、代码统一保护。第四,权限设计必须前置,等出了问题再补,补的成本远高于设计成本。第五,先跑通最小闭环再上框架,从简单的单Agent检索试起,再逐步叠加图谱、多Agent和记忆系统。

这五条每一条都有真实的失败案例支撑。单拿“一次加载整个知识库”来说,我见过有小团队把整个产品手册通过系统提示词塞给模型,结果既超上下文限制又答不对,因为模型在大量文本里平均用力,对问题对应的段落反而注意力不够。正确的思路永远是让Agent学会按需取用,而不是锻炼所谓的“记忆容量”。

6. 从66页到更大规模:主线怎么继续长

6.1 新资料自动路由

这套体系跑通以后,一个自然的诉求是:以后来了新文档怎么办?总不能再手工切一遍、标一遍元数据、选一遍入库类型。我把这个环节做成了半自动:新资料先进“暂存库”,系统用规则和少量模型调用判断内容形态,自动分流到RAG、结构化抽取或图谱实体挖掘三条处理线,只有最终入库结果需要人抽查确认。

自动路由的逻辑并不复杂,本质就是分类问题:文档里有大量表格,且表结构规整,优先进结构化提取;文本段落为主,说明流程和操作,进RAG;文档反复出现设备名、部件名、备件名,提示有实体关系,才考虑补图谱。这套规则在66页基础上开发,后来接了上千页资料依然适用,因为它抓的是内容形态,不依赖具体行业术语。

6.2 知识库的版本与更新

知识库是活的,资料会改版,设备会升级,参数会变更。我在本地用Git管理整个知识库的数据源,包括Markdown文件、结构化表、图谱的CSV导出。每次更新都形成一次提交,Agent回答时可以追溯到当前版本,出了问题能快速回滚到上一个可用版本。这个操作对工业文档尤其重要,因为旧版本参数可能已经作废,但如果直接覆盖,历史记录就丢了,审计时讲不清楚。

版本管理的另一个收益是可以做A/B效果评估。同一批测试问题,在旧版本知识库和新版本知识库上各跑一遍,对比命中率和回答准确率,就能判断这次更新到底是优化还是劣化。这比拍脑袋说“感觉好多了”靠谱得多。

6.3 我的体会:主线的价值在于“最小可行资料”

回头看,这份66页工业库的量级确实不大,但恰恰是这种小体量,让我有空间把三条知识库支线、Agent编排、记忆、权限全部跑通一遍。我最大的体会是,知识库Agent项目不要等着大而全的数据集到位再启动,选一小份有代表性的领域资料,沿着“解析-分库-召回-Agent-反馈-回流”这条主线先走一遍,整个系统的骨架就立住了。后面接入更多资料,只是在给这个骨架填充肌肉。

最后再分享一个小技巧:每完成一版迭代,我都会把“用户真实问过但系统答不对”的问题汇总成一份测试集,固定在每次改版后回归。这份测试集比任何监控指标都更能反映知识库Agent的真实水平。我的主线还会继续往下走,下一个准备做的方向是把Agent从“回答问题”推向“执行动作”,不只是告诉操作员该怎么处理,而是直接联动工单、通知维护人员,甚至生成处置记录。这条从66页长出来的路,后面还长。