从零讲透 LangChain 链式调用:让模型不只是“能说”,而是“能干”
一、我一开始对 LangChain 的最大误解
最开始我以为 LangChain 的核心价值是 Prompt。
于是我花了很多时间去调 Prompt,结果跑起来却是这样的:
response = model.invoke(prompt)
print(response.content)
看起来很高级,实际上只是:
“把大模型当成一个特别贵的 print”。
问题不在模型,而在我——
我只学会了“调模型”,没学会“搭流程”。
二、什么是 LangChain 的链式调用?
一句话版本:
链式调用(Chain)= 把 Prompt、模型、输出解析、甚至多个步骤串成一条可复用的流水线。
以前我是这样用的:
Prompt → Model → 自己处理字符串
后来我意识到,真正工程化的用法是
Prompt
↓
Model
↓
Output Parser
↓
下一步逻辑(判断 / 入库 / 调用工具)
在 LangChain 里,这条线可以用 LCEL(LangChain Expression Language) 一行写完。
三、我最早真正“开窍”的一个例子
场景:评论情感分析
❌ 我最开始的写法(别学)
prompt = f"判断评论情感:{comment}"
result = model.invoke(prompt)
print(result.content)
结果是:
“这条评论整体是正面的,因为……”
人能看懂,代码完全没法用。
✅ 用链式调用的正确姿
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import PydanticOutputParser
from pydantic import BaseModel, Field
class SentimentResult(BaseModel):
sentiment: str = Field(description="positive / neutral / negative")
confidence: float = Field(description="0~1")
parser = PydanticOutputParser(pydantic_object=SentimentResult)
prompt = ChatPromptTemplate.from_template(
"分析评论情感:\n{comment}\n\n{format_instructions}"
)
chain = (
prompt.partial(format_instructions=parser.get_format_instructions())
| model
| parser
)
调用时:
result = chain.invoke({"comment": "性价比高,就是物流太慢"})
print(result.sentiment)
print(result.confidence)
📌 那一刻我突然明白:
链的意义不是“少写几行代码”,而是“让模型输出变得可依赖”。
四、链式调用到底解决了什么痛点?
我总结了三个我最痛的点:
|
痛点 |
没有 Chain |
用了 Chain |
|---|---|---|
|
输出不稳定 |
自己正则硬撸 |
输出解析器兜底 |
|
流程难复用 |
copy paste Prompt |
一条链到处用 |
|
多步逻辑乱 |
if else 堆代码 |
链天然支持组合 |
一句话:
Chain 是把“实验性 Prompt”升级成“生产级流程”的关键。
五、我最常用的几种链形态
✅ 1. Prompt + Model + Parser(最基础,也是主力)
适合:80% 的业务场景
chain = prompt | model | parser
特点:
-
结构清晰
-
易测试
-
易维护
✅ 2. 多步链(Sequential Chain)
比如我先总结,再判断情感:
summary_chain = summary_prompt | model | StrOutputParser()
sentiment_chain = sentiment_prompt | model | parser
text = "..."
summary = summary_chain.invoke({"text": text})
sentiment = sentiment_chain.invoke({"text": summary})
📌 我现在的原则:
一步干一件事,而不是一个 Prompt 干完所有事。
✅ 3. 条件分支链(Router Chain)
当用户意图不同时,走不同链:
if category == "refund":
chain = refund_chain
elif category == "complaint":
chain = complaint_chain
更高级一点,可以用 RunnableLambda动态路由。
六、我踩过的 3 个典型坑
❌ 1. 把链写得太“重”
一个 Prompt 干:
-
分类
-
总结
-
抽取
-
改写
结果:每一步都不稳定
✅ 解法:拆链,拆 Prompt。
❌ 2. 忽略输出解析器
chain = prompt | model
然后自己 .split()、.find("JSON")……
✅ 解法:链的最后一定是 parser。
❌ 3. 把 LangChain 当“魔法框架”
以为 Chain 会自动帮我:
-
修 Prompt
-
修模型幻觉
-
修业务错误
✅ 现实是:
Chain 只负责“怎么跑”,不负责“跑得对”。
七、我现在的 Chain 设计原则
我自己总结的一条经验公式:
清晰的 Prompt + 稳定的 Parser + 单一职责的 Chain = 可用系统
具体落地就是:
-
一个链只做一件事
-
输出一定结构化
-
所有业务判断都基于解析后的数据,而不是原始文本
八、一句话总结
**Prompt 决定模型“怎么想”,
Output Parser 决定“能不能用”,
Chain 决定“能不能上线”。**
没有链式调用,LangChain 只是 Prompt 工具;
有了链式调用,它才真正成为 AI 应用骨架。
更多推荐

所有评论(0)