为了账号安全,请及时绑定邮箱和手机立即绑定

向量相似性搜索简直是白费劲儿了

预设的相似性概念本质上存在缺陷,注定会失败的命运。我们可以做得更好一些。

大约两年前左右,作为一名机器学习顾问,我有很多机会参与到一些项目中,尝试让GPT变得有用且知识丰富。有一次,我让它扮演了一个客服的角色,另一次是让它扮演销售工程师的角色,还有一次是实现了一个用于医疗咨询服务的诊断工具。

在所有情况下,最初让人印象深刻的是GPT利用其通用知识回答问题,但最终却发现它的能力有限。该模型的通用知识已经过时、不全面,而且很难区分事实与虚构。在客户支持方面,它会愉快地为你的产品编造功能,或者根本不知道此产品的详细工作原理等。询问它关于一个不断演变的产品的细节问题,你只能失望,指望模型的通用知识能涵盖该主题是不现实的。

当然,解决方案是RAG:检索增强生成。这是一个听起来复杂但实际上非常简单的东西。RAG就是先看问题,复制粘贴一些相关知识文章,然后加上问题,让模型根据粘贴的文章提供答案。

我们来看一个具体例子。假设我正在构建一个自动化的房产支持代理。我手里有所有租户的租赁合同,他们通过电子邮件给我发来问题和投诉。

显然,比如说,如果你只是问ChatGPT,它根本不知道该如何回答这些问题——模型里并没有写明我的租约里有什么,或适用于该租约的城市规定。

huh?我们之后再来看看它是怎么自信满满地得出了这么个奇怪的答案。

好的,所以GPT突然有点失控了,它决定去找答案,找到了一个完全不相关的来源,然后胡编乱造了一些东西。如果我们不用网络搜索,你就会得到那种典型的四段长的“我不知道”的回答,这种模型喜欢这样生成。

所以我如果在粘贴租赁合同中与宠物相关的部分的纯文本内容时问同样的问题会怎样?我先粘贴了合同中相关页面的内容,接着提出了我的问题。神奇的事情就出现了。

这是一个完美的回答。如果你查一下相关的城市规定、建筑许可之类的,你会找到类似的好答案。

所以RAG真的很棒。如果我们找到一段能直接帮助回答问题的文本,像ChatGPT这样的大型语言模型就能根据这段文本进行扩展并给出一个权威的答案。请注意,这不仅仅适用于房地产支持机器人,还能支持许多其他应用场景:

  • 你可以帮助技术人员解决复杂机器的问题,只要你知道如何获取相关的手册。
  • 你可以帮助保险理赔员根据保险政策文件的相关部分和相关的医疗发票决定是否报销费用。
  • 你可以下载与你研究主题相关的最新研究论文,来回答问题或规划实验。

现在有一个令人烦恼的问题仍然存在——我们如何获取相关文本片段来回答手头的主题?记住,上下文长度有限制——我们不能把所有相关文档都粘贴进去。因此,我们应该如何选择放入的辅助文本?

向量表示来帮忙了

向量嵌入的概念非常吸引人。简单来说,大型语言模型(LLMs)会生成每个文本片段的抽象表示。比如,一个单词、一句话或是一份50页的文档都可以转换成一个向量。输入文本,输出的则是一串数字。

以一个具体的例子来说,你可以将这篇博客文章输入到OpenAI的Ada Embedding,得到一个含有1,536个数字的列表,这些数字在某种程度上代表这篇博客文章。你还可以用它来和Medium上的其他博客文章进行比较,它们很可能涉及相似的话题。

如果我们想要从技术上精确地测量这些向量之间的距离,我们通常计算向量之间的距离,例如,取这两个数字列表,相减后求平方和。

使用向量嵌入,搜索变得非常简单。将你所有关于问题领域的租赁合同、城市法令、建筑许可等信息进行索引,并将每份文档转换成向量。当一个新的问题进来时,将整个问题或对话转换到相同的向量空间中,找到最相关的文档。现在把这些文档复制粘贴作为上下文提供给你的大语言模型,在用户输入前(“这里有一些支持文件,你可以用它们来回答问题”),然后就完成了。

如果你想对相关文本片段进行更精确的本地化,你可以选择嵌入整个文档,也可以单独嵌入它们的各个部分,比如章节、段落等。这样,你可以先找到一个大致相关的文档,接着深入到具体的段落或部分,看看它们是否更符合你的需求。这听起来是不是很神奇?

这个解决方案实际上非常神奇。你将一跃从零搜索能力达到非常精细的搜索。我们先来惊叹一下它的神奇之处,然后再拆解分析:

我可以这样问:“嗨,我住在31A,我能养一只宠物短吻鳄吗?”在我的52页合同中,把这句话放在每个段落里,你就会在合同的最前面看到这一段。

你可以询问关于你的押金,果然如此,搜索结果中的一个答案回答了押金的具体数目。

当我们开始问更细致的问题时,裂缝就开始出现了。如果我问,“你什么时候可以使用我的押金?你如何使用我的押金?” 搜索结果中排名靠前的内容并没有详细说明。

但如果我们仔细查看第二和第三个结果,我们最终还是能找到相关的内容,不过这里就不详细说了,因为它太长太枯燥。

简单来说,模型预测失败是因为它嵌入信息的方式无法预料到回答的准确上下文。

向量搜索可以测量文本片段间的相似度,但不知道哪些相似性是重要的,哪些是不重要的。

这里举一个极端的例子。假设我有多份同一位租户的租赁文件,其中一些文件已经过期。相似度搜索可以很容易地从错误的合同中找到正确的段落。

你可以尝试一些技巧,比如在问题文本前加上“这个问题是在2024年12月2日提出的。”但是这不会显示更新的文档,因为可惜的是,已失效的租约提到它在2024年12月1日到期,在这样的语义空间里,这个日期在语义上和2024年12月2日非常接近。但在房地产法律界,两个日期的距离应被视为无限远——合同已经过期。但在这样的语义空间里,日期在语义上看起来很接近,因此看起来还是相关。

检索到一个无关的文档并将其用作上下文,这就是你在原本很好的RAG系统中得到离谱的谎言的方式。还记得第一次例子中的ChatGPT因进行互联网搜索而抓取了一些无关的来源,给我自信却错误的信息,说有关我的公寓吗?这其实是个很常见的RAG系统错误。从错误的合同中得到了正确的条款,从错误的手册中得到了正确的指令,等等。

一个好检索需要有索引支持

在实际文件中,通常有明确的业务逻辑说明如何获取该文档。你可以从租赁合同中提取入住和退房的日期。更好的是,不只是索引这些项目,而是索引整个文档,以便预先回答大多数常见问题,比如租金是多少,押金是多少,或者宠物政策摘要等自由格式的文本。

让我们通过一个具体例子来说明。我可以复制并粘贴我整个53页的租房合同,然后提示GPT提取我感兴趣的字段。

如果我们把这些信息转换成 JSON 格式的数据,并一致提取相同的字段,我们还能免费得到很多好处。

  1. 我们能够获得一致且可靠的检索结果。我们可以用相同的字段(如入住日期等)索引所有文档,并运行SQL或MongoDB查询来获取相关文档。
  2. 更进一步,我们可以让我们的AI了解我们文档的索引方式,让它自动编写相关查询以获取相关文档。
  3. 有时我们不需要获取整个文档,因为我们在索引中已经包含了答案。例如,租赁合同的问题通常会涉及文档理解中的相同几个方面——租金金额、付款时间表、入住日期、宠物政策等。这不仅让我们调用大语言模型的成本更低,速度也更快。我们只需要引用索引结果,而无需阅读文档的整个部分。

我认为这个模式非常强大。我对这一点非常有信心,以至于我创立了一家公司来推广这种方法,这是一家以此为宗旨的公司,名为DocuPanda.io

我们使定义一组字段变得轻松,并能以一致的数据类型,在大规模的文档中跨数以百万计的文档提取它们。即使文档包含表格、手写、勾选等,这项功能也能正常运行。

这在DocuPanda中看起来像一个输出(为了节省空间,我隐藏了一些字段)。

一旦你标准化了许多文档,就可以自由提问,AI会自动帮你找到相关信息。

这个问题触发了一连串的操作,其中AI会检查我们在数据库模式中有哪些字段(例如租户姓名、允许养宠物,这是一项布尔值的“是/否”,允许养宠物的详情,这是一段简短的描述)。然后,AI会编写数据库查询语句来获取相关的结果,读取返回的记录(例如租户名字是“Meital Bendet”),最后对结果进行分析,如有需要,还会参考原始文档中的文本。

这得到最终结果了。

我希望你能考虑到,通过花一点时间思考你的业务如何理解其文档,并以一种对您有意义的方式索引您的文档,你可以建立更强大的文档处理管道。这种方式符合您预期的文档搜索方式。同时也考虑试一下DocuPanda。它是经过多年尝试与错误的结晶,可能帮助您更快地实现目标。

祝你索引玩得开心!

我们一直在编索引,几千年了,现在别停

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消