【LangChain入门 5】工作流编排
主要介绍LCEL、Runnable interface、Stream的一些概念
主要内容:
- LCEL
- Runable interface
- Stream
- Stream events
一、LCEL (LangChain Expression Language )介绍
LangChain 表达式语言
LCEL是一种强大的工作流编排工具,可以从基本组件构建复杂任务连(Chain),并支持如流式处理、并行处理和日志记录等开箱即用的功能。
支持将原型投入生产,无需更改代码,从最简单的“提示 +LLM”链到最复杂的链。以下是一些亮点
-
一流的流式支持
当您使用LCEL构建链时,将获得可能得最佳时间到第一个标记(直到输出的第一块内容出现所经过的时间)
对于某些链,意味着我们直接从LLM流式书传输标记到流式输出解析器,将以与LLM提供程序输出原始标记的速率相同的速度获取解析的增量输出块 -
异步支持
使用LCEL构建的任何链都可以使用同步API(例如,在您的Jupyter笔记本中进行原型设计)及其异步API(例如,在LangServe服务器中)进行调用。 这使得可以在原型和生产中使用相同的代码,具有出色的性能,并且能够在同一服务器中处理许多并发请求。 -
优化的并行执行
每当LCEL链具有可以并行执行的步骤时(例如,如果从多个检索其中获取文档),LangChain会自动执行,无论是在同步接口还是异步接口中,以获得可能的最小的延迟。 -
重试和回退
LCEL链的任何部分配置重试和回退。使得链在规模上更可靠的好方法。 目前正在努力为重试/回退添加流式支持,这样您就可以获得额外的可靠性而无需任何延迟成本。 -
访问中间结果
对于更复杂的链,访问中间步骤的结果通常非常有用,即使在生成最终输出之前。 这可以用于让最终用户知道正在发生的事情,甚至用于调试您的链。 你可以流式传输中间结果,并且在每个LangServe服务器上都可以使用。 -
输入和输出模式
输入和输出模型为每个LCEL链提供了从链的结果推断出的Pydantic和JSONSchema模式。 这可用于验证输入和输出,并且LangServe的一个组成部分。
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
llm = ChatOllama( model="deepseek-r1:7b")
prompt = ChatPromptTemplate.from_template("给我讲个关于{input}的笑话")
parser = StrOutputParser() # 加了这段后,会讲Chunk类转化成字符串,也就是获取Chunk类中的content内容
chain = prompt | llm | parser
response = chain.invoke({"input": "孙悟空"})
print(response)
二、Runable Interface
为了尽可能简化创建自定义链的过程,我们实现了一个Runnable协议。 许多LangChain组件都实现了Runnable协议,
包括聊天模型,LLMS、输出解析器、检索器、提示模版等。 此外,还有一些有用的基本组件可用于处理可运行对象。
这是一个标准的接口,可以轻松定义自定义链,并以标准方式调用它们。 标准接口包括:
- stream: 返回响应的数据块
- invoke: 对输入调用链
- batch:对输入列表调用链
还有相应的异步方法,与asyncio一起使用await 语法以实现并发 - astream:异步返回响应的数据块
- ainvoke:异步调用链
- abatch:
- astream_log: 异步返回中间步骤,以及最终响应
- astream_events: beta 流式传输链中发生的事件
| 组件 | 输入类型 | 输出类型 |
|---|---|---|
| 提示 | 字典 | 提示值 |
| 聊天模型 | 单个字符串、聊天信息或提示值 | 聊天信息 |
| LLM | 单个字符串、聊天信息或提示值 | 字符串 |
| 输出解析器 | LLM或聊天模型的输出 | 取决于解析器 |
| 检索器 | 单个字符串 | 文档列表 |
所有可运行对象都公开输入和输出模式,以检查输入和输出:
- input_schema: 从可运行对象结构自动生成的输入Pydantic模型
- output_schema:从可运行对象结构自动生成的输出 Pydantic模型
三、Stream
流式允许对于使基于LLM的应用程序对最终用户的响应性至关重要。 重要的LangChain原语,如聊天模型、输出解析器、提示模板、检索器和代理都实现了LangChain Runnable接口。该接口提供了两种通用的流式表达内容方法:
- 同步
stream和异步 astream:流式传输链的最终输出和默认实现 - 异步 astream_events和异步astream_log:这些方法提供了一种从链中流式传输中间步骤和最终输出的方式。
这些方法旨在以块的形式流式传输最终输出,尽快返回每个块。 只有在程序中的所有步骤都知道如何处理输入流时,才能进行流式传输。
3.1 同步调用
# 流式传输的一个小例子
from langchain_ollama import ChatOllama
llm = ChatOllama( model="deepseek-r1:7b", )
chunks = []
for chunk in llm.stream("帮我讲个笑话,100字"):
chunks.append(chunk)
print(chunk.content, end="|", flush=True)
3.2 异步调用
import asyncio
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
prompt = ChatPromptTemplate.from_template("给我讲一个关于{topic}的笑话")
parser = StrOutputParser()
chain = prompt | llm | parser
async def async_stream():
async for chunk in chain.astream({"topic": "小鸟"}):
print(chunk, end="|", flush=True)
asyncio.run(async_stream())
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)