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_promptresultstr_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 翻译助手示例整理,涵盖提示词模板、模型调用、输出解析及链式编程核心概念。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐