# 成员画像 Dify Workflow 设计 ## 当前状态 - Dify app 信息已确认: - `base_url`: `http://192.168.2.240/v1` - `api_key`: `app-b2cj03DipGCIAmgBfcx7SKsT` - `mode`: `workflow` - 当前接口探测结果: - `GET /info` 正常,说明应用存在 - `POST /workflows/run` 返回 `Workflow not published` - 结论: - 插件侧已切为 workflow 调用模式 - 你需要在 Dify 后台把工作流发布,发布后插件才能真正调用 ## 可直接导入的 DSL 仓库里已生成可导入文件: - [member_context_workflow.yml](/d:/learn/abot/plugins/member_context/member_context_workflow.yml) 你可以直接在 Dify 后台导入这个 DSL,再检查模型可用性并发布。 ## 目标 将“群某一天的成员画像提取”从单大提示词,拆成 Dify 内部轻工作流,减少结果波动: 1. 按 `wxid` 作为唯一主键 2. 不用昵称做唯一识别 3. 优先提取稳定的行为信号 4. 允许弱信号为空 5. 输出严格 JSON 文本,供插件直接落库 ## 建议工作流 ### 1. Start 节点 输入变量建议如下: - `query`:文本,大段提示词正文,插件会直接传入 - `chatroom_id`:文本 - `digest_date`:文本,格式 `YYYY-MM-DD` - `member_labels`:段落,候选成员列表,格式 `wxid | display_name` - `compressed_chat`:段落,压缩后的群聊天文本 说明: - 当前插件已按上述字段调用 workflow - 为了兼容未来扩展,`query` 仍会保留 ### 2. LLM 节点:群日画像批量提取 模型建议: - 上下文长度足够大的模型 - 响应稳定、结构化能力强的模型 系统提示词建议: ```text 你是微信群后台的成员日行为证据提取器。 任务: 根据给定的一天群聊记录,只按 wxid 识别成员,输出每个成员当天的结构化行为观察。 关键规则: 1. wxid 是唯一标识。display_name 仅用于展示,不用于身份判定。 2. 每个 wxid 最终只能输出一条记录,严禁重复输出同一个 wxid。 3. 请先按 wxid 汇总该成员全天发言,再提取结果。 4. 即使成员发言以短句为主,只要样本量足够,也必须尽量提炼: - topics - discussion_scenarios - skill_signals - problem_solving_signals - value_preferences - habit_signals - expression_markers - engagement_traits - reply_entry_points - social_role - temperament_signal - summary_text 5. identity_clues、family_signals、life_stage_signals 没有明确公开证据时允许为空。 6. 不允许因为“短句较多”就统一输出空数组和通用摘要。 7. 不做心理诊断、不做隐私猜测、不把玩笑当事实。 8. 只能输出候选成员列表中的 wxid。 输出要求: - 只输出严格 JSON,不要 markdown,不要解释。 - 输出格式: { "members": [ { "wxid": "成员wxid", "display_name": "显示名", "topics": ["主题1"], "discussion_scenarios": ["场景1"], "identity_clues": ["身份线索1"], "skill_signals": ["技能信号1"], "problem_solving_signals": ["处理方式1"], "family_signals": ["家庭线索1"], "life_stage_signals": ["阶段线索1"], "value_preferences": ["价值偏好1"], "interaction_style": "一句中文", "message_pattern": "一句中文", "response_style_hint": "一句中文", "habit_signals": ["习惯1"], "expression_markers": ["表达标记1"], "engagement_traits": ["参与特征1"], "reply_entry_points": ["接话点1"], "decision_style": "一句中文", "social_role": "一句中文", "reply_taboos": ["避坑1"], "temperament_signal": "一句中文", "summary_text": "不超过100字", "representative_messages": ["原话1", "原话2"], "confidence": 0.95 } ] } ``` 用户提示词建议: ```text 群ID: {{chatroom_id}} 日期: {{digest_date}} 候选成员: {{member_labels}} 压缩后的群聊记录: {{compressed_chat}} ``` ### 3. End 节点 输出变量建议: - `text`:直接输出 LLM 节点的文本结果 说明: - 插件默认读取 workflow outputs 中的 `text` - 如果你在 Dify 里把输出字段换成别的名字,例如 `result_json`,需要同步修改插件配置中的 `workflow_output_key` ## 插件侧已对接的输入 当前插件发给 workflow 的 inputs 如下: ```json { "query": "完整提示词文本", "chatroom_id": "45317011307@chatroom", "digest_date": "2026-04-01", "member_labels": "wxid_a | 张三\nwxid_b | 李四", "compressed_chat": "【09:20】...\n..." } ``` ## 插件侧已对接的输出 插件会优先读取: 1. `outputs.text` 2. `outputs.answer` 3. `outputs.result_json` 4. `outputs.result` 如果你的工作流最终输出不是 `text`,请把 ```toml workflow_output_key = "text" ``` 改成对应字段名。 ## 为什么建议这样设计 相较于把所有事情都压进单次 completion: - workflow 模式更适合后面继续拆节点 - 可以后续增加: - JSON 清洗 Code 节点 - wxid 去重 Code 节点 - 质量分判断节点 - 插件侧已经兼容 workflow 调用,不需要再改主逻辑 ## 你现在要做的最后一步 在 Dify 后台: 1. 打开 `member_context` 2. 按上面结构补 Start / LLM / End 3. 确保 End 输出字段叫 `text` 4. 点击 Publish 发布 发布完成后,插件就能直接调用。