Repository navigation
perf(agent): 只追加续接时只发变了的尾部段,每轮插查证提醒,记录续接与否和原因 - #1246
Merged
Merged
Conversation
尾部整段照发每轮多一万多字,大半是逐字没变的参考资料和已经发过的记忆、跨群条目。现在同一标题的段和上文最近一版相同就不发,记忆和跨群按条补新的,可提及成员候选不发;当前消息前固定插一行查证提醒。上线后群聊连续两轮没续上却查不出原因,所以每轮写一条 append_context 调试记录,Runner 校验键拆成三段指纹。
SuInk
force-pushed
the
claude/append-skip-sent
branch
from
October 27, 2026 19:21
2bd57a8 to
2eaf076
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
只追加续接时,尾部不再整段照发,只发变了的部分:和上文同一标题最近一版相同的段不发,长期记忆、跨群历史按条补新的,可提及成员候选不发。另外在当前消息前固定插一行查证提醒,并为每一轮写一条
append_context调试记录,写明续接上没有、没续上的原因。10-27 生产三个群各 12 轮模拟,每轮增长从约 1.05 万字降到约 5000 字;DeepSeek 实测命中率从 91.9% 升到 96.2%(现布局 82.9%)。Why
#1233 上线后,续接时尾部是整段照发的,每轮多出 1 万多字。按段统计,这些内容大半是逐字没变的参考资料(群约定、说话风格、会话进行状态等),或者是上文里已经有的记忆、跨群条目。
只追加对话、尾部一律不发也试过:每轮只增长约 1000 字,但 gpt-6.1-sol 回放 15 轮有 2 轮出错:
所以状态段变了要补发,记忆和跨群按条补发。
查证方面:现有的查证规则都在头部,续接后离当前消息隔着好几轮对话,模型又看到自己前几轮都是直接回答的,容易照着凭印象答。「我当时不是说过…」那一轮:现布局 5 次查了 2 次,续接不加提醒 3 次查了 1 次。
10-28 01:13 线上升级到 canary.12 后,私聊续接生效了(连续几轮命中 85%~99%)。但 Telegram 群连续两轮都没续上,只命中了 1.8 万的检查点。增长上限、记录被覆盖、sessionKey,以及请求里的头部、契约和工具定义都已排除;具体被哪道校验拦下,线上没有记录,查不出来。
改了什么
model/assistant/append_context.go:【本轮提醒】,要求先查证再回答;这一行不参与「和上一版一样就不发」的判断。appendContextContinuation返回原因:no_log、head_changed、too_long。append_context:是否续接、原因,以及前缀、追加部分、完整组装各自的 token 数。runner_key_changed,并附新旧两把键。model/agent/continuation.go:校验键改成「系统提示.契约.工具定义」三段短指纹,新旧一比就知道是哪一段变了。docs/group-prompt-cache.md的「只追加上下文」一节。影响
append_context轨迹。验证
DeepSeek 实测(10-27 生产同群连续 8 轮,不计第一轮):
行为回放(gpt-6.1-sol):
跨群:选了两个群跨群条目最多的 10 轮回放,没有出现把之前几轮的跨群内容错接到当前回复的情况。不过这 10 轮里两边的回复都没有直接用上跨群内容,所以这组样本只能说明不会错接,测不出联想效果有没有变。
用 10-28 线上那两轮 Telegram 群的真实请求离线跑续接判断:可以续接,续接请求约 4.8 万 token,上限 8.3 万。
单元测试:
TestAppendContextSendsOnlyWhatChanged:同一段没变就不发,状态段变了补上,记忆只补新条目,跨群和可提及成员候选不发,查证提醒紧挨在当前消息前面。TestAppendContextRestartsWhenHeadChangesOrGrowsTooLong:重开时给出head_changed/too_long原因。TestSplitContextBlocksRoundTrips。./model/agent、./model/assistant在-race下通过,./model/agent、./model/assistant、./webui在TZ=UTC下通过。