你搜一个东西时,gbrain 在背后怎么找
你开始用 brain 了。某天你搜「特斯拉 2024 Q3 财报」,蹦出来的结果很准;另一次你搜「我长期持有的底层逻辑」,它也懂你意思。你可能会想:它到底是怎么找到的?为什么有些系统你搜专有名词搜不到、搜语义又答非所问,而这里两样都还行?
这一课讲 gbrain 的检索怎么工作——但重点不是术语,而是理解它为什么要把两种找法叠在一起。
一、两种找法,各有所短
人类找东西其实有两套直觉。一套是「按名字认人」:你搜「特斯拉 2024 Q3 财报」,脑子直接匹配这几个 exact 词。另一套是「按意思找」:你搜「长期持有的逻辑」,你并不指望哪个文件正好叫这名,你是要它懂你的意思、把相关的都拎出来。
计算机也对应两种检索。关键词检索(BM25) 干第一套——精确匹配词面,专有名词、财报编号、人名这种它极强。向量检索 干第二套——把你的查询和每篇笔记都变成一串数字(embedding),比「意思相近」而非「字面相同」,所以搜语义它行。
问题来了:只用语义(向量),碰到「特斯拉 2024 Q3 财报」这种有标准名字的东西反而弱——它可能在意「财报」的语义而放过了精确的那篇。只用语义,gbrain 自己的评测里 P@5 只有 18(满分 100 里的前 5 命中率)。只用关键词呢?能到 38,但仍不懂你的弦外之音1。
二、所以两路一起跑,再融合
gbrain 的做法朴素但有效:关键词和向量两路同时召回,各给一份候选列表,再用一个叫 RRF 的融合公式把它们并成一张总排名。RRF 不关心两路各自的分数绝对值,只在意「一个东西在两路里分别排第几」——排得越靠前,融合分越高(公式里那个常数 60 只是调节两路权重的旋钮)2。
融合之后还会叠几层微调:标题命中的提一点权重、某些来源提一点权重,最后用一个交叉编码器做精排(reranker)对前排结果做精细重排。评测里这一步会重排掉约 60% 的榜首结果——说明初排和精排看到的「最相关」并不总一致,精排值得做3。
把两路叠起来后,gbrain 的 P@5 从单路的 18 / 38 跳到 49,叠加图谱后到 97.9 的召回率。这就是「混合」的 payoff:没有一种检索通吃,但叠起来几乎不漏1。
三、一个让人安心的保底
你亲手修订过的笔记,是你在 brain 里最权威的版本。gbrain 在去重阶段有个保证:每篇返回的结果里,至少保留一个你修订过的权威版本片段(compiled_truth),不会被模型生成的摘要挤掉4。对使用者意味着:你花心思改过的投资结论,搜的时候一定有一席之地。
还有个细节关乎「旧归档不要丢」:像 archive/ 这种老目录,gbrain 不会硬隐藏它,只是降一点权重——你仍能搜到,只是默认排在后面5。
四、一个建筑师会记下的
检索质量不是靠「换个更强的向量模型」就能大幅提分的。gbrain 的评测清楚显示,图谱和抽取质量才是那道「承重墙」——光调向量模型,P@5 卡在 18;加上图谱与结构化抽取,才冲到 49。所以如果你造自己的工具,别把钱全砸在 embedding 模型上,结构化的图谱和抽取往往更值1。后面第 5 课会专门讲图谱和矛盾探针。
五、这一课带走的
- 你搜专有名词靠关键词、搜意思靠向量;gbrain 两路同跑、RRF 融合,比任一路都准。
- 融合后还有 reranker 精排,约六成榜首会被重排。
- 你修订过的权威版本,检索时必有一席(compiled_truth 保底)。
- 老归档不会被藏起来,只是降权。
练习题
只用语义(向量)检索「特斯拉 2024 Q3 财报「这类专有名词,gbrain 评测里 P@5 大约多少?
gbrain 怎么把关键词和向量两路结果合到一起?
compiled_truth 保底保证什么?
archive/ 这类老目录在检索里怎么处理?
参考出处
Footnotes
-
文档
docs/architecture/RETRIEVAL.md§「Benchmark」(BrainBench 表:纯向量 P@5=18.0/R@5=66.9、BM25 P@5=38.1/R@5=92.9、gbrain 全栈 P@5=49.1/R@5=97.9;「+31 P@5 points from the graph + extract quality work. The graph isn’t a marginal feature; it’s the load-bearing wall.」)。 ↩ ↩2 ↩3 -
代码
src/core/search/hybrid.ts(RRF score = sum(1 / (60 + rank_in_list));export const RRF_K = 60;注释:「a boosted chunk inside the first 60 ranks outranks an unboosted rank-1 chunk」)。 ↩ -
代码
src/core/search/mode.ts(reranker_model: 'zeroentropyai:zerank-2',balanced/tokenmax 默认开启、conservative 关闭);文档docs/architecture/RETRIEVAL.md§「Pipeline」(zerank-2「reshuffles 60% of top-1 results」)。 ↩ -
代码
src/core/search/dedup.ts(「Compiled truth guarantee: ensure at least 1 compiled_truth chunk per page」;final pass 为无 compiled_truth chunk 的页补回代表)。 ↩ -
代码
src/core/search/mode.ts(issue #1777:「archive/ moved from DEFAULT_HARD_EXCLUDES to a 0.5 source-boost demote」——archive 内容不消失、仅降权,仍可被召回)。 ↩