💡 学习目标

  1. 如何使用 LangChain:一套在大模型能力上封装的工具框架
  2. 如何用几行代码实现一个复杂的 AI 应用
  3. 面向大模型的流程开发的过程抽象
  • LangChain 也是一套面向大模型的开发框架(SDK)
  • LangChain 是 AGI 时代软件工程的一个探索和原型
  • 学习 LangChain 要关注接口变更

LangChain 的核心组件

  1. 模型 I/O 封装
    • Chat Models:对语言模型接口的封装
    • PromptTemple:提示词模板
    • OutputParser:解析输出
  2. 数据连接封装(弱于 LlamaIndex)
    • Document Loaders:各种格式文件的加载器
    • Document Transformers:对文档的常用操作,如:split, filter, translate, extract metadata, etc
    • Text Embedding Models:文本向量化表示,用于检索等操作
    • Verctorstores & Retrievers:向量数据库与向量检索
  3. 架构封装
    • Chain/LCEL:实现一个功能或者一系列顺序功能组合
    • Agent:根据用户输入,自动规划执行步骤,自动选择每步需要的工具,最终完成用户指定的功能
    • Tools:调用外部功能的函数,例如:调 google 搜索、文件 I/O、Linux Shell 等等
    • LangGraph:工作流开发框架
  4. LangSmith:过程监控与调试框架

文档(以 Python 版为例)

LangChain 是开源项目

项目地址:https://github.com/langchain-ai

1. 模型 I/O 封装

把不同的模型,统一封装成一个接口,方便更换模型而不用重构代码。

1.1 模型 API: ChatModel

1.1.1 OpenAI 模型封装
1.1.2 多轮对话 Session 封装
1.1.3 DeepSeek 模型封装
1.1.4 流式输出
1.1.5 通义千问模型封装
1.1.6 Ollama模型封装

1.2 模型的输入与输出

1.2.1 Prompt 模板封装
  1. PromptTemplate 可以在模板中自定义变量
  2. ChatPromptTemplate 用模板表示的对话上下文
  3. MessagesPlaceholder 把多轮对话变成模板
1.2.2 从文件加载 Prompt 模板

1.3 结构化输出

1.3.1 直接输出 Pydantic 对象
1.3.2 输出指定格式的 JSON
1.3.3 使用 OutputParser

OutputParser 可以按指定格式解析模型的输出

1.4 Function Calling

1.5 小结

  1. LangChain 统一封装了各种模型的调用接口,包括补全型和对话型两种
  2. LangChain 提供了 PromptTemplate 类,可以自定义带变量的模板
  3. LangChain 提供了一些列输出解析器,用于将大模型的输出解析成结构化对象
  4. LangChain 提供了 Function Calling 的封装
  5. 上述模型属于 LangChain 中较为实用的部分

2. 数据连接封装

2.1 文档加载器:Document Loaders

2.2 文档处理器

2.2.1 TextSplitter

2.3、向量数据库与向量检索

2.4 小结

  1. 文档处理部分,建议在实际应用中详细测试后使用
  2. 与向量数据库的链接部分本质是接口封装,向量数据库需要自己选型

3. Chain 和 LangChain Expression Language (LCEL)

LangChain Expression Language(LCEL)是一种声明式语言,可轻松组合不同的调用顺序构成 Chain。LCEL 自创立之初就被设计为能够支持将原型投入生产环境,无需代码更改,从最简单的“提示+LLM”链到最复杂的链(已有用户成功在生产环境中运行包含数百个步骤的 LCEL Chain)。

LCEL 的一些亮点包括:

  1. 流支持:使用 LCEL 构建 Chain 时,你可以获得最佳的首个令牌时间(即从输出开始到首批输出生成的时间)。对于某些 Chain,这意味着可以直接从 LLM 流式传输令牌到流输出解析器,从而以与 LLM 提供商输出原始令牌相同的速率获得解析后的、增量的输出。

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

  3. 优化的并行执行:当你的 LCEL 链条有可以并行执行的步骤时(例如,从多个检索器中获取文档),我们会自动执行,无论是在同步还是异步接口中,以实现最小的延迟。

  4. 重试和回退:为 LCEL 链的任何部分配置重试和回退。这是使链在规模上更可靠的绝佳方式。目前我们正在添加重试/回退的流媒体支持,因此你可以在不增加任何延迟成本的情况下获得增加的可靠性。

  5. 访问中间结果:对于更复杂的链条,访问在最终输出产生之前的中间步骤的结果通常非常有用。这可以用于让最终用户知道正在发生一些事情,甚至仅用于调试链条。你可以流式传输中间结果,并且在每个 LangServe 服务器上都可用。

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

  7. 无缝 LangSmith 跟踪集成:随着链条变得越来越复杂,理解每一步发生了什么变得越来越重要。通过 LCEL,所有步骤都自动记录到 LangSmith,以实现最大的可观察性和可调试性。

  8. 无缝 LangServe 部署集成:任何使用 LCEL 创建的链都可以轻松地使用 LangServe 进行部署。

原文:https://python.langchain.com/docs/expression_language/

3.1 Pipeline 式调用 PromptTemplate, LLM 和 OutputParser

3.2 用 LCEL 实现 RAG

3.3 用 LCEL 实现模型切换(工厂模式)

3.4 通过 LCEL,还可以实现

  1. 配置运行时变量:https://python.langchain.com/docs/how_to/configure/
  2. 故障回退:https://python.langchain.com/docs/how_to/fallbacks/
  3. 并行调用:https://python.langchain.com/docs/how_to/parallel/
  4. 逻辑分支:https://python.langchain.com/docs/how_to/routing/
  5. 动态创建 Chain: https://python.langchain.com/docs/how_to/dynamic_chain/

更多例子:https://python.langchain.com/docs/how_to/lcel_cheatsheet/

4. LangChain 与 LlamaIndex 的错位竞争

  • LangChain 侧重与 LLM 本身交互的封装
    • Prompt、LLM、Message、OutputParser 等工具丰富
    • 在数据处理和 RAG 方面提供的工具相对粗糙
    • 主打 LCEL 流程封装
    • 配套 Agent、LangGraph 等智能体与工作流工具
    • 另有 LangServe 部署工具和 LangSmith 监控调试工具
  • LlamaIndex 侧重与数据交互的封装
    • 数据加载、切割、索引、检索、排序等相关工具丰富
    • Prompt、LLM 等底层封装相对单薄
    • 配套实现 RAG 相关工具
    • 同样配套智能体与工作流工具
    • 提供 LlamaDeploy 部署工具,通过与三方合作提供过程监控调试工具

5. 总结

  1. LangChain 随着版本迭代可用性有明显提升
  2. 使用 LangChain 要注意维护自己的 Prompt,尽量 Prompt 与代码逻辑解依赖
  3. 它的内置基础工具,建议充分测试效果后再决定是否使用
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐