深度 · 小互解读

Cerebras 公开公司知识库搭法:不需要任何人改使用习惯,资料留在原处AI自己去取

上线三个月,每天被提问超过 15000 次;四路打分、讨论串蒸馏、排名融合的具体参数都写了出来。
一分钟速览
  • Cerebras 的三名工程师公开了公司内部知识库 Cerebras Knowledge 的搭法,上线三个月,每天被提问超过 15000 次,提问方包括员工、自动化脚本和 Agent。
  • 它不要求任何人改变习惯:资料继续留在 Slack、代码仓库、文档系统里,系统去每个平台取数,全部落进同一张 Postgres 表。
  • Slack 是最难啃的源。同一批候选会被四种打分方式同时检索:全文匹配、向量匹配、稀有词权重、时间衰减,各补各的盲区。
  • 聊天记录不直接拿去做向量。先由模型蒸馏成「一句话问题+摘要+结论+涉及的系统和代码符号」的统一结构,再嵌入。
  • 六个检索器各出一份排名,用倒数排名融合合成一份,常数取 60,效果是「几份榜单都靠前」的文档赢过「一份榜单第一」的文档。
开篇 · 上线三个月

每天 15000 个问题,问的人里还有 Agent

Cerebras 的三名工程师最近在公司博客上把内部知识库 Cerebras Knowledge 的搭法整个拆开公开,从数据怎么采集一路讲到答案怎么排序,每一层用了什么参数都写在里面。

这套系统上线三个月,每天被提问超过 15000 次。提问的不只是员工,还有自动化脚本和 Agent。

触发它的场景很多公司都熟悉:Cerebras 的团队分布在机房运维、芯片设计、硬件、训练、推理、云平台等方向,每年进来几百个新人,沟通频道里被同样的三类问题填满:某个东西在哪里、某件事谁最懂、这个名词是什么意思。

值得看的地方在于它不是演示级的 RAG 搭建教程:日均 15000 次查询跑在真实的公司数据上,而每一层的取舍和阈值都被写了出来,包括 3072 维向量、稀有词门槛 IDF 大于等于 4.0、burst 合并后至少 200 字符、排名融合常数取 60、重排后只留 10 条证据。
Cerebras Knowledge 六层架构总览
原图标注为英文,六层自上而下依次是:
① SOURCES 数据源,Slack、Wiki、代码、事故记录 ② DISTILLATION 蒸馏,模型把原始内容抽成统一结构 ③ EMBEDDINGS 向量,存进 Postgres 的 pgvector,3072 维,用 HNSW 这种索引结构快速找到最接近的向量 ④ RETRIEVAL 检索,六份排名并行 ⑤ FUSION + RERANK 融合与重排,先用倒数排名融合再交给小模型重排 ⑥ SYNTHESIS 合成,给出带引用的答案。来源:Cerebras
设计决定 · 数据放在哪

把资料全搬到一个地方,为什么从来没成过

在公司内部找资料难,难点不在搜索本身,在于资料天生就是散的。每过一个季度,总有人提出同一个「绝妙方案」:以后所有信息都记录到一个平台上,做成唯一的真相源。这个设想在实践中几乎没有成功过。

原因是信息在哪里产生方便,就会在哪里产生:文档里的建议修改、Slack 里的讨论串、GitHub 里的代码引用、Jira 里的状态字段。这些平台各自为自己的场景打磨了很多年。在 Google Docs 里讨论一个 pull request 会是很糟糕的体验。

所以 Cerebras 的第一个决定,是设计一套几乎不要求人改变现有习惯的系统。采集这一侧的做法,就是直接去每个平台把数据抽出来。

搬家方案
  • 要求大家以后都写到统一平台
  • 每个人多一道工序,执行几周后回潮
  • 历史资料还留在原处,两边都不全
连接器方案(他们的选择)
  • 人继续在原来最顺手的地方写
  • 每个源写一个连接器去取数
  • 取回来的东西统一格式,落进同一张表

整套东西的核心,是一张表

这个知识库对外提供三件事:一个存内部数据的地方、一个查这些数据的地方,以及一层做身份认证、权限控制、审计和统计的东西。

核心是一张 Postgres 表,里面同时放着向量、原始摘要和元数据,来源不限。系统持续把公司各处的数据灌进来,维持一个随时可查的状态。数据接口被刻意做得简单:不管来自 Slack 讨论串还是芯片设计用的网表文件,都落进同一张向量表,进了这张表就能被同一套接口查到。

每个数据源只需要定义三件事:这是什么数据、怎么连上去、多久取一次。取回来生成的每一行,字段结构完全一样。

一个源一个连接器,同一张表同一套接口
Slack 频道
Wiki / Confluence
代码仓库
网表文件
内部文档
团队自建数据库
EMBEDDINGS(一张表)
document 归一后的正文
embedding 3072 维向量
metadata 频道、作者、系统
source + 时间戳
MCP 工具网页界面Agent
来源:Cerebras(依原文架构图重绘为中文)。这张表是后面所有机制的公共地基:加一个新数据源,查询侧不用改任何东西。

这个设计还留了一个口子给别的团队。有些团队本来就有自己的数据库,不想为了进知识库把数据挪到 Slack 或文档系统里。做法是把这类源当成插件脚本:团队提一个 pull request,交一个小的 Python 模块,负责从自己的系统读数据、吐出符合那张表结构的行,再配一条数据源记录。只要写进同一个库、用同一套字段,剩下的整条链路一行都不用动。

Slack · 混合检索

Slack 里最难的事,是分不清哪句话有用

Slack 是他们最看重、也最难处理的数据源,公司里最新的工程讨论都发生在那里。一开始他们试过最省事的办法:把原始文本直接做成向量去搜。很快发现单靠向量捞不全。

问题出在聊天记录本身的三个特点。第一,信息密度差得极远,「好的收到,谢谢」和一整段讲内核实现的解释,在系统眼里都只是一条消息。第二,消息长短不一,而短消息在向量相似度上经常压过更长、更详细的那条。第三,一条消息的含义往往取决于它前后的对话。

这三个特点合起来意味着什么

你在群里搜「恢复卡在清单加载之后」。真正解决过这个问题的那条回复,可能一个原词都没用,说的是「checkpoint 在 NFS 挂载点上卡住了」;而字面最像的那条,是八个月前一个已经作废的老办法;至于「好的收到,谢谢」,它和几乎所有问句都有点像。

他们的解法是让同一条内容同时被几种检索方式覆盖,每一种补上别的短板。同一个查询、同一批四条候选,切换打分方式,谁被抬起来、谁被压下去就变一次(数据取自原文示例)。