【LangChain学习笔记】链式调用

定义

LangChain链式调用核心是利用 | 运算符,串联 PromptTemplateChatOpenAIJsonOutputParser 等功能组件,形成有序执行流水线,生成全新可调用对象。通过统一调用完成端到端任务,无需手动逐组件传递参数,实现流程自动化。

示例

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_templatellmjson_output_parser),快速生成具备自动化流水线能力的全新链式对象(示例中的 chain)。

该链式对象仅需调用 invoke 方法并传入初始参数(示例中为 num1 = 10num2 = 20),无需手动干预中间流程,内部会按组件串联顺序自动触发对应方法,实现数据接力处理并返回最终结果。

补充说明:除示例中使用的 invoke 同步调用外,链式对象还支持 stream 流式调用(示例未涉及),可逐块获取结果,适合需要实时展示响应的场景。

构建逻辑

示例的构建逻辑遵循「数据流转方向」:按 "提示模板→大模型→输出解析器" 的顺序,用 | 串联组件。核心规则是前一组件的输出必须能作为后一组件的输入,示例中:

  • 提示模板(prompt_template:接收初始参数,生成包含计算需求和格式要求的提示词。
  • 大模型(llm:接收提示词,生成符合要求的响应内容。
  • 输出解析器(json_output_parser:接收响应内容,转换为结构化数据。
python 复制代码
# 示例构建核心代码(按数据流转顺序串联)
chain = prompt_template | llm | json_output_parser

执行流程

示例中采用 invoke 同步执行方式,流程简洁且自动化,具体步骤:

  1. 调用链式对象的 invoke 方法,传入初始参数(示例中为 {"num1": 10, "num2": 20})。
  2. 内部自动执行:初始参数先传入提示模板生成提示词,提示词传入大模型生成响应,响应传入解析器转换为结构化数据。
  3. 执行完成后,直接返回最终的结构化结果,通过 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 接口的组件串联为流水线。调用 invokestream 时,初始参数仅需传入第一个组件,后续组件通过内部自动接力完成执行,最终返回对应结果。
  • 串联顺序规则:必须遵循「数据输入→处理组件→输出组件」的逻辑(如示例中「提示模板→大模型→解析器」),顺序错误会导致数据格式不匹配,进而中断执行流程。
  • 调用方法要点invokestream 均只需传入第一个组件所需的初始参数,中间参数由链式内部自动传递;前者适合需要完整结果的场景,后者适合需实时展示结果的场景。
  • 组件兼容性要求 :可通过 | 串联的组件需实现 LangChain 的 Runnable 接口,核心组件默认已实现,可直接串联。

常见问题

  • 组件不兼容报错 :若自定义组件无法串联,或调用 invoke/stream 时报错,需优先检查组件是否实现 Runnable 接口及对应的调用方法。
  • 执行流程中断:多数因组件顺序错误,或前序组件输出格式与后序组件输入要求不匹配,需核对串联顺序并校验组件间数据格式。
  • 参数传递失败:检查传入的初始参数是否符合第一个组件的格式要求,避免遗漏必填参数或参数类型错误。
相关推荐
yinuo2 小时前
IndexedDB 使用指南
前端
小徐_23332 小时前
2025,AI 编程元年,我用 TRAE 做了这些!
前端·程序员·trae
沛沛老爹2 小时前
Web开发者实战RAG评估:从指标到工程化验证体系
前端·人工智能·llm·agent·rag·评估
软件技术NINI3 小时前
JavaScript性能优化实战指南
前端·css·学习·html
前端小配角3 小时前
React难上手原因找到了,原来是因为坑太多了。。。
前端
是你的小橘呀3 小时前
零基础也能懂!React Hooks实战手册:useState/useEffect上手就会,告别类组件
前端·架构
xhxxx3 小时前
从样式到结构:TailwindCss + Fragment 如何让 React 代码更干净、更高效
前端·css·react.js
Maxkim3 小时前
「✍️JS原子笔记 」深入理解JS数据类型检测的4种核心方式
前端·javascript·面试
小高0073 小时前
Elips-Core:轻量级 Node.js Web 框架核心实现
前端·javascript·node.js