上下文工程
内容
系统提示词、知识库检索内容、历史对话摘要、工具结果
装配器
预算账本、分层来源、决策理由、版本与配置快照、最终token和msgs、异常标记
问题
一个 AI 客服会话跑了几十轮,你要往上下文窗口里装东西。系统提示、用户长期记忆(VIP 等级、历史投诉)、知识库召回块、历史对话摘要——这四类分别归谁管?也就是:谁在什么时候写它、谁决定装不装它、它超预算时会不会被挤掉。
两个具体判断:
- 窗口满了,你先砍哪一类?为什么是这个顺序?
- 落到 Go 代码上,你会做成一个独立的装配器(预算 + 装配策略),还是散在各个 Graph 节点里各自拼 messages?
- 长期记忆 > 召回块(低分)> 历史摘要。
- 装配器为什么必须独立成一层,而不是散在各节点拼 msg。散着拼有三个必然后果:每个节点各自决定塞什么,裁剪策略不一致,同一会话两次运行不可复现;你无法回答「这一轮到底给模型塞了什么」;没法单测、没法 A/B。
1 | type ContextAssembler struct{ Budget TokenBudget } |
一个 AI 客服会话跑到第 30 轮,上下文只剩 30% 预算。用户说「我上次投诉的那个订单问题还没解决」。你手上有四样东西:系统提示、用户长期记忆(VIP 等级 + 历史投诉记录)、检索到的 3 个订单相关块、10 轮旧对话的摘要。
- 这 30% 预算你怎么分给四层?先砍谁,说清理由。
- 「上次投诉的那个订单」这个信息,应该来自记忆层还是检索层?如果记忆里有、检索没有,你怎么办?(这题考边界,不是查库)
- 除了 messages,你的装配器还要吐出什么,才能让线上出问题后 5 分钟内说清「这一轮到底塞了什么、为什么这么塞」?