一句话定义:双编码器(Bi-Encoder)是把查询(query)和文档(document)分别送进编码器,各自压缩成一个向量(vector),检索时只比较两个向量的距离。
它怎么工作
"双"不是因为一定有两个模型,而是同一套编码器被叫了两次:一次把用户的问题变成一串数字,一次把每篇文档变成同样长度的数字。两边各干各的,互相不知道对方存在。
打个比方:招聘时给每位候选人单独拍一张证件照,再给岗位要求单独拍一张,然后靠比照片相似度来挑人。好处是候选人照片可以提前拍好、批量归档;坏处是照片里看不出这个人和这份工作"聊不聊得来"。
落到工程上就是:所有文档离线编码一次,存进向量库;用户提问时只算一次查询向量,再做近似最近邻搜索(Approximate Nearest Neighbor, ANN)。文档规模到百万级,响应依然在毫秒量级。
和交叉编码器的区别
交叉编码器(Cross-Encoder)把问题和文档拼成一条输入,让两边每个词都互相"打招呼"(注意力交互),判断质量高得多。代价是无法预计算——一万篇文档就得跑一万次模型,检索阶段根本扛不住。
| 维度 | 双编码器 Bi-Encoder | 交叉编码器 Cross-Encoder |
|---|---|---|
| 编码方式 | 查询、文档各自独立 | 拼在一起联合编码 |
| 交互粒度 | 无,只在末尾比向量 | 词级全交互 |
| 文档可否预计算 | 可以,一次编码反复用 | 不可以,每对都要重跑 |
| 速度 | 快,适配海量召回 | 慢,适合小规模精排 |
| 精度 | 够用但偏粗 | 高 |
| 典型角色 | 召回(retrieval) | 重排(rerank) |
它丢了什么
查询和文档从没"见过面",所有信息都要挤进一个固定长度的向量里。词级匹配、否定词、条件限定、数字范围这些细节很容易在压缩中糊掉。所以向量相似度高,不等于答案真的好——"不支持退货"和"支持退货"的向量可能挨得很近。
多向量(multi-vector)检索是折中方案:不把整篇压成一个点,而是保留若干个小向量,索引会变大,计算也更重。
对实际工作的意义
今天主流的AI 词典:检索增强生成">检索增强生成(Retrieval-Augmented Generation, RAG)系统基本都是两段式:双编码器负责从百万文档里捞出几十条候选,交叉编码器再从中精排出前几条喂给大模型。前者决定"有没有捞到",后者决定"排得对不对",两者的调优目标并不相同。
对普通用户来说:搜索能在一瞬间返回结果,多半是它的功劳;偶尔遇到"看着像但答非所问"的召回,也是它为了速度付出的代价。具体的向量维度、模型选型与索引参数,以各官方页面为准。
