LLMs 诸神之战:LangChain ,以【奥德赛】之名

news2024/12/23 17:02:40

LLMs 一出,谁与争锋?

毫无疑问,大语言模型(LLM)掀起了新一轮的技术浪潮,成为全球各科技公司争相布局的领域。诚然,技术浪潮源起于 ChatGPT,不过要提及 LLMs 的技术发展的高潮,谷歌、微软等巨头在其中的作用不可忽视,它们早早地踏入 AI 的技术角斗场中,频频出招,势要在战斗中一争高下,摘取搜索之王的桂冠。

而这场大规模的 AI 之战恰好为 LLMs 技术突破奏响了序曲。LangChain 的加入则成为此番技术演进的新高潮点,它凭借其开源特性及强大的包容性,成为 LLMs 当之无愧的【奥德赛】。

LLMs 变聪明的秘密——LangChain

LLMs 优秀的对话能力已是共识,但其内存有限、容易“胡说八道”也是不争的事实。比如你要问 ChatGPT:“《荒野大镖客:救赎》游戏中设置了几种级别的难度?“,ChatGPT 会自信地回答:”没有难度设置“。但实际上,这个游戏中共设置了 3 种难度级别。LLMs 是根据权重生成答案,因此无法验证信息的可靠性或提供信息来源。

那么,如何让 LLMs 好好地回答问题并总结数据?如何让 LLMs 提供答案来源?如何让 LLMs 记住 token 限制范围外的对话?

这个时候,LangChain 就可以大展身手了。LangChain 是一个将不同计算方式、知识与 LLMs 相结合的框架,可进一步发挥 LLMs 的实际作用。可以这样理解,只要熟练使用 LangChain,你就可以搭建专业领域的聊天机器人和特定的计算 Agent 等。

不过,在 LLMs 变聪明的过程中,以 Milvus 为代表的向量数据库扮演着怎样的角色呢?或许,我们把 Milvus 看成 LLMs 的超强记忆外挂更为合适。

LLMs 一次只能处理一定数量的 token(约 4 个字符),这就意味着 LLMs 无法分析长篇文档或文档集。想要解决这个问题,我们可以将所有文档存储在数据库中,搜索时仅搜索与输入问题相关的文档,并将这些文档输入其中,向 LLMs 提问以生成最终答案。

Milvus 向量数据库可以完美地承接这一任务,它可以利用语义搜索(semantic search)更快地检索到相关性更强的文档。

首先,需要将待分析的所有文档中的文本转化为 embedding 向量。在这一步中,可以使用原始的 LLMs 生成 embedding 向量,这样不仅操作方便,还能在检索过程中保留 LLMs 的“思维过程”。将所有数据转化成 embedding 向量后,再将这些原始文本的 embedding 向量和原数据存储在 Milvus 中。在查询时,可以用同样的模型将问题转化为 embedding 向量,搜索相似性高的相关问题,然后将这个相关问题作为提问,输入 LLMs 中并生成答案。

虽然这个流程看起来简单,但完成整个流水线(pipeline)的搭建需要大量时间和精力。但好消息是,LangChain 能够帮助我们轻松完成搭建,并且还为向量数据库提供了向量存储接口 (VectorStore Wrapper)。

如何集成 Milvus 和 LangChain?

以下代码集成了 Milvus 和 LangChain:

class VectorStore(ABC):
    """Interface for vector stores."""    @abstractmethoddef add_texts(
        self,
        texts: Iterable[str],
        metadatas: Optional[List[dict]] = None,
kwargs:Any,
    ) ->List[str]:
"""Run more texts through the embeddings and add to the vectorstore."""    @abstractmethoddefsimilarity_search(
        self, query:str, k:int =4,kwargs: Any) -> List[Document]:
        """Return docs most similar to query."""def max_marginal_relevance_search(
        self, query: str, k: int = 4, fetch_k: int = 20) -> List[Document]:
        """Return docs selected using the maximal marginal relevance."""raise NotImplementedError

    @classmethod    @abstractmethoddef from_texts(
        cls: Type[VST],
        texts: List[str],
        embedding: Embeddings,
        metadatas: Optional[List[dict]] = None,
        **kwargs: Any,
    ) -> VST:
        """Return VectorStore initialized from texts and embeddings."""              

为了将 Milvus 集成到 LangChain 中,我们需要实现几个关键函数:add_texts()

similarity_search()max_marginal_relevance_search()from_text()

总体而言 Milvus VectorStore 遵循一个简单的流程。首先它先接收一组文档。在大多数 LLMs 项目中,文档是一种数据类,包含原始文本和所有相关元数据。文档的元数据通常为 JSON 格式,方便存储在 Milvus中。VectorStore 会使用你提供的 emebdding 函数将接收到的文档转化为 embedding 向量。在大多数生产系统中,这些 embedding 函数通常是第三方的 LLMs 服务,如 OpenAI、Cohere 等。当然,如果能够提供一个函数,允许输入文本后返回向量,那也可以使用自己的模型。在 pipeline 的这个步骤中,Milvus 负责接收 embedding、原始文本和元数据,并将它们存储在一个集合(collection)中。随着集合中的文档数据越来越多,Milvus 会为所有存储的 embedding 创建索引,从而加快搜索的速度。

Pipeline 的最后一步就是检索相关数据。当用户发送一个问题时,文本和用于过滤的元数据被发送到 Milvus VectorStore。Milvus 会使用同样的 embedding 函数将问题转化为 embedding 向量并执行相似性搜索。Milvus 作为 VectorStore 提供两种类型的搜索,一种是默认的、按照未修改的顺序返回对象,另一种是使用最大边缘相关算法(MMR)排序的搜索。

不过,将 Milvus 集成到 LangChain 中的确存在一些问题,最主要的是 Milvus 无法处理 JSON 文件。目前,只有两种解决方法:

在现有的 Milvus collection 上创建一个 VectorStore。

基于上传至 Milvus 的第一个文档创建一个 VectorStore。

Collection schema 在 collection 创建时确定,因此所有后续新增的数据都需要符合 schema。不符合 schema 的数据都无法上传。

同样,如果在 collection 创建后向文档添加了任何新的元数据,这些新增的元数据都将被忽略。这些缺点不利于系统适用于多种场景。我们需要花很多额外精力来清理输入数据和创建新的 collection。不过好消息是,Milvus 2.3 版本即将支持存储 JSON 格式的文件,能够更进一步简化集成工作,感兴趣的朋友可以试用 Milvus 2.3 测试版!

写在最后

操作进行到这里,我们便可以搭建出一个 LLMs 知识库。在集成了 Milvus 后,LangChain 还新增了 Retriever,用于连接外部存储。当然,由于开发时间较短,本项目还有以下优化空间:

  • 精简 Milvus VectorStore 代码。

  • 加入 Retriever 功能。

此外,Milvus 目前还不支持动态 schema,因此向已创建好的 collection 中插入不符合 schema 的数据较为麻烦。在 Milvus 正式支持 JSON 格式后,我们会重新修改优化这一部分功能。

(本文首发于 The Sequence,作者 Filip Haltmayer 系 Zilliz 软件工程师。)


  • 如果在使用 Milvus 或Zilliz 产品有任何问题,可添加小助手微信 “zilliz-tech” 加入交流群 ​
  • 欢迎关注微信公众号“Zilliz”,了解最新资讯。 ​ alt

本文由 mdnice 多平台发布

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

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

相关文章

React的表单数据绑定

当我们在页面中使用表单提交数据时,react是如何拿取表单数据的呢 这里通过两种方式来实现 非受控组件实现 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" conte…

在Ubuntu 22.04 LTS Jammy Linux 系统上安装MySQL

在Ubuntu 22.04 LTS Jammy Linux 系统上安装MySQL 1. Update Apt Package Index2. Install MySQL Server & client on Ubuntu 22.043. To Check the version4. Run the Security script to secure MySQL5. Login Database Server as the root user6. Manage MySQL service7…

C-认识指针

认识指针 内容来自《深入理解C指针》 声明指针 在数据类型后面跟上星号*&#xff0c;如下的声明都是等价的 int* pi; int * pi; int *pi; int*pi;阅读声明 如下&#xff1a; const int *pci;1.pci是一个变量 const int *pci; 2.pci是一个指针变量 const int *pci; 3.pci是一…

FMC篇-SDRAM(IS42S16400J)

IS42S16400J 这个东西太常见啦&#xff0c;长方形的。不会过多解释&#xff0c;详细请阅读它的数据手册。 IS42S16400J是一种高速同步动态随机存储器(SDRAM)&#xff0c;64Mb的存储容量&#xff0c;采用4个bank&#xff0c;每个bank大小为16Mb&#xff0c;总线宽度为16位&…

eDiary-白日梦电子记事本基本使用说明【记事本导出和导入方法、本地数据迁移方法、记录工作日报、日历代办等】

文章目录 说明笔记导出与导入导出导入 本地数据迁移及备份本地备份说明恢复 记录工作日报记录今天发生美事等日历代办 说明 因为公司大佬分享资料&#xff0c;需要用到白日梦这个电子记事本&#xff0c;所以才了解到这个软件&#xff0c;体量小&#xff0c;功能高级&#xff0…

图数据库 NebulaGraph 的内存管理实践之 Memory Tracker

数据库的内存管理是数据库内核设计中的重要模块&#xff0c;内存的可度量、可管控是数据库稳定性的重要保障。同样的&#xff0c;内存管理对图数据库 NebulaGraph 也至关重要。 图数据库的多度关联查询特性&#xff0c;往往使图数据库执行层对内存的需求量巨大。本文主要介绍 …

Amazon 一周回顾 – 2022 年 7 月 18 日

上周&#xff0c;Amazon 峰会&#xff08;纽约&#xff09;在贾维茨中心线下举办&#xff0c;有数千名与会者以及 100 多家赞助商和合作伙伴参加。在主题演讲中&#xff0c;Amazon 首席开发人员倡导者 Martin Beeby 谈到了云基础设施的创新如何帮助客户适应挑战并抓住新的机遇。…

开源之夏 2023 | 欢迎参加openEuler A-Tune SIG和Base-service SIG开发任务

开源之夏是中国科学院软件研究所联合openEuler发起的开源软件供应链点亮计划系列暑期活动&#xff0c;旨在鼓励在校学生积极参与开源软件的开发维护&#xff0c;促进优秀开源软件社区的蓬勃发展。活动联合各大开源社区&#xff0c;针对重要开源软件的开发与维护提供项目&#x…

linux Fd以及重定向讲解

感谢你的阅读&#xff0c;是对我最大的鼓励&#xff01;&#xff01;&#xff01;&#xff01; 目录 fd理解 文件操作重定向 让我们回顾C语言文件操作 首选我们要知道2个知识点&#xff1a; 额外知识点 如何理解一切皆文件呢&#xff1f; 当父进程fork创建子进程是否创建…

移动出行下半场,T3出行做起“加减法”

五一小长假外出聚餐时&#xff0c;在T3出行打了一辆网约车&#xff0c;车厢上居然印了《灌篮高手》的动漫角色。 松果财经了解到&#xff0c;这是T3出行在上海、深圳、广州、成都、重庆及武汉等六大城市与《灌篮高手》展开的合作&#xff0c;大概有数百辆定制网约车印上了《灌篮…

现在Java和大数据开发还能学来找工作吗?

卷是必然的&#xff0c;不止java和大数据&#xff0c;也不止IT这个行业~ 这两个方向其实都是不错的方向&#xff0c;java虽然卷&#xff0c;但是技能在手也不怕。大数据的发展前景也是不容小觑的。关键就在于你未来想发展的方向以及个人的兴趣 首先先给你吃一颗定心丸&#x…

HTML零基础快速入门(详细教程)

1&#xff0c;HTML代码特点 <html><head></head><body>hello world!</body> </html>HTML代码有以下特点&#xff1a; html代码是通过标签来组织的&#xff0c;而标签是由尖括号< >组织的&#xff0c;也可被叫作元素&#xff08;ele…

SpringCloudAlibaba项目打成war后无法注册到Nacos,无法连接到Nacos Server

SpringCloudAlibaba项目打成war后无法注册到Nacos,无法连接到Nacos Server 背景原因解决重新打包、部署&#xff1a;正常&#xff01; 参考&#xff1a;https://www.jb51.net/article/233940.htm 背景 正常jar(使用内嵌tomcat)包是可以连接并注册到Nacos的&#xff0c;但是将…

uniapp源码编译打包App上架发布详细教程

基础配置 App打包&#xff08;使用Hbuilder进行App打包&#xff09; 视频教程 视频地址&#xff1a; https://www.bilibili.com/video/BV1Kg411g7cb 一、修改接口地址 1.打开uni-app下config/app.js修改接口地址&#xff0c;将下图红框中的地址修改成您的域名 二、配置参…

研发工程师玩转Kubernetes——安装microk8s和Docker

《研发工程师玩转Kubernetes》将立足于实操&#xff0c;试图由浅入深探索Kubernetes世界。于是在技术选型和内容上也将由易到难&#xff0c;由简单到复杂。 为了降低进入的门槛&#xff0c;我们前期将不考虑多实例&#xff08;机器&#xff09;的部署&#xff0c;而采用单机部署…

ThreadLocal 的原理讲述 + 基于ThreadLocal实现MVC中的M层的事务控制

ThreadLocal 的原理讲述 基于ThreadLocal实现MVC中的M层的事务控制 文章目录 ThreadLocal 的原理讲述 基于ThreadLocal实现MVC中的M层的事务控制每博一文案1. ThreadLocal 给概述2. 抛砖引玉——>ThreadLocal3. ThreadLocal 的模拟编写4. ThreadLocal 源码原理分析5. Thre…

云厂商降价潮背后:来中小企业战场「拼刺刀」

如果说过往云厂商的降价打响的是从C端进军B端的营销战&#xff0c;那么在这一轮降价潮背后&#xff0c;对应的则是云厂商从大型KA客户向中小企业进军的信号&#xff0c;强被集成&#xff0c;强获客。 云厂商又一轮降价潮袭来。 5月16日&#xff0c;移动云宣布部分产品线最高降…

技术探秘:揭秘Bean Factory与FactoryBean的区别!

大家好&#xff0c;我是小米&#xff0c;一个热衷于技术分享的29岁小编。今天&#xff0c;我们来聊一聊在Spring框架中常用的两个概念&#xff1a;beanFactory和FactoryBean。它们虽然看似相似&#xff0c;但实际上有着不同的用途和作用。让我们一起来揭开它们的神秘面纱吧&…

SaleSmartly聊天机器人如何帮助您的电商业务(二)

上文为大家介绍了两类机遇SaleSmartly&#xff08;ss客服)强大的自动化编辑器构建的两类聊天机器人&#xff0c;接下来继续为大家介绍两种类型的聊天机器人。SaleSmartly&#xff08;ss客服&#xff09;可构建的聊天机器人还有以下两类&#xff1a; 3. NLP聊天机器人 SaleSma…

Datax+Datax-web2.1实现MySQL数据库数据同步(二)

目录 流程1、创建项目2、创建数据源3、创建任务模板4、构建任务5、执行同步任务 安装文档参考&#xff1a;https://blog.csdn.net/zhanremo3062/article/details/130728287 流程 这里以2.1.2版本为例&#xff0c;datax-web使用起来还是很顺滑的&#xff0c;操作流程跟其他任务…