当我们用LangChain对接搜索引擎搭建AI问答系统时,经常会遇到一个让人头疼的问题:搜索引擎返回的十几二十条结果里,总有不少内容重复、主题重叠或者带无关广告的冗余信息。这些冗余内容不仅会浪费模型的上下文空间,还容易让AI被重复信息带偏,答非所问。
一、应用场景:什么时候需要过滤冗余结果?
最典型的场景是本地生活类AI助手,比如用户问“杭州西湖周末亲子游路线”,搜索引擎返回的结果中,有三条都是同一个亲子乐园的内容,还有两条是西湖同款游船的介绍,核心内容几乎完全重合。这类冗余结果会让AI在整理信息时做大量重复工作,甚至出现“重复说同一句话”的情况。另一个常见场景是学术类问答,比如用户问“机器学习的分类算法”,结果里会有好几篇同一会议的论文的不同转载版本,内容高度重叠,没有补充信息,属于典型的冗余。此外,当用户搜索“减肥食谱”时,结果里会有大量带“减肥代餐广告”的无关内容,也需要过滤。
二、搜索引擎召回结果的冗余类型
这些冗余结果主要分为三类,每一类的过滤逻辑差异明显:
2.1 内容完全重复
比如同一个网页的不同镜像站点、重复的新闻稿件,连文本内容、标题、段落都完全一致,没有任何有效补充信息,属于最容易识别的冗余。
2.2 主题高度重叠
这是最常见的冗余类型,比如多条结果都在讲“北京烤鸭的家常做法”,只是换了不同厨师的名字,或者把“烤鸭”说成“北京特色烤鸭子”,核心主题和内容相似度超过80%,只是措辞略有调整。
2.3 格式性冗余
这类结果本身有有效内容,但附带了大量无关信息,比如页面底部的版权声明、跳转广告提示、二维码链接等,这些内容和用户的搜索主题完全无关,属于“无效冗余”。
三、过滤规则的核心设计方案
我们可以根据不同的冗余类型,设计对应的过滤规则,以下三种方案覆盖了大部分场景,且代码实现简单,适合开发者快速落地:
3.1 基于文本重合度的过滤方案
这个方案的核心是计算两个结果文本的相似度,超过设定阈值就判定为冗余,只保留一条最完整的结果。比如两条结果:“北京早餐推荐:豆汁儿配焦圈,炒肝是必吃”和“北京早餐必选:豆汁儿搭配焦圈,炒肝不能少”,两者的相似度超过70%,就过滤掉其中一条。 以下是完整代码示例,技术栈统一用Python,依赖LangChain和文本相似度计算工具:
# 技术栈:Python + LangChain + sentence-transformers
from langchain.embeddings import HuggingFaceEmbeddings
from sentence_transformers.util import cos_sim
# 初始化文本向量模型,用来计算两个文本的相似程度
embeddings = HuggingFaceEmbeddings(model_name="all-MiniLM-L6-v2")
# 模拟搜索引擎返回的3条结果,其中前两条是冗余的
search_results = [
"北京早餐推荐:豆汁儿配焦圈,还有炒肝是经典早点",
"北京早餐必吃选择:豆汁儿搭配焦圈,炒肝值得尝试",
"上海早餐推荐:生煎包配咸豆浆,是本地特色"
]
# 过滤规则:相似度超过0.7(即70%)则判定为冗余,只保留一条
filtered_results = []
for result in search_results:
is_redundant = False
# 和已经筛选过的结果逐一对比相似度
for kept in filtered_results:
# 计算两条文本的余弦相似度(数值越大越相似)
similarity = cos_sim(embeddings.embed_query(result), embeddings.embed_query(kept)).item()
if similarity > 0.7:
is_redundant = True
break
if not is_redundant:
filtered_results.append(result)
print("过滤后的有效结果:", filtered_results)
3.2 基于主题关键词匹配的过滤方案
这个方案针对“主题高度重叠”的冗余,核心是提取搜索query的核心关键词,然后检查每条结果的关键词匹配度,只保留匹配度最高的结果,或者去掉匹配度不足的结果。比如用户query是“Python操作Excel的方法”,核心关键词是“Python, Excel, 操作”,结果里有两条都用了openpyxl库,但其中一条提到了pandas,匹配度更高,就保留这条,过滤掉只讲openpyxl的那条。
3.3 基于来源可信度的过滤方案
这个方案针对“格式性冗余”和低质量结果,核心是提前建立一个可信来源库,比如官方网站、权威媒体的域名,过滤掉来自低质量博客、广告站点的结果。比如用户问“新冠疫苗接种注意事项”,只保留卫健委官网的结果,过滤掉个人博客里的“随便转载的旧信息”或者“带推销的广告内容”。
四、各方案的技术优缺点
4.1 文本重合度方案
优点是:计算速度快,代码实现简单,不需要复杂的预处理,适合快速验证需求;缺点是:对调整语序、替换同义词的情况识别不足,比如“焦圈配豆汁儿”和“豆汁儿配焦圈”的相似度会降低,容易漏判,且无法区分“主题相似但内容互补”的结果。
4.2 主题关键词方案
优点是:能精准识别核心主题,适合检索类问答场景,过滤效果更灵活;缺点是:需要提前处理query的关键词,对模糊查询(比如“最近好吃的”)的关键词提取困难,且无法识别替换了核心词的情况,比如把“Excel”说成“表格工具”。
4.3 来源可信度方案
优点是:能有效过滤低质量结果,提升问答的权威性,适合需要专业信息的场景;缺点是:需要维护可信来源库,更新麻烦,且无法处理同一权威网站下的重复内容,比如国家卫健委官网的同一内容的不同页面。
五、落地时的注意事项
5.1 阈值要灵活调整
不能用统一的阈值,比如文本长的结果,相似度阈值可以设为0.8,文本短的结果(比如一句话的广告),阈值可以设为0.6,避免误删有效内容。
5.2 混合多个方案提升效果
单独用一个方案的过滤效果有限,最好先用来源可信度过滤低质量结果,再用文本重合度过滤内容重复的结果,最后用主题关键词过滤剩下的重叠结果,多重过滤能大幅提升质量。
5.3 保留内容互补的结果
比如两条结果,一条讲“北京早餐的历史”,另一条讲“北京早餐的推荐店铺”,虽然主题都围绕北京早餐,但内容互补,就不应该过滤,需要在规则里加例外条款,避免误删有效信息。
六、总结
LangChain对接搜索引擎时,冗余结果的过滤是提升问答质量的关键一环,不需要追求复杂的算法,用生活化的规则就能解决大部分问题:“内容太像的留一条”“来源靠谱的优先留”“无关信息直接去掉”。通过设计符合自身业务场景的过滤规则,既能让AI的上下文更高效,也能让模型输出更准确、更实用的回答,避免被冗余信息带偏。
评论
围绕“LangChain对接搜索引擎时召回结果冗余的过滤规则设计方案”参与讨论