问题描述
当前每次对话都完整重建上下文:
// ai/context/builder_impl.go
func (b *contextBuilderImpl) Build(ctx context.Context, req *ContextRequest) (*ContextResult, error) {
// 每次都完整构建
shortTerm := b.shortTermExtractor.Extract(ctx, req)
longTerm := b.longTermExtractor.Extract(ctx, req)
retrieval := b.formatRetrievalResults(req.RetrievalResults)
// ...
}
在多轮对话中,这导致:
- 重新计算所有 Token 估算
- 重新排序所有上下文片段
- 重新截断到预算
- 浪费计算资源(实际只有最新消息变化)
建议方案
实现增量上下文构建:
type IncrementalContextBuilder struct {
lastResult *ContextResult
lastReqHash string
dirty map[string]bool // 标记需要更新的部分
}
type DeltaInfo struct {
OnlyNewMessage bool // 仅添加了新消息
RetrievalUnchanged bool // 检索结果未变化
PrefsUnchanged bool // 用户偏好未变化
}
func (b *IncrementalContextBuilder) Build(req *ContextRequest) (*ContextResult, error) {
delta := b.computeDelta(req)
switch {
case delta.OnlyNewMessage && delta.RetrievalUnchanged:
// 最优路径: 仅追加新消息
return b.appendOnly(req)
case delta.RetrievalUnchanged:
// 部分重建: 仅更新会话历史
return b.updateConversationOnly(req)
default:
// 完整重建
return b.fullRebuild(req)
}
}
func (b *IncrementalContextBuilder) appendOnly(req *ContextRequest) (*ContextResult, error) {
result := b.lastResult.Clone()
// 仅添加最新的用户消息
newMessage := req.CurrentQuery
newTokens := EstimateTokens(newMessage)
// 检查预算
if result.TotalTokens + newTokens > req.MaxTokens {
// 需要截断最早的消息
result = b.truncateOldest(result, newTokens)
}
result.ConversationContext += "\nUser: " + newMessage
result.TotalTokens += newTokens
return result, nil
}
性能提升预估
| 场景 |
当前耗时 |
优化后 |
提升 |
| 首轮对话 |
50ms |
50ms |
- |
| 第2轮对话 |
50ms |
15ms |
70% |
| 第5轮对话 |
55ms |
10ms |
82% |
文件变更
ai/context/incremental_builder.go - 新增增量构建器
ai/context/incremental_builder_test.go - 单元测试
ai/context/builder_impl.go - 添加增量模式支持
ai/context/builder.go - 接口扩展
验收标准
预估工时
3-5 天
技术风险
相关 Issue
问题描述
当前每次对话都完整重建上下文:
在多轮对话中,这导致:
建议方案
实现增量上下文构建:
性能提升预估
文件变更
ai/context/incremental_builder.go- 新增增量构建器ai/context/incremental_builder_test.go- 单元测试ai/context/builder_impl.go- 添加增量模式支持ai/context/builder.go- 接口扩展验收标准
预估工时
3-5 天
技术风险
相关 Issue