langchain 内置中间件详解 - SummarizationMiddleware — 对话摘要

langchain 内置中间件详解

    • [SummarizationMiddleware --- 对话摘要](#SummarizationMiddleware — 对话摘要)

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),
        ),
    ],
)