Cerebras 内部知识库的实战构建 混合检索如何驯服企业信息洪流

📅 2026/7/17 13:42:51 👁️ 阅读次数 📝 编程学习
Cerebras 内部知识库的实战构建 混合检索如何驯服企业信息洪流

在 Cerebras 这家快速扩张的 AI 芯片公司,每天都有新同事加入。工程师们在 Slack、GitHub、Jira 等不同平台上反复遇到同样的问题:“这个 flag 在哪定义的?”“谁是这个 kernel 的专家?”“这个部署流程最新状态是什么?”

沟通渠道被重复提问堵塞,信息却始终散落在最适合它的地方——讨论线程、代码提交、状态元数据。强行把所有东西搬到一个“单一真相源”平台听起来很美,实际执行却总是失败,因为信息产生的地方永远比你规划的更方便、更专业。

Cerebras 团队没有对抗这个现实,而是构建了一套知识库系统,让数据留在原地,同时提供统一的、高精度的查询能力。上线三个月后,这套系统每天被人类、自动化流程和 AI Agent 提问超过 1.5 万次,成为公司采用率最高的内部工具之一。

这套系统的核心不是“把数据搬走”,而是最小侵入地采集 + 多信号融合检索。信息像水一样,总是流向阻力最小的容器;检索系统要做的是在不改变水流方向的前提下,建立一套能同时听懂“精确词汇”“语义意图”“信号强度”和“时效性”的智能索引。

Slack 线程为什么需要蒸馏 + bursting 两层处理

Slack 是公司最活跃的信息源,但直接对原始消息做 embedding 效果很差。消息长度差异极大,短消息(如“sounds good”)在余弦相似度中经常碾压长消息;一段关键的 kernel 解释可能只出现在长线程的某个 tangent 里;同一个问题的表述在不同人嘴里完全不同。

他们采取了混合策略,每种技术弥补其他技术的短板:

  • 全文检索(Postgres GIN 索引):精确匹配错误字符串、flag 名、主机名。当工程师直接粘贴报错日志时,词法匹配几乎总是最强证据。
  • 蒸馏后的向量嵌入:用 LLM 把整个线程提炼成结构化数据——工程师会实际搜索的单行问题、简短摘要、解决方案、提到的系统和代码引用。再对这些结构化内容做 embedding,而不是原始 transcript。实验显示,规范化后准确率显著提升。
  • Bursting(爆发片段):把同一作者连续的消息作为一个 burst,用线程主题作为上下文前缀单独 embedding。只有满足以下条件的 burst 才会被保留:包含全库稀有 token(IDF ≥ 4.0)、总长度 ≥ 200 字符、至少有一个 reaction 提供社交信号。

这样既保留了线程整体语义,又不会让重要但孤立的 tangent 消息被淹没。

实时采集通过 Slack Bot 的 Socket Mode 实现。新消息到达后立即确认、去重,然后重新拉取整个线程(包括 parent 和所有回复),以一条记录的形式写入。这样存储的内容、参与者列表和最后活跃时间始终是完整的对话快照。

代码库与自定义数据源的统一处理

代码仓库最初被认为“grep 就够了”,但实际使用中发现,语义搜索在大型代码库中能找到 grep 漏掉的跨文件关联。他们采用 CocoIndex 框架,按语言特定规则做层级切分(先尝试类边界,再退化到方法、块),生成文件级和函数级多粒度 embedding。

关键是增量同步:CocoIndex 只在 commit 时重新处理变更的 chunk,同步状态和向量存储在同一 Postgres 库里,效率极高。团队甚至把仓库 onboarding 做成配置文件,支持路径级 allowlist/denylist。

对于已经有自己数据库的团队,不需要迁移数据。只要写一个小的 Python 插件脚本,按统一 schema 把数据写入 embeddings 表,就自动成为可查询的一部分。整个栈对新数据源零特殊处理。

查询侧的规划、重排序与上下文补全

单纯把所有 retriever 结果混在一起还不够。Cerebras 在查询时先跑一个轻量规划 LLM,根据问题和当前 project 决定调用哪些工具:

  • subsystem_index(文件级 LLM 摘要)
  • 统一向量搜索
  • search_slack / search_code
  • who_knows(识别领域专家)
  • recent_prs 等

多个 retriever 的结果先用Reciprocal Rank Fusion (RRF)融合,再交给一个小重排序模型打 0-10 分,保留 top 10。RRF 的平滑常数让“多个列表都靠前”的文档胜过“只在一个列表里排第一”的文档。

最终结果还会把上下文补回来——匹配到 wiki 某段时,同时拉前后两段,避免 chunking 切断前提条件和注意事项。

MCP 与 Web UI 的双轨设计

他们把检索原语暴露为 MCP(Model Context Protocol)工具:search_slack、search_code、who_knows 等都保持简单、结构化、尽量不依赖 LLM。Claude Code 这类 Agent 可以自己决定调用顺序和组合结果,检索层不把编排逻辑硬编码进去。

Web UI 则走完整 pipeline(Planner → Executor → Synthesis),对用户呈现为“直接问问题就行”。

项目 scoping:让默认搜索就高相关

随着语料增长,“搜遍一切”很快失效。编译器团队不想看到运维 runbook,反之亦然。他们引入Project概念,把相关 Slack 频道、代码仓库、文档空间打包成一个轻量 bundle。同一个数据源可以被多个 project 引用。

新员工 onboarding 时选择或创建默认 project,后续查询自动限定在高信号范围内。

不同检索信号的权衡对比

检索技术核心优势主要局限典型适用场景Cerebras 融合方式
Full-text (GIN)精确匹配错误字符串、flag 名无法处理同义表述直接复制报错日志基础必备信号
Vector Embedding捕捉 paraphrase 和语义意图短消息偏好、忽略稀有 token问题与答案用不同词汇蒸馏后使用
IDF 加权突出稀有高价值信号对常见词惩罚过重obscure 配置 flagBurst 过滤阈值
Age Decay优先新鲜、未过时的信息可能错过经典但仍有效的方案基础设施快速迭代场景最终排序加权
RRF + 小模型重排序多源共识 > 单一强信号增加少量计算延迟复杂跨源问题最终 top 10 筛选

这套混合方案的本质,是把多个不完美的检索器变成一个鲁棒的“证据包”。

为什么这套系统能长期有效

信息不会因为你想统一它而移动,它只会待在最舒服的地方。Cerebras 的做法是承认这个事实,然后在不改变开发者工作流的前提下,建立了一层能同时理解“精确词汇”“语义意图”“信号稀有度”和“时效性”的智能索引。

当 AI Agent 开始大规模参与内部流程时,这种“原生多源、混合检索、可被 Agent 直接调用”的知识层,会成为比任何单一平台更重要的基础设施。


如果你正在设计类似系统,你会如何在 full-text 和 semantic 之间设置初始权重?或者在你的团队里,信息检索最大的瓶颈目前是 Slack 线程太长,还是代码搜索不够语义化?欢迎在评论区分享你的真实场景。

我是紫微AI,在做一个「人格操作系统(ZPF)」。后面会持续分享AI Agent和系统实验。感兴趣可以关注,我们下期见。