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

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.rhkb.cn/news/29691.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

chatgpt赋能python:Python游戏辅助教程:让你的游戏更加容易

Python游戏辅助教程:让你的游戏更加容易 介绍 Python是一种非常受欢迎的编程语言,具有灵活性和易用性。Python可用于编写各种类型的程序,包括游戏辅助工具。Python的易用性和维护性,使得它成为游戏玩家、开发人员和测试人员的首…

Oracle账户被锁定解决方法

当用PLSQL登录Oracle时提示ORA-28000: the account is locked; 这个提示就是当前用户被锁定; 为什么会被锁定呢? 用户登录十次没有成功的,当前用户会被锁定;安装时没有解锁的; 下面我们用两种比较常用的方…

chattr、lsattr目录锁定解锁与查看

创建一个目录,并在目录中创建一个文件夹和文件 [rootk8s-m-01 ~]# mkdir /aaa/ [rootk8s-m-01 ~]# cd /aaa/ [rootk8s-m-01 aaa]# mkdir bbb [rootk8s-m-01 aaa]# touch ccc [rootk8s-m-01 aaa]# ls bbb ccc 使用chattr对/aaa/目录下所有文件进行锁定可以发现锁定…

python编程获取《续蜀山剑侠传》目录信息:目录名称和网址

一直很欣赏武侠小说宗师还珠楼主李寿民的扛鼎之作《蜀山剑侠传》,可惜由于种种原因,《蜀山剑侠传》并未写完。这着实令还珠迷们扼腕,也有不少人继写了《蜀山剑侠传》,但是良莠夹杂,其中有一位退休公务员写的《续蜀山剑…

chatgpt赋能Python-python_nah

Python Nah:一场涵盖搜索引擎的革命 一、Python Nah的简介 Python Nah是一种基于Python编程语言的搜索引擎技术,旨在改进搜索引擎的性能和搜索结果的准确性。与其他搜索引擎技术不同,Python Nah利用了Python的机器学习优势,并且…

可汗学院统计学1-16课笔记

[第1课] 均值 中位数 众数 均值(平均值) 数据之和 / 数据个数中位数 数据排序后,处在中间的数(如果两位数取平均值)众数 出现次数最多的数,一组数据可以有多个众数 import numpy as np import pandas as pd#定义数据 datanp.array([1,2,…

余承东回应高通对华为恢复 5G 芯片供应;ChatGPT 发布重要更新;微软推出免费 AI 入门课|极客头条...

「极客头条」—— 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧。 整理 | 梦依丹 出品 | CSDN(ID:CSDNnews) 一分钟速览新闻点&#…

23.4.25 Go学习日记

1. Go的命名规范(生成自ChatGPT) 1.1 包名 包名应该小写并尽可能用单个简短的词组,不要使用下划线或混合大小写。 1.2 文件名 Go 语言的文件名通常为小写字母,可以包含下划线 (_) 或点 (.),但不建议,并确…

微软亚研院:Language Is Not All You Need

源 | 量子位 还记得这张把谷歌AI搞得团团转的经典梗图吗? 现在,微软亚研院的新AI可算是把它研究明白了。 拿着这张图问它图里有啥,它会回答:我看着像鸭子。 但如果你试图跟它battle,它就会改口:看上去更像兔…

2023需要重点关注的四大AI方向

2023需要重点关注的四大AI方向 过去10年,人工智能从实验室走向各行各业,成为一种普遍技术应用于众多领域。根据IDC的数据,2022年全球AI市场规模达到4328亿美元,增长近20%。而Precedence Research预计,到2030年&#xf…

全球首个完全开源的指令跟随大模型;T5到GPT-4最全盘点

1. Dolly 2.0:世界上第一个完全开源的指令跟随LLM 两周前,Databricks发布了类ChatGPT的大型语言模型 (LLM)Dolly,其训练成本不到 30 美元。今天,他们发布了 Dolly 2.0,这是业内第一个开源的指令跟随LLM,并根…

chatgpt赋能python:Python怎么绕过登录爬取数据

Python怎么绕过登录爬取数据 在进行网站爬取时,经常会发现需要登录才能访问所需要的数据,这给我们的爬虫程序带来了一定的难度。本文就介绍一些Python绕过登录的方法,让你获取到所需的数据。 1. Session维持登录状态 当我们登录一个网站时…

怎么洗稿容易过稿-在线洗稿软件

自媒体洗稿软件 即使您是一位优秀的自媒体写作人员,也难免遇到让人头疼的撰写问题,例如无法处理大量原始文本、需要手动删除冗余信息、缺少时间针对每篇文章进行深入修改等问题。但是,现在有了我们的一款自媒体洗稿软件,您再也不需…

洗稿用什么软件-洗稿软件免费

洗稿文章的主要优势 洗稿文章的主要优势在于提高文章的质量和效率。以下是洗稿文章的几个主要优势: 优化结构和语言 洗稿可以删除冗余、无用和重复的内容,同时对文章的结构和语言进行优化,提高文章的可读性和吸引力。这可以使文章更加专业…

洗稿伪原创工具-洗稿生成器

chatgpt快速洗稿一篇文章 做自媒体创作的人都知道,文案创作是一件十分耗时间和精力的事情,而且要做好一篇文章,还需要考虑排版、语法和语气等问题。为了让自媒体写作更简单、更快速,我们推出了一款名为ChatGPT的快速洗稿软件&…

chatgpt赋能python:PythonReadline遍历:如何准确高效地读取大文件

Python Readline遍历: 如何准确高效地读取大文件 简介 在Python编程中,读取大型文本和数据文件是一项常见的任务。通常,Python在读取文件时,会一次性将整个文件读入内存中,这在读取小型文件时是非常有效的,但当文件较…

chatgpt赋能python:Python文件调用指南

Python文件调用指南 在Python编程中,经常需要使用文件进行数据读取和写入,所以掌握文件读写操作是非常重要的。本文将介绍如何在Python中调用文件,并给出一些使用技巧。 1. Python如何打开文件 可以使用Python内置的open()函数打开文件。o…

chatgpt赋能python:Python文件句柄全面解析

Python文件句柄全面解析 在 Python 中,文件被视为 I/O(输入/输出)操作的基础,文件句柄是与文件进行交互的重要方式之一。本文将从以下方面介绍和解析 Python 文件句柄: 什么是文件句柄?如何创建文件句柄&…

chatgpt赋能python:Python文件读取入门指南

Python文件读取入门指南 Python是一门强大的编程语言,能够处理各种各样的数据类型,其中文件也不例外。文件是计算机与外部世界进行信息交换的基础,使用Python读取和处理文件是我们在日常编程中必须掌握的技能。 在这篇文章中,我…

【Go】从文件读取json

在Go语言中,可以使用标准库中的 encoding/json 包来将 JSON 数据解析为 Go 中的结构体。 下面是一个简单的示例代码,演示了如何从 JSON 文件中读取数据并将其解析为结构体: package mainimport ("encoding/json""fmt"&q…