Dify工作流需动态生成Prompt以适配用户习惯:从API拉取最近3次对话主题、上次点击工具ID及偏好标签,经Python清洗后,通过Jinja2模板注入系统提示词末尾,要求用户表提前扩展字段并确保user_id正确传递。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

在Dify工作流中,需根据用户最近3次对话主题、上一次点击的工具按钮、以及历史偏好标签(如“偏好数值分析”“倾向简明回复”)实时生成Prompt,使大模型输出自动适配其行为习惯。直接硬编码静态Prompt会导致响应僵化,必须让系统在每次调用前动态组装上下文片段。
准备用户行为数据源
从Dify的Web API或自建后端服务拉取用户行为快照,确保包含:最近3条对话的summary字段、last_used_tool_id、preference_tags数组。Dify默认不存储完整行为日志,【必须提前在用户表中扩展这三个字段并持续写入】,否则后续所有拼接逻辑将因缺少数据而返回空字符串。
使用HTTP请求节点调用GET /api/v1/user/behavior?user_id={{user_id}},响应体需为JSON格式,且status字段必须为200才进入下一步。
提取并清洗行为字段
添加一个「代码块」节点,语言选Python,输入变量设为behavior_data。
写入以下逻辑:
```python
data = behavior_data
topics = (data.get("recent_topics") or [])[-3:]
tool = data.get("last_used_tool_id", "")
tags = [t.strip() for t in (data.get("preference_tags") or []) if t.strip()]
return {"topics": topics, "tool": tool, "tags": tags}
```
注意:topics必须截取最后3项而非前3项,因为用户最新行为在列表末尾;若topics为空,则topics字段返回空列表,避免后续模板渲染报错。
构造动态Prompt模板
在「LLM节点」前插入「模板」节点,启用Jinja2语法。
填写模板内容:
{% if topics %}你刚连续讨论过:{{ topics | join("、") }}。{% endif %}{% if tool %}上次你主动选择了【{{ tool }}】功能。{% endif %}{% if tags %}你偏好:{{ tags | join(",") }}。{% endif %}请基于上述背景,调整本次回复的详略程度、术语密度和结构风格。
这个模板不加任何前缀或后缀说明文字,只输出纯指令片段——Dify会将其自动注入到系统提示词末尾,与其他固定Prompt拼接。若某字段为空,对应区块完全不渲染,避免出现“你刚连续讨论过:。”这类无效句式。
绑定用户ID并触发流程
第一步:在工作流顶部「开始」节点中,勾选「启用用户上下文」,并设置user_id来源为「来自请求参数」→「query.user_id」或「header.x-user-id」,二者选其一且保持与后端传参一致。
第二步:确保HTTP请求节点的URL中{{user_id}}变量已被正确解析,可通过调试模式查看该节点输入面板是否显示真实ID值,【若显示为字面量{{user_id}}而非具体字符串,则整个流程无法获取行为数据】。
第三步:将模板节点输出连接至LLM节点的「系统提示词」字段,选择「追加到默认系统提示词之后」模式。


















