backgraound-image

向量搜索的局限探究

以 LLM 为基础的知识问答系统构建方法核心在于:

在上一篇文章中进行了实践,发现存在以下问题:

  1. 用户意图识别精度低
  2. 搜索召回精度低

用户意图识别精度低

我们总是期望以较低的成本获得较好的结果。上文中提到搜索 Obsidian,这个意图就是不清晰的,是 Obsidian 的官网,还是插件,还是内容,还是分享,这些都是不明确的。以一个单词快速检索出内心想要的东西,甚至自己都没想明白只有一个关键字,传递给电脑大概率得到的结果也很敷衍。

Zero-Shot Information Extraction via Chatting with ChatGPT: https://arxiv.org/abs/2302.10205

Precise Zero-Shot Dense Retrieval without Relevance Labels 一文面向 zero-shot 场景下的稠密检索,使用基础模型在训练过程中已经掌握的相关语料,面向用户问题,生成虚构的文档。该文档的作用,不是输出最终结果,而是通过 LLM 对问题的理解能力,生成与之相关的内容。这相当于自动化生成相关性标签,避免外部输入。虚构文档生成后,再使用无监督检索器进行 Embedding;然后将生成的向量在本地知识库中进行相似性检索,寻找最终结果。

简单来说就是:

搜索召回精度低

试用向量搜索搜索 Obsidian,在返回结果中可以很明显的发现并不是包含 Obsidian 的结果都得到了返回,同时还会返回语雀、开源笔记等内容,这就是所谓的召回精度低:

这个是由文本转换为向量这个步骤导致的,提高向量维度能解决返回结果不全的问题,但其泛化能力会得到削弱。减少向量维度泛化能力能得到提高,但失去了准确度。这几乎是一个无解的问题,因为我们既想要搜索 Obsidian 的全部结果,又想要与 Obsidian 近义的结果,比如黑曜石,obsidian,ob。1536 维的向量是 GPT 的 embedding 模型推荐的,应该是目前能调的最好的结果。

当然,也可以先进行全文搜索 Obsidainob黑曜石 等关键字,和向量搜索得到的结果一起喂给 GPT,但 GPT 会存在同样的问题。它不会按部就班的返回所有结果,会选择性的对向量搜索得到的结果进行加工。

同样的,如果我在内容中写上:“Obsidian 是一款笔记软件”,“黑曜石诞生于 2020 年”,转化成向量就是两个完全无关的向量了。如果我搜索“Obsidian 在那哪一年开始开发的”,向量搜索大概率不会把上述两个结果同时返回。如果你不给清楚上下文直接送给 GPT,那么大概率还会碰到另一个问题——GPT 瞎编。

上述过程是从无标注文本实现信息抽取(Information Extraction,IE),信息抽取有三类任务:

这是一个分词,词性标注,NER 识别,确定关系(依存关系,并列关系,修饰关系,从属关系,限定词等)的过程。

而这三类任务在知识问答的场景下,可简化为两个过程:

  1. 名词短语提取
  2. 谓语提取

而要做上述两个过程,有下列办法:

  1. LLM 提取:结果不准确、开销大。
  2. 传统 NLP 提取:业界已经有不少传统 NLP 工具可以使用,CoreNLP 和 HanLP 就是就是其中的佼佼者,对中文支持好,依赖少。首先根据正确的词性标注,构建出语法树,从语法的角度提取名词和短语。

该方法的优势在于:

我并没有使用 langchain 实际测试这样做的效果,可想而知这非常受限于文本处理的结果。对于信息提取得好的文本,搜索效果就会好,否则可能不尽如人意。关键词提取,依存句法分析,成分句法分析,构建知识图谱,创建向量搜索,处理问题,调用 LLM,这一系列操作成本颇高,在大量文本面前可能不是个人所能承受的。

总结

综上,向量搜索配合 LLM 想要达到稍微理想的程度,得花大功夫从两方面入手:

  1. 从输入入手,建立问题背景,进行意图识别
  2. 从搜索入手,增加关键字,建立多级索引和知识图谱

这些操作实际上已经和 LLM 没有太大关系了,此时的 LLM 起到汇总和润色的功能。谷歌早就在在搜索引擎上采取 rank,词性识别等操作,其搜索效果依然没有想象中好使。如果想要精确的找到想要的东西,传统搜索方式似乎是更好的选择。

参考链接

WD