开发学院

您的位置:首页>教程>正文

教程正文

LangChain概念指南(1)

架构

  LangChain 作为一个框架,由多个包组成。

langchain-core

  这个包包含了不同组件的基础抽象以及它们组合的方式。

  这里定义了像 LLMs(大型语言模型)、向量存储、检索器等核心组件的接口。

  这里没有定义第三方集成。

  这里的依赖故意保持非常轻量级。


合作伙伴包

  虽然大部分集成都在 langchain-community 中,我们将流行的集成拆分到它们自己的包中(例如 langchain-openai、langchain-anthropic 等)。

  这样做是为了改善对这些重要集成的支持。


langchain

  主要的 langchain 包包含了构成应用程序认知架构的链、代理和检索策略。

  这些不是第三方集成。

  这里所有的链、代理和检索策略都不是特定于任何一种集成的,而是跨所有集成通用的。


  这个包包含了由 LangChain 社区维护的第三方集成。

  关键的合作伙伴包被单独分离出来(见下文)。

  这个包含了各种组件(LLMs、向量存储、检索器等)的所有集成。

  为了尽可能保持包的轻量级,这个包中的所有依赖都是可选的。


langgraph

  langgraph 是 langchain 的扩展,旨在通过将步骤建模为图中的边和节点来构建健壮的、有状态的多参与者应用程序。

  LangGraph 提供了用于创建常见类型代理的高级接口,以及用于组合自定义流程的低级 API。


langserve

  一个部署 LangChain 链作为 REST API 的包。它使轻松启动生产就绪的 API 变得容易。


LangSmith

  一个开发者平台,让您可以调试、测试、评估和监控 LLM 应用程序。

  https://python.langchain.com/v0.2/svg/langchain_stack_062024.svg


LangChain 表达式语言 (LCEL)

  LangChain 表达式语言,简称 LCEL,是一种声明式的方式来串联 LangChain 组件。LCEL 从第一天起就被设计为支持将原型投入生产环境,无需进行任何代码更改,适用于从最简单的“提示 + LLM”链到我们在生产中见过的包含数百个步骤的最复杂的链。以下是您可能想要使用 LCEL 的几个原因:


一流的流媒体支持

  当您使用 LCEL 构建链时,您将获得最佳的首次令牌时间(即输出的第一块内容出现之前经过的时间)。对于某些链,这意味着例如我们直接从 LLM 流式传输令牌到流式输出解析器,并且您以与 LLM 提供商输出原始令牌相同的速率获得解析后的增量输出块。


异步支持

  任何使用 LCEL 构建的链都可以使用同步 API(例如,在您的 Jupyter 笔记本中进行原型设计时)以及异步 API(例如,在 LangServe 服务器中)进行调用。这使得您可以在原型和生产中使用相同的代码,具有出色的性能,并能够在同一服务器上处理多个并发请求。


优化的并行执行

  每当您的 LCEL 链有可以并行执行的步骤时(例如,如果您从多个检索器获取文档),我们会自动执行它,无论是同步还是异步接口,以实现尽可能小的延迟。


重试和回退

  为您的 LCEL 链的任何部分配置重试和回退。这是在大规模上使您的链更可靠的好方法。我们目前正在努力为重试/回退添加流媒体支持,以便您可以在不增加任何延迟成本的情况下获得额外的可靠性。


访问中间结果

  对于更复杂的链,通常在最终输出产生之前访问中间步骤的结果非常有用。这可以用来让用户知道正在发生什么,或者仅仅是为了调试您的链。您可以流式传输中间结果,并且在每个 LangServe 服务器上都有提供。


输入和输出模式

  输入和输出模式为每个 LCEL 链提供了从链的结构中推断出的 Pydantic 和 JSONSchema 模式。这可以用于验证输入和输出,并且是 LangServe 的一个重要组成部分。


无缝 LangSmith 跟踪

  随着您的链变得越来越复杂,了解每一步确切发生的事情变得越来越重要。使用 LCEL,所有步骤都自动记录到 LangSmith,以实现最大的可观测性和可调试性。

  LCEL 旨在为行为和定制提供一致性,超越了传统的子类链,如 LLMChain 和 ConversationalRetrievalChain。这些传统链隐藏了像提示这样的重要细节,并且随着更多可行模型的出现,定制变得越来越重要。

  如您目前正在使用这些传统链之一,请参见此指南了解如何迁移。

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


可运行接口

  为了尽可能方便地创建自定义链,我们实现了一个“可运行”协议。许多 LangChain 组件实现了可运行协议,包括聊天模型、LLM、输出解析器、检索器、提示模板等。还有一些有用的原语用于处理可运行对象,您可以在下面阅读到。

  这是一个标准接口,使您可以轻松定义自定义链并以标准方式调用它们。标准接口包括:

  stream:流式传输响应块

  invoke:在输入上调用链

  batch:在输入列表上调用链

  这些也有对应的异步方法,应该与 asyncio await 语法一起使用以实现并发:

  astream:异步流式传输响应块

  ainvoke:异步在输入上调用链

  abatch:异步在输入列表上调用链

  astream_log:除了最终响应外,还流式传输发生的中间步骤

  astream_events:beta 版本流式传输链中发生的事件(在 langchain-core 0.1.14 中引入)

  组件的输入类型和输出类型各不相同:


  

组件输入类型输出类型
Prompt字典PromptValue
ChatModel单个字符串、聊天消息列表或 PromptValueChatMessage
LLM单个字符串、聊天消息列表或 PromptValue字符串
OutputParserLLM 或 ChatModel 的输出取决于解析器
Retriever单个字符串文档列表
Tool单个字符串或字典,取决于工具取决于工具


  所有可运行对象都暴露了输入和输出模式以检查输入和输出:

  input_schema:从可运行的结构自动生成的输入 Pydantic 模型

  output_schema:从可运行的结构自动生成的输出 Pydantic 模型