贫瘠之地

华北无浪漫,死海扬起帆
多少个夜晚,独自望着天

0%

LangChain 生态入门

LangChain 生态入门

LangChain 生态下面都有哪些库和服务

  • LangChain:开发由大型语言模型(LLM)应用程序的框架
    • langchain-core 基础抽象和 LCEL(LangChain Expression Language)
    • langchain-community 三方集成;例如 ****langchain-openai langchain-elasticsearch
    • langchain Chains  Agents  retrieval strategies
  • LangGraph:使用 LLM 构建健壮且有状态的多参与者应用程序(multi actor),与 LangChain 平滑集成,但也可以在没有 LangChain 的情况下使用
  • LangSmith:开发者平台,用于调试、测试、评估、监控 LLM 应用
  • LangServer:部署 LangChain 的 chains 作为 REST API

LangChain

简介

LangChain 是对各种组件的抽象,以及 LCEL 支持

因为 LangChain 是整个生态最基础的库,并且社区迭代了很长时间,其拥有的功能非常庞杂,这里简要整理其功能

  • LCEL:创建任意自定义 Chain 的方法(框架)
  • 组件
    • PromptTemplate:Prompt 模板,占位符快速 build Prompt messages
      • few shot examples template
      • messages placeholder
    • Example selectors:examples 选择的抽象和封装
    • Chat models:LLM
      • LLMs:LangChain 中这是 LLM 的早期封装,当时还没有聊天模式,和 LLM 主要的交互模式是输入字符串、输出字符串
    • Messages:LLM 输出的 Message 封装;包括对历史消息的操作,我理解替代了 v0.1 的 memory
      • MessageType
      • trim 修剪
      • filter 过滤
      • merge 合并
    • Output parsers:负责获取 LLM 的输出并解析为更结构化的格式
      • JSON
      • XML
      • enums
      • retry and fix
    • Text splitters:将文档拆分为块便于检索
    • Embedding models:对 Embedding models 的抽象
    • Vector stores:对向量数据库的抽象
    • Retrievers:查询并返回相关文档
      • 上下文压缩检索器
      • 时间权重检索器
      • 元数据过滤检索器(metadata filter)
      • 重排序减轻 lost in the middle 影响
    • Index:用于同步向量存储和底层数据源(文档),处理文档哪些内容变更了、哪些需要向量化、哪些需要存储
      • Incremental
      • Full
    • Tools:LLM 工具执行封装
      • 内置 toolkit
      • 人工干预
      • 错误处理
    • Multimodal:多模态 API 封装
    • Agents:Agent 主要迁移到 LangGraph 实现了,不需要在 LangChain 这里关注
    • Callbacks:LLM 执行各个阶段的钩子

举例

LLM Async & Stream

LangChain 中的 LLM 实现了异步、Streaming 模式的相关接口,并且还进行了扩展

langchain_core.runnables.base.Runnable — 🦜🔗 LangChain 0.2.12

A unit of work that can be invoked, batched, streamed, transformed and composed.

  • invoke/ainvoke: Transforms a single input into an output.
  • batch/abatch: Efficiently transforms multiple inputs into outputs.
  • stream/astream: Streams output from a single input as it’s produced.
  • astream_log: Streams output and selected intermediate results from an input.

Built-in optimizations:

  • Batch: By default, batch runs invoke() in parallel using a thread pool executor.Override to optimize batching.
  • Async: Methods with “a” suffix are asynchronous. By default, they executethe sync counterpart using asyncio’s thread pool. Override for native async.

LCEL & Runnable

LCEL 是 LangChain Expression Language

它用于快速构建自定义的 chain(将 LangChain 的组件包装起来),基于 Runnable 协议(这个 Runnable 是 LangChain 定义的结构)

我觉得可以将 LCEL 理解为简易的流程引擎,实际上构造 chain 的过程和和构造一个流程一致,Runnable 实际上就是流程节点

在 LCEL 出现之前,组件之间的组装是通过参数进行赋值的,并且一般需要在外部包装一个外部对象(例如 Chain),有了 LCEL 之后可读性、易用性、灵活性都有了提高

例如如下代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# example 1
chain = prompt | llm

# example 2
retrieval_chain = (
{"context": retriever, "question": RunnablePassthrough()}
| prompt
| model
| StrOutputParser()
)

# example 3
joke_chain =
ChatPromptTemplate.from_template("tell me a joke about {topic}") | model
poem_chain =
ChatPromptTemplate.from_template("write a 2-line poem about {topic}") | model

map_chain = RunnableParallel(joke=joke_chain, poem=poem_chain)

序列化

LangChain 下的所有对象都可以序列化(JSON),包括消息、文档对象(例如,从检索器返回的对象)和大多数 Runnables,如 Chat Model、检索器和用 LECL 实现的 Chain

Use Case

演示一下官方文档中的 RAG Q&A How to add chat history | 🦜️🔗 LangChain

补充

Chat LangChain

LangChain 的官网有一个有意思的产品

Chat LangChain

可以和 LLM 交互来询问文档使用的问题(我理解是一个 RAG Q&A),例如

LangChain 的 AzureOpenAI 接入了 response_format 了吗

起码最新版的 langchain-openai 0.1.14 还没有接入

关于 response_format

OpenAI Platform

指定模型必须输出的格式对象,兼容 GPT-4 Turbo 和大于 gpt-3.5-turbo-1106 版本的 GPT-3.5 Turbo 设置为 {"type":"json_object"} 可以启用 JSON 模式,从而保证模型生成的消息是有效的 JSON

需要注意: 当使用 JSON 模式时必须在系统或用户消息中提供结构,否则模型可能会一直输出空白流直到达到 token 限制,导致该请求长时间运行且看起来 “卡住” 还要注意如果 finish_reason="length" ,则消息内容可能会被部分切断,这表示生成超过了 max_tokens 或会话超过了最大上下文长度

type string Optional Defaults to text Must be one of text or json_object

LangChain Integrations

LangChain 同时提供了非常多的集成,所有定义的组件都提供了三方集成方便使用

OpenAI Platform

  • LLM 90+
    • OpenAI
    • AzureOpenAI
    • Llama
    • AWS Bedrock
    • Baidu Qianfan
    • QianWen
    • ...
  • Embedding models 75+
  • Document loaders 150+
  • Vector stores 100+
  • Retrievers 50+
  • Tool 70+
  • Toolkit 30+

LangChain Hub

LangChain Hub 是一个 Prompt 管理社区

  • Prompt 分享
  • 类似 Git commit 的机制,管理 Prompt 的版本
  • 在 Prompt Playground 快速调试

LangGraph

简介

LangGraph 是 LangChain 社区下的新框架,主要用于构建基于状态的多行动者的 LLM 应用,应用于 Agent 和复合 Agent 工作流

其核心功能

  • 循环和分支:在应用程序中实现循环和条件
  • 持续:每个步骤后自动保存状态,随时暂停、恢复流程图执行
  • 人工循环:中断流程图执行以批准或编辑代理计划的下一个操作
  • 流式传输支持:流式传输每个节点产生的输出(包括令牌流)
  • 和 LangChain 集成:和 LangChain 及 LangSmith 无缝集成

快速开始

LangGraph - 快速开始

补充

Agent 设计模式

LangGraph 的官方文档整理了当前常见的 Agent 设计思想,可以了解一下

Collaboration (langchain-ai.github.io)

  • RAG
    • 自适应 RAG(Adaptive):查询、分析后执行自校正 RAG
    • 代理 RAG(Agentic)
    • 自校正 RAG(Corrective):对检索的文档进行分级和评估
    • 自我 RAG(Self-RAG):对检索的文档进行分级和反思
  • Agnet
    • 复合
      • 合作:分而治之(LLM 职责拆分)
      • 监督委派:使用 LLM 来协调不同的代理(加一层)
      • 分级团队:工作分层分布(再加一层)
    • 计划
      • 计划执行(Plan-and-Execute):先拆分计划再执行
      • 无观察推理(Reasoning without Observation):由下一步 Action 进行观察
      • LLM 编译器(LLMCompiler):基于 Planner 和 Jointer,让 LLM 生成一个 DAG 来处理可以并发执行的任务提高效率
    • 反思 & 评审
      • 基础反思(Basic Reflection):强调观察、评估后再采取行动
      • 反射(Reflexion):强调矫正,反思包括有没有漏掉(missing)或者重复(Superfluous),然后回答问题,回答之后再有针对性的修改(Revise)
      • 搜索树(Tree Search):ToT 对树状结果进行打分
      • 自发现(Self-Discover):选择反省方式、进行反省、反省后重新输出

推荐一下 LangGraph 画的图,非常便于理解

LangGraph Cloud

截止目前 LangGraph Cloud 是一款仅限邀请阶段的开源付费产品

  • 部署和托管 LangGraph 应用程序的托管服务,快速部署服务提供 API
  • 与 LangSmith 无缝集成

LangSmith

LangSmith 的核心能力 LangSmith (langchain.com)

  • Tracing
  • 数据集管理
  • 评估
  • 人工反馈
  • 监控 & 自动化
  • Prompt 管理 & 简便调试

参考

How-to guides | 🦜️🔗 LangChain

Introduction | 🦜️🔗 LangChain

🦜🕸️LangGraph (langchain-ai.github.io)