在 AI 圈子里,很多人对 RAG(检索增强生成)的理解还停留在“喂饭”的初级阶段:拿个开源的 LangChain 或 LlamaIndex 库,把各种格式的文档切一切,扔进向量数据库,然后套个漂亮的 UI 壳子就对外宣称“我们做出了企业级知识大脑”。
如果在个人的玩具项目里,这种做法又快又爽。但当你真正面对一家企业,需要去治理那些带有复杂层级、高频更新且密级森严的内部知识时,这种“垃圾进、垃圾出(Garbage In, Garbage Out)”的模式是一场不折不扣的工程灾难。
在独自一人扛起 Knowledge Hub (KH) 研发重任的过程中,我每天都在和这种系统的“熵增”做对抗。我非常确信一点:RAG 系统的长期确定性,绝对不取决于你的 Embedding 模型又多提升了零点几个百分点的召回率,而取决于你是否能在知识的整个生命周期里,用冰冷的代码和强硬的约束,铺设出一条不容越轨的“受控”铁路。
所谓“受控”,是指一份知识从进入系统、经过权限校验、到最终被 Agent 检索并用来回答用户的每个节点,都必须具备强一致性、可审计性和明确的业务意图。
本文是对 KH 整个知识流转管道的一次全盘架构复盘。
一、摄取层:用 Staging 与 BaseSha 终结“非受控导入”
在很多粗糙的系统里,文档上传是即时生效的。但在企业多部门协作、特别是涉及 Git 双向同步的环境下,这极度危险。
这 30% 的人类智慧:对一致性的绝对偏执。
我没有在internal/gitsync/service.go里写一个简单的拉取函数,而是基于 Spec-Driven Development (SDD),在架构文档中规定死了一个包含“暂存、审核、防并发”的重型摄取关卡。
当系统通过 API 或 Git 同步接收到新文件变更时,它不会立刻污染线上索引。它会先生成一个 GitStageStatusPending 状态的记录挂在“暂存区”。
在最终执行提交(Commit)落库时,系统会触发一道被称为 CBWM 安全闸 (基于基线版本的写入模型) 的硬核逻辑。它会强制去比对当前 Git 仓库的最新指针是否等于暂存时的基础指针(BaseSha)。
一旦发现不匹配,说明有人在你审核期间强行修改了源头,系统会直接拉死闸熔断任务。这种把“数据导入”重塑为“受控发布流水线”的做法,彻底斩断了因“最后写胜出 (Last-Writer-Win)”导致的知识踩踏悲剧。
二、过滤层:基于 GORM Scope 的实时原子级 ACL
企业知识库最大的雷区不是答错,而是“越权泄密”。
为了图快和节省性能,很多以前我见过的方案都是把权限标签(如 [role_A, user_B])直接写进向量数据库的 Metadata 里。但这种“静态权限”有一个长达数分钟甚至几小时的一致性空窗期——某个核心员工离职了,如果向量库的元数据还没来得及更新,机密就已经泄露了。
我向自己提出了一个在性能上极具挑战性的架构底线:废弃静态 Token,把权限过滤下沉到关系型数据库的行级安全(RLS)机制中,必须做到毫秒级同步。
在 internal/database/scope/acl.go 中,我引入了 GORM Scope 注入引擎。现在的系统在执行向量检索时,底层会自动拦截查询,并强制附加一个 JOIN document 的操作。它利用关系型数据库的事务一致性,实时去比对文档表里的 access_policy 字段。
只要在后台剥夺了某个人的权限,下一毫秒,哪怕他问的问题和机密文档的余弦相似度达到 99.9%,这篇文档也会在物理层面上被阻断。这种“1=0”的硬核防线,是企业信任 AI 的基石。
三、干预层:动态路径权重补偿 (Path Boosting)
在杂乱的企业知识海洋里,不是所有的文档都有同等的话语权。Git 里的 README.md 显然比某个不知名角落里临时建的 draft.txt 更具权威性。
为了让 RAG 有这种“组织觉悟”,我们在 internal/rag/orchestrator.go 引入了 Path Boosting(路径增强) 机制。
我们在算法底层强行加了一个动态补偿策略。当检索出的片段来自于被 SourceType: git 标记为正式渠道的项目时,它的最终 RRF(互惠排名融合)召回得分会得到额外的高额百分比加权。
这就像是在纯粹的数学概率上,加了一个“人类经验的偏置”。它确保了 Agent 在面对模棱两可、甚至互相矛盾的内容时,能自动优先“听取”官方正规渠道的声音,极大地压制了过时或低质量知识的噪音干扰。
四、消费层:退化为“证据库”的 Agent-first
在链路的最后一环,我们彻底抛弃了传统的“一次性查库 -> 塞进 Prompt -> 让模型强行作答”的危险模式。这种过度依赖大模型根据几块碎切片去“脑补”业务全貌的架构,是产生幻觉的头号温床。
在 KH 中,我将系统全面转向 Agent-first 架构。RAG 被冷酷地降级了,它不再负责组织答案。
在 internal/agent/service.go 里,我通过一套严厉的指令协议设计了两段式取证流程:
- 广泛侦察 (Scout):Agent 必须先通过
search_knowledge_base工具拿到局部片段线索。 - 定向精读 (Deep Read):Agent 基于自身推理提取
doc_id,利用read_document工具拉取该文档的全文上下文。
这迫使 AI 必须像一个真实的人类调查员一样:先通过目录定位大致位置,再翻开书页仔细研读。最后,在 strictGroundingPrompt(严禁脱离检索内容编造时间、流程或凭证)的铁腕约束下,老老实实地给出带有精确引用的回答。
五、结语:用工程的确定性,对抗 AI 的随机性
回看这一条条被冰冷代码死死卡住的链路,这就是我作为一个后端架构师对 RAG 系统的终极理解。
整个业界都在狂热地吹捧大模型的涌现能力,但我深知,如果不加严密的系统限制,那种不可控的涌现能力在严肃的企业级场景下就是致命的随机性灾难。
Knowledge Hub 的设计理念从头到尾只有一个:用工程纪律来维持系统的绝对确定性。
从摄取层的 Staging 与 BaseSha 防并发,到过滤层的实时 RLS JOIN 物理阻断,再到干预层的路径权威加权,最后收口于两段式的精读取证协议。
我们的系统并没有用什么魔法,每一层其实都在做枯燥的“减法”,每一层都在严守“死线”。在 AI 狂奔的时代,我们固然可以把大量繁琐的逻辑推演外包给智能体,但这绝不意味着我们放弃了对系统的架构主权。相反,真正的系统导演更应该站得高高的,用这些“受控的链路”,给这头名叫 AI 的高速猛兽,划定出一条不可逾越的安全航道。