AI 精准搜索可以通过以下几个关键步骤来实现:
第一种方案会有枚举无法穷尽的问题,第二种方案主要问题在于大模型的识别准确度不够高。意图识别另一个关键作用,是对用户提问进行分类,比如可以把用户的搜索意图分为:导航类:用户希望找到特定的网站或网页。例如:搜索“ThinkAny”,是为了打开ThinkAny官网;信息查询类:用户希望找到某个问题的答案或关于某个事物的详细信息。例如:搜索“什么是AI搜索引擎”,是为了了解这类产品或这个行业;交易类:用户希望进行某种交易。例如:搜索“笔记本电脑”是为了找到电脑相关的产品信息和价格信息,并进入推荐的电商网站购买。本地信息类:用户希望根据特定地理位置查找本地信息。例如:搜索“附近的烤肉店”是为了找到附近的餐馆。还有其他一些分类,包括多级子分类。照样面临枚举无法穷尽的问题。对搜索意图进行分类,可以匹配更准的信息源和更好的回复提示词。比如搜索“笔记本电脑”,如果能提取出一个“shopping”意图,就可以挂载亚马逊/淘宝/京东等电商平台的信息源进行更小范围内的搜索,召回的信息会更加精准。同时也可以加载跟此类搜索意图匹配的提示词模板,来控制搜索后的大模型回答内容。意图分类是搜索前一个非常关键的步骤,可以很大程度提升检索召回率,通过不同的提示词模板总结输出,保证了搜索结果的个性化。目前主流的实现方案,主要是通过提示词,请求大模型完成识别。不管是成熟的大模型,还是微调的小模型,准确度都不够高。大模型提供的Function Calling能力也可以理解为一种意图识别。1.问题改写Query Rewrite
在完成意图识别,确认需要联网检索之后。可以对用户的query进行改写(Rewrite)。Query Rewrite的目的,是为了得到更高的检索召回率。Query Rewrite可以通过设置提示词请求大模型完成。主要包括三个维度的改写:让提问有更精准/更专业的表达比如用户搜索:“ThinkAny”,改写后的query可以是:“ThinkAny是什么?”,再把问题翻译成英文:“What is ThinkAny”,同一个问题,双语分别检索一次,得到更多的参考信息。补全上下文,做指代消解比如用户搜索:“ThinkAny是什么?”,得到第一次回复后继续追问:“它有什么特点?”,用历史对话内容作为上下文,把第二次query改写成:“ThinkAny有什么特点?”,指代消解后再去检索,会有更高的召回率。名词提取比如用户搜索:“ThinkAny和Perplexity有什么区别?”,可以把“ThinkAny”和“Perplexity”两个名词提取出来,分别检索。1.多信息源聚合Multi Source提升AI搜索准确度,另一个关键措施就是做多信息源整合。结合上面提到的意图识别和问题改写,假设用户搜索:“ThinkAny和Perplexity的区别是什么?”,根据意图识别,判断需要联网,并且是信息查询类的搜索意图。在问题改写阶段,提取出来“ThinkAny”和“Perplexity”两个概念名词,除谷歌检索之外,还可以检索Wikipedia/Twitter等信息源,拿到百科词条内容和Twitter的用户反馈信息,可以更好的回答这个问题。AI搜索最大的壁垒在于数据。
多信息源的整合,可能会涉及到海量数据的处理,包括自建信息源索引等技术,传统搜索厂商做这件事会更有优势。依靠UGC建立数据飞轮的超级App,在垂类数据的整合上,也会更有优势。比如腾讯元宝整合的公众号数据,小红书自身的衣食住行攻略类数据,知乎的时事评论数据等,都有比较深的护城河。1.搜索结果重排RerankingAI搜索如果要做多信息源整合,免不了要对多信息源的检索结果做重排(Reranking)。重排的目的主要是两个:过滤掉跟搜索query不相关的参考信息对参考信息的相关性进行排序,便于做上下文挂载时,有限截取权重最高的top_k条记录作为引用参考第一点很好理解,多信息源的检索内容受限于信息源自身的搜索实现,有可能出现搜出来的结果不太匹配的情况。就算是谷歌这种聚合信息源,也会受到SEO的干扰,返回跟搜索query并不匹配的结果。第二点主要考虑到context长度问题,我们可能不太愿意暴力传输所有的检索结果,而是选择其中的top_k条结果,获取详情,再作为上下文挂载内容。Reranking的目的就是为了让最有可能包含准确信息的结果排到最前面,不至于出现信息遗漏。做重排的方案有很多,ThinkAny尝试过的方案有两种:使用zilliz向量数据库+llamaindex框架做相似度匹配使用FlashRank开源框架第一种方案主要问题是效率比较低,第二种方案测试下来准确度不够高。1.搜索内容读取Read Content