文章目录1. 前言2. ColBERT 是什么2.1 BERT 模型2.2 ColBERT 检索模型2.3 三种架构对比3. 工作流程3.1 文档离线编码3.2 用户查询编码3.3 MaxSim 匹配3.4 计算得分4. 两种场景4.1 召回4.2 重排序1. 前言在之前我们介绍了两种编码器Bi-encoders效果尚可速度很快向量存储开销小。Cross-encoders检索质量最高但速度极慢常用于重排序。那么在召回阶段有没有一种既能接近Cross‑Encoder的细粒度匹配能力又能保留Bi‑Encoder可做大规模向量检索的特性的模型2. ColBERT 是什么2.1 BERT 模型BERT即Bidirectional Encoder Representations from Transformers中文全称基于Transformer的双向编码器表征模型。原始Transformer由Encoder理解文本、Decoder生成文本两部分构成BERT仅使用Encoder模块面向文本理解任务如文本分类、语义匹配、语义向量提取、实体抽取等。BERT本质是基于Transformer Encoder的预训练语言模型采用双向自注意力每个词可以同时看到上下文全部token擅长文本理解类任务情感分析、分类等原生不适合文本生成。BERT的核心特点双向无掩码自注意力读取词语时同时看到整句左右全部内容不会续写新 Token模型输出向量可用于文本分类、实体抽取经过微调如Sentence-BERT后用于语义检索、相似度计算。2.2 ColBERT 检索模型核心思想每个词一个向量而不是每个句子一个向量由斯坦福Omar KhattabMatei Zaharia在2020年正式提出相关资料地址V1版本论文地址ColBERT: Efficient and Effective Passage Search via Contextualized Late Interaction over BERTV2版本论文地址ColBERTv2: Effective and Efficient Retrieval via Lightweight Late InteractionGitHub 地址ColBERT(Contextualized Late Interaction Over BERT) 即基于BERT的延迟交互检索模型它是一种介于Bi-Encoder和Cross-Encoder之间的折衷方案旨在平衡检索速度与匹配精度。ColBERT采用词粒度向量延迟交互打分既能离线预计算实现海量文档快速召回又拥有细粒度语义匹配的高分效果。核心机制逐Token生成向量不为文本生成单一全局向量每个词元独立编码为向量文档向量支持离线预存储保留高速检索能力。延迟交互/MaxSim打分编码时查询与文档互不干涉打分阶段做细粒度匹配查询每个词元匹配文档最优词元取最大相似度求和。以更低算力获得接近Cross‑Encoder的高精度。延迟交互是指文档向量仍然离线预计算好交互只在查询时、在token级进行。这样既保留了token级的细粒度匹配能力又不用像cross-encoder那样每次查询都把query和doc拼起来重跑一遍BERT。2.3 三种架构对比双编码器 Bi-EncoderColBERT延迟交互交叉编码器 Cross-Encoder编码方式query、doc各自独立过 BERTquery、doc各自独立过 BERTquerydoc拼接成一对过 BERT交互时机无交互只用[CLS]向量算余弦编码后逐 token 做 MaxSim 交互编码中全 token 双向交互自注意力文档预计算✅ 可离线建索引✅可离线建索引❌ 每对都要实时算打分粒度粗一个向量 vs 一个向量细token 级最细token 级双向速度最快中MaxSim 计算略贵最慢无法缓存效果一般接近交叉编码器最好通常作精排3. 工作流程工作流程示意图3.1 文档离线编码离线编码属于预处理阶段只在构建知识库的时候执行一次后续线上检索不再重复运行文档编码器以此节省查询耗时。步骤说明文档分句与分词对每一篇原始文档做文本清洗再通过BERT的分词器拆分为独立Token每个Token代表一个最小语义单元。上下文编码将Token序列送入文档编码器f D f_DfDBERT主干网络为每一个Token单独输出一条 768 维上下文向量。这里不会做全局池化操作不会把整篇文档压缩成单个向量完整保留每个词语独立的语义信息。向量持久化与索引构建保存每一组Token向量同时维护「向量→文档ID」的映射关系构建ANN近似检索索引用于后续快速粗召回候选文档。示例候选文档Doc1明珠最喜欢吃桂花糕软糯香甜。Doc2小红爱吃糖葫芦小明爱吃糖炒栗子。Doc3周末一起去爬山风景很美。处理结果文档Token 分词列表文档向量集合Doc1明珠 / 最 / 喜欢 / 吃 / 桂花糕D 1 { d 11 , d 12 , d 13 , d 14 , d 15 } D_1\{d_{11},d_{12},d_{13},d_{14},d_{15}\}D1{d11,d12,d13,d14,d15}Doc2小红 / 爱吃 / 糖葫芦 / 小明 / 爱吃 / 糖炒栗子D 2 { d 21 , d 22 , d 23 , d 24 , d 25 , d 26 } D_2\{d_{21},d_{22},d_{23},d_{24},d_{25},d_{26}\}D2{d21,d22,d23,d24,d25,d26}Doc3周末 / 一起 / 去 / 爬山 / 风景 / 很美D 3 { d 31 , d 32 , d 33 , d 34 , d 35 , d 36 } D_3\{d_{31},d_{32},d_{33},d_{34},d_{35},d_{36}\}D3{d31,d32,d33,d34,d35,d36}阶段特点文档与查询完全分开编码向量之间不会提前计算相似度交互这就是ColBERT「晚交互」范式的前置基础。3.2 用户查询编码查询编码属于在线实时阶段每接收一条用户提问都需要即时执行一次编码流程。问句分词对用户输入的原始问句明珠爱吃啥使用和文档侧完全一致的分词器拆分出Query Token序列保证两边分词规则对齐。Query 编码器生成多向量将分词结果送入查询编码器f Q f_QfQ与文档侧权重共享的BERT模型每一个 Query Token 生成一条独立的上下文向量。和文档编码逻辑保持一致不做均值池化、CLS池化不合并成单一全局向量。保留完整 Query 向量列表传递给后续MaxSim打分模块。查询示例Query 文本Query 分词Query 向量集合明珠爱吃啥明珠 / 爱吃 / 啥Q { q 1 , q 2 , q 3 } Q\{q_1,q_2,q_3\}Q{q1,q2,q3}阶段特点直到当前步骤结束Query向量和文档向量之间没有任何相似度运算语义匹配的交互过程延迟到后面打分环节执行。3.3 MaxSim 匹配MaxSim是ColBERT的核心匹配算子针对每一篇召回后的候选文档独立计算。取出当前待打分文档的全部Token向量集合。遍历Query里的每一个独立Token向量q i q_iqi和该文档全部的Token向量d j d_jdj依次做点积运算得到一组相似度数值。在这一组相似度结果中选取最大值作为这个Query Token对当前文档的匹配得分该运算定义为M a x S i m ( q i , D ) max j ( q i ⋅ d j ) \boldsymbol{\mathrm{MaxSim}(q_i,D)\max_j(q_i\cdot d_j)}MaxSim(qi,D)maxj(qi⋅dj)。对Query中所有Token重复执行上面的操作得到一组独立的MaxSim值。该机制的核心逻辑每个查询词自动在文档里寻找语义最贴合的那个词做匹配不要求词语位置严格对齐实现细粒度的语义对齐。示例查询语句中每个Token向量和每个文档计算出来的相似度Query TokenDoc1最大相似度Doc2最大相似度Doc3最大相似度q 1 q_1q1明珠0.90.10.05q 2 q_2q2爱吃0.80.90.02q 3 q_3q3啥0.30.20.10其中Doc1明珠精准命中文档同名token得分0.9爱吃和文档中的吃语义贴近得分0.8疑问词啥没有直接匹配对象分数偏低。Doc2不存在明珠这个主体因此q 1 q_1q1相似度仅0.1但是包含关键词爱吃q 2 q_2q2拿到高分0.9。Doc3整段文本和用户问句语义无关全部Token的匹配数值都维持在很低的水平。3.4 计算得分步骤详解对单篇文档把上一步得到的全部 Query Token 的 MaxSim 最大值进行累加求和求和结果就是这篇文档最终的全局相关性分数完整公式S c o r e ( Q , D ) ∑ i M a x S i m ( q i , D ) \displaystyle \boldsymbol{Score}(Q,D)\sum_{i}\mathrm{MaxSim}(q_i,D)Score(Q,D)i∑MaxSim(qi,D)。将所有候选文档计算完毕后按照最终得分从高到低降序排列。根据业务需求截取Top‑N结果返回给用户完成检索排序。示例文档MaxSim分数累加过程最终得分相关性排序Doc10.9 0.8 0.3 0.9 0.8 0.30.90.80.32.001Doc20.1 0.9 0.2 0.1 0.9 0.20.10.90.21.202Doc30.05 0.02 0.10 0.05 0.02 0.100.050.020.100.173结果解读Doc1总分最高人物主体、动作语义全部完成高匹配是最贴合用户问题的结果Doc2仅有局部关键词爱吃命中但核心人物不匹配分数低于Doc1对比普通单向量模型ColBERT不会因为单个关键词命中就给出虚高的分数Doc3几乎没有任何语义重合得分最低排在最后。对比传统单向量稠密检索普通模型把整句话压缩为1个向量容易丢失主体细节ColBERT依靠逐词MaxSim累加的方式区分「局部关键词匹配」和「完整语义匹配」检索精度更高。4. 两种场景ColBERT本身是Late Interaction 模型既可以做召回也可以做重排。4.1 召回ColBERT v2论文原生能力文档拆成token每个token单独编码成向量构建token级ANN索引Query编码成query token向量直接在全文档索引里做MaxSim匹配一次性召回候选段落。在召回场景ColBERT的优势比Bi-encoder多向量细粒度匹配不把整句压缩为单一向量避免语义丢失召回准确率更高、歧义适配更强。比Cross‑Encoder支持向量索引、可做全局召回推理速度更快。Bi-encoder快但粗Cross-Encoder精但不能召回ColBERT兼顾细粒度精度与检索速度。4.2 重排序在LlamaIndex中只看到ColBERT作为Rerank没看到召回相关ColBERT重排只对这一小批候选文档计算Query token和Passage token的MaxSim细粒度相似度重新打分排序再取TopN交给LLM✅ 优点算力可控精度接近CrossEncoder速度远快于CrossEncoder。
