langchain学习总结-LCEL表达式与Runnable可运行协议

7 阅读2分钟

学习目标

理解 LangChain 中的 LCEL(LangChain Expression Language)表达式和 Runnable 协议的核心概念。

核心概念

1. Runnable 协议

Runnable 是 LangChain 中的核心接口协议,所有可运行的组件都实现了这个协议。主要方法包括:

  • invoke(input): 同步调用,传入输入,返回输出
  • batch(inputs): 批量调用
  • stream(): 流式输出

2. LCEL (LangChain Expression Language)

LCEL 是一种声明式的链式调用语法,使用管道操作符 | 将多个组件连接起来,形成处理流程。

示例对比

方式一:手写 Chain 实现(理解原理)

from typing import Any
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI

# 1. 构建组件
prompt = ChatPromptTemplate.from_template("{query}")
llm = ChatOpenAI(model="moonshot-v1-8k")
parser = StrOutputParser()

# 2. 定义链
class Chain:
    steps: list = []

    def __init__(self, steps: list):
        self.steps = steps

    def invoke(self, input: Any) -> Any:
        for step in self.steps:
            input = step.invoke(input)
        return input

# 3. 编排链
chain = Chain([prompt, llm, parser])

# 4. 执行
result = chain.invoke({"query": "你好,你是?"})

关键点:

  • 手写 Chain 类展示了链的执行原理
  • 每个步骤必须实现 invoke 方法
  • 数据流从前一个组件的输出传递到下一个组件的输入

方式二:LCEL 表达式(推荐使用)

from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI

# 1. 构建组件
prompt = ChatPromptTemplate.from_template("{query}")
llm = ChatOpenAI(model="moonshot-v1-8k")
parser = StrOutputParser()

# 2. 使用 LCEL 创建链
chain = prompt | llm | parser

# 3. 调用
result = chain.invoke({"query": "请讲一个程序员的冷笑话"})

关键点:

  • 使用 | 操作符串联组件
  • 简洁、易读、易维护
  • 自动处理数据流转

数据流转过程

输入: {"query": "你好"}
    ↓
Prompt (模板) → "你好"
    ↓
LLM (模型) → AIMessage(content="我是AI助手...")
    ↓
Parser (解析器) → "我是AI助手..."
    ↓
输出: "我是AI助手..."

常见组件

1. Prompt 模板

  • ChatPromptTemplate.from_template()
  • 将输入字典转换为提示词

2. LLM 模型

  • ChatOpenAI
  • 接收提示词,生成消息

3. Output Parser 解析器

  • StrOutputParser()
  • 将 AIMessage 转换为字符串

最佳实践

  1. 使用 LCEL 语法:简洁且易于维护
  2. 理解组件职责:每个组件只做一件事
  3. 注意数据类型:确保上下游组件的输入输出类型匹配
  4. 调试技巧:可以在链中加入自定义的处理步骤打印中间结果

扩展阅读

  • LangChain Runnable 协议文档
  • LCEL 高级用法(并行、分支、循环)
  • 自定义 Runnable 组件