LangChain :Chain
好的,我们来深入浅出地讲解 LangChain 中的核心概念之一:Chains(链)。
核心概念:什么是 Chain?
在 LangChain 中,Chain(链) 是一个核心抽象,它允许我们将多个组件(如模型、提示模板、其他链、工具等)按预定的顺序或逻辑连接起来,以完成一个更复杂的任务。
你可以把它想象成一个工作流水线或函数调用链。单一的大型语言模型(LLM)调用可以比作一个单独的工具,而 Chain 则是将多个工具和步骤组装起来,完成一个端到端的复杂任务。
为什么需要 Chains?
单一的语言模型调用通常只能完成一步任务。但在现实世界中,大部分应用都需要多步推理和协作。例如:
- 总结一篇长文:可能需要先“拆分”文章,再“总结”各部分,最后“合并”总结。
- 基于网络搜索回答问题:需要先“搜索”问题,再“提炼”搜索结果,最后“组织”语言生成答案。
- 与数据库交互:需要先“理解”用户问题,再“转换”为 SQL 查询,接着“执行”查询,最后将结果“解释”给用户。
Chain 就是为了优雅地解决这类多步问题而设计的。它提供了标准化、可复用、可组合的方式来构建这类应用。
Chains 的主要类型和工作模式
LangChain 提供了多种类型的 Chain,下图清晰地展示了最常见的工作模式:
flowchart TDA[用户输入] --> B[PromptTemplate<br>提示模板]B -- 填充变量 --> C[LLM<br>大语言模型]C -- 生成文本 --> D[OutputParser<br>输出解析器]D -- 结构化数据 --> E[最终结果]F[简单顺序链] --> G[组件序列化执行]H[转换链] --> I[处理列表数据<br>如文档摘要]J[路由链] --> K[根据输入选择不同处理分支]L[自定义链] --> M[自由组合组件<br>实现复杂逻辑]
其中最基础、最常用的是 LLMChain,它构成了绝大多数复杂链的基础。其工作流程如下:
from langchain.chains import LLMChain
from langchain.prompts import PromptTemplate
from langchain_community.llms import OpenAI # 或 from langchain_openai import ChatOpenAI# 1. 创建模板
prompt = PromptTemplate(input_variables=["product"],template="为一家生产{product}的公司起一个好听的名字,并给出一个 slogan。",
)# 2. 创建模型
llm = OpenAI(temperature=0.7) # 或者 ChatOpenAI(model="gpt-3.5-turbo")# 3. 创建链
chain = LLMChain(llm=llm, prompt=prompt)# 4. 运行链
result = chain.run("环保可降解的咖啡杯")
print(result)
# 输出可能:
# 公司名: 绿源杯业
# Slogan: 品味咖啡,守护地球每一杯。
调用deepseek
from langchain.chains import LLMChain
from langchain.prompts import PromptTemplate
from langchain_community.llms import OpenAI # 或 from langchain_openai import ChatOpenAI
from langchain_openai import ChatOpenAI# 1. 创建模板
prompt = PromptTemplate(input_variables=["product"],template="为一家生产{product}的公司起一个好听的名字,并给出一个 slogan。",
)# 2. 创建模型
#llm = OpenAI(temperature=0.7) # 或者 ChatOpenAI(model="gpt-3.5-turbo")
llm = ChatOpenAI(model="deepseek-chat",api_key="sk-api key",base_url="https://api.deepseek.com/v1", # DeepSeek API 地址temperature=0.7)
# 3. 创建链
chain = LLMChain(llm=llm, prompt=prompt)# 4. 运行链
result = chain.run("环保可降解的咖啡杯")
print(result)
# 输出可能:
# 公司名: 绿源杯业
# Slogan: 品味咖啡,守护地球每一杯。
其他有用的 Chain 类型
除了 LLMChain
,LangChain 还提供了许多开箱即用的高级链,专门为常见任务设计:
链类型 | 说明 | 典型应用 |
---|---|---|
Sequential Chain | 按顺序执行多个链,将一个链的输出作为下一个链的输入。 | 需要多步处理的任务,如翻译后再总结。 |
Transformation Chain | 处理文档列表,对每个文档进行转换(如总结),然后再组合。 | 长文档摘要(先分块总结,再合并)。 |
Router Chain | 根据输入内容,决定将其发送到哪个子链(专业模型)处理。 | 构建专家系统,如技术问题路由到编码模型,文学问题路由到创意模型。 |
Custom Chain | 自己组合各种组件和逻辑,实现高度定制化的流程。 | 任何复杂、独特的业务逻辑。 |
示例:SequentialChain
(顺序链)
from langchain.chains import SimpleSequentialChain# 假设我们已经定义了两个链
# chain_1: 负责生成公司名称
# chain_2: 负责根据公司名称写一段简短的介绍overall_chain = SimpleSequentialChain(chains=[chain_1, chain_2], verbose=True)# 运行总链
final_result = overall_chain.run("环保可降解的咖啡杯")
print(final_result)
# 输出:
# 绿源杯业是一家致力于... (这里包含了chain_1的输出和chain_2的输出)
如何选择和使用 Chains?
- 从
LLMChain
开始:绝大多数任务都是从定义一个好的提示模板和调用 LLM 开始的。这是最基本的构建块。 - 使用内置工具链:在构建常见应用(如带来源的问答Q&A、摘要、API交互)时,先查看LangChain是否提供了对应的内置链(如
create_retrieval_chain
,create_summarization_chain
),这可以节省大量时间。 - 组合而非重写:LangChain 的设计哲学是组合。尽量将复杂任务拆解成多个小链,然后用
SequentialChain
或自定义链将它们组装起来。 - 自定义复杂逻辑:当内置链无法满足需求时,可以继承
Chain
基类来创建完全自定义的链,完全控制_call
方法的执行逻辑。
总结
Chain(链) 是 LangChain 框架的支柱之一,它解决了复杂AI应用的编排问题。
- 核心价值:通过将多个模块化组件(LLM调用、提示、工具等)连接起来,完成单个LLM调用无法处理的复杂、多步任务。
- 关键思想:可组合性(Composability)。像搭积木一样构建应用程序。
- 使用场景:几乎所有稍复杂的LangChain应用都会用到链,从简单的提示模板化到复杂的多步推理和操作。
简单来说,如果你需要让LLM完成一个需要多个步骤的任务,Chain 就是你需要的工具。它让你的代码更加结构化、清晰且易于维护。