LCEL

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旨在提供行为一致性和对传统子类链(如LLMChainConversationalRetrievalChain)的定制化。许多这些传统链隐藏了重要细节,例如提示,而随着越来越多可行模型的出现,定制化变得愈发重要。

如果您目前正在使用这些传统链,请参阅此指南以获取迁移指导

有关如何使用LCEL执行特定任务的指南,请查看相关的操作指南

Runnable interface #

为了尽可能简化创建自定义链的过程,我们实现了一个“Runnable”协议。许多LangChain组件实现了Runnable协议,包括聊天模型chat models、LLMs、输出解析器output parsers、检索器retrievers、提示模板prompt templates等。此外,还有几个用于处理可运行(runnables)组件的实用原语,您可以在下面阅读。

这是一个标准接口,使得定义自定义链以及以标准方式调用它们变得简单。标准接口包括:

  • stream:流式返回响应块
  • invoke:在输入上调用链
  • batch:在输入列表上调用链

这些方法还有相应的异步方法,应该使用asyncioawait语法来实现并发:

  • 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模型

其他 #

© 2024 青蛙小白
comments powered by Disqus