Langchain 工作流编排

一、工作流编排核心架构

LangChain通过LCEL(LangChain Expression Language)Runnable接口构建声明式工作流,其核心原理是:

  1. 所有组件实现Runnable接口标准化调用
  2. 使用管道符|连接组件形成链(Chain)
  3. 自动支持流式传输/异步/并行等特性
from langchain_core.runnables import RunnablePassthrough

chain = prompt | model | output_parser  # LCEL管道语法

二、LCEL(LangChain Expression Language)

核心作用
  • 声明式组合:用|运算符连接Runnable组件
  • 自动类型推导:验证组件输入输出兼容性
  • 运行时优化:自动并行/批处理可加速的环节
基础用法
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI

prompt = ChatPromptTemplate.from_template("讲一个关于{topic}的故事")
model = ChatOpenAI()
chain = prompt | model | (lambda x: x.content)  # 组合Prompt+LLM+输出解析

chain.invoke({"topic": "龙"})  # 输出完整故事文本
高级组合
# 分支与合并
from langchain_core.runnables import RunnableParallel

map_chain = RunnableParallel(
    joke=chain,
    poem=poem_chain  # 假设已定义的诗生成链
)

三、Runnable接口

统一接口方法

所有组件(模型/提示词/解析器等)都实现以下方法:

class Runnable(Protocol):
    def invoke(self, input: Any) -> Any: ...        # 同步调用
    async def ainvoke(self, input: Any) -> Any: ... # 异步调用
    def batch(self, inputs: List) -> List: ...      # 批量处理
    def stream(self, input: Any) -> Iterator: ...   # 流式输出
关键特性
  1. 自动适配:无论输入是dict/str/list都会自动处理
  2. 组合嵌套:支持任意深度的链式组合
  3. 生命周期钩子:可通过事件监听进行调试
# 自定义Runnable
from langchain_core.runnables import RunnableLambda

def length_func(text: str) -> int:
    return len(text)

length_chain = RunnableLambda(length_func)
length_chain.invoke("hello")  # 输出5

四、Stream流式传输

实现原理
  • 逐步生成输出而非等待全部完成
  • 每个处理环节均支持流式(模型/转换器等)
同步流式
for chunk in chain.stream({"topic": "太空"}):
    print(chunk, end="", flush=True)
# 逐词打印生成的文本
异步流式
async for chunk in chain.astream({"topic": "火星"}):
    print(chunk, end="", flush=True)

五、Stream Events事件驱动

事件类型

通过stream_events方法捕获完整生命周期事件:

  • on_chain_start:链开始执行
  • on_llm_start:调用LLM
  • on_chat_model_stream:聊天模型输出块
  • on_chain_end:链执行完成
事件监听示例
from langchain_core.tracers import ConsoleCallbackHandler

events = chain.stream_events(
    {"topic": "AI"}, 
    version="v1",
    config={"callbacks": [ConsoleCallbackHandler()]}  # 控制台打印事件
)

for event in events:
    if event["event"] == "on_chat_model_stream":
        print(f"收到块: {event['data']['chunk'].content}")
典型事件结构
{
  "event": "on_llm_start",
  "name": "ChatOpenAI",
  "run_id": "uuid123",
  "data": {"input": "龙的传说"}
}

六、综合应用示例

from langchain_core.runnables import RunnablePassthrough

# 完整工作流
full_chain = (
    {"context": load_context, "query": RunnablePassthrough()}  # 并行执行
    | prompt_template 
    | model.with_config({"temperature": 0.7})
    | output_parser
)

# 流式+事件监听
async def process_query(query: str):
    async for event in full_chain.astream_events(
        query,
        version="v1",
        config={"metadata": {"user_id": "123"}}
    ):
        if event["event"] == "on_chat_model_stream":
            yield event["data"]["chunk"].content

七、核心优势总结

特性作用技术实现
LCEL声明式组合/类型安全/优化执行操作符重载+类型系统
Runnable统一接口/异步支持/组合能力接口协议+适配器模式
Stream低延迟输出/内存优化生成器+异步迭代器
Events实时监控/调试/中间结果捕获观察者模式+回调系统

通过这四者的结合,LangChain实现了:

  • 灵活组合:任意模块的自由拼接
  • 高效执行:自动批处理/流式/并行
  • 全链路可控:事件系统提供深度可观测性
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值