【LangChain系列八】LangChain 基础使用:链式编程快速上手
文章目录
【LangChain系列八】LangChain 基础使用:链式编程快速上手
前面几篇把 LangChain 的模型、提示词、输出解析器都讲了,这篇把这些零件组装起来——聊聊 LangChain 的链式编程。
链式编程是 LangChain 最核心的设计思想。把模型、提示词、解析器像管道一样串起来,数据流过去,结果就出来了。
1. 先搞清楚整体流程
用 LangChain 调用大模型,标准流程就五步:
- 定义大模型
- 定义消息(提示词)
- 调用大模型
- 定义输出解析器
- 链式执行
看起来步骤多,但其实写起来很短。下面一步步来。
2. 定义模型和消息
from langchain_openai import ChatOpenAI
from langchain_core.messages import SystemMessage, HumanMessage
# 定义模型
model = ChatOpenAI(
model="gpt-4",
temperature=0
)
# 定义消息
messages = [
SystemMessage(content="你是一个翻译助手,把中文翻译成英文"),
HumanMessage(content="今天天气真不错")
]
SystemMessage 是系统指令,告诉模型扮演什么角色。HumanMessage 是用户输入。这两个是最基本的消息类型。
调用模型很简单:
result = model.invoke(messages)
print(result.content)
# 输出类似: "The weather is really nice today."
3. 输出解析器:StrOutputParser
直接调用模型返回的是一个 AIMessage 对象,要拿到纯文本字符串,还得 .content。每次这么写挺烦的。
StrOutputParser 就是干这个的——把模型输出直接转成字符串:
from langchain_core.output_parsers import StrOutputParser
parser = StrOutputParser()
# 单独用
result = model.invoke(messages)
text = parser.invoke(result)
print(text)
# 直接就是字符串,不用再 .content 了
当然,单独用解析器没啥意义。它的价值在于——链式组合。
4. 链式调用:三种写法
这才是 LangChain 的精髓。把模型和解析器串起来,形成一条"链"。
写法一:管道运算符 |(最推荐)
chain = model | parser
result = chain.invoke(messages)
print(result)
# 直接拿到字符串
一个 | 就把模型和解析器串起来了。invoke 之后,数据先经过模型,再经过解析器,最终输出字符串。
这种写法最简洁,也是 LangChain 社区最常用的风格。
写法二:RunnableSequence
from langchain_core.runnables import RunnableSequence
chain = RunnableSequence(model, parser)
result = chain.invoke(messages)
和 model | parser 效果完全一样,只是写法更显式。了解一下就行,实际开发中很少这么写。
写法三:.pipe() 方法
chain = model.pipe(parser)
result = chain.invoke(messages)
又是一种等价写法。如果你更习惯函数式编程的风格,.pipe() 也挺直观。
三种写法选哪种?我个人推荐 |,最简洁,社区认可度最高。后面所有示例都用这种。
5. 把 Prompt 也串进来
实际开发中,你不会手动拼消息列表。而是用 ChatPromptTemplate 定义模板,然后一起串进链里:
from langchain_core.prompts import ChatPromptTemplate
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个翻译助手,把{source_lang}翻译成{target_lang}"),
("user", "{text}")
])
# 三件套:prompt → model → parser
chain = prompt | model | parser
# 调用
result = chain.invoke({
"source_lang": "中文",
"target_lang": "英文",
"text": "今天天气真不错"
})
print(result)
这就是 LangChain 的标准范式了。prompt 负责格式化输入,model 负责推理,parser 负责提取输出。三个环节各司其职,通过 | 串成一条流水线。
6. 实战:做个简单的问答链
来个稍微实际点的例子——做个能回答问题的链,要求模型用中文回答,并且控制回答长度:
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
# 模型
model = ChatOpenAI(model="gpt-4", temperature=0.7)
# 提示词
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个知识渊博的技术专家。请用简洁的中文回答问题,不超过200字。"),
("user", "{question}")
])
# 解析器
parser = StrOutputParser()
# 组装
chain = prompt | model | parser
# 使用
answer = chain.invoke({"question": "什么是微服务架构?"})
print(answer)
整个调用就一行 chain.invoke(...),干净利落。
7. 链的复用和组合
链的好处是可以复用。定义一次,到处调用:
questions = [
"什么是RESTful API?",
"Python的GIL是什么?",
"Docker和虚拟机有什么区别?"
]
for q in questions:
answer = chain.invoke({"question": q})
print(f"Q: {q}")
print(f"A: {answer}\n")
而且链是可以嵌套组合的。一条链的输出可以作为另一条链的输入,这就形成了更复杂的处理流程。不过这个后面讲 LCEL(LangChain Expression Language)时再展开。
8. 加个输出解析器的进阶用法
StrOutputParser 是最简单的解析器,但实际场景中你可能需要结构化输出。比如让模型返回 JSON:
from langchain_core.output_parsers import JsonOutputParser
from langchain_core.prompts import ChatPromptTemplate
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个信息提取器。请以JSON格式返回结果。"),
("user", "从这段文本中提取人名和年龄:{text}")
])
chain = prompt | model | JsonOutputParser()
result = chain.invoke({"text": "小明今年25岁,他的朋友小红23岁"})
print(result)
# {'小明': 25, '小红': 23} 或类似的结构
不过 JsonOutputParser 有时候不太稳定,模型可能返回不符合 JSON 格式的内容。更可靠的方案是用 PydanticOutputParser 或 with_structured_output,这些后面的文章会详细讲。
9. 调试技巧:查看链的中间结果
调试时你可能想看 prompt 格式化后的结果,或者模型的原始输出。用 RunnablePassthrough 可以实现:
from langchain_core.runnables import RunnablePassthrough
# 只看 prompt 的输出
debug_chain = prompt | RunnablePassthrough()
result = debug_chain.invoke({"question": "什么是Python?"})
print(result)
或者用 LangSmith(LangChain 的可观测性平台)来追踪每一步的输入输出,这个在生产环境中很有用。
小结
这篇文章讲了 LangChain 链式编程的核心:
- 整体流程:模型 → 提示词 → 输出解析器,通过
|串起来 - 三种链式写法:
|管道、RunnableSequence、.pipe(),推荐用| - 标准范式:
prompt | model | parser三件套 - 复用性:定义一次,多次调用
链式编程是 LangChain 的灵魂。掌握了它,后面做 RAG、Agent 都是在这个基础上叠加。
觉得有帮助的话,点个赞👍收藏⭐支持一下吧!
更多推荐


所有评论(0)