欢迎关注我的公众号 [极智视界],获取我的更多经验分享
大家好,我是极智视界,本文来介绍一下 能够轻松构建大模型端到端应用的 LangChain,到底是什么。
邀您加入我的知识星球「极智视界」,星球内有超多好玩的项目实战源码下载,链接:t.zsxq.com/0aiNxERDq
先上官方的定义,什么是 LangChain 呢:
LangChain 呢,你可以理解成一种标准 或者说 一层协议,这个协议定义了你构建一个大语言模型可能会用到哪些东西,然后对这些东西呢,做了一个标准化的定义。举个简单的例子,在大语言模型里面会用到一个东西叫做 prompts,这个应该都会相对熟悉,在 LangChain 里面就会对 prompts 进行了管理、优化,也会提供通用性质的接口,去利用一些操作,让这个 prompts 更有效率。
在 LangChain 中,不止有对 prompts 的管理,还有 chains、data augmented generation 等,这个官方也做了说明,如下,除了这些,未来可能还会有一些新的概念出来。
所以回头过来看,LangChain 其实想做的一件事情就是,把 AI 大模型开发过程中会用到的相关技术全部抽象成一个一个小的元素,我们只要去用这些元素,就可以不用重复去造轮子,不用从架构上去考虑应该怎么去管理这些 prompts,怎么去管理这些 agent,而只需要把这些东西像搭积木那样搭起来就行了。比如这个地方需要一个 prompts 管理单元,下面需要接一个处理单元,最后需要有个评价单元,把它们连接起来,就是一个 AI 大模型应用。至于具体这个 prompts 的处理单元是怎么样处理的,agent 是怎么生成的,评价单元是怎么样评价的,LangChain 在内部提供了我们可能用到的各种各样的东西,对于内部实现我们并不用关心。比如 prompts 提供的数据库,是从 AWS 里面来的还是从微软语音里面来的,这些 LangChain 都给你提供好了。所以简单来说,LangChain 就是在做一个标准化的事情。
可以看到目前 LangChain 已经有六万多个 Star 了,这是一个非常恐怖的数据,首先它证明现在 AI 确实很火,然后它还证明 LangChain 真的是有它自己的实用价值的。
在介绍完 LangChain 的基本概念之后,再来介绍一下为什么它这么火,它到底解决了实际中的哪些问题。我们使用大模型相关的服务,用的最多的可能还是 OpenAI 的 API。在用 OpenAI 的 API 的时候可能会遇到一些问题,比如它的数据库直到 2021 年、它只是适用于自然语言处理;它没有办法针对实事做判断;而且它的 token 数量是有限的,只能接收 4096 个 token 或者 8192 个 token,没有办法接收更加多的文字字符了;比如它只支持图片;比如它没有办法形成一个长期的记忆,需要一直给它有个预设在,它才有可能根据这个预设的短期记忆来生成你想生成的东西。另外还有数据安全的问题,这么多的问题汇总起来其实就是,我们不希望我们的 AI 大模型应用是完全依赖于单独一个 OpenAI 公司的,而是希望 OpenAI 的 API 只是我们程序里面的一个模块、一个部分而已,它是任何时间都可以被取代的。LangChain 就是在做这个事情,把调用大模型能力变得更加通用化,而不单独依靠 OpenAI,这就是 LangChain 最大的优势所在,这也是为什么这么多人对它如此兴奋的原因。
然后来说要怎么样去读懂 LangChain。LangChain 提供了比较完善的文档,在 Quickstart 部分提供了安装和使用方法,可以使用尝试一下,用起来相对简单。要理解 LangChain,主要还是要看文档中的 Modules 部分。
Modules 这块,它其实是把大语言模型中会用到的东西分类了这样几个大类,这些大类就是所有那些乐高积木会用到的那些砖块,然后每个砖块负责不同的事物:
- Model I/O;
-
- Prompts;
- Language models;
- Output parsers;
- Retrieval;
- Chains;
- Memory;
- Agents;
- Callbacks;
比较直接的,拿 Model I/O 中的 Prompts 关键词来说,它在这个地方就会教你应该怎么样在 LangChain 中去做关键词的管理。
上图中就在教我们怎么在 LangChain 中创建和使用自定义的关键词,原文档中解释为了创建自定义的关键词,有两个要求:
- It has an input_variables attribute that exposes what input variables the prompt template expects.
- It defines a format method that takes in keyword arguments corresponding to the expected input_variables and returns the formatted prompt.
体现在代码里会更加直观:
from langchain.prompts import StringPromptTemplate
from pydantic import BaseModel, validator
PROMPT = """\
Given the function name and source code, generate an English language explanation of the function.
Function Name: {function_name}
Source Code:
{source_code}
Explanation:
"""
class FunctionExplainerPromptTemplate(StringPromptTemplate, BaseModel):
"""A custom prompt template that takes in the function name as input, and formats the prompt template to provide the source code of the function."""
@validator("input_variables")
def validate_input_variables(cls, v):
"""Validate that the input variables are correct."""
if len(v) != 1 or "function_name" not in v:
raise ValueError("function_name must be the only input_variable.")
return v
def format(self, **kwargs) -> str:
# Get the source code of the function
source_code = get_source_code(kwargs["function_name"])
# Generate the prompt to be sent to the language model
prompt = PROMPT.format(
function_name=kwargs["function_name"].__name__, source_code=source_code
)
return prompt
def _prompt_type(self):
return "function-explainer"
然后怎么样去使用自定义关键词模版的方法如下:
fn_explainer = FunctionExplainerPromptTemplate(input_variables=["function_name"])
# Generate a prompt for the function "get_source_code"
prompt = fn_explainer.format(function_name=get_source_code)
print(prompt)
这样就会打印出自定义关键词模版:
Given the function name and source code, generate an English language explanation of the function.
Function Name: get_source_code
Source Code:
def get_source_code(function_name):
return inspect.getsource(function_name)
Explanation:
再比如 Chains 模块,对应的文档里面也有相应的例子告诉你在 LangChain 中怎么去做 chain 去做链接。所以这个文档最精华的地方就在这个 Modules 里面,要去通过这个 Modules 来了解在大型语言模型里面每一个 Module 对应的是一个什么任务,然后这个任务下面有什么样的方式能够去使用它。
然后来解释解释里面具体的一些 Module。Prompts 关键词就不用多说了,来说说 Chains。你可以把它理解成,当和 ChatGPT 对话的时候,我一问它一答,这里就是一步操作,它不涉及任何链式操作,也就是不涉及任何 chain。但是当我们真正去调用一些相对复杂的工作的时候,它可能不是这种一步操作,它可能是一步操作到两步操作或者是一步操作到多步操作。举个例子,比如我问 ChatGPT 一个数学计算的问题,ChatGPT 可能没有办法像人类的思维那样一步直接算出答案返回,它可能会需要将这个问题进行拆解,比如拆成两步,首先将这个数学计算问题转成等效的 python 代码,然后第二步去执行这个代码获得计算结果,这是它擅长的。这里就会涉及一个链式的操作,就是一个 chain。一步问题拆分成两步去解决,从而得到正确的回答。所以这个地方的 Chains 其实解决的就是这样的问题,让自然语言的模型拆解问题去完成自然语言擅长的事情。
接着是 Data Augmented Generation,这个 data generation 其实主要还是 API Core,主要还是 OpenAI 的服务,也会扩展如 Google 的服务、Amazon 的服务、比如其他服务商的服务等。接着有个东西叫做 Agents,可以把它理解成一个更高维度的执行器 或者说 更高维度的统筹、协作的节点,负责对任务进行分发和管理。下面一个东西叫 Memory,Memory 可以理解成一个长期记忆,而上面的关键词可以理解成短期记忆。Memory 可以理解成是已经在模型内部的已知的知识,而不是通过输入给到它的,这有点像计算机里面内存和外存的概念。内存在重启计算机之后就清空了,类比这里的短期记忆就清空了;而像外存如 SSD、HDD 等,即使重启了机器,里面还是保存着这些资料信息的,这就可以理解成这里的 Memory。Memory 在大语言模型中会有几种存在方式,它可以是以 vector 的形式 或者是 embedding 的形式 或者是数据的形式存在着一个地方,然后每次运行我们的大语言模型的时候会去那个地方给读取出来,这样它就是一个长期的记忆,就是 Memory;或者更加直观的,已经把这些数据 fineturing 到模型里面了,模型里面的每个节点的权重已经是存储了这些信息了,它也是一个长期记忆。最后的部分是 Evaluation,这个很好理解,就是对最终的模型进行一个判断,进行一个标记、评估,有一个 tag 的作用在这个地方。这个目前还是 Beta 的状态,在文档 document 中也没有办法找到。
所以 LangChain 大概就分成了这么一些东西,这些东西都是在大语音模型里面常用的模块。LangChain 的核心就是在做标准化的事情,目的是让搭建 AI 应用,特别是大语言模型应用更加快速、更加简单。
好了,以上分享了 能够轻松构建大模型端到端应用的 LangChain 到底是什么,希望我的分享能对你的学习有一点帮助。
【公众号传送】
畅享人工智能的科技魅力,让好玩的AI项目不难玩。邀请您加入我的知识星球, 星球内我精心整备了大量好玩的AI项目,皆以工程源码形式开放使用,涵盖人脸、检测、分割、多模态、AIGC、自动驾驶、工业等。不敢说会对你学习有所帮助,但一定非常好玩,并持续更新更加有趣的项目。 t.zsxq.com/0aiNxERDq