LangChain Expression Language (LCEL) #
https://python.langchain.com/docs/concepts/#langchain-expression-language-lcel
LangChain表达语言(LCEL)是一种声明式的方式去连接LangChain组件。LCEL从第一天起就被设计成支持将原型投入生产,无需代码更改,从最简单的“提示 + LLM”链到最复杂的链(我们看到有人成功在生产中运行包含数百个步骤的LCEL链)。以下是使用LCEL的一些原因:
- 流式支持(First-class streaming support):使用LCEL构建链时,可以获得最佳的首次token时间(time-to-first-token从开始到第一个输出块的时间)。对于某些链,这意味着我们直接将token从LLM流向流式输出解析器,您会以与LLM提供者输出原始token相同的速度获得解析的增量输出块。
- 异步支持(Async support):使用LCEL构建的任何链都可以通过同步API(例如,在Jupyter Notebook中原型设计)和异步API(例如,在LangServe服务器中)调用。这使得在原型和生产中使用相同的代码成为可能,并具有良好的性能,能够处理同一服务器上的多个并发请求。
- 优化的并行执行(Optimized parallel execution):每当您的LCEL链有可以并行执行的步骤(例如,如果您从多个检索器获取文档),我们会自动在同步和异步接口中执行,以尽可能减小延迟。
- 重试和回退(Retries and fallbacks):为LCEL链的任何部分配置重试和回退。这是提高链在规模上可靠性的好方法。我们目前正在添加流式重试/回退支持,因此您可以在没有延迟成本的情况下获得额外的可靠性。
- 访问中间结果(Access intermediate results):对于更复杂的链,访问中间步骤的结果在最终输出生成之前通常非常有用。这可以用于让最终用户知道正在发生的事情,或仅仅用于调试您的链。您可以流式传输中间结果,并且它在每个LangServe服务器上都可用。
- 输入和输出schemas(Input and output schemas):输入和输出schemas为每个LCEL链提供从链结构推断的Pydantic和JSONSchema schemas架构。这可以用于输入和输出的验证,是LangServe的重要组成部分。
- 无缝的LangSmith跟踪:随着链的复杂性增加,了解每一步究竟发生了什么变得越来越重要。使用LCEL,所有步骤都会自动记录到LangSmith,以实现最大程度的可观察性和可调试性。
LCEL旨在提供行为一致性和对传统子类链(如LLMChain
和ConversationalRetrievalChain
)的定制化。许多这些传统链隐藏了重要细节,例如提示,而随着越来越多可行模型的出现,定制化变得愈发重要。
如果您目前正在使用这些传统链,请参阅此指南以获取迁移指导。
有关如何使用LCEL执行特定任务的指南,请查看相关的操作指南。
Runnable interface #
为了尽可能简化创建自定义链的过程,我们实现了一个“Runnable”协议。许多LangChain组件实现了Runnable协议,包括聊天模型chat models、LLMs、输出解析器output parsers、检索器retrievers、提示模板prompt templates等。此外,还有几个用于处理可运行(runnables)组件的实用原语,您可以在下面阅读。
这是一个标准接口,使得定义自定义链以及以标准方式调用它们变得简单。标准接口包括:
stream
:流式返回响应块invoke
:在输入上调用链batch
:在输入列表上调用链
这些方法还有相应的异步方法,应该使用asyncio
的await
语法来实现并发:
astream
:异步流式返回响应块ainvoke
:异步在输入上调用链abatch
:异步在输入列表上调用链astream_log
:在返回最终响应的同时,流式返回中间步骤astream_events
:在链中实时流式返回事件(在langchain-core 0.1.14中引入)
输入类型和输出类型因组件而异:
Component | Input Type | Output Type |
---|---|---|
Prompt | 字典 | PromptValue |
ChatModel | 单个字符串、聊天消息列表(list of chat messages)或PromptValue | ChatMessage |
LLM | 单个字符串、聊天消息列表(list of chat messages)或PromptValue | String |
OutputParser | LLM或ChatModel的输出 | 取决于解析器 |
Retriever | 单个字符串 | 文档列表 |
Tool | 单个字符串或字典,取决于工具 | 取决于工具 |
所有可运行组件都暴露输入和输出schema,以便检查输入和输出:
input_schema
:从Runnable组件的结构自动生成的输入Pydantic模型output_schema
:从Runnable组件的结构自动生成的输出Pydantic模型