问题背景
Hermes 在输出长内容时会遇到 length limit 限制,导致输出被截断。用户希望实现"遇到长度限制时自动分段输出"。
核心结论
分段输出应该是工作习惯,而不是依赖工具自动触发。
原因:
1. 真正的瓶颈在模型 API 层的 max_tokens,Hermes 无法在输出中途捕获
2. Python 工具需要手动调用,无法覆盖所有场景
3. 最有效的方式是把分段意识内化为工作习惯
解决方案组成
方案一:SOUL.md 规则(已生效)
位置: ~/.hermes/SOUL.md
内容:
**复杂任务自动拆分。** 当任务满足以下任一条件时,立即使用 delegate_task 或 todo 拆分,不要硬撑:
- 需要调用 5+ 个工具
- 涉及多个独立子任务
- 可能产生大量输出(文件分析、数据处理、多步骤流程)
- 用户说"又输出限制了"、"继续"这类话
拆分原则:宁可多拆,不可硬撑。拆小了只是多几步,撑爆了从头再来。
效果: 每次 Hermes 启动都会加载,指导行为
方案二:auto-segment-output Skill(已创建)
位置: ~/.hermes/skills/software-development/auto-segment-output/SKILL.md
触发条件:
必须立即分段的情况:
1. 系统提示:[System: Your previous response was truncated by the output length limit]
2. 用户反馈:用户说"输出限制"、"继续"、"分段"、"拆开"、"length limit"
3. 预判超长:内容超过 3000 字符
4. 工具输出限制:read_file 返回大量内容、terminal 输出过长
必须主动预判并分段的情况(不要等截断): 5. 生成文章/文档:用户要求"生成MD文件"、"写篇文章"、"保存为文档" 6. 分析/解释复杂系统:用户要求"详细介绍"、"全面解释"、"详细说明" 7. 代码生成:需要生成超过 100 行的代码 8. 文件内容输出:需要展示文件完整内容且文件超过 50 行 9. 多步骤任务:任务包含 5+ 个独立步骤或章节 10. 用户要求"结合"或"整合":需要把多个内容合并输出时
判断标准: 如果不确定是否需要分段,就分段。宁可多拆,不可硬撑。
分段策略:
- 按章节/模块拆分
- 按段落拆分(每段 5-8 个段落)
- 按文件拆分
执行方式:
- 直接分段输出:每段开头说明"这是第X部分,共Y部分"
- 使用 write_file 分段写入:先写第一部分,再用 patch 追加
- 使用 delegate_task 并行处理
方案三:Python 自动分段工具(可选)
位置: /Users/lvy/claudecode/qiyeweixin/src/auto_segment_retry.py
功能:
- LengthLimitHandler 类:检测长度限制错误并自动分段重试
- auto_segment_retry() 函数:便捷函数
- execute_code_with_auto_segment() 函数:针对 execute_code 的适配器
局限性:
- 需要手动调用
- 只适用于 execute_code 场景
- 无法覆盖 write_file、直接输出文本等场景
适用场景: - 在 Python 代码中执行可能产生长输出的操作 - 需要在代码层面自动处理分段
方案对比
| 方案 | 类型 | 效果 | 推荐度 |
|---|---|---|---|
| SOUL.md 规则 | 行为指导 | 已生效,指导所有行为 | ⭐⭐⭐⭐⭐ |
| auto-segment-output Skill | 明确规则 | 已创建,详细触发条件和策略 | ⭐⭐⭐⭐⭐ |
| Python 工具 | 代码工具 | 需手动调用,场景有限 | ⭐⭐ |
最佳实践
1. 主动预判
不要等系统截断,提前判断内容长度: - 用户说"生成MD文件" → 立即预判需要分段 - 用户说"详细介绍" → 立即预判需要分段 - 内容超过 3000 字符 → 立即分段
2. 分段输出工作流
1. 预判任务会产生长输出
↓
2. 主动说"这个内容较长,我分段输出"
↓
3. 第一段输出(控制在 2000-3000 字符)
↓
4. 保存到文件(用 write_file)
↓
5. 后续段落用 patch 追加
↓
6. 每段完成后确认
3. 使用工具组合
- write_file:写入第一段内容
- patch:追加后续内容
- delegate_task:并行处理多个段落
实际案例
案例1:生成文章并保存
错误做法:
用户:把之前的回答保存为MD文件
助手:[一次性输出 8000 字] → 被截断
正确做法:
用户:把之前的回答保存为MD文件
助手:好的,这篇文章较长,我分段保存。
[用 write_file 写入第一部分]
[用 patch 追加第二部分]
[用 patch 追加第三部分]
完成!文件已保存到 /path/to/file.md
案例2:详细介绍复杂系统
错误做法:
用户:详细介绍一下 Hermes 记忆系统
助手:[一次性输出 6000 字] → 被截断
正确做法:
用户:详细介绍一下 Hermes 记忆系统
助手:好的,这个系统有三层架构,我分段介绍:
## 第一部分:系统架构概览
[内容...]
(第一部分完成,继续第二部分?)
配置调整(可选)
如果问题是模型 max_tokens 太小,可以调整:
# 查看当前配置
hermes config | grep max_tokens
# 修改配置(如果支持)
hermes config set model.max_tokens 16000
注意: 这只是治标不治本,真正有效的是养成分段习惯。
总结
核心原则:分段输出是工作习惯,不是应急措施。
三道防线: 1. SOUL.md:宏观指导,养成拆分意识 2. Skill:具体规则,明确触发条件和策略 3. Python 工具:代码层面的兜底方案
效果: - SOUL.md 已生效 - Skill 已创建 - 规则已完善(新增"生成文章/文档"等触发条件)
下一步: - 多次实践,形成肌肉记忆 - 遇到长输出任务时,立即预判并分段 - 宁可多拆,不可硬撑