-
Notifications
You must be signed in to change notification settings - Fork 3.7k
Open
Description
问题背景
在 agents/v5_compression_agent.py 的 _messages_to_text 方法(L302-L320)中,消息内容在转为纯文本时被硬编码截断:
def _messages_to_text(self, messages: list) -> str:
"""Convert messages to plain text for summarization."""
lines = []
for msg in messages:
role = msg.get("role", "?")
content = msg.get("content", "")
if isinstance(content, str):
lines.append(f"[{role}] {content[:500]}") # 截断到 500 字符
elif isinstance(content, list):
for block in content:
if isinstance(block, dict):
if block.get("type") == "tool_result":
text = str(block.get("content", ""))[:200] # 截断到 200 字符
lines.append(f"[tool_result] {text}")
elif block.get("type") == "text":
lines.append(f"[{role}] {block.get('text', '')[:500]}") # 截断到 500 字符
elif hasattr(block, "text"):
lines.append(f"[{role}] {block.text[:500]}") # 截断到 500 字符
return "\n".join(lines)问题
-
这里的截断处理是否与 Claude Code 的真实压缩/摘要行为一致? Claude Code 在进行上下文压缩时,是否也是先将消息截断到固定长度再做摘要?还是有更智能的策略(如按 token 计算、保留关键信息等)?
-
截断可能导致关键信息丢失。 例如:
- 一段 500+ 字符的代码片段,被截断后可能丢失关键的函数签名或逻辑
tool_result仅保留 200 字符,对于文件读取、搜索等结果来说可能远远不够- 截断后的内容被用于 summarization,如果摘要模型看到的是不完整的信息,生成的摘要质量也会受影响
-
硬编码的魔法数值(500、200)缺乏依据。 这些截断阈值是如何确定的?是否有更合理的策略?例如:
- 根据总 token 预算动态分配每条消息的截取长度
- 对代码类内容保留更多字符,对普通文本适当缩短
- 使用配置常量代替硬编码数值
期望
希望了解这里的设计意图,以及 Claude Code 实际的上下文压缩策略是否与此不同。如果这只是一个简化的教学实现,建议在代码注释中注明与生产环境的差异。
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels