你好,我在看 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 的逻辑更清楚。
你好,我在看
s08_context_compact/code.py时,对reactive_compact这里有一点疑问。当前代码是:
我的理解是,
reactive_compact是在主 LLM 调用遇到prompt_too_long后触发的。但这里会先执行:
而
summarize_history本身也是一次 LLM 调用,所以看起来可能会再次遇到上下文过长的问题。我看到教学代码里
summarize_history内部有:所以实际运行时可能不会炸,但从阅读代码的角度看,这个顺序有点容易误解。
是否可以先切分 recent tail,再只对旧历史做 summary?比如:
这样可能更符合 “保留最近几条原始消息,总结更早历史” 的直觉,也能让 emergency compact 的逻辑更清楚。