最近,在RAG应用中进行向量搜索非常流行。我看到它被强行应用于每一个角落,无论是否需要。根据我的经验,当您处理少量代表各种不同主题的文章时,它表现得尤为出色。
然而,让我告诉你,在你需要绝对精确的情况下,尤其是在创建类似文档的领域,向量搜索开始显示出它的不足。我亲身经历后发现,它并不总是像人们所说的那样神奇。混合搜索也是如此。
在我们在EXTRACTUM开发的项目中,我们发现对于特定类型的文档,特别是像财务报告和法律文件这样复杂的文档,向量搜索效果不佳。
这在处理某些领域中具有特殊含义的词语时是一个大问题。例如,在法律、医疗或土木工程项目中,向量搜索经常会混淆术语。比如“抗拉强度”和“极限强度”。这些词语对嵌入模型来说可能看起来很相似,但对于专家来说,它们的含义却大不相同。
这表明我们需要更好的方法来搜索那些需要深入了解特定主题和术语的文档。虽然向量搜索对于某些事情很有用,但它并不是每种情况下的最佳选择,尤其是在我们需要理解含义的细微差别时。
虽然可以找到特定领域的预训练嵌入模型,或者花费时间微调现有的模型,但这些解决方案往往无法捕捉细微的差异或在大型数据集中定位特定的数值。
全文搜索(FTS)自20世纪70年代以来一直是一种可靠的方法。它为我在使用RAG系统时遇到的这些精度问题提供了解决方案。FTS擅长找到包含特定值和关键词的确切相关片段。
与基于嵌入的方法不同,全文搜索(FTS)保留了特殊术语、特定领域的关键实体、数值和特殊标记。它特别擅长在大型数据集中定位精确细节。
理想情况下,全文搜索(FTS)应成为大多数场景下的默认选择。然而,在以下情况下,基于向量的搜索可能是可以接受的:
对于特定领域的术语、专业术语或涉及数字的内容,FTS相比基于嵌入的方法提供了更优越的结果。
我发现嵌入方法对于那些不想费劲准备关键词和查询的人来说简直是救星。它非常简单:只需为你的段落和用户的提问计算嵌入,然后让余弦相似度发挥作用(同时你可以祈祷得到相关的结果 ;-)).
另一方面,基于关键词的搜索则需要多做一些准备工作:
最终,你的投入将会是值得的。在我的项目中,我发现仔细关注这些步骤会显著提高信息检索的准确性。从而也提高了RAG的准确性。
现在是时候探索技术方面了。考虑一个用户查询:
你能提供关于针对种子阶段初创企业的有效路演技巧的文章或资源的信息吗?
在聊天机器人中,我们需要定位合适的文章,将其输入语言模型,并作为聊天机器人的响应呈现。让我们看看如何使用全文搜索(FTS)实现数据检索。显然,我们首先需要构建查询的关键实体列表。
为了创建一个有效的关键词列表,我遵循以下准备步骤:
所有这些指令都可以打包到一个提示中。
LLM 对上述示例的输出可能如下所示:
"paraphrased": [ "有哪些关于为寻求种子轮融资的早期创业公司准备演讲策略的资源?", "在哪里可以找到关于为种子阶段的创业公司创建有效演讲的文章?", "是否有任何关于为种子阶段的创业公司打造引人注目的演讲的资源或指南?" ], "expanded": [ "种子阶段的创业公司有效的演讲有哪些关键要素?", "为种子轮融资做演讲与其他阶段的创业融资演讲有何不同?", "UPTEC是否有即将举行的关于早期创业公司演讲培训的活动或研讨会?", "种子阶段的创业公司在向投资者演讲时应该避免哪些常见错误?" ], "keywords": { "演讲技巧": [ "演讲策略", "演讲技巧", "电梯演讲" ], "种子阶段的创业公司": [ "早期公司", "初创企业", "新兴企业" ], "文章": [ "资源", "指南", "出版物", "材料" ], "有效的": [ "成功的", "有影响力的", "有说服力的", "引人注目的" ], "UPTEC": [ "U.Porto 科技园", "波尔图大学孵化器" ], "资源": [ "工具", "信息", "支持", "帮助" ], "创业公司": [ "新公司", "创业企业", "创新公司" ], "演讲": [ "展示", "提议", "展示", "推销" ], "种子融资": [ "初始投资", "早期融资", "种子资本" ] }
一个小注: _我喜欢用一个SQLite3数据库开始项目,它具有很好的全文搜索(FTS)功能,特别是FTS5功能。之后,可以迁移到PostgreSQL FTS或其他任何数据库。关于表结构,我通常为每个表创建一个专用的FTS SQL表,其中包含一个“combined_content”列,该列将行中的所有列用空格分隔符连接起来,并且包含一个“originalid”外键,用于后续与原始表进行JOIN操作。
下一步是创建一个SQL查询。构建一个MATCH条件,该条件:
一个对应的 FTS5 MATCH 字符串可能如下所示:
MATCH NEAR(创业技巧种子阶段初创公司文章有效UPTEC资源初创公司融资技巧,2) OR NEAR(创业* 技巧* 种子* 阶段* 初创* 公司* 文章* 有效* UPTEC* 资源* 初创* 公司* 融资* 技巧*,3) OR (创业* AND 技巧* AND 种子* AND 阶段* AND 初创* AND 公司* AND 文章* AND 有效* AND UPTEC* AND 资源* AND 初创* 公司* AND 融资* 技巧*) OR NEAR(创业* 战略* 展示* 技能* 展示* 早期* 阶段* 公司* 初创* 业务* 初创* 企业* 资源* 指导* 公开* 材料* 成功* 影响* 说服* 强制* 波尔图* 科技* 公园* 大学* 波尔图* 孵化* 工具* 信息* 支持* 协助* 新* 业务* 创业* 创新* 公司* 展示* 提出* 展示* 销售* 初创* 投资* 早期* 阶段* 财务* 种子* 资本*,6) OR (创业* OR 技巧* OR 种子* OR 阶段* OR 初创* OR 公司* OR 文章* OR 有效* OR UPTEC* OR 资源* OR 初创* 公司* OR 融资* 技巧*)
查询本身将看起来像
SELECT article.title, article.content, article.combined_content, bm25(article_fts) AS rank FROM article JOIN article_fts ON article.rowid = article_fts.original_id WHERE article_fts MATCH … ORDER BY rank LIMIT …
此查询搜索确切条目、词形还原条目、同义词和单个单词,并使用BM25算法按相关性排序。
虽然大型语言模型(LLM)可以生成SQL查询,但手动编写的查询通常能提供更好的控制和准确性。根据我的经验,使用LLM进行关键词提取并程序化地处理查询构建更为可靠和有效。
在RAG应用中的向量搜索存在限制,特别是对于需要绝对精确或特定领域知识的文档。
全文搜索(FTS)为复杂的文档(如财务报告和法律文件)提供了更高的精确度。
FTS 在保留特殊术语、特定领域实体和数值方面表现出色。
选择全文搜索(FTS)而非向量搜索当:
实现全文搜索需要更多的初期努力,但能获得更好的准确性:
对于最优的全文搜索(FTS)实现:
虽然向量搜索有其用途,但全文搜索(FTS)仍然是在复杂领域中进行精确信息检索的强大替代方案,并且在基于检索增强生成(RAG)的应用中提供了对检索机制的完全控制。