Skip to content

fix(harness): 连续会话压缩时会过滤上一轮摘要,导致原始用户意图丢失#2360

Open
CyberXavier wants to merge 1 commit into
agentscope-ai:mainfrom
CyberXavier:fix/chained-compaction-summary-loss
Open

fix(harness): 连续会话压缩时会过滤上一轮摘要,导致原始用户意图丢失#2360
CyberXavier wants to merge 1 commit into
agentscope-ai:mainfrom
CyberXavier:fix/chained-compaction-summary-loss

Conversation

@CyberXavier

Copy link
Copy Markdown
Contributor

fix: #2359

## 修改概述

修复 `ConversationCompactor` 在连续执行会话压缩时过滤上一轮摘要,导致后续摘要无法继承原始会话上下文的问题。

该问题已确认影响 AgentScope Java v2.0.0,当前 `main` 分支的
`2.0.1-SNAPSHOT` 中也存在相同实现。

## 问题原因

当前实现会先从待压缩前缀中过滤
`__compaction_summary__````java
List<Msg> prefix =
        filterSummaryMessages(
                new ArrayList<>(messages.subList(0, cutoff)));

过滤后的 prefix 随后同时用于:

  • 生成下一轮压缩摘要;
  • 提取长期记忆。

这导致第二次及后续压缩无法看到上一轮摘要,实际行为变成:

S2 = summarize(M2)
S3 = summarize(M3)

而不是:

S2 = summarize(S1 + M2)
S3 = summarize(S2 + M3)

如果待压缩前缀只包含上一轮摘要,过滤后的前缀会变成空列表,
最终生成:

No previous conversation history.

此时上一轮摘要中保留的会话目标、关键决策和后续计划会从模型上下文中丢失。

修复方案

根据用途分别构造摘要输入和长期记忆输入:

List<Msg> summaryInput =
        new ArrayList<>(messages.subList(0, cutoff));

List<Msg> flushInput =
        filterSummaryMessages(summaryInput);

List<Msg> tail =
        new ArrayList<>(messages.subList(cutoff, messages.size()));

其中:

  • summaryInput 保留上一轮摘要,用于生成累计摘要;
  • flushInput 过滤上一轮摘要,避免重复提取长期记忆;
  • tail 保持原有行为,继续保留未压缩的近期消息。

修复后满足:

新摘要 = summarize(上一轮摘要 + 本轮待压缩消息)
压缩后上下文 = 新摘要 + 未压缩的近期消息

offloadMessages() 的行为保持不变。该方法原本接收的就是完整
messages,而不是过滤后的 prefix:

flushManager.offloadMessages(
        rc, messages, agentId, sessionId);

因此本次修复只调整摘要生成和 memory flush 的输入,不改变会话归档语义。

测试覆盖

新增 ConversationCompactorTest,覆盖:

  • 上一轮摘要进入下一轮摘要模型输入;
  • 上一轮摘要不进入 memory flush;
  • 连续执行两轮压缩时,第二轮摘要模型输入包含第一轮生成的摘要;
  • 待压缩前缀只包含旧摘要时,不生成
    No previous conversation history.
  • 前缀中存在多个旧摘要时,压缩后只保留一个新摘要;
  • 禁用 memory flush 时,旧摘要仍进入下一轮摘要模型输入。

- 保留先前摘要作为汇总输入以构建连续压缩,但排除它们避免重复提取
- 区分用于摘要的输入和用于内存刷新的输入,确保只刷新新压缩的消息
- 更新过滤逻辑使先前摘要参与下一次汇总但仍避免重复提取
- 添加完整的单元测试验证摘要消息的路由和处理行为
@CyberXavier

Copy link
Copy Markdown
Contributor Author

@jujn 我发现了一个上下文压缩时用户意图漂移的问题,提交了这份pr修复该问题,望您审批一下

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]:连续会话压缩时会过滤上一轮摘要,导致原始用户意图丢失

1 participant