一些纯语言模型,比如GPT-4,虽然也很强大,但它们的知识都是在训练时就固定下来的,无法实时更新。这就意味着,它们无法获取到训练之后出现的新信息。所以,对于一些需要最新信息,或者是一些特定场景的问题,纯语言模型可能无法给出满意的答案。
对于不同类型和语言的文件,我们需要选择适当的RAG技术。例如,对于PPT和PDF这些主要包含文本和图像的文件,我们可能需要使用能够理解和生成图像描述的模型。对于CSV和Excel这些主要包含结构化数据的文件,我们可能需要使用能够理解和生成数据摘要的模型。此外,不同语言的文件可能需要不同的嵌入模型以适应不同语言的语义。
因此,当我们描述问题时,有时并不清楚我们的提问是否与提供的文本表达存在歧义,或者当我们只有模糊的记忆,只知道一两个词时,向量库的语义搜索往往无法满足我们的需求。
因此,如果我们能够结合关键词和语义进行同时检索,就能够进一步提高我们的RAG的准确度。这种混合检索方法可以在保证搜索效率的同时,提高搜索的准确性和全面性。具体来说,当我们的问题描述不清楚,或者记忆模糊只知道一两个关键词时,混合检索方法可以通过关键词匹配找到可能的答案,然后结合语义匹配来进一步提高答案的准确性。
BM25 是一种基于概率的排名函数,用于信息检索系统。BM25原理是根据查询词在文档中的出现频率以及查询词在整个文本集中的出现频率,来计算查询词和文档的相似度。BM25模型的主要思想是:如果一个词在一份文档中出现的频率高,且在其他文档中出现的频率低,那么这个词对于这份文档的重要性就越高,相似度就越高。BM25模型对于长文档和短文档有一个平衡处理,防止因文档长度不同,而导致的词频偏差。
以下是使用Langchain进行混合检索的示例代码:
Llamaindex 使用的方法叫做 HybridFusionRetrieverPack,与 Langchain 的主要区别在于,它在进行混合检索之前,还会根据我们搜索的内容用大模型生成几条类似的提问,以提高我们提问的泛化能力。这种方法可以更有效地处理我们的模糊记忆和不确定的问题描述,使我们的搜索更加精确和全面。
其他的模型也是利用了BM25还有Embeding模型,但是Llamaindex主要还是对openai的支持比较好,所以它默认是用openai 的embeding模型的,如果你想要使用其他的Embeding模型,就需要将这些模型挂载到OneAPI上,通过配置key和base_url来转接调用
相当于它就会根据what is the main content?来生成5条差不多意思的句子然后再进行Langchain的那个操作
由于BM25模型主要依赖于词频来判断文档和查询词的相似度,因此当我们输入的词被错误地分词,或者当我们搜索名字或者号码这类内容时,模型的效果可能会大打折扣。这是因为在这些情况下,词频可能并不能准确地反映出查询词和文档的相关性。例如,一个人的名字在一篇文档中可能只出现一次,但这并不意味着这篇文档与查询词不相关。同样,如果我们在搜索电话号码时,由于电话号码通常是一长串数字,因此它的词频很可能非常低,但这并不影响其对于查询结果的重要性。因此,尽管BM25模型在许多情况下都能提供满意的检索效果,但在处理此类问题时,它的性能可能会大大降低。
因此,为了解决这个问题,我们可以考虑引入ElasticSearch。ElasticSearch是一个开源的、分布式的、RESTful搜索引擎,它的设计使得它非常适合执行诸如全文搜索、结构化搜索、实时聚合等复杂的搜索、分析任务。其内部使用Lucene作为索引和搜索的引擎,并做了很多优化和改进,使得ElasticSearch在处理复杂搜索时性能更高,使用更方便。
首先,我们可以尝试使用ElasticSearch进行纯关键词搜索。纯关键词搜索是最简单的一种搜索方式,不需要进行任何预处理或向量化,只需要对输入的关键词进行精确匹配。这种搜索方式的优点是简单、快速,但缺点是可能会漏掉一些含义相关但没有使用相同关键词的文档。但是,对于一些简单的、明确的搜索需求,纯关键词搜索是一个非常有效的方法。
搜索一个不知道是什么的词
结果如下,他还是能够精准识别出来,效果很不错
首先,我们需要安装并配置Elasticsearch。一旦Elasticsearch安装并运行,我们就可以创建一个索引,并将我们的数据添加到这个索引中。一旦数据被索引,我们就可以使用Elasticsearch的搜索API来查询数据。
下面是一个使用Elasticsearch进行混合识别的示例:
** 注意:有一个坑就是如果要使用ElasticSearch的这种混合检索,需要使用它的付费版本,所以如果真的需要混合检索可以用ElasticSearch的关键词再和普通向量检索的结果直接拼接去重融合就好了
不同的Embeding模型以及不同的RAG优化方法适用于不同的文本内容,我们需要根据实际情况进行选择和优化。例如,对于一些具有特定术语或者专业知识的文本,我们可能需要使用特定的嵌入模型以更好地理解和表示这些特定的词汇。同样,对于不同的搜索需求,我们可能需要调整我们的RAG策略,例如调整关键词和语义的权重,或者调整我们的向量库的大小和复杂性。这需要我们在实践中不断尝试和优化,以找到最适合我们需求的模型和策略。