一句话定义:指令前缀(instruction prefix)是在把一段文本送进嵌入模型(embedding model)之前,按模型训练时的约定贴在开头的固定字符串,用来告诉模型"这是查询还是文档、该按哪种任务来理解它"。
为什么会有这么个东西
E5、BGE 这类模型是专门为检索训练的。训练数据的构造方式很朴素:把查询和它对应的文档拼成一对,让模型学会"这两段向量应该靠得近"。但查询和文档长得不一样——查询短、口语化,文档长、书面化。为了不让模型混淆两种角色,训练时就在前面加标记:查询拼成 query: 怎么退订会员,文档拼成 passage: 退订会员的操作步骤是……。
模型见过上亿条这样的样本,前缀早就成了它判断任务的开关之一。上线推理时你不加,等于给它一个训练时没见过的输入格式,输出的向量方向就会偏,向量检索的召回自然往下掉——而且掉得莫名其妙,因为你查代码找不到任何明显的 bug。
打个比方
这就像图书馆的两种卡片:读者写的是索书单,书架上贴的是书脊标签,格式不同但指向同一本书。管理员是按"两种格式"训练出来的,你递给他一张没有任何格式标记的白纸,他也能看,但会犹豫、会放错位置。前缀就是那个纸头的格式栏。
别和这几个概念搞混
| 概念 | 用在哪 | 谁定的 | 长什么样 |
|---|---|---|---|
| 指令前缀 | 嵌入模型的输入 | 训练时定死,跟模型绑定 | 固定字符串,如 query: / passage: |
| 提示词 prompt | 生成式大模型 | 使用者随写随改 | 自由文本,可以任意发挥 |
| 特殊 token | 模型内部格式 | 分词器或架构决定 | 如 [CLS]、[SEP] |
| 微调">指令微调 | 训练阶段 | 训练者 | 改的是模型能力,不是推理输入 |
关键区别是:前缀不是"写得越漂亮效果越好"的提示词,它是接口的一部分,写死、写错、漏写都算调用错误。
落到实际工作里
第一,建索引的脚本和在线查询的代码必须对齐。常见事故是离线灌库时忘了给文档加 passage:,上线后觉得"模型不行",其实是一半数据格式错了。第二,换嵌入模型时要重读模型页面(model card),前缀约定是逐模型不同的:E5 常见是查询 query:、文档 passage:;BGE 中文系列常见的做法是给查询加一句"为这个句子生成表示以用于检索相关文章:";有些模型只在查询端加指令,文档端什么都不加。第三,检索效果突然变差时,把"前缀是否配对"列进排查清单的前三条。
对普通使用者的意义更简单:如果你在自建知识库或搜索功能里换过模型,却感觉"越换越差",先别怀疑数据,去看看那一行前缀有没有删掉。具体每个模型要加什么,以官方页面为准。
