LangChain 联合创始人下场揭秘:如何用 LangChain 和向量数据库搞定语义搜索?

本文涉及的产品
阿里云百炼推荐规格 ADB PostgreSQL,4核16GB 100GB 1个月
简介: AIGC 时代,提高大模型应用性能的一个关键手段就是将大语言模型(LLM)和外部数据相结合。具体而言就是在 LLM 中接入现成的数据集,并要求 AI 应用能够记住用户的对话,通过“反思”对话上下文生成“新记忆”。

近期,关于 ChatGPT 的访问量有所下降的消息引发激烈讨论,不过这并不意味着开发者对于 AIGC 的热情有所减弱,例如素有【2023 最潮大语言模型 Web 开发框架】之称的大网红 LangChain 的热度就只增不减。

原因在于 LangChain 作为大模型能力“B2B2C”的一个重要的中间站,能够将大模型和其他项目丝滑连接在一起,达到 1 + 1 大于 3 的效果。

正如大家所知,AIGC 时代,提高大模型应用性能的一个关键手段就是将大语言模型(LLM)和外部数据相结合。具体而言就是在 LLM 中接入现成的数据集,并要求 AI 应用能够记住用户的对话,通过“反思”对话上下文生成“新记忆”。当用户在 AI 应用中进行检索时,应用系统会先在接入的现成数据集中提取相关信息,然后结合用户查询以及记忆的上下文,最终高效准确地返回检索结果,LangChain + Milvus 就是其中最好的应用。

为了帮开发者深入理解使用 LangChain 和 Milvus 进行语义搜索的原理及实例,Zilliz 联动 LangChain 进行了一次干货满满的直播讨论,LangChain 联合创始人兼首席执行官 Harrison Chase 对话 Zilliz 软件工程师 Filip Haltmayer ,共同探讨如何使用 LangChain 和向量数据库进行语义搜索以及在此过程中可能会遇到的一些典型案例。

01. 什么是检索?

检索是指从内存或其他存储设备中获取信息的过程。那么,如何利用检索技术、向量数据库(如:Milvus)、AI 代理(如:LangChain)搭建一个接入外部知识库的 LLM 应用?

Harrison 表示,尽管 LLM 功能强大,但在使用上还存在一些限制,比如 LLM 只能记住预先训练时的信息。这就意味着,LLM 并不能够做到实时更新数据信息。举个例子,ChatGPT 的数据仅涵盖 2021 年及以前的数据,因此 ChatGPT 无法回答 2021 年之后的信息。除此之外,LLM 还缺乏特定领域的专业信息(如:业务相关的特定数据)。在此情况下,检索技术能够作为一种补充形式,帮助我们打破 LLM 本身的使用限制。换言之,检索技术能够为 LLM 应用提供更多信息上下文,从而帮助 LLM 返回更准确的答案。

02. 语义搜索——检索技术的主流用例

检索技术的主流用例之一就是语义搜索。Harrison 解释了语义搜索如何在 CVP 架构(ChatGPT + Vector Database + Prompt)中发挥作用。

下图展示了语义搜索在 CVP 技术栈中的作用。如果用户提出了一个一般问题且 LLM 可以回答,那么 LLM 会直接返回问题的答案。但是,如果用户提出的问题是特定领域的专业问题,那么这个问题会被转化为向量并被发送到如 Milvus 之类的向量数据库。而向量数据库中已经预先存储了一些专业文档片段的 embedding 向量。当用户专业问题向量被发送到向量数据库后,会在数据库中进行相似性搜索,以找到 “top-k” 个最相关的结果。这些找到的结果会与用户查询的问题一同经过 AI 代理 (如:LangChain)的处理合并发送到 LLM。最终 LLM 返回令人满意的响应结果。

CVP 技术栈中的语义搜索
CVP 技术栈中的语义搜索

03. 语义搜索的典型案例

语义搜索十分常用且能够有效解决多种 LLM 应用的问题。Harrison 列举了 5 个语义搜索的典型案例,并详细分析了每种情况:

  • 重复信息

如果数据库中存有许多重复文档,检索信息会面临一些挑战。这些重复的内容其实不适用于 LLM,会产生很多不必要的上下文。

对于这个问题, Harrison 提出了以下 3 种解决方案:

  1. 通过语义搜索过滤掉类似的文档。例如在将提示发送到 ChatGPT 之前,LangChain 会检索 20-30 个相似文档,并通过向量检索技术过滤掉或者绕过重复文本,再将提示发送到 ChatGPT。
  2. 利用最大边际相关算法来优化多样性。此搜索侧重于从其他检索到的向量中获取相似和多样的结果。
  3. 在存储之前对文档进行去重。但是,这种方法挑战性最大,因为需要大量时间和精力来确定一个相似性分数,用于判定文档是否重复。即便设置了一个相似性分数,它也未必十分准确,因为单个事物的单个向量维度差异巨大,分数稍有偏差,结果就会大相径庭。
  • 冲突信息

如果对于同一个问题,不同来源的数据给出不同的回答,则会导致信息冲突。如果将这些数据据全部都给到 LLM,可能会导致 LLM 混乱。

例如,用户想要通过 LLM 应用查询公司休假政策,而人力资源文件和一些临时会议记录给出了不同的答案。

对于这种情况,Harrison 提出了以下 2 种解决方案:

  1. 对来源进行优先级排序,并将优先级打分权重加入到检索中。
  2. 将所有源信息都传入生成步骤,交由 LLM 来判断哪个信息源更可靠。
  • 时效性

信息需要不断更新,保证信息的时效性。例如,公司的休假政策可能会偶尔更新,那 LLM 应用需要能够确保给到用户更新后的正确信息。

对于这种情况,Harrison 提出了以下 3 种解决方案:

  1. 在检索中进行对最近的信息进行加权——完全过滤过时的信息。
  2. 给生成信息带上时间戳——要求 LLM 优先选择更近期的信息。
  3. 不断反思,即不断修订 LLM 对一个话题的理解。
  • 元数据查询

某些情况下,用户提出的问题更侧重于元数据信息而非内容本身。

例如,用户可能会查询“1980年间关于外星人的电影”。其中,“关于外星人的电影”这一部分可以进行语义搜索,而”1980 年间“其实是需要通过精确匹配来筛选结果的。

对于这种情况,Harrison 建议在执行语义搜索检索之前先加入一个元数据过滤器。这样一来,当用户查询”1980年间关于外星人的电影“时,其实会分为两个步骤:

  1. 元数据过滤器:通过精确匹配,先筛选出年份为 1980 年的电影。
  2. 语义搜索:查询筛选结果中”关于外星人“的电影。

许多向量存储器都允许在查询前先通过元数据过滤器筛选数据。如果大家选择的向量存储器不支持在查询前进行元数据过滤,那么在语义搜索之后再过滤数据也是一个可行的方案。

  • 多跳问题

用户可能会一次提出多个问题,这会给语义搜索带来挑战。对于这种情况,Harrison 建议使用如 LangChain 之类的 AI 代理工具。LangChain 可以将问题分解为几个步骤并使用语言模型作为推理引擎来检索所需信息。但是这种方法的一个弊端就是多次调用 LLM,导致使用成本较为高昂。

对此,Filip 建议集成 GPTCache 与 LangChain,使用 GPTCache 存储 LLM 生成的问题和答案。在用户下一次提出类似查询时,GPTCache 会先在缓存中搜索是否是已经问过的重复问题,之后如有必要再执行语义搜索并调用 LLM。这样一来,可以大大节省 LLM 的调用成本。

04. 问答彩蛋

问题 1: 如何使用外部知识生成 Prompt ?是否能够提供一些示例或者小技巧?LangChain 后续是否计划添加一些功能能够帮助优化 Prompt?

Harrison Chase:想要写出好的 Prompt,关键就在于要先明确自己想要什么。如果你无法清楚表达自己的意图,那么 LLM 是不知道该怎么做的,这就和人类之间的交流一样。而且我们确实后续会添加一些功能帮助用户优化 Prompt。

问题 2: 如何看待当前基于检索增强的文本生成赛道?现在我们也看到了许多解决方案,如 Langchain、LlamaIndex、Vectara 等。是否有用于细化检索步骤(包括路由器查询引擎等)的最佳解决方案?您之前提到检索技术可以区分文件的重要性,LangChain 是否已经实现此类功能?

Harrison Chase:整个赛道仍处于早期阶段,发展非常迅速。我们首先要区分检索步骤和生成步骤。对于检索而言,我认为 LangChain 模块化的架构支持自定义向量检索系统,更具灵活性。Vectara 是一套出色的端到端全托管的检索解决方案。LlamaIndex 提供了一些更有趣的数据结构,如树型结构,可供实验使用。对于生成步骤而言,所有用例都使用的是 LangChain。我们和这 3 种方案都有集成。

问题 3: 随着时间推移,LLM 可能会不断放宽其对提示中上下文字数限制,这对检索技术用例有何影响?

Harrison Chase:虽然 Anthropic 推出了支持 10 万上下文长度的 LLM 上下文转换器插件,但我们为什么仍然需要向量数据库?向量数据库提供了一种更高效的解决方案。设想一下,如果 LLM 负责所有计算的工作,而向量数据库负责所有存储的工作,那计算开销会飞速上涨。这也就是说,处理的上下文越多,成本越高。这时我们就可以使用向量数据库来节省开销。计算总是比存储更贵,而且甚至昂贵 100 多倍。而且使用上下文转换器,LLM 仍有可能会忘记早期对话中的内容。

问题 4: Cohere 发布了维基百科的向量数据集,另外还有一个项目发布了 arXiv 摘要的向量数据集。您此有什么看法吗?你是否有推荐的用于开源向量内容的最佳模型?

Harrison Chase:首先,这些初衷都是好的,可以帮忙熟悉语义搜索并降低生成向量数据所需的额外时间和成本。但是预先计算也会带来一些限制,例如你不可以修改 Embedding 方式或内容。此外,其实对于您的数据,并不存在最佳的推荐模型。我只能说,您使用的模型越流行的话,您的数据集被使用的概率就会越大。

问题 5: LangChain 中内存分包的工作原理是什么样的?为什么聊天消息的历史记录与内存分开?这样设计是否有什么特别理由?

Harrison Chase:我们正在重新设计内存模块,使其更加清晰。

如果在使用 Milvus 或 Zilliz 产品有任何问题,可添加小助手微信 “zilliz-tech” 加入交流群。

相关实践学习
阿里云百炼xAnalyticDB PostgreSQL构建AIGC应用
通过该实验体验在阿里云百炼中构建企业专属知识库构建及应用全流程。同时体验使用ADB-PG向量检索引擎提供专属安全存储,保障企业数据隐私安全。
AnalyticDB PostgreSQL 企业智能数据中台:一站式管理数据服务资产
企业在数据仓库之上可构建丰富的数据服务用以支持数据应用及业务场景;ADB PG推出全新企业智能数据平台,用以帮助用户一站式的管理企业数据服务资产,包括创建, 管理,探索, 监控等; 助力企业在现有平台之上快速构建起数据服务资产体系
目录
相关文章
|
1月前
|
SQL 数据库
LangChain-09 Query SQL DB With RUN GPT 查询数据库 并 执行SQL 返回结果
LangChain-09 Query SQL DB With RUN GPT 查询数据库 并 执行SQL 返回结果
32 2
|
3月前
|
存储 机器学习/深度学习 自然语言处理
LangChain与向量数据库:高效的信息检索方案
【8月更文第4天】随着自然语言处理技术的发展,特别是深度学习的进步,我们能够更加高效地处理大量的文本数据。LangChain 作为一种强大的工具链,旨在简化和加速构建复杂的自然语言处理应用程序。结合向量数据库,LangChain 可以实现高效且精准的信息检索功能。本文将探讨这一组合的工作原理,并通过一个具体的实现案例来展示其在实际应用中的效果。
436 2
|
3月前
|
分布式计算 关系型数据库 数据处理
深度揭秘:ADB之外的数据库战场,Planner与ORCA优化器,谁才是性能提升的幕后推手?
【8月更文挑战第27天】在数据库和Android调试领域,优化器如Planner与ORCA扮演着提升性能的关键角色。Planner作为传统数据库的核心,以成熟稳定、高度集成及易于扩展著称,适用于大多数查询优化场景。ORCA则凭借其模块化设计、高并发性和基于成本的优化策略,在处理复杂查询和大规模数据集时展现出色性能。尽管ADB本身不包含这些优化器,但其调试理念与优化器的设计理念相辅相成,共同推动技术进步。例如,在使用ORCA的数据库中,一个涉及多表连接的复杂查询可以被自动优化,通过评估不同连接策略的成本来选择最佳执行计划。这两种优化器各有所长,共同促进数据处理技术的发展。
53 0
|
3月前
|
存储 监控 安全
阿里云数据库(ADB)的多租户秘籍:资源隔离的魔法如何施展?
【8月更文挑战第27天】多租户系统在云计算与大数据领域日益重要,它让不同用户或组织能在共享基础设施上独立运行应用和服务,同时确保资源隔离与安全。ADB(如阿里云数据库)通过资源组及标签实现高效多租户隔离。资源组作为一种软隔离策略,允许为不同租户分配独立的计算和存储资源,并设置资源上限;资源标签则支持更细粒度的硬隔离,可为每个数据库表或查询指定特定标签,确保资源有效分配。此外,ADB还提供了资源监控与告警功能,帮助管理员实时监控并调整资源分配,避免性能瓶颈。这种灵活且高效的资源隔离方案为多租户环境下的数据处理提供了强大支持。
145 0
|
11天前
|
存储 SQL Apache
Apache Doris 开源最顶级基于MPP架构的高性能实时分析数据库
Apache Doris 是一个基于 MPP 架构的高性能实时分析数据库,以其极高的速度和易用性著称。它支持高并发点查询和复杂分析场景,适用于报表分析、即席查询、数据仓库和数据湖查询加速等。最新发布的 2.0.2 版本在性能、稳定性和多租户支持方面有显著提升。社区活跃,已广泛应用于电商、广告、用户行为分析等领域。
Apache Doris 开源最顶级基于MPP架构的高性能实时分析数据库
|
1月前
|
存储 缓存 API
LangChain-18 Caching 将回答内容进行缓存 可在内存中或数据库中持久化缓存
LangChain-18 Caching 将回答内容进行缓存 可在内存中或数据库中持久化缓存
42 6
|
1月前
|
机器学习/深度学习 存储 自然语言处理
LangChain-22 Text Embedding 续接21节 文本切分后 对文本进行embedding向量化处理 后续可保存到向量数据库后进行检索 从而扩展大模型的能力
LangChain-22 Text Embedding 续接21节 文本切分后 对文本进行embedding向量化处理 后续可保存到向量数据库后进行检索 从而扩展大模型的能力
37 0
|
3月前
|
存储 SQL 监控
ADBPG&Greenplum成本优化问题之ADB PG的数据库管控的定义如何解决
ADBPG&Greenplum成本优化问题之ADB PG的数据库管控的定义如何解决
44 2
|
3月前
|
缓存 Java Spring
Spring缓存实践指南:从入门到精通的全方位攻略!
【8月更文挑战第31天】在现代Web应用开发中,性能优化至关重要。Spring框架提供的缓存机制可以帮助开发者轻松实现数据缓存,提升应用响应速度并减少服务器负载。通过简单的配置和注解,如`@Cacheable`、`@CachePut`和`@CacheEvict`,可以将缓存功能无缝集成到Spring应用中。例如,在配置文件中启用缓存支持并通过`@Cacheable`注解标记方法即可实现缓存。此外,合理设计缓存策略也很重要,需考虑数据变动频率及缓存大小等因素。总之,Spring缓存机制为提升应用性能提供了一种简便快捷的方式。
49 0
|
3月前
|
存储 NoSQL Java
MPP数据库入门介绍及集群部署
MPP数据库入门介绍及集群部署
71 0