前言:

在旧版本的

LangChain 中,我们需要写很多复杂的 Chain 类(比如 LLMChain),但现在有了 Runnable 和 |,一切都变得像搭积木一样优雅和简单。

核心原理解析:什么是 Runnable 和 |

  1. Runnable(可运行对象): 在最新的 LangChain 架构中,几乎所有的核心组件(Prompt 模板、大语言模型、输出解析器等)都实现了 Runnable 接口。这意味着它们都有统一的标准方法,比如 .invoke()(单次调用)、.stream()(流式输出)和 .batch()(批量处理)。
  2. 管道符 (|): 它的灵感来源于 Unix 系统的管道命令。它的作用是将左边 Runnable 的输出,无缝作为右边 Runnable 的输入

例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser

# 1. 定义 Prompt 模板
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个专业的翻译"),
("human", "{language}: {text}"),
])

# 2. 实例化解析器(注意这里要加括号)
str_output_parser = StrOutputParser()

# --- 方式一:拆解执行 ---
# 执行提示:生成 PromptValue 对象
valueA = prompt.invoke({"language": "en", "text": "Hello, I am a student."})

# 执行模型:将提示传递给 llm(假设你已经定义了 llm)
valueB = llm.invoke(valueA)

# 执行解析器:将模型结果转换为字符串
valueC = str_output_parser.invoke(valueB)

# --- 方式二:链条式执行(推荐) ---
# 这里的管道符 | 会自动处理数据的传递
chain = prompt | llm | str_output_parser
result = chain.invoke({"language": "en", "text": "Hello, I am a student."})

print(result)

核心机制

  • 标准化接口:任何实现了 Runnable 接口的对象都可以参与管道串联。
  • 自动状态传递:当你使用 | 时,前一个组件完成处理后,会自动将结果传递给下一个组件的 invoke 方法,极大减少了中间代码。
  • 组合能力chain 本身也是一个 Runnable,因此你可以将一个完整的 chain 再次通过 | 串联到另一个更大的流程中。