LangChain chain
目录
1. Chain
Chain 是 langchain 早期提供的链抽象。他正在被 LCEL 取代。但是 Chain 仍然是 langchain 中非常重要的一个组件。仍被广泛使用,所以我们也需要了解。Chain 的代码位于 langchain.chains 内。
1.1 BaseChain
|
|
属性名 | 类型 | 默认值 | 说明 |
---|---|---|---|
memory |
Optional[BaseMemory] |
None |
链的记忆模块。用于在执行链时引入上下文记忆,自动在调用前加载变量、调用后保存变量。适用于多轮对话、Agent 状态持久化等。 |
callbacks |
Callbacks |
None |
回调函数列表或回调管理器。贯穿链的生命周期(开始、结束、异常等),用于日志记录、追踪、调试、UI 更新等。 |
verbose |
bool |
langchain.globals.get_verbose() |
控制是否开启“详细模式”。启用后会在控制台打印中间执行信息,便于调试。 |
tags |
Optional[list[str]] |
None |
用于标记每一次链的调用,便于在日志或 trace 工具中识别用途或调用源(如 "qa_chain" , "retriever_flow" )。 |
metadata |
Optional[dict[str, Any]] |
None |
附加元数据,用于跟踪链的调用上下文,可传给 callback。适合记录模型版本、实验标记等。 |
callback_manager |
Optional[BaseCallbackManager] |
None (已废弃) |
已废弃的回调字段,请改用 callbacks 。在旧版中用于管理回调函数。 |
model_config |
ConfigDict |
arbitrary_types_allowed=True |
Pydantic v2 配置,允许包含任意类型(如函数、类实例等),使链具备高度灵活性。 |
BaseChain 定义了如下抽象方法:
|
|
BaseChain 已经继承自 Runnable,所以我们重点来看它的 invoke 方法。chain 原本提供的 run、__call__
都已经 deprecated,并在内部调用 invoke。
调用链如下:
|
|
|
|
Chain 的抽象并不复杂,我们来看一些常用的具体的 Chain 实现。
- LLMChain
2. LLMChain
2.1 基本使用
|
|
2.2 LLMChain 实现
LLMChain 就是将「Prompt → LLM 调用 → 生成文本」的过程封装起来,让你可以像调用函数一样调用大模型
接口实现
|
|
从 _call 可以看到,核心实现位于:
- generate: generate 方法在 BaseLLm 中也被实现,这样就保证 LLMChain 也可以作为一个 LLM 来使用。
- create_outputs: 解析 generate 返回的 LLMResult 为 dict
调用链如下:
|
|
generate
|
|
对应的 LCEL 实现
看完了 LLMChain ,我们对比看一下 LCEL 的实现:
|
|
此时 chain 是 RunnableSequence,RunnableSequence 的 invoke 方法会调用每一个 Runnable 的 invoke 方法,并且将上一个 Runnable 的输出作为下一个 Runnable 的输入。
- prompt.invoke:
- 调用连上会调用一个 _validate_input 方法,在 input_variables 长度为一是,把 input 包装为
{"adjective": input}
- invoke 的调用链是 invoke -> format_prompt -> format 最终返回一个 StringPromptValue
- 调用连上会调用一个 _validate_input 方法,在 input_variables 长度为一是,把 input 包装为
- OpenAI.invoke:
- 参照 LanguageModel 的继承关系,llm.invoke 方法继承自 BaseLLM,最终调用的是 OpenAI._generate 方法
- BaseLLM.invoke 方法接收 StringPromptValue 返回 str
- StrOutputParser.invoke 接收 str 直接返回接收的 str