定义
LangChain链式调用核心是利用 | 运算符,串联 PromptTemplate、ChatOpenAI、JsonOutputParser 等功能组件,形成有序执行流水线,生成全新可调用对象。通过统一调用完成端到端任务,无需手动逐组件传递参数,实现流程自动化。
示例
python
from langchain_core.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import JsonOutputParser
from pydantic import BaseModel, Field
# 模型名称,修正空格避免识别错误
model_name = "qwen-plus"
# 模型基础地址,修正空格确保链接有效性
base_url = "https://dashscope.aliyuncs.com/compatible-mode/v1"
# 替换为个人有效API Key,原笔记中的敏感信息已替换为占位符并提示替换
api_key = "[API Key]"
# 大模型初始化(参数配置见专项笔记)
llm = ChatOpenAI(
model_name=model_name,
base_url=base_url,
api_key=api_key
)
# 提示模板初始化(细节见专项笔记)
prompt_template = PromptTemplate.from_template(
"""问题内容:计算{num1}和{num2}的和。输出格式:{format_instructions}"""
)
# 输出解析器相关(细节见专项笔记)
class Result(BaseModel):
# 两个数的和(整数类型)
sum: int
# 计算过程描述(字符串类型)
description: str
_ = (
sum.set_config(description="两个数的和"),
description.set_config(description="计算描述")
)
# 初始化JSON输出解析器,关联Result模型
json_output_parser = JsonOutputParser(pydantic_object=Result)
# 预填充格式说明,避免重复传参
prompt_template = prompt_template.partial(
format_instructions=json_output_parser.get_format_instructions()
)
# 构建链式调用:提示模板→大模型→输出解析器
chain = prompt_template | llm | json_output_parser
# invoke方法:同步调用,直接获取完整结果(适用于需完整结果场景)
result = chain.invoke(input={"num1": 10, "num2": 20})
# 打印最终结构化结果
print("invoke方法结果:", result)
执行现象
结合示例可见,LangChain链式调用的核心现象是:通过 | 运算符可直接关联多个LangChain核心对象(示例中为 prompt_template、llm、json_output_parser),快速生成具备自动化流水线能力的全新链式对象(示例中的 chain)。
该链式对象仅需调用 invoke 方法并传入初始参数(示例中为 num1 = 10、num2 = 20),无需手动干预中间流程,内部会按组件串联顺序自动触发对应方法,实现数据接力处理并返回最终结果。
补充说明:除示例中使用的 invoke 同步调用外,链式对象还支持 stream 流式调用(示例未涉及),可逐块获取结果,适合需要实时展示响应的场景。
构建逻辑
示例的构建逻辑遵循「数据流转方向」:按 "提示模板→大模型→输出解析器" 的顺序,用 | 串联组件。核心规则是前一组件的输出必须能作为后一组件的输入,示例中:
- 提示模板(
prompt_template):接收初始参数,生成包含计算需求和格式要求的提示词。 - 大模型(
llm):接收提示词,生成符合要求的响应内容。 - 输出解析器(
json_output_parser):接收响应内容,转换为结构化数据。
python
# 示例构建核心代码(按数据流转顺序串联)
chain = prompt_template | llm | json_output_parser
执行流程
示例中采用 invoke 同步执行方式,流程简洁且自动化,具体步骤:
- 调用链式对象的
invoke方法,传入初始参数(示例中为{"num1": 10, "num2": 20})。 - 内部自动执行:初始参数先传入提示模板生成提示词,提示词传入大模型生成响应,响应传入解析器转换为结构化数据。
- 执行完成后,直接返回最终的结构化结果,通过
print语句即可查看。
python
# 示例执行核心代码(invoke同步调用)
result = chain.invoke(input={"num1": 10, "num2": 20})
print("invoke方法结果:", result)
补充说明(流式调用):若需使用流式调用,可将 invoke 替换为 stream,示例代码如下(非原示例内容,仅作扩展):
python
# 流式调用示例(扩展)
print("stream方法结果:")
for chunk in chain.stream(input={"num1": 10, "num2": 20}):
# 过滤空片段,确保输出整洁
if chunk:
print(chunk)
原理
- 串联与执行逻辑 :
|运算符将实现Runnable接口的组件串联为流水线。调用invoke或stream时,初始参数仅需传入第一个组件,后续组件通过内部自动接力完成执行,最终返回对应结果。 - 串联顺序规则:必须遵循「数据输入→处理组件→输出组件」的逻辑(如示例中「提示模板→大模型→解析器」),顺序错误会导致数据格式不匹配,进而中断执行流程。
- 调用方法要点 :
invoke和stream均只需传入第一个组件所需的初始参数,中间参数由链式内部自动传递;前者适合需要完整结果的场景,后者适合需实时展示结果的场景。 - 组件兼容性要求 :可通过
|串联的组件需实现 LangChain 的Runnable接口,核心组件默认已实现,可直接串联。
常见问题
- 组件不兼容报错 :若自定义组件无法串联,或调用
invoke/stream时报错,需优先检查组件是否实现Runnable接口及对应的调用方法。 - 执行流程中断:多数因组件顺序错误,或前序组件输出格式与后序组件输入要求不匹配,需核对串联顺序并校验组件间数据格式。
- 参数传递失败:检查传入的初始参数是否符合第一个组件的格式要求,避免遗漏必填参数或参数类型错误。