LangChain_LCEL链式表达式实战

LangChain LCEL 链式表达式实战:从入门到生产级应用

作者:Crown_22 | AI Agent & 自动化工作流开发者 | 技术分享

前言

如果你还在用 chain.run() 这种老式写法来调用 LangChain,那这篇文章就是为你准备的。

LangChain Expression Language(LCEL)是 LangChain 0.1.0 引入的声明式链式调用语法,它彻底改变了我们构建 AI 应用的方式。不是简单的语法糖,而是架构层面的升级——支持流式输出、批量处理、异步调用、并行执行,而且所有组件都可以无缝组合。

我在实际项目中踩过不少 LCEL 的坑,今天把经验分享出来,帮你少走弯路。


在这里插入图片描述

一、LCEL 是什么?为什么用它?

1.1 老式写法的问题

# ❌ 老式写法(已废弃)
from langchain.chains import LLMChain
from langchain.prompts import PromptTemplate

chain = LLMChain(llm=llm, prompt=prompt)
result = chain.run(input="你好")

问题:

  • 不支持流式输出
  • 不支持异步
  • 链式组合困难
  • 错误处理复杂
  • 无法批量处理

1.2 LCEL 写法

# ✅ LCEL 写法
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser

chain = prompt | llm | StrOutputParser()
result = chain.invoke({
   
   "input": "你好"})

优势:

  • | 管道语法,直观易读
  • 自动支持 .invoke().stream().batch().ainvoke()
  • 可以任意组合组件
  • 内置重试和回退机制

1.3 核心概念:Runnable 接口

LCEL 中所有组件都实现了 Runnable 接口:

class Runnable:
    def invoke(self, input, config=None) -> output
    async def ainvoke(self, input, config=None) -> output
    def stream(self, input, config=None) -> Iterator[output]
    def batch(self, inputs, config=None) -> List[output]
    def __or__(self, other) -> RunnableSequence  # | 管道语法

这意味着你可以对任何组件使用相同的方法,不需要记忆不同的 API。


二、基础组件实战

2.1 PromptTemplate

from langchain_core.prompts import ChatPromptTemplate

# 简单模板
prompt = ChatPromptTemplate.from_template(
    "你是一个{role},请用{style}的方式回答:{question}"
)

# 多消息模板
system_prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个资深的{domain}专家,回答要简洁准确。"),
    ("human", "{question}")
])

# 格式化测试
messages = prompt.format_messages(
    role="Python专家",
    style="简洁",
    question="什么是装饰器?"
)
print(messages)

2.2 OutputParser

from langchain_core.output_parsers import (
    StrOutputParser,      # 字符串输出
    JsonOutputParser,     # JSON输出
    PydanticOutputParser, # Pydantic模型输出
)

# 字符串解析器(最常用)
str_parser = StrOutputParser()

# JSON解析器
json_parser = JsonOutputParser()

# Pydantic解析器(结构化输出)
from pydantic import BaseModel, Field

class CodeReview(BaseModel):
    issues: list[str] = Field(description="发现的问题列表")
    suggestions: list[str] = Field(description="改进建议")
    score: int = Field(description="代码质量评分 1-10")

pydantic_parser = PydanticOutputParser(pydantic_object=CodeReview)

2.3 组合使用


                
「LLM那些事」系列第 4 篇《上下文窗口的边界》,文章连接:https://blog.csdn.net/houwenjin/article/details/163999753。 演示什么:在「预测」Sheet 的黄色格子里输入一句话(默认「来泡一杯」),四个「模型」——分别只统计最后 1 / 2 / 3 / 4 个字的 n-gram 查表——同时预测下一个字。同一个输入,看的上下文越长,候选越少、预测越确定: ┌────────────────┬──────────┬───────────────┬──────┐ │ 只看最后几个字 │ 用的前缀 │ 候选下一字数 │ 预测 │ ├────────────────┼──────────┼───────────────┼──────┤ │ 1 个 │ 杯 │ 3(茶/子/水) │ 模糊 │ ├────────────────┼──────────┼───────────────┼──────┤ │ 2 个 │ 一杯 │ 2(茶/水) │ 收窄 │ ├────────────────┼──────────┼───────────────┼──────┤ │ 3 个 │ 泡一杯 │ 1(茶) │ 确定 │ ├────────────────┼──────────┼───────────────┼──────┤ │ 4 个 │ 来泡一杯 │ 1(茶) │ 确定 │ └────────────────┴──────────┴───────────────┴──────┘
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值