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

news2024/12/23 8:50:57

a7dd42120c23e5b317eab0d5fd6d3fed.png

近期,关于 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 和向量数据库进行语义搜索以及在此过程中可能会遇到的一些典型案例。

c14bca4e313ab998213560d6744ba7b9.png

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 返回令人满意的响应结果。

779e6e9a12d58cdbf10f97f0fb8a9943.png

|CVP 技术栈中的语义搜索

03.

语义搜索的典型案例

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

  • 重复信息

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

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

  • 通过语义搜索过滤掉类似的文档。例如在将提示发送到 ChatGPT 之前,LangChain 会检索 20-30 个相似文档,并通过向量检索技术过滤掉或者绕过重复文本,再将提示发送到 ChatGPT。

  • 利用最大边际相关算法来优化多样性。此搜索侧重于从其他检索到的向量中获取相似和多样的结果。

  • 在存储之前对文档进行去重。但是,这种方法挑战性最大,因为需要大量时间和精力来确定一个相似性分数,用于判定文档是否重复。即便设置了一个相似性分数,它也未必十分准确,因为单个事物的单个向量维度差异巨大,分数稍有偏差,结果就会大相径庭。

  • 冲突信息

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

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

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

  • 对来源进行优先级排序,并将优先级打分权重加入到检索中。

  • 将所有源信息都传入生成步骤,交由 LLM 来判断哪个信息源更可靠。

  • 时效性

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

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

  • 在检索中进行对最近的信息进行加权——完全过滤过时的信息。

  • 给生成信息带上时间戳——要求 LLM 优先选择更近期的信息。

  • 不断反思,即不断修订 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:我们正在重新设计内存模块,使其更加清晰。

点击【阅读原文】或访问下列网址观看直播回放:

https://zilliz.com/event/memory-for-llm-applications-webinar

🌟「寻找 AIGC 时代的 CVP 实践之星」 专题活动即将启动!

Zilliz 将联合国内头部大模型厂商一同甄选应用场景, 由双方提供向量数据库与大模型顶级技术专家为用户赋能,一同打磨应用,提升落地效果,赋能业务本身。

如果你的应用也适合 CVP 框架,且正为应用落地和实际效果发愁,可直接申请参与活动,获得最专业的帮助和指导!联系邮箱为 business@zilliz.com。

推荐阅读

262390ba0feff1f6cf445a11f09d1f42.png

2ebba2a4f26b663cea9823cbf4dba8f2.png

f1f5f4186ad1f730b4fef8b6a014ae5d.png

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

1快速入门MyBatis

开发前的准备 准备数据库表:汽⻋表t_car 确定表中的字段以及字段的数据类型 guide_price是decimal类型,专⻔为财务数据准备的类型produce_time可以用char类型 , 格式’2022-10-11’ 使用navicat for mysql⼯具向t_car表中插⼊两条数据 配置IDEA中ma…

【C++修炼之路】vector 模拟实现

👑作者主页:安 度 因 🏠学习社区:StackFrame 📖专栏链接:C修炼之路 文章目录 一、读源码二、成员变量三、默认成员函数1、构造2、析构3、拷贝构造4、赋值重载 四、访问1、[ ] 重载2、迭代器 五、容量1、cap…

Profibus DP主站转Modbus TCP网关profibus从站地址范围

远创智控YC-DPM-TCP网关。这款产品在Profibus总线侧实现了主站功能,在以太网侧实现了ModbusTcp服务器功能,为我们的工业自动化网络带来了全新的可能。 远创智控YC-DPM-TCP网关是如何实现这些功能的呢?首先,让我们来看看它的Profib…

Oracle解析JSON字符串

Oracle解析JSON字符串 假设某个字段存储的JSON字符串,我们不想查出来后通过一些常见的编程语言处理(JSON.parse()或者是JSONObject.parseObject()等),想直接在数据库上处理,又该如何书写呢? 其实在ORACLE中…

算法06-搜索算法-广度优先搜索

文章目录 参考:总结大纲要求搜索算法-广度优先搜索迷宫问题问题迷宫的存储迷宫的移动搜索方式代码实现 图的广度优先遍历题目描述用邻接矩阵表示图 搜索算法-广度优先搜索 参考: 【算法设计】用C类和队列实现图搜索的广度优先遍历算法 C/C 之 广度优先…

梯度下降(Gradient Descent)

基本思想 梯度下降是一个用来求函数最小值的算法,本次,我们将使用梯度下降算法来求出代价函数的最小值。 梯度下降背后的思想是:开始时我们随机选择一个参数的组合,计算代价函数,然后我们寻找下一个能让代价函数值下降…

Linux:squid透明代理

在传统代理上进行修改并添加网卡 这次不使用手动代理,而是把网关搞成代理 在下面这个链接里的文章实验下进行修改 Linux:squid传统代理_鲍海超-GNUBHCkalitarro的博客-CSDN博客 完成以后不用再win10上去配置,代理的那一步,然后…

Python(十二)常见的数据类型

❤️ 专栏简介:本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中,我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 :本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

TabLayout+ViewPager实现滚动页面

目录 一、TabLayout介绍 二、TabLayout的常用属性和方法 常用属性: 常用方法: 三、适配器介绍 (一)、PagerAdapter介绍: (二)、FragmentPagerAdapter介绍: (三&am…

习题 1.26

我们先来看看题目要求,题目住说将 square 调用换成了(* x x),结果导致执行时间变慢。 根据以前学过的内容,我们知道 在做显示乘法的时候,是直接进行计算的,而在做函数调用的时候,是先进行表达式展开的&…

【MySQL】常见函数使用(二)

🚗MySQL学习第二站~ 🚩本文已收录至专栏:数据库学习之旅 ❤️文末附全文思维导图,感谢各位点赞收藏支持~ 就如同许多编程语言中的API一样,MySQL中的函数同样是官方给我们封装好的,可以直接调用的一段代码。…

ZooKeeper ZAB

文章首发地址 在接收到一个写请求操作后,追随者会将请求转发给群首,群首将探索性地执行该请求,并将执行结果以事务的方式对状态更新进行广播。一个事务中包含服务器需要执行变更的确切操作,当事务提交时,服务器就会将这…

dp算法篇Day7

"抱紧你的我&#xff0c;比国王富有~" 31、最长定差子序列 (1) 题目解析 从题目来看还是很容易理解的&#xff0c;就是找寻数组中构成差值相等的子序列。 (2) 算法原理 class Solution { public:int longestSubsequence(vector<int>& arr, int difference…

多模态系列论文--ALBEF 详细解析

ALBEF来自于Align before Fuse&#xff0c;作者团队全自来自于Salesforce Research。 论文地址&#xff1a;Align before Fuse: Vision and Language Representation Learning with Momentum Distillation 论文代码&#xff1a;ALBEF 1 摘要 最近图像文本的大规模的特征学习非…

AI Chat 设计模式:7. 单例模式

本文是该系列的第七篇&#xff0c;采用问答式的方式展开&#xff0c;问题由我提出&#xff0c;答案由 Chat AI 作出&#xff0c;灰色背景的文字则主要是我的旁白和思考。 问题列表 Q.1 简单介绍一下单例模式A.1Q.2 详细说说饿汉式&#xff0c;并使用 c 举例A.2Q.3 好&#xff…

【半监督医学图像分割 2022 IJCAI】UGPCL

文章目录 【半监督医学图像分割 2022 IJCAI】UGPCL摘要1. 介绍2. 相关工作2.1 半监督医学图像分割2.2 对比学习2.3 不确定度估计 3. 方法3.1 解码器间的一致性学习3.2 不确定性引导的对比学习3.3 等变对比损失 4. 实验4.1 实验设置4.2 定量实验4.3 消融实验 5. 结论 【半监督医…

引爆用户流量,打造热门小红书创业项目

引爆用户流量&#xff0c;打造热门小红书创业项目 在当今互联网时代&#xff0c;创业者们不断寻求新的商机和盈利模式。而小红书作为一个以分享购物心得、美妆、旅行等内容为主的社交平台&#xff0c;成为了众多创业者关注的焦点。如何通过小红书引爆用户流量&#xff0c;并打造…

【框架篇】使用注解存储对象

使用注解存储对象 之前我们存储Bean时&#xff0c;需要在spring-config 中添加一行 bean注册内容才行&#xff0c;如下图所示&#xff1a; 问题引入&#xff1a;如果想在Spring 中能够更简单的进行对象的存储和读取&#xff0c;该怎么办呢&#xff1f; 问题解答&#xff1a;实…

Python应用实例(一)外星人入侵(十)

外星人入侵&#xff08;十&#xff09; 1.记分1.1 显示得分1.2 创建记分牌1.3 在外星人被消灭时更新得分1.4 重置得分1.5 将消灭的每个外星人都计入得分1.6 提高分数1.7 舍入得分1.8 最高得分1.9 显示等级1.10 显示余下的飞船数 1.记分 下面来实现一个记分系统&#xff0c;以实…

动态规划01背包之1049 最后一块石头的重量 II(第11道)

题目&#xff1a; 有一堆石头&#xff0c;用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。 每一回合&#xff0c;从中选出任意两块石头&#xff0c;然后将它们一起粉碎。假设石头的重量分别为 x 和 y&#xff0c;且 。那么粉碎的可能结果如下&#xff1a; …