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 执行各个阶段的钩子
- PromptTemplate:Prompt 模板,占位符快速 build
Prompt messages
举例
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 | # example 1 |
序列化
LangChain 下的所有对象都可以序列化(JSON),包括消息、文档对象(例如,从检索器返回的对象)和大多数 Runnables,如 Chat Model、检索器和用 LECL 实现的 Chain
Use Case
演示一下官方文档中的 RAG Q&A How to add chat history | 🦜️🔗 LangChain
补充
Chat LangChain
LangChain 的官网有一个有意思的产品
可以和 LLM 交互来询问文档使用的问题(我理解是一个 RAG Q&A),例如
LangChain 的 AzureOpenAI 接入了 response_format 了吗
起码最新版的 langchain-openai 0.1.14
还没有接入
关于 response_format
指定模型必须输出的格式对象,兼容 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
orjson_object
LangChain Integrations
LangChain 同时提供了非常多的集成,所有定义的组件都提供了三方集成方便使用
- 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 无缝集成
快速开始
补充
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 管理 & 简便调试