Dify Agent代码生成与审查实战教程
先说几个硬核结论:过去让AI自动写代码、做语法检查、识别安全漏洞、按团队规范做风格审查,至少得拆成三条独立流水线。现在用Dify工作流一次性串联,而且你一行后端代码都不用写。
这套流程的核心架构是三层管道:Code Generator 生成代码 → Style & Syntax Review 审查规范与语法 → Security Scanner 扫描OWASP高危漏洞。所有节点通过参数绑定和JSON结构化输出确保数据精准传递,整个过程可视化、可调试,非常适合打造标准化的代码质量流水线。
创建Workflow应用并配置基础模型
登录Dify控制台(https://cloud.dify.ai或你的私有部署地址)→ 左侧导航栏点击「工作室」→ 点击「新建应用」→ 选择「Workflow」类型 → 输入应用名称“CodeGen-Review-Agent” → 点击「创建」。
进入应用后,点击右上角「模型设置」→ 在「LLM Provider」中添加DeepSeek-R1或Qwen2.5-Coder API(需提前获取API Key并填入密钥字段)→ 将该模型设为默认推理模型 → 保存。
【必须启用流式响应】否则后续节点无法实时捕获代码生成过程中的中间输出,导致审查环节缺少上下文。这一步很多人容易忽略,一旦漏掉,节点间的依赖数据就会断裂。
搭建三段式工作流节点
在画布空白处双击,添加第一个节点:选择「LLM」类型 → 命名为「Code Generator」→ 在提示词编辑区粘贴以下内容:
“你是一个资深全栈工程师,严格按用户需求生成可运行代码。要求:1)只输出代码块,不加任何解释;2)代码必须包含完整依赖声明和入口函数;3)若需求模糊,用注释标出待确认点。用户需求:{{input}}。”
添加第二个节点:选择「LLM」类型 → 命名为「Style & Syntax Review」→ 连接前一节点的「output」→ 提示词写为:
“你是一名Python/JS代码规范审查员。请逐行检查上一段代码:1)是否符合PEP8/ESLint默认规则;2)是否存在语法错误或未定义变量;3)指出具体行号和修复建议。仅输出JSON格式:{"issues": [{"line": 12, "type": "style", "message": "缺少空格"}]}。”
添加第三个节点:选择「LLM」类型 → 命名为「Security Scanner」→ 连接「Style & Syntax Review」节点 → 提示词写为:
“你是一名OWASP Top 10安全专家。扫描代码中是否存在硬编码密钥、SQL注入、XSS、反序列化等高危漏洞。只返回JSON:{"vulnerabilities": [{"risk": "high", "location": "line 45", "description": "硬编码API key"}]}。”
三个节点顺序执行,数据流自然串联。这里有个小技巧:提示词尽量明确输出格式和约束,不然模型容易自由发挥,导致下游JSON解析失败。
配置输入输出与连接逻辑
第一步:点击画布左上角「开始」节点 → 在参数配置中新增一个字符串参数,命名为「code_requirement」,勾选「用户输入」。
第二步:将「开始」节点拖拽连线至「Code Generator」节点 → 弹出映射窗口 → 左侧选「code_requirement」,右侧选「input」→ 确认绑定。
第三步:依次连接「Code Generator」→「Style & Syntax Review」→「Security Scanner」→「结束」节点,全部使用默认「output」→「input」映射。
注意:不要手动修改节点间的数据路径名,Dify会自动识别同名字段;若改名,后续JSON解析将失败。这一点在实际踩坑中遇到过很多次,保持默认是最稳妥的做法。
添加结构化输出与异常兜底
为了让前端或下游系统方便取用,需要对最终结果做一次格式化。有两种可选方式:
方法一:在「Security Scanner」节点后添加「代码」节点 → 类型选「Python」→ 输入代码:
import json
try:
result = json.loads({{previous_node.output}})
output = {"code": {{Code Generator.output}}, "review": result}
except:
output = {"error": "审查模块返回非JSON格式"}
方法二:直接在「结束」节点配置「输出模板」→ 勾选「启用自定义输出」→ 输入:
{
"generated_code": "{{Code Generator.output}}",
"style_issues": {{Style & Syntax Review.output.issues}},
"security_vulns": {{Security Scanner.output.vulnerabilities}}
}
【结束节点必须开启「返回原始输出」】否则Dify会自动包裹一层response字段,前端解析时取不到code字段。很多同学在这里栽跟头,调试半天发现数据格式不对,其实是默认配置埋的坑。
至此整套流水线就搭完了,后续只需要根据团队需求微调提示词中的规则边界,就能把代码审查和安全扫描融入日常开发流程。
