专名与缩写检索怎么修
专有名词、产品型号与缩写是纯向量检索的弱项:它们在语料里出现频次低,模型的对比学习目标又倾向把语义相近的表述拉到一起,结果就是低频专名在向量空间里被平滑掉,检索时排不到前面。修复思路有三条,且通常组合使用——加一路关键词检索兜住精确词形、维护同义词与缩写词典把不同写法映射到同一概念、把型号等结构化信息写进元数据支持精确过滤。
基本信息
| 问题根源 | 低频词在向量空间被语义平滑,缺乏区分度 |
|---|---|
| 混合检索 | 引入 BM25 或学习式稀疏向量作为第二路 |
| 词典 | 同义词、缩写、旧称到标准名的映射表 |
| 元数据 | 型号、版本等结构化字段支持精确过滤 |
| 维护要求 | 词典要有明确负责人,随产品线更新同步补充 |
典型使用场景
- 产品问答:用户直接输入型号,必须精确命中对应文档
- 技术术语:内部简称与官方名称不一致,需要映射统一
- 错误码检索:一串字符在向量空间里几乎没有语义,靠关键词一路
- 新旧产品名并存:旧称也要能检索到新文档
- 权限与版本过滤:按产品线字段限定范围,避免跨型号召回
同义词与缩写映射
同义词与缩写映射
SYNONYMS = {
'K8s': ['Kubernetes'],
'向量库': ['vector database', '向量数据库'],
'RAG': ['检索增强生成'],
}
def expand(query):
for k, v in SYNONYMS.items(): # 查询改写阶段扩展同义词
if k in query:
query = query + ' ' + ' '.join(v)
return query精确过滤兜底
精确过滤兜底
model_no = detect_model_no(question) # 从问题里抽取型号
if model_no:
hits = store.search(q_vec, filter={'model_no': model_no}, top_k=10)
else:
hits = store.search(q_vec, top_k=10) # 没有型号就走普通语义检索三类问题的修法
| 问题 | 表现 | 主要手段 |
|---|---|---|
| 专名低频 | 语义相近的泛化文档排前 | 混合检索加关键词一路 |
| 写法不一致 | 同一概念多种表述互相不命中 | 同义词与缩写词典 |
| 结构化信息 | 型号、版本无法参与语义匹配 | 元数据字段加精确过滤 |
缩写词典要有维护人和更新流程:新增产品线时同步补充词条,否则新专名从上线第一天起就检索不到,而指标上看不出来是哪一块缺失。