
langchain 内置中间件详解
-
- [SummarizationMiddleware --- 对话摘要](#SummarizationMiddleware — 对话摘要)
-
- trigger的条件格式
-
- 单个条件触发
- [多个条件 OR 逻辑触发](#多个条件 OR 逻辑触发)
- [多个条件 AND 逻辑触发](#多个条件 AND 逻辑触发)
- [组合 AND 与 OR 逻辑触发](#组合 AND 与 OR 逻辑触发)
- 代码示例
SummarizationMiddleware --- 对话摘要
作用 :当对话历史接近 Token 限制时,自动摘要压缩旧消息,保留最近的消息原文。
模块 :langchain.agents.middleware
使用场景:
- 长时间运行的对话
- 多轮对话中历史消息过长
- 需要保留完整上下文但受限于上下文窗口
构造参数:
| 参数 | 类型 | 必需 | 说明 |
|---|---|---|---|
model |
`str | BaseChatModel` | 是 |
trigger |
`ContextSize | TriggerClause | list |
keep |
ContextSize |
否 | 摘要后保留多少上下文。默认 ("messages", 20) |
token_counter |
function |
否 | 自定义 Token 计数函数,默认基于字符计数 |
summary_prompt |
str |
否 | 自定义摘要 Prompt 模板,需包含 {messages} 占位符 |
trim_tokens_to_summarize |
int |
否 | 生成摘要时包含的最大 Token 数,默认 4000 |
trigger 条件详解:
- 单个条件:
("tokens", 4000)--- Token 数 >= 4000 时触发 - AND 逻辑:
{"tokens": 4000, "messages": 10}--- 同时满足时触发 - OR 逻辑:
[("tokens", 3000), ("messages", 50)]--- 任一满足即触发 - 混合:
[{"tokens": 5000, "messages": 3}, {"tokens": 3000, "messages": 6}]
代码示例:
python
from langchain.agents import create_agent
from langchain.agents.middleware import SummarizationMiddleware
agent = create_agent(
model="openai:gpt-4o",
tools=[weather_tool, calculator_tool],
middleware=[
# Token 超过 4000 时自动摘要,保留最近 20 条消息
SummarizationMiddleware(
model="openai:gpt-4o-mini", # 用小模型生成摘要,省钱
trigger=("tokens", 4000),
keep=("messages", 20),
),
],
)
python
# 高级用法:使用比例和 AND/OR 组合
agent = create_agent(
model="openai:gpt-4o",
tools=[...],
middleware=[
SummarizationMiddleware(
model="openai:gpt-4o-mini",
trigger=[
{"tokens": 5000, "messages": 3}, # AND: tokens>=5000 且 messages>=3
{"tokens": 3000, "messages": 6}, # AND: tokens>=3000 且 messages>=6
],
keep=("fraction", 0.3), # 保留上下文窗口 30% 的内容
),
],
)
trigger的条件格式
单个条件触发
python
# 当 token 数量 >= 4000 时触发
trigger=("tokens", 4000)
多个条件 OR 逻辑触发
python
# 当 token 数量 >= 3000 或 消息数量 >= 6 时触发 (满足任一即可)
trigger=[
("tokens", 3000),
("messages", 6),
]
多个条件 AND 逻辑触发
python
# 当 token 数量 >= 4000 且 消息数量 >= 10 时触发 (必须同时满足)
trigger={"tokens": 4000, "messages": 10}
组合 AND 与 OR 逻辑触发
python
# 当 (token >= 5000 且 messages >= 3) 或 (token >= 3000 且 messages >= 6) 时触发
trigger=[
{"tokens": 5000, "messages": 3}, # 第一个 AND 条件组
{"tokens": 3000, "messages": 6}, # 第二个 AND 条件组
]
代码示例
python
from langchain.agents import create_agent
from langchain.agents.middleware import SummarizationMiddleware
# Single condition: trigger if tokens >= 4000
agent = create_agent(
model="gpt-5.5",
tools=[your_weather_tool, your_calculator_tool],
middleware=[
SummarizationMiddleware(
model="gpt-5.4-mini",
trigger=("tokens", 4000),
keep=("messages", 20),
),
],
)
# Multiple conditions: trigger if number of tokens >= 3000 OR messages >= 6
agent2 = create_agent(
model="gpt-5.5",
tools=[your_weather_tool, your_calculator_tool],
middleware=[
SummarizationMiddleware(
model="gpt-5.4-mini",
trigger=[
("tokens", 3000),
("messages", 6),
],
keep=("messages", 20),
),
],
)
# AND logic: trigger only when tokens >= 4000 AND messages >= 10
agent3 = create_agent(
model="gpt-5.5",
tools=[your_weather_tool, your_calculator_tool],
middleware=[
SummarizationMiddleware(
model="gpt-5.4-mini",
trigger={"tokens": 4000, "messages": 10},
keep=("messages", 20),
),
],
)
# Combine AND and OR: trigger if (tokens >= 5000 AND messages >= 3)
# OR (tokens >= 3000 AND messages >= 6)
agent4 = create_agent(
model="gpt-5.5",
tools=[your_weather_tool, your_calculator_tool],
middleware=[
SummarizationMiddleware(
model="gpt-5.4-mini",
trigger=[
{"tokens": 5000, "messages": 3},
{"tokens": 3000, "messages": 6},
],
keep=("messages", 20),
),
],
)
# Using fractional limits
agent5 = create_agent(
model="gpt-5.5",
tools=[your_weather_tool, your_calculator_tool],
middleware=[
SummarizationMiddleware(
model="gpt-5.4-mini",
trigger=("fraction", 0.8),
keep=("fraction", 0.3),
),
],
)