第一轮用户说:“分析动态工作流的并发限制。”
第二轮只说:“那最小改动应该落在哪个函数?”
如果系统只把第二句话发给模型,它就像接到一张没有寄件人和前文的便签;如果把所有历史原封不动重播,又会让上下文越来越重。多轮上下文的难点,是在“连续”与“膨胀”之间保持平衡。
4.1 当前生产链路如何携带历史
当前生产续聊链路不是直接调用conversationContextFormatter.ts,而是:
Webview continueConversation -> extension.ts.handleContinueConversation -> conversationManager.addUserMessage -> conversationManager.getConversationHistory -> executeRun(..., conversationHistory) -> reactAgentRunner.run -> system message + history + 当前 taskconversationContextFormatter.ts是仓库中独立、带测试的格式化器,体现了相同的消息序列规则,但阅读生产行为时应以extension.ts和reactAgentRunner.ts为准。
runner 会先加入本轮 system prompt,再逐条复制历史中的 user/assistant 消息;如果最后一条消息并不是内容完全相同的当前 user task,才追加当前任务。
这个小规则看似琐碎,却避免了两个常见错误:
- 把同一条用户消息重复追加,模型误以为用户说了两遍;
- 在上一轮仍未闭合时插入新 user 消息,破坏消息角色序列。