查询指令与非对称检索
检索天然是不对称的:查询通常只有几个词,文档却是成段的文字,两者在语义空间里并不天然对齐。针对这个差异训练的模型会要求在查询侧加一段任务指令或前缀,把“这是一次检索请求”的意图显式告诉模型,例如为这个句子生成表示以用于检索相关文章。文档侧通常不加指令,因为文档本身就是被检索的对象。关键点是:不同模型的要求互不通用,必须逐个按模型卡核对,加错方向比不加更糟。
基本信息
| 适用场景 | 查询短、文档长的不对称检索 |
|---|---|
| 查询侧 | 按模型卡添加检索指令或前缀 |
| 文档侧 | 通常不加指令,保持原文编码 |
| 模型差异 | BGE-zh 系列建议加指令,E5 用固定前缀,部分模型完全不加 |
| 错误代价 | 加错方向或只加一侧,效果下降且无报错 |
典型使用场景
- 中文短查询检索长文档:查询侧指令帮助模型理解检索意图
- 模型迁移:从 BGE 换到 E5 或其它模型时,先核对指令规则再改代码
- 封装隔离:把指令拼接写进 encode_query,避免调用方各自实现
- 质量回归:每次调整指令措辞都在固定评测集上看 Recall@k 变化
- 排错线索:检索结果整体不相关时,先确认两侧的指令与前缀是否配对
查询侧加指令
查询侧加指令
INSTRUCTION = '为这个句子生成表示以用于检索相关文章:'
def encode_query(q):
return model.encode(INSTRUCTION + q, normalize_embeddings=True)
def encode_document(text):
return model.encode(text, normalize_embeddings=True) # 文档侧不加
qv = encode_query('如何配置超时')常见模型族的规则
| 模型族 | 查询侧 | 文档侧 |
|---|---|---|
| BGE-zh v1.5 等 | 建议加一句检索指令 | 不加 |
| E5 / multilingual-e5 | 固定前缀 query: | 固定前缀 passage: |
| 部分通用句向量模型 | 不加 | 不加 |
| 重排模型 | 不适用(按查询片段对直接打分) | 不适用 |
把指令与前缀写成不可变常量并加单元测试:手写字符串容易多一个空格或写错冒号,这类错误不会抛异常,只会让检索质量悄悄下降。