构建搜索引擎,而不是向量数据库

英文原文地址:Build a search engine, not a vector DB

构建搜索引擎,而不是矢量数据库

2023 年 12 月 19 日

在过去12个月里,向量数据库初创公司数量激增。我并不是来讨论其中任何一个的具体设计权衡。相反,我想回顾一下向量数据库是什么、它的用途以及如何使用它来解决问题的几种常见方法。

向量数据库不是内存

许多向量数据库将其基本用途定义为解决语言模型缺乏长期记忆的问题,或者解决您无法将问题的所有上下文放入提示中的问题。

https://trychroma.com/blog/seed

然而,向量搜索最终只是一种特殊的搜索为您的 LLM 提供对其可写入和搜索的数据库的访问权限非常有用,但最终最好的概念是为代理提供对搜索引擎的访问权限,而不是实际上“拥有更多内存”。

想象一下,您是一家想要构建由LLMs支持的文档体验的公司。如果您认为向量数据库只是为您的语言模型提供扩展的内存,那么您可能只需嵌入公司的所有产品文档,然后让用户向您的机器人提问。当用户按下回车键时,您会对他们的查询进行向量搜索,找到所有块,将它们加载到上下文中,然后让您的语言模型尝试回答问题。事实上,这就是我在 Stripe 开发他们的AI 文档产品时最初采用的方法。

但最终,我发现这种方法是死胡同。关键在于,虽然向量搜索在某些方面比传统搜索更好,但这并不神奇。就像常规搜索一样,您最终会在结果中得到不相关或丢失的文档。语言模型就像人类一样,只能使用他们拥有的东西,那些不相关的文档很可能会误导他们。

如果您想制作一个使用您的文档的优秀 RAG 工具,您应该首先为这些文档创建一个足以供人们自行使用的搜索引擎。这可能是您的组织之前考虑过的事情,如果它不存在,那是因为构建一个好的搜索引擎传统上是一项重大任务。

好消息

您已经坐下来决定建立良好的搜索,那么您实际上是如何做到的呢?事实证明,在这种情况下,LLMs实际上可以扭转局面。

尽管嵌入不是魔法棒,但仍然非常令人惊奇。高质量的嵌入搜索将比关键字搜索具有更低的误报率,并且将这两个结果结合起来比任何纯全文搜索的性能都要好得多(谷歌多年来一直在使用BERT来做到这一点)。然而,嵌入本身以及在大规模搜索中使用它们所需的工具都得到了突飞猛进的改进。有很多经过实战考验的数据库可以让您将关键字和向量搜索结合起来,我强烈建议使用其中之一(在 Elicit 中我们使用Vespa,但像 Chroma 这样的矢量数据库现在也通常支持这种方式)。

一旦您通过将嵌入与更传统的方法相结合来改进了整体搜索,您就会得到有趣的东西。一个精明的人试图通过搜索引擎查找信息,知道如何构建他们的查询,以确保他们找到相关信息(Google-fu 曾经是一种强大的艺术形式),语言模型也可以做到这一点。如果您的模型想要查找“有关疟疾疫苗的最新消息是什么”,您可以让语言模型构建一个包含日期过滤器的查询。这里有大量唾手可得的成果,之后可以进行几乎无穷无尽的调整,以产生令人难以置信的高质量搜索。与许多其他情况一样,在LLMs之前,类似的事情在世界上是可能的,但它们需要大量的专业技能和努力。现在,您只需花费几个小时的时间和一些计算即可获得具有竞争力的性能。

传统搜索流程的最后阶段是重新排名。过去的情况是,要进行重新排名,您需要根据信号训练相关性模型,例如用户在给定的搜索结果页面上单击哪些项目,然后使用该模型对热门结果进行排序。如果您不是一个围绕构建搜索引擎构建的整个团队,那么这不是一个可行的解决问题。现在,借助语言模型,您可以向模型提供有关查询:结果对的一些详细信息,并获得相关性分数,该分数将击败除最佳专用系统之外的所有系统。

最终,人工智能的最新进展使得构建尖端搜索变得更加容易,所需的工作量比以前少了几个数量级。正因为如此,坐下来认真建立良好的搜索的回报是非常高的。

如果您想构建基于 RAG 的工具,请首先构建搜索。

后记(坏消息)

您已经使用上述技术构建了一个不错的搜索引擎,现在是时候部署它了。不幸的是,语言模型无法让您避免构建搜索引擎的另一半:评估它。

具体来说,这意味着能够回答以下问题:

  • “什么时候进行搜索合适?”
  • “当您进行搜索时,您实际上想要查找什么内容?”
  • “该内容在您的结果中排名有多高?”

回答任何这些问题都需要构建评估和监控基础设施,您可以使用它来迭代搜索管道并了解您所做的更改是否有所改进。对于评估搜索引擎的后续内容,我推荐这一系列优秀的帖子。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/321729.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Java 设计模式】创建型之单例模式

文章目录 1. 定义2. 应用场景3. 代码实现1)懒汉式2)饿汉式 4. 应用示例结语 在软件开发中,单例模式是一种常见的设计模式,它确保一个类只有一个实例,并提供一个全局访问点。单例模式在需要控制某些资源,如数…

正则表达式中的“回引用(回溯)”——别名引用与序号引用的差异及正则表达式中的“P”关键字

读到一段巧妙的正则表达式,勾起我对正则表达式欠缺知识点的探寻: P y t h o n Python Python正则表达式中的“回引用(回溯)”——分组别名引用与序号引用的差异及正则表达式中的“P”关键字详情。 (笔记模板由python脚本于2024年01月14日 07:49:35创建&a…

Makefile编译原理 变量的使用

一.变量和不同的赋值方法 ->makefile中支持程序设计语言中变量的概念 ->makefile中的变量只代表文本数据(字符串) ->makefile中的变量名规则 - 变量名可以包含字符,数字,下划线。 - 不能包含 ":" "#&…

动态规划篇-04:完全平方数

279、完全平方数 状态转移方程 base case 当n 0 时,和为n的完全平方数的最少数量为0. 明确状态 “原问题或子问题中变化的变量” 在本题中,状态是 “完全平方数的最少数量”。因为当我们选择不同的完全平方数的时候,所需完全平方数的数量…

个人网站制作 Part 5 优化网站性能(图片压缩、代码优化) | Web开发项目

文章目录 👩‍💻 基础Web开发练手项目系列:个人网站制作🚀 优化网站性能🔨图片优化🔧步骤 1: 使用压缩工具 🔨代码优化🔧步骤 2: 压缩CSS和JavaScript🔧步骤 3: 合并文件…

PCL ISS关键点提取(C++详细过程版)

边界提取 一、概述二、代码实现三、结果展示PCL ISS关键点提取(C++详细过程版)由CSDN点云侠原创,爬虫自重。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、概述 ISS关键点提取在PCL里有现成的调用函数,具体算法原理和实现代码见:PCL ISS关键点提…

性能优化2.0,新增缓存后,程序的秒开率不升反降

目录 一、前情提要经过4次优化,将页面的加载时间控制在了1秒以内,实打实的提升了程序的秒开率。 二、先了解一下,什么是缓存1、缓存有哪些分类2、本地缓存与分布式缓存 三、Guava Cache本地缓存1、Google Guava2、Loadingcache数据结构3、Loa…

上海亚商投顾:创业板指冲高回落 光伏、航运股逆势走强

上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 一.市场情绪 沪指1月12日冲高回落,创业板指午后跌近1%。北证50指数跌超6%,倍益康、华信永道、众诚科…

SpringBoot 入门教程

1.复习SSM项目中,用spring,mybatis,springmvc这三个框架整合的项目。 SSM项目的所有类,这是用SSM整合一个搜索书籍种类和呈现的前端和后端的ssm的小项目。 2.springboot如何去开发这个页面: 新建springboot项目,勾选对…

【Nuxt3】Nuxt3脚手架nuxi安装项目和项目目录介绍

简言 最近学了Nuxt3,并使用它创建了自己的小网站。记录下学习到的nuxt3内容。 Nuxt3官网 Nuxt 是一个免费的开源框架,可通过直观、可扩展的方式使用 Vue.js 创建类型安全、高性能、生产级的全栈 Web 应用程序和网站。 支持SSR、SPA、建立静态网站,也可以…

分布式限流的主流方案

本文已收录至我的个人网站:程序员波特,主要记录Java相关技术系列教程,共享电子书、Java学习路线、视频教程、简历模板和面试题等学习资源,让想要学习的你,不再迷茫。 常见的分布式限流方案 前面我们了解了什么是分布式…

【算法实验】实验1

实验1-1 斐波那契数 【问题描述】斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。 定义:F(0) 0, F(1) 1, F(n) F(n-1) F(n-2) 其中n>1 要求计…

11.云原生存储之TIDB

云原生专栏大纲 文章目录 为什么使用TIDB后端视角运维视角基础架构视角 TiDB Operator 简介软件版本要求部署tidbTIDB工具helm常用命令TIDB学习推荐资料 为什么使用TIDB 从后端视角、运维视角和基础架构视角来看,使用 TiDB 作为数据库系统可以获得分布式架构、高可…

Unity 踩坑记录 项目启动时获取目标子UI的位置相同

检查是否使用了 LayoutGroup ui控件控制位置 因为项目刚启动的时候 控件还没有工作所以他们都挤在一个位置 延迟两秒钟获取 就可以获取到 子UI 的正确坐标位置

【HarmonyOS4.0】第七篇-ArkUI系统组件(二)

鸿蒙开发系统组件详细剖析 五、进度条组件 进度条也是UI开发最常用的组件之一,ArkUI开发框架提供了两种类型的进度条: Progress 和LoadingProgress ,前者可以精准指定进度,后者表示正在加载的状态,我们接下来对它们分…

对Transformer的理解。

要理解Transformer,需要先理解注意力机制,下面大部分内容来自台大教授李宏毅老师讲课资料。 注意力机制 之前使用的MLP,CNN,RNN模型可以解决一些简单序列问题,但当序列长度太长容易失去效果,原因是看了新…

python 列表的高级应用

当前版本: Python 3.8.4 简介 列表(list)是Python编程语言中的基本数据类型之一,也是一个非常重要的通用序列。在其它编程语言中,它们通常被称为“数组”。可以存储多个元素,包括数字、字符串、甚至其他列…

python 字符串的详细处理方法

当前版本: Python 3.8.4 简介 字符串是由字符组成的序列,可以用单引号、双引号或三引号(单引号或双引号的连续使用)括起来。一般用来表示和处理文本信息,可以是字母、数字、标点符号以及其他特殊字符,用于…

力扣每日一练(24-1-14)

做过类似的题,一眼就是双指针,刚好也就是题解。 if not nums:return 0p1 0 for p2 in range(1, len(nums)):if nums[p2] ! nums[p1]:p1 1nums[p1] nums[p2]return p1 1 根据规律,重复的数字必定相连,那么只要下一个数字与上一…

WeNet2.0:提高端到端ASR的生产力

摘要 最近,我们提供了 WeNet [1],这是一个面向生产(工业生产环境需求)的端到端语音识别工具包,在单个模型中,它引入了统一的两次two-pass (U2) 框架和内置运行时(built-in runtime)…