【LangChain】 入门:从分步调用到链式编程

LangChain 入门:从分步调用到链式编程

本文基于一段翻译助手的示例代码,讲解 LangChain 的核心概念、输出解析器的作用,以及普通写法与链式写法的对比。


一、LangChain 是什么?

名字拆解

缩写 含义
Lang Lang uage(语言)→ 大语言模型(LLM = Large Language Model)
Chain 链 → 把多个步骤像链条一样串起来执行

核心理念:把和大语言模型打交道的各种操作,拆成一个个小模块,再用"链"串起来,像工厂流水线一样工作。

复制代码
原料 → 工序A → 工序B → 工序C → 成品
     ↓        ↓        ↓
   提示词   调模型    解析结果

二、完整代码示例(翻译助手)

以下是一段使用 LangChain 调用通义千问模型进行翻译的完整代码:

python 复制代码
from langchain import PromptTemplate
from langchain_community.chat_models import ChatTongyi
from langchain_core.output_parsers import StrOutputParser

# 1. 创建模型客户端
model = ChatTongyi()

# 2. 构建提示词模板
prompt = PromptTemplate(
    template="你是一个翻译助手,请讲以下内容翻译成{language}:{text}"
)

# 3. 输入参数,构建真正的提示词
fact_prompt = prompt.format(language="中文", text="I am a programmer")
print(fact_prompt)

# 4. 调用模型
result = model.invoke(fact_prompt)

# 5. 解析输出结果
parser = StrOutputParser()
str_result = parser.invoke(result)
print(str_result)

三、分步详解

第1步:创建模型客户端

python 复制代码
model = ChatTongyi()

初始化通义千问( Tongyi )的聊天模型客户端,后续通过它向大模型发送请求。


第2步:构建提示词模板

python 复制代码
prompt = PromptTemplate(
    template="你是一个翻译助手,请讲以下内容翻译成{language}:{text}"
)

使用 PromptTemplate 创建带占位符的模板:

  • {language} → 目标语言(如"中文")
  • {text} → 待翻译内容(如"I am a programmer")

好处:模板可复用,只需替换变量就能生成不同提示词。


第3步:填充参数

python 复制代码
fact_prompt = prompt.format(language="中文", text="I am a programmer")

将具体值填入占位符,生成真正发送给模型的提示词:

复制代码
你是一个翻译助手,请讲以下内容翻译成中文:I am a programmer

第4步:调用模型

python 复制代码
result = model.invoke(fact_prompt)

向大模型发送请求,返回一个复杂对象(不是纯文本)。


第5步:解析输出结果 ⭐重点

python 复制代码
parser = StrOutputParser()
str_result = parser.invoke(result)
print(str_result)
为什么要解析?

大模型返回的 result 是一个包装对象,结构类似:

python 复制代码
AIMessage(
    content="我是一名程序员",           # 真正的回答内容
    response_metadata={
        "token_usage": {...},         # Token 消耗统计
        "model_name": "qwen-turbo",   # 模型名称
        "finish_reason": "stop"       # 结束原因
    },
    id="run-xxxxxx",
    usage_metadata={"input_tokens": 15, "output_tokens": 6, "total_tokens": 21}
)
StrOutputParser 的作用
功能 说明
提取 content AIMessage 对象中抽取出 .content 字段
转为纯字符串 去掉所有元数据包装,只保留模型生成的文本
链式兼容 可以无缝接入 LangChain 的 `

效果对比

操作 输出结果
print(result) AIMessage(content='我是一名程序员', ...) 一大串对象信息
print(str_result) 我是一名程序员 ← 干净的人话

解析的本质 :大模型 API 返回的是"包裹在快递盒里的商品",StrOutputParser 就是帮你拆快递盒,只把里面的"商品"(纯文本答案)拿出来。


四、普通写法 vs 链式写法

普通写法(分步式)

python 复制代码
from langchain import PromptTemplate
from langchain_community.chat_models import ChatTongyi
from langchain_core.output_parsers import StrOutputParser

# 创建各个组件
model = ChatTongyi()
prompt = PromptTemplate(
    template="你是一个翻译助手,请讲以下内容翻译成{language}:{text}"
)
parser = StrOutputParser()

# 手动一步步执行
fact_prompt = prompt.format(language="中文", text="I am a programmer")
result = model.invoke(fact_prompt)
str_result = parser.invoke(result)

print(str_result)  # 我是一名程序员

特点:每一步都显式写出来,变量中间结果可见,适合调试理解。


链式写法(管道式)

python 复制代码
from langchain import PromptTemplate
from langchain_community.chat_models import ChatTongyi
from langchain_core.output_parsers import StrOutputParser

# 创建组件
model = ChatTongyi()
prompt = PromptTemplate(
    template="你是一个翻译助手,请讲以下内容翻译成{language}:{text}"
)
parser = StrOutputParser()

# 用 | 符号把组件串成一条链
chain = prompt | model | parser

# 一次调用,全程自动流转
result = chain.invoke({
    "language": "中文", 
    "text": "I am a programmer"
})

print(result)  # 直接输出:我是一名程序员

特点 :一行 chain = prompt | model | parser 定义数据流向,调用时自动按顺序执行。


对比总结

维度 普通写法 链式写法
代码行数 多,步骤分散 少,高度浓缩
可读性 适合新手,流程清晰 适合熟练后,一眼看全貌
中间变量 fact_promptresultstr_result 都暴露 内部自动传递,无中间变量
数据流向 靠变量赋值串联 靠 `
调试难度 容易,每步可打断点检查 稍难,错误可能在链中某环
扩展性 改流程要改多处 改链定义即可,如加 `prompt
LangChain 推荐度 教学/理解用 生产/工程用

底层执行逻辑

两者完全一样,只是代码组织方式不同:

复制代码
普通写法:  prompt.format() → model.invoke() → parser.invoke()
链式写法:  prompt | model | parser → chain.invoke()

实际都是:  字典参数 → 填充模板 → 调用模型 → 解析结果 → 输出字符串

\| 只是语法糖,LangChain 内部会把 A | B 转成 RunnableSequence(A, B),按顺序执行。


五、总结

Lang = 语言(模型),Chain = 链(式组合)

LangChain = 让语言模型工作流像搭积木一样简单

写法 适用场景
普通写法 学习阶段,理解每一步在干什么
链式写法 实际项目,代码简洁、易于维护

建议:先理解普通写法每一步在干什么,再过渡到链式写法写实际项目。

普通写法是"手工作坊"------每一步亲力亲为,看得懂;

链式写法是"流水线"------定义好工序,原料进去成品出来,效率高。


本文基于 LangChain 翻译助手示例整理,涵盖提示词模板、模型调用、输出解析及链式编程核心概念。

相关推荐
gb42152877 小时前
python中pypdf库和langchain-unstructured库在解析pdf文件的时候的区别?
python·langchain·pdf
badhope8 小时前
用RAG做了个智能客服,上线第一天就被用户骂了——我的7天实战复盘
人工智能·langchain
Wang's Blog14 小时前
AI Agent白手起家44: LangChain 文档切分实战 — 长度、文本架构与语义切片
人工智能·langchain
jaboo1214 小时前
postgresql从入门到精通
数据库·postgresql·langchain
闲猫1 天前
LangChain / Integrations / Integrations by component / Tool
java·数据库·langchain
程序员AI工坊1 天前
Agent 开发:ReAct 循环与工具调用实战——从单次调用到自主 Agent
人工智能·后端·python·langchain·agent·react
Wang's Blog1 天前
AI Agent白手起家41: LangChain 链的高级应用:函数、记忆、路由与容错
langchain
Wang's Blog1 天前
AI Agent白手起家37: LangChain 输出解析器实战:文本、JSON、XML 与 Pydantic
xml·langchain·json
梦想三三2 天前
Qwen Function Calling实战:重构电商客服AI Agent
人工智能·python·langchain·大模型·rag
hboot2 天前
AI工程师第六课 - RAG检索增强生成
后端·langchain·llm