你有没有遇到过这种情况:在搜索引擎里输入一个关键词,结果出来的东西却不是你想要的?或者,你想搜某个东西,但不知道用什么词表达才最准确?别担心,"查询扩展"技术可以帮你解决这些问题。
最近,查询扩展这项技术又火了起来。它曾经是搜索引擎的标配,后来因为一些原因沉寂了一段时间。但现在,随着一种叫做"推理式搜索"(Agentic Search)的新技术兴起,查询扩展又重新回到了人们的视野。
为什么需要查询扩展?
我们平时在使用搜索引擎时,输入的搜索词往往比较简短、口语化。这可能会导致两个问题:
- 搜索词太笼统:比如,你想了解“人工智能”的最新进展,但只输入“人工智能”,搜索引擎很难判断你具体想了解哪个方面。
- 搜索词太具体:比如,你想搜某种疾病的信息,但不知道用哪个专业术语表达最准确。
这些问题都会影响搜索结果的质量。即使是更先进的搜索技术,如推理式搜索(Agentic Search),也面临同样的挑战。
什么是推理式搜索(Agentic Search)?
推理式搜索是一种更智能的搜索方式。你可以把它想象成一个聪明的助手,它不仅能理解你输入的关键词,还能根据上下文和你的意图,帮你找到更准确、更全面的信息。
举个例子,如果你搜索"怎么做蛋糕",传统的搜索引擎可能只会返回包含"做"和"蛋糕"这两个词的网页。但推理式搜索会理解你的意图是学习做蛋糕的方法,所以它可能会返回一些更详细的教程、视频,甚至是不同种类的蛋糕食谱。
尽管推理式搜索更智能,但如果我们的搜索词过于简短或模糊,它仍然难以准确把握我们的意图。为了解决这个问题,我们需要一种技术来“扩展”或“改写”我们的搜索词,让它更准确、更全面地表达我们的搜索意图。这就是“查询扩展”技术。
什么是查询扩展?
查询扩展(Query Expansion)是一种优化搜索结果的技术。它的核心思想很简单:在你的原始搜索词里加上一些相关的词,让搜索引擎更容易找到你想要的结果。
比如,你想搜索 “怎么做红烧肉”,查询扩展可能会自动加上 “菜谱”、“做法”、“家常”、“五花肉” 这些词。这样,搜索结果不仅会包含标题或正文中有 “红烧肉” 的内容,还会包含那些教你做红烧肉的菜谱、家常做法,甚至是用五花肉做红烧肉的教程,让搜索结果更全面、更符合你的需求。
-
图 1:使用同义词典的查询扩展流程图
查询扩展可以用于各种类型的搜索引擎,包括传统的关键词搜索引擎和更先进的推理式搜索引擎。对于推理式搜索,查询扩展可以帮助它更好地理解用户的搜索意图,从而提供更相关的结果。
在传统的搜索引擎中,查询扩展主要用于解决以下两个问题:
- 词形变化:同一个词的不同形式(比如“跑”和“跑步”)会被认为是不同的词,导致搜索结果不全。
- 同义词和相关词:如果你搜索“减肥”,传统的搜索引擎可能找不到包含“瘦身”、“减脂”或“控制体重”的网页,但实际上这些词都是高度相关的。
为了实现查询扩展,人们想了很多办法,比如:
- 人工编写同义词词典:就像一本字典,告诉你哪些词的意思是相近的。
- 从大量文章里自动找出相关的词:通过分析哪些词经常一起出现,来判断它们是不是相关的。
- 分析搜索记录:看看大家在搜索类似内容时,还会用哪些关键词。
- 根据用户的反馈:让用户告诉搜索引擎,哪些词是相关的。
语义向量模型与查询扩展
近年来,随着人工智能的发展,出现了一种叫做“语义向量模型”的新技术。你可以把它想象成一种“词语翻译器”,它能把每个词语都翻译成一串数字(我们称之为“向量”)。这些数字代表了词语的意思,而且意思越接近的词,它们对应的数字串(向量)也越接近。
有了语义向量模型,理论上来说,搜索引擎应该更聪明了,查询扩展似乎就没必要了。比如,如果你搜索“怎么做红烧肉”,语义向量模型应该知道“菜谱”、“做法”这些词和“红烧肉”的意思很接近,即使你不输入这些词,搜索引擎也应该能找到相关的菜谱。
但现实情况是,语义向量模型并不完美。它产生的“数字串”(向量)可能会包含一些模棱两可的信息,导致搜索结果不够准确。
举个例子,如果你搜索“苹果”,搜索引擎可能会返回一些关于“苹果手机”的结果,也可能返回一些关于“水果”的结果,还可能返回“苹果公司”的股票信息。但如果你真正想找的是关于“苹果种植技术”的文章,却可能被淹没在其他结果中。如果我们在搜索词里加上“种植”,就能帮助搜索引擎更准确地理解我们的意图,找到更符合我们需求的结果。
用 AI 大模型(LLM)做查询扩展
现在,我们有了更强大的工具来做查询扩展,那就是 AI 大模型(LLM)。
什么是 AI 大模型(LLM)? 你可以把它想象成一个超级博学的“语言专家”,它在海量的文本数据上进行过训练,掌握了丰富的知识和语言能力。
相比传统的查询扩展方法,用 LLM 做查询扩展有几个显著优势:
- 词汇量巨大:LLM 见过很多词,不用担心找不到合适的同义词或相关词。
- 具备一定的判断力:LLM 能初步判断哪些词是和你的搜索主题相关的,而传统方法做不到这一点。它可以帮你过滤掉一些不相关的扩展词。
- 灵活,可定制:你可以根据具体的搜索任务,告诉 LLM 你想要什么样的扩展词。这就像你给 LLM 一个“指令”,告诉它你想要什么样的结果。
用 LLM 生成扩展词之后,接下来的流程就和传统的查询扩展差不多:把这些词加到你的原始搜索词里,然后用语义向量模型生成一个“查询向量”,再用这个向量去搜索。
图 2:使用 LLM 的向量查询扩展
实验:看看查询扩展的效果
为了验证 LLM 辅助的查询扩展到底有没有用,我们做了一些实验。
实验环境
- LLM:我们用了 Google 的 Gemini 2.0 Flash 模型。
- 向量模型:我们用了两种向量模型:jina-embeddings-v3 和 all-MiniLM-L6-v2
- 数据集:我们用了一些公开的搜索测试数据集。
实验方法
我们设计了两种"提示词"(Prompt)来引导 LLM 生成扩展词。提示词就像你给 LLM 的指令,告诉它你想要什么样的结果。
- 通用提示词:适用于各种搜索任务。
- 特定任务提示词:针对特定的搜索任务(比如医学搜索)设计的提示词。
我们还测试了不同数量的扩展词:100 个、150 个和 250 个。
通用提示词的效果
我们发现,下面这个通用提示词效果不错:
Please provide additional search keywords and phrases for
each of the key aspects of the following queries that make
it easier to find the relevant documents (about {size} words
per query):
{query}
Please respond in the following JSON schema:
Expansion = {"qid": str, "additional_info": str}
Return: list [Expansion]
这个提示词可以一次处理多个搜索词,并为每个搜索词生成一个扩展词列表。
我们首先用 jina-embeddings-v3 模型进行了测试,结果如下:
测试集 | 无扩展词 | 100 个拓展词 | 150 个拓展词 | 250 个拓展词 |
---|---|---|---|---|
SciFact(事实核查任务) | 72.74 | 73.39 | 74.16 | 74.33 |
TRECCOVID(医疗检索任务) | 77.55 | 76.74 | 77.12 | 79.28 |
FiQA(金融期权检索) | 47.34 | 47.76 | 46.03 | 47.34 |
NFCorpus(医疗信息检索) | 36.46 | 40.62 | 39.63 | 39.20 |
Touche2020(论点检索任务) | 26.24 | 26.91 | 27.15 | 27.54 |
从结果可以看出,在大多数情况下,查询扩展都能提升搜索效果。
为了验证查询扩展在不同模型上的效果,我们又用 all-MiniLM-L6-v2 模型重复了同样的测试,结果如下:
测试集 | 无扩展词 | 100 个拓展词 | 150 个拓展词 | 250 个拓展词 |
---|---|---|---|---|
SciFact(事实核查任务) | 64.51 | 68.72 | 66.27 | 68.50 |
TRECCOVID(医疗检索任务) | 47.25 | 67.90 | 70.18 | 69.60 |
FiQA(金融期权检索) | 36.87 | 33.96 | 32.60 | 31.84 |
NFCorpus(医疗信息检索) | 31.59 | 33.76 | 33.76 | 33.35 |
Touche2020(论点检索任务) | 16.90 | 25.31 | 23.52 | 23.23 |
从结果可以看出,查询扩展对搜索效果有明显的提升,特别是对于 all-MiniLM-L6-v2 这种较小的模型,效果更明显。
下表总结了各模型在所有任务上的平均提升幅度:
模型 | 100 拓展词 | 150 拓展词 | 250 拓展词 |
---|---|---|---|
jina-embeddings-v3 | +1.02 | +0.75 | +1.48 |
all-MiniLM-L6-v2 | +6.51 | +5.84 | +5.88 |
all-MiniLM-L6-v2 的提升幅度比 jina-embeddings-v3 大很多,这可能是因为 all-MiniLM-L6-v2 模型的初始性能较低。jina-embeddings-v3 模型本身就能更好地理解搜索词的意思,所以查询扩展能提供的额外帮助就比较有限。
但这个结果也说明,查询扩展能显著提升一些性能一般的模型的搜索效果,让它们在某些情况下也能有不错的表现。
针对特定任务的提示词
我们发现,通用提示词虽然总体上有效,但可能会引入一些不相关的词,反而降低搜索效果。所以,我们针对两个特定的搜索任务(事实核查和金融期权检索),设计了更具体的提示词:
Please provide additional search keywords and phrases for
each of the key aspects of the following queries that make
it easier to find the relevant documents scientific document
that supports or rejects the scientific fact in the query
field (about {size} words per query):
{query}
Please respond in the following JSON schema:
Expansion = {"qid": str, "additional_info": str}
Return: list [Expansion]
实验结果表明,这种更具体的提示词,几乎在所有情况下都能提升搜索效果:
测试集 | 模型 | 无拓展词 | 100 拓展词 | 150 拓展词 | 250 拓展词 |
---|---|---|---|---|---|
SciFact | jina-embeddings-v3 | 72.74 | 75.85 (+2.46) | 75.07 (+0.91) | 75.13 (+0.80) |
SciFact | all-MiniLM-L6-v2 | 64.51 | 69.12 (+0.40) | 68.10 (+1.83) | 67.83 (-0.67) |
FiQA | jina-embeddings-v3 | 47.34 | 47.77 (+0.01) | 48.20 (+1.99) | 47.75 (+0.41) |
FiQA | all-MiniLM-L6-v2 | 36.87 | 34.71 (+0.75) | 34.68 (+2.08) | 34.50 (+2.66) |
从上表可以看出,除了在 SciFact 上使用 all-MiniLM-L6-v2 模型并添加 250 个扩展词的情况外,所有设置下的搜索效果都有所提高。
对于 jina-embeddings-v3 模型,我们发现添加 100 或 150 个扩展词的效果最好;添加 250 个扩展词反而会降低效果。这说明,并不是扩展词越多越好,如果加的词太多,反而可能会让搜索结果更差。
查询扩展的优点和挑战
优点
- 能提升搜索效果:查询扩展可以让搜索引擎更好地理解你的意图,找到更相关、更全面的信息。
- 对性能一般的模型效果更明显:查询扩展可以帮助一些性能一般的模型,让它们的搜索效果也能有不错的表现。
挑战
- 成本问题:使用 LLM 会增加搜索的时间和计算成本。如果使用一些收费的 LLM 服务,还会产生额外的费用。
- 提示词的设计:设计好的提示词并不容易,需要大量的实验和调整。而且,不同的 LLM、不同的向量模型、不同的搜索任务,可能都需要不同的提示词。
- 其他优化方法:如果你的向量模型性能很差,直接换一个更好的模型,可能比花时间做查询扩展更划算。
未来方向
虽然查询扩展还有一些挑战,但我们相信它在未来的搜索技术中会发挥重要的作用。我们正在探索以下几个方向:
- 看看查询扩展能不能用来改进文档的向量表示。
- 探索查询扩展在其他 AI 搜索技术(比如重排序)中的应用。
- 对比 LLM 生成的扩展词和传统方法(比如同义词词典)生成
- 专门针对查询扩展任务,训练 LLM。
- 优化扩展词的数量,避免一次性加太多词。
- 研究如何识别好的扩展词和不好的扩展词。
所有代码和实验结果都开源了,欢迎大家围观和复现:
llm-query-expansion: https://github.com/jina-ai/llm-query-expansion/