开发框架
作为一个AI开发框架,LangChain 最重要的价值是提供了一些开发应用所需的基础抽象和 LangChain 表达式语言。
示例代码:
chain = model | parser
chain.invoke(messages)
这段代码定义了一个包含模型 model 和解析器 parser 的链 chain,并通过 invoke 方法传递消息messages。
当我们把消息传给这条链时,先调用模型,根据消息生成相应内容,然后传给输出结果解析器,解析成所需要的格式。
model | parser:
-
1. 这个结构是 LangChain 的一种语法糖,表示将模型的输出传递给解析器进行处理。 -
2. 这种管道操作符 | 表示将前一个组件的结果传递给下一个组件。 -
3. model 是一个大型语言模型,如 GPT-3.5 或 Llama2,会生成一段文本作为输出。 -
4. parser 是一个输出解析器 Output Parser,将模型生成的自由格式文本转换为结构化数据,如 JSON、列表等。
常见的解析器类型包括:
-
• JsonOutputParser: 解析 JSON 格式的输出。 -
• BaseOutputParser: 基础的解析功能,允许自定义解析逻辑。
chain.invoke(messages):
-
1. chain 是由模型和解析器组成的链。 -
2. invoke 方法接受一个消息列表 messages,并依次传递给模型。 -
3. 模型生成的输出会被解析器解析,然后返回最终的结果。
以下是一个完整的示例代码:
from langchain.llms import OpenAI
from langchain.output_parsers import JsonOutputParser
from langchain.prompts import PromptTemplate
# 定义模型
model = OpenAI(model_name="text-davinci-003")
# 定义解析器
json_parser = JsonOutputParser()
# 定义链
chain = model | json_parser
# 定义提示模板
prompt = PromptTemplate(
input_variables=["product"],
template="请列出 {product} 的优点。",
)
# 调用链
messages = [{"product": "智能手机"}]
result = chain.invoke(messages)
print("解析后的结果:", result)
上述代码的功能是将模型生成的自由文本转换为结构化数据。
输出解析器
核心作用是让大模型能够返回结构化的数据,如 JSON。
它通过以下方式实现这一目标:
-
1. 提示设计 : 调用大模型之前,在提示中明确要求模型返回 JSON 格式的数据。
例如:请以 JSON 格式返回结果。 -
2. 验证修复 : 如果返回的内容不符合预期格式,自动修复解析器会尝试修复错误或重新生成内容。 -
3. 重试机制 : 如果初次尝试失败,重试解析器会捕获异常并重新调用模型。
模型 model 和输出结果解析器 parser 都是 LangChain 的基础抽象,类似这样的抽象,还有比如提示词模板、文档加载器、向量存储等。
LangChain 应用的核心就是构建一条这样的链,也是 LangChain 这个名字里 Chain 的含义。
社区生态
把 LangChain 的基础抽象理解成一个个的接口,但只有接口是无法完成任何工作的,还需要接口具体的实现。
为了降低依赖,这些实现没有放在 LangChain 核心框架中,于是扩大对 LangChain 的理解,把这些实现涵盖进来,就是 LangChain 的社区生态。
社区生态内容
社区生态包含了大量各种实现,比如各种大模型,OpenAI GPT、Anthropic Claude 等,都有对应的实现。
除了大模型,还有其它基础抽象,比如向量数据库,Milvus、FAISS、Qdrant、Chroma 等,文档加载既可以加载一个 Web 页面,也可以从 S3、微软 OneDrive 加载,甚至从 Twitter、Telegram 加载内容。
总之,针对不同的抽象,都有对应的实现,可以根据需要在 LangChain 集成页面找到对应的内容。
提示词模板
除了直接代码实现,还有各种提示词模板。相比于其它的代码,提示词模板都是纯文本。
LangChain 社区有一个专门提示词社区,可以找到各种类别提示词:
实现 Agent 、代码编写、文档问答、内容总结,主流提示词在这里都可以找到。
我们只要把它加载过来,就可以形成一个提示词模板:
//从 Hugging Face 模型库中拉取名为 "react" 的模型
prompt = hub.pull("hwchase17/react")
//将模型赋值给变量 runnable,
runnable = prompt | model
上述代码的功能是从 Hugging Face 模型库中拉取名为 react 的模型,赋值给变量 runnable,加载预训练的 react 模型,以便在后续使用该模型进行推理或训练。
Hugging Face 是一个流行的机器学习模型库,提供了大量的预训练模型。
扩展生态
除了构建链之外,还有什么其它事情可以做呢?
在了解 LangChain 时,会看到一些与 LangChain 相关的名字。
这就是 LangChain 的拓展生态:
-
1. LangServe:把 LangChain 编写的链部署成 REST API 的一个工具。
因为编写的应用多半以服务的方式对外提供,LangServe 简化了 LangChain 应用服务化的门槛。
更多地是面向 LangChain 使用场景设计的,提供的服务是否适合你的应用,还需要根据情况评估。
-
2. LangSmith:LangChain 团队提供的一个 SaaS 平台。
帮助开发者调试、追踪、测试、评估和监控基于大模型的应用。
-
3. LangGraph:提供了一种构建 Agent 的方式。
把 Agent 的状态流转构建成一个图,LangChain 团队甚至构建了一个 IDE:LangGraph Studio,简化这个图的构建过程。
拓展生态在开发社区的接受程度远远不如 LangChain 的开发框架和社区生态。
只要知道它们的存在即可,如果有需要再去深入了解。
如何使用 LangChain
首先是否选择 LangChain?
-
1. 如果只对接 OpenAI 的模型,模型抽象就是多余的。兼容 OpenAI API 的模型越来越多,也降低了模型抽象的价值。 -
2. 如果做的是一次性工作,比如翻译一句话,LangChain 模型中的记忆存储之类的抽象也是多余的。 虽然提示词模板不错,但像 Python 这样的语言本身也有字符串模板。 -
3. ……
一些开源项目的代码,虽然选择 LangChain,但并没有选择 LangChain 的基础抽象,而是单纯地利用 LangChain 的代码。
它的社区生态很好地提供了各种集成,也降低了开发的难度。
LangChain 是一个很好的学习材料,提供了大量的示例。
了解 LangChain 之后,可以充分利用 LangChain 资源学习如何编写各种大模型应用。
无论是 RAG,还是 Agent,或是如何利用工具,都可以通过 LangChain 来学习。
如果这篇内容你只能记住一件事,那请记住:
LangChain 不只是一个框架,而是一个生态系统。


