一、我一开始对 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 应用骨架

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐