必须构建可干预、可验证、可拦截的后处理链:启用dify内置自校正规则(json_fixer、sql_validator等),在workflow中嵌入代码节点校验、http调用外部api重试、rag检索增强纠错,或部署sql自愈子工作流实现闭环修复。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

要在Dify工作流中让AI输出自动识别并修正自身错误,避免返回语法错误SQL、不完整JSON或越界数值,必须绕过单纯依赖模型能力的思路,转而构建可干预、可验证、可拦截的后处理链。
启用内置自校正后处理规则
进入Dify应用后台 →「高级设置」→「后处理」→ 在文本框中粘贴以下YAML配置并保存:
post_processing:
enabled: true
rules:
- type: "json_fixer"
- type: "sql_validator"
- type: "length_limiter"
max_tokens: 512
- type: "safety_guard"
policy: "strict"
这组规则会在LLM原始输出生成后立即触发:json_fixer自动补全缺失括号或引号,sql_validator调用Dify内置SQL解析器验证语法合法性,length_limiter强制截断超长响应,safety_guard拦截含敏感词或越权指令的内容。整个过程无需修改模型权重,也不依赖重训。
在Workflow节点中嵌入校验逻辑
方法一:使用代码节点执行结构校验
在关键输出节点后插入「代码」节点,语言选Python,输入以下逻辑:
import json
try:
json.loads({{input}})
return {"valid": True, "data": {{input}}}
except json.JSONDecodeError as e:
return {"valid": False, "error": str(e), "raw": {{input}}}
注意:该节点输出必须绑定到后续条件路由,否则校验形同虚设。
方法二:调用外部校验API实现闭环重试
添加HTTP节点 → Method选POST → URL填入你部署的SQL语法检查服务地址(如http://validator-api/sql/check)→ Body填{{input}} → 勾选「失败时重试」并设最大重试3次 → 将「响应状态码 ≠ 200」分支连至上游LLM节点的重执行入口。
这一步必须确保HTTP节点的超时时间设为≤8秒,否则会拖慢整体响应;若校验服务不可达,流程将卡死在该节点。
配置RAG检索增强式纠错
第一步:在知识库中上传《常见错误模式对照表.md》,内容格式为:
### 错误模式:SELECT * FROM users WHERE id = ;
### 正确写法:SELECT * FROM users WHERE id = {{value}};
### 修复说明:缺少参数占位符,需注入整型变量
第二步:在工作流中添加RAG检索节点,检索query设为“当前输出中的SQL语法错误”,相似度阈值调至0.82以上。
第三步:将RAG返回的「正确写法」字段通过模板语法注入到重生成Prompt中:
请严格按以下范式重写SQL:
{{#each rag_results}}
- {{this.correct_example}}
{{/each}}
原始输出:{{llm_output}}
【RAG检索结果必须开启重排序(Re-ranking)】,否则低相关性文档会被优先召回,导致纠错方向错误。
部署SQL自愈专用子工作流
① 新建独立工作流,命名为“SQL-Self-Heal”,仅包含三个节点:输入(text)、代码(Python校验+重写)、输出(text)。
② 在主工作流中,当检测到输出含SQL关键词(SELECT/INSERT/UPDATE/DELETE)时,用「条件路由」将该段文本送入“SQL-Self-Heal”子工作流。
③ 子工作流代码节点内运行以下逻辑:
import sqlparse
from sqlparse.exceptions import ParseError
sql = {{input}}.strip()
try:
parsed = sqlparse.parse(sql)
if len(parsed) == 0:
raise ValueError("Empty SQL")
return {"status": "ok", "sql": sql}
except (ParseError, ValueError):
fixed = sql.replace("= ;", "= 1;").replace("WHERE ;", "WHERE 1=1;")
return {"status": "repaired", "sql": fixed}
④ 主工作流接收子工作流返回后,判断status字段:若为"repaired",则记录日志并触发人工复核告警;若为"ok",则继续下游流程。










