这道题其实在问一个核心问题:当模型面对一个动态变化的输入环境时,我们该怎么构造训练数据,才能让它学会正确应对。动态Prompt的本质,说白了就是一个输入依赖的状态机,Prompt的结构会随着上下文、工具返回、用户意图实时变化,而不是一套固定的模板。所以数据构建必须围绕状态、动作、转移这三个要素来展开。
先说样本生成。这里的关键不是生成静态的问答对,而是要生成完整的轨迹数据。什么意思呢?就是一条样本必须包含状态、行为、结果的完整链条。举个例子,在客服退款场景里,模型可能要调用订单查询、退款计算、库存确认等多个工具,每一步的思考、动作、观察结果都要记录下来。我会按意图类型、工具组合、轮次数分层采样,确保覆盖常见路径和长尾边界。同时,我会故意构造一些异常分支,比如工具调用失败、信息缺失、用户突然改主意,这些对抗性样本对模型的鲁棒性特别重要。另外,我倾向于用强模型基于规则模板生成基础轨迹,然后在关键决策点上人工精修,这样效率和质量都能兼顾。
再来说标签定义。这里有个边界划分的问题:粗粒度标注适用于端到端微调,比如对话任务,只要最终输出满足用户意图就行;而细粒度标注适用于[[Agent]]任务,需要对每步的思考、动作、观察都打标签。实际落地时,我往往会两者结合,对中间步骤用过程监督,对最终结果用结果监督。比如在订单异常处理中,我会标注每步工具调用是否正确,同时也会标注最终是否解决了用户问题。另外,如果要用RL或[[DPO]]训练,还需要构造同一状态下优劣响应的偏好对。
上下文建模这块,我有个很深的体会:状态追踪机制设计不好,模型很容易失忆。我会把历史工具返回、中间结论编码成结构化格式,比如JSON或XML[[嵌入]]Prompt,这样模型解析起来更清楚。同时,关键信息比如最新观察结果要放在Prompt尾部,利用位置偏置让模型更关注。还有一个容易被忽视的坑:超长上下文时,不能简单截断,而是要做摘要保留关键信息,这需要同步训练一个摘要模块。
最后是质量验证。我坚持一个原则:训练数据必须通过真实执行验证。具体来说,要检查工具调用是否能解析执行,执行结果和标注的观察是否一致,多轮后是否收敛到正确终态。常见失败场景是,数据标注时模型能走通,但上线后因为工具返回格式或内容变化就崩了。所以我会建立执行失败、归因分析、补充样本的迭代飞轮,而不是一次性标注完就完事。
其实还有一个关键点我没展开,就是当动态Prompt中涉及多工具并行调用时,数据如何构造。比如一个任务需要同时查询库存和价格,模型怎么决定调用顺序?这直接影响到训练数据的标注策略。这个场景下状态空间会指数级增长,如何处理?
所以总结下来,我更倾向于把动态Prompt的数据构建看作一个系统工程,核心是围绕状态机生成轨迹数据,按任务粒度定义标签,做好状态追踪,并用执行闭环持续迭代。做好了这些,模型才能真正适应动态环境。