【LangChain】 入门:从分步调用到链式编程
LangChain 入门:从分步调用到链式编程
本文基于一段翻译助手的示例代码,讲解 LangChain 的核心概念、输出解析器的作用,以及普通写法与链式写法的对比。
一、LangChain 是什么?
名字拆解
| 缩写 | 含义 |
|---|---|
| Lang | Language(语言)→ 大语言模型(LLM = Large Language Model) |
| Chain | 链 → 把多个步骤像链条一样串起来执行 |
核心理念:把和大语言模型打交道的各种操作,拆成一个个小模块,再用"链"串起来,像工厂流水线一样工作。
原料 → 工序A → 工序B → 工序C → 成品
↓ ↓ ↓
提示词 调模型 解析结果
二、完整代码示例(翻译助手)
以下是一段使用 LangChain 调用通义千问模型进行翻译的完整代码:
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步:创建模型客户端
model = ChatTongyi()
初始化通义千问( Tongyi )的聊天模型客户端,后续通过它向大模型发送请求。
第2步:构建提示词模板
prompt = PromptTemplate(
template="你是一个翻译助手,请讲以下内容翻译成{language}:{text}"
)
使用 PromptTemplate 创建带占位符的模板:
{language}→ 目标语言(如"中文"){text}→ 待翻译内容(如"I am a programmer")
好处:模板可复用,只需替换变量就能生成不同提示词。
第3步:填充参数
fact_prompt = prompt.format(language="中文", text="I am a programmer")
将具体值填入占位符,生成真正发送给模型的提示词:
你是一个翻译助手,请讲以下内容翻译成中文:I am a programmer
第4步:调用模型
result = model.invoke(fact_prompt)
向大模型发送请求,返回一个复杂对象(不是纯文本)。
第5步:解析输出结果 ⭐重点
parser = StrOutputParser()
str_result = parser.invoke(result)
print(str_result)
为什么要解析?
大模型返回的 result 是一个包装对象,结构类似:
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 链式写法
普通写法(分步式)
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) # 我是一名程序员
特点:每一步都显式写出来,变量中间结果可见,适合调试理解。
链式写法(管道式)
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_prompt、result、str_result 都暴露 |
内部自动传递,无中间变量 |
| 数据流向 | 靠变量赋值串联 | 靠 | 管道符号直观表达 |
| 调试难度 | 容易,每步可打断点检查 | 稍难,错误可能在链中某环 |
| 扩展性 | 改流程要改多处 | 改链定义即可,如加 prompt | model | parser | 其他 |
| LangChain 推荐度 | 教学/理解用 | 生产/工程用 |
底层执行逻辑
两者完全一样,只是代码组织方式不同:
普通写法: prompt.format() → model.invoke() → parser.invoke()
链式写法: prompt | model | parser → chain.invoke()
实际都是: 字典参数 → 填充模板 → 调用模型 → 解析结果 → 输出字符串
\| 只是语法糖,LangChain 内部会把 A | B 转成 RunnableSequence(A, B),按顺序执行。
五、总结
Lang = 语言(模型),Chain = 链(式组合)
LangChain = 让语言模型工作流像搭积木一样简单。
| 写法 | 适用场景 |
|---|---|
| 普通写法 | 学习阶段,理解每一步在干什么 |
| 链式写法 | 实际项目,代码简洁、易于维护 |
建议:先理解普通写法每一步在干什么,再过渡到链式写法写实际项目。
普通写法是"手工作坊"——每一步亲力亲为,看得懂;
链式写法是"流水线"——定义好工序,原料进去成品出来,效率高。
本文基于 LangChain 翻译助手示例整理,涵盖提示词模板、模型调用、输出解析及链式编程核心概念。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)