图谱只扩候选不改排序,Quanta把三路检索收进单进程

Quanta: A Self-Contained Python Library for Hybrid Retrieval over Quantised Embeddings, Lexical Indexes, and Knowledge Graphs

Ioannis E. Livieris

cs.IR, cs.AI

2026-09-16

开源库把四比特向量、词法检索和图谱遍历收进同一接口。图谱只扩候选再由内容重打分,临床案例把池子放大三点三倍,但没有带标注评测。

这篇在解决什么

一套像样的RAG检索栈,现在经常要同时开向量库、全文搜索、图数据库和文档库。四套系统各自有部署面和故障模式,把它们绑在一起的胶水代码每个项目重写一遍。稠密检索能跨词汇匹配,但在产品编号、法条号、专有名词上掉链;BM25补这块,可两者都用不上语料主人已经知道、文本里却没写的关系,比如某诊断和另一诊断共病、某药和某药相互作用。

Quanta的立场是:三路信号该合成一次检索,不该合成一次运维。它是MIT许可的Python库,把4-bit量化向量检索、Tantivy上的BM25和图谱遍历收进同一个异步SEARCH()。论文写明,这是系统描述,对照检索评测留给以后。

方法

向量压缩全部外包给TurboQuant的实现TURBOVEC,库本身不声称对量化或近似最近邻有贡献。一百万条768维向量、4-bit,约占366 MiB,相对float32的2.86 GiB;搜索对量化后的表示做精确扫描,时间随语料线性增长,没有外部ANN服务。

融合规则用加权Reciprocal Rank Fusion,不把余弦、BM25、跳数压到同一分数轴。作者认为那种归一化依赖查询,病态。文档不在某一腿里就不贡献该项,默认krrf=60。各稠密索引平分wdense,另加wbm25和wgraph。

图谱的用法是这篇跟GraphRAG真正分开的地方。第一遍只用内容和BM25打分,取top GRAPHSEEDK当种子,有界广度优先扩GRAPHHOPS跳。新进来的ID不塞合成分数,而是作为allowlist再跑一遍稠密检索,按与查询的相似度重新排名。默认wgraph=0:图决定谁被考虑,不决定谁排前面。论文算过一笔账:若wdense=0.7、wgraph=0.3,一跳邻居可以压过内容第一名。所以调参方向是种子数和跳数,不是给图加权重。

元数据过滤也走同一套allowlist:先解析谓词拿到合格ID,再只在这些向量上扫,避免「先取top-K再扔掉」把有效K偷偷削掉。可选组件都有空实现,可以从纯向量检索起步,配置打开词法、图、缓存。

结果

随库发布的临床知识图谱是合成数据:100名患者、30名医师、12个ICD-10诊断、12项操作、12种药、5家医院,加上手写的9条COMORBIDWITH和10条INTERACTSWITH。叙事全是希腊文,文本用768维多语句编码器,图像用512维CLIP,全部4-bit,占107.3 KiB,相对float32的858 KiB。

三路稠密索引(诊断、操作、患者摘要)加上BM25,权重wdense=0.5、wbm25=0.3、wgraph=0。k=6、三颗种子、两跳时,第一遍约18个ID,广度优先摸到50个节点,新进41到42个,约70%能被约束重打分,池子大约放大3.3倍。查询「heart failure, dyspnoea」里,E11(2型糖尿病)本来只靠BM25排第六、稠密腿没进top-k;从I50沿共病边扩进来后,稠密项变成0.0025,融合分从0.0046升到0.0071,名次进到第四。纯稠密或稠密加BM25是7到9毫秒,打开扩展后44到115毫秒。

同一底座上的工具agent暴露12个工具。6道未见过的临床题,本地27B开源模型全部答完无报错;工具19到984毫秒,整轮19到32秒,检索占比低于5%。英文转诊问题对上希腊肾病叙事,量化后余弦0.620。

为什么重要

对想上混合检索、又不想同时运维四套服务的小团队,这是一条单进程路径。图当候选扩展器、内容再打分,避免「邻居因为近就被抬到第一」这种常见翻车。allowlist同时服务元数据过滤和扩图重打分,接口干净。4-bit精确扫描在这个体量上够用,检索相对生成几乎可以忽略。

它明确不是一篇证明检索更准的论文。没有相关性标注,没有对照排序器。合成100人图谱上线性扫描能跑,百万级语料上还适不适合,文中没测。

局限与存疑

作者自己把这点写在结论里:观测刻画架构行为,不建立检索优越性。图是语料主人手写的,不是语言模型抽的,所以测的是扩展,不是抽取质量。默认wgraph=0在「扩进来的文档根本没有向量」时不够用,那时图腿必须进融合,又会重新引入跳数压过内容的风险。临床案例的「6题全对」没有对照系统,生成延迟完全压过检索,说明不了检索质量。跨语言0.620只是单点余弦,不是检索指标。搜索对量化表示做精确扫描,语料一大,这条假设会先破。

术语

原文与代码

社区讨论

相关论文

全部论文解读