Skip to content

reactive_compact 的执行顺序可能有点容易误解 #350

@shaojunying

Description

@shaojunying

你好,我在看 s08_context_compact/code.py 时,对 reactive_compact 这里有一点疑问。

当前代码是:

def reactive_compact(messages):
    transcript = write_transcript(messages)
    summary = summarize_history(messages)
    tail_start = max(0, len(messages) - 5)
    ...

我的理解是,reactive_compact 是在主 LLM 调用遇到 prompt_too_long 后触发的。

但这里会先执行:

summary = summarize_history(messages)

summarize_history 本身也是一次 LLM 调用,所以看起来可能会再次遇到上下文过长的问题。

我看到教学代码里 summarize_history 内部有:

conversation = json.dumps(messages, default=str)[:80000]

所以实际运行时可能不会炸,但从阅读代码的角度看,这个顺序有点容易误解。

是否可以先切分 recent tail,再只对旧历史做 summary?比如:

tail_start = max(0, len(messages) - 5)

old_messages = messages[:tail_start]
recent_messages = messages[tail_start:]

summary = summarize_history(old_messages)

return [
    {"role": "user", "content": f"[Reactive compact]\n\n{summary}"},
    *recent_messages,
]

这样可能更符合 “保留最近几条原始消息,总结更早历史” 的直觉,也能让 emergency compact 的逻辑更清楚。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions