【LangChain系列八】LangChain 基础使用:链式编程快速上手

前面几篇把 LangChain 的模型、提示词、输出解析器都讲了,这篇把这些零件组装起来——聊聊 LangChain 的链式编程。

链式编程是 LangChain 最核心的设计思想。把模型、提示词、解析器像管道一样串起来,数据流过去,结果就出来了。

1. 先搞清楚整体流程

用 LangChain 调用大模型,标准流程就五步:

  1. 定义大模型
  2. 定义消息(提示词)
  3. 调用大模型
  4. 定义输出解析器
  5. 链式执行

看起来步骤多,但其实写起来很短。下面一步步来。

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 格式的内容。更可靠的方案是用 PydanticOutputParserwith_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 都是在这个基础上叠加。

觉得有帮助的话,点个赞👍收藏⭐支持一下吧!

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐