Dify多轮追问结构化表单Agent设计
在Dify中设计结构化表单填写Agent需实现动态收集能力,支持用户中途打断、跳转纠错。核心步骤包括:准备JSON格式字段定义并采用自然语言描述;通过条件分支节点或记忆变量控制分阶段引导;配置关键词触发器处理用户追问与修改;最终用代码节点校验必填字段完整性后提交。
想象一下,当用户与Dify Agent填写表单时,最希望获得什么样的体验?如同与真人客服对话:先询问姓名,再确认手机号,接着核实地址,最后了解偏好——但在过程中,用户可以随时插入“地址填错了怎么办?”或“能跳过这步吗?”这样的提问,Agent能够灵活响应,而不是机械地按照固定顺序逐一推进。这才是理想的人机交互体验。
要实现这一效果,关键在于使Agent具备动态表单收集能力,并支持用户中途打断、跳转和纠错。下面我们将详细拆解具体实现方法。

在Dify中,你需要通过Agent模拟真人客服的交互节奏:先问姓名→再问手机号→接着确认地址→最后让用户补充偏好,过程中允许用户随时插话追问甚至修改之前填写的内容,而不是僵硬地按顺序跑完所有字段。
准备结构化表单字段定义
第一步是打好基础。在Dify知识库或应用设置中,新建一个JSON格式的表单Schema,明确每个字段的名称、类型、必填性及校验规则。举例来说:{"name":{"type":"string","required":true,"description":"用户真实姓名"},"phone":{"type":"string","required":true,"pattern":"^1[3-9]\d{9}$"}}。
这里有一个关键点:字段描述必须使用自然语言写清楚。比如“地址”字段不能只写一个"string",而要写成“详细到门牌号的收货地址,需包含省市区和街道”,否则Agent无法准确追问细节。
这一步容易踩坑:如果漏掉pattern或required,在多轮对话中Agent就会缺失校验能力,用户随意输入手机号也能蒙混过关,体验直接崩塌。
配置Agent工作流:分阶段引导+动态跳转
有两种方法可以实现,你可以根据具体场景选择其一,或组合使用。
方法一:用「条件分支节点」控制字段顺序
首先在工作流画布中拖入一个「LLM节点」,在提示词开头写明当前目标:“你正在收集用户注册信息,请严格按顺序获取:①姓名→②手机号→③地址→④偏好。每问完一项,确认用户已回答再进入下一项。”
然后在这个LLM节点后面接一个「条件分支节点」,设置判断逻辑为“是否已获得姓名且格式有效”。成立则流向手机号提问节点,不成立则返回原LLM节点重新询问。
对每个字段重复这个分支设置。但地址分支需要额外增加一条路径:当用户输入包含“改地址”“重新填”“跳过”等关键词时,直接跳回地址字段的LLM节点,不要死板地卡在顺序上。
方法二:用「记忆变量」记录填写进度
在应用设置中启用「对话记忆」,并手动添加三个记忆变量:filled_fields(数组)、current_step(字符串)、pending_correction(布尔值)。每次用户完成一个字段,就用「赋值节点」更新filled_fields,将字段名推入数组。
LLM提示词里嵌入变量调用:{{filled_fields}},让模型实时知道“已经填了姓名和手机,下一步该问地址”。注意:current_step必须与filled_fields的最后一个元素保持同步,否则会重复提问或跳过关键字段。
处理用户中途追问:拦截关键词+上下文锚定
用户随时可能打断,例如“手机号填错了”“我不想填这个了”“之前说错了”。每个字段对应的LLM节点提示词末尾,统一追加一段指令:“如果用户当前回复包含‘怎么修改’‘不想填’‘之前说错了’‘跳过’‘算了’等意图,立即暂停表单流程,先响应该问题,再根据用户最新输入决定是否回到上一字段、当前字段或继续下一字段。”
这一步如果不做,用户说“手机号填错了”后,Agent还会傻乎乎地继续问地址,体验直接断裂。
更稳妥的做法是:为每个字段LLM节点单独配置「关键词触发器」。在节点设置里勾选“启用关键词匹配”,填入该字段专属纠错词。例如手机号节点填入“错号、打错了、重输、换一个”;地址节点填入“写错、不对、要改、门牌号错了”。触发后自动跳转至专用纠错LLM节点,该节点只处理修改逻辑,不涉及其他字段,干净利落。
验证必填字段完整性并提交
当用户主动说“填完了”,或者四个字段全部出现在filled_fields数组中时,工作流进入终审节点。
使用「代码节点」运行一段Python脚本,遍历JSON Schema中required:true的字段,检查是否全部存在于用户提交数据中。缺失项直接返回错误消息:“请补填【姓名】和【手机号】,这两项为必填。”
校验通过后,调用「HTTP请求节点」将整理好的字典对象POST到你的业务接口,URL和Header按实际填写,Body选择raw JSON。整个流程至此完成。
