接入成员画像 Dify 工作流并清理旧提取逻辑
- 新增 member_context 专用 DifyClient,统一兼容 completion 与 workflow 两种调用模式 - 将成员画像插件默认切换到 Dify workflow 模式,配置改用新的 workflow 应用与 workflows/run 接口 - 生成可直接导入 Dify 的成员画像工作流 DSL 文件,方便后台一键导入和发布 - 补充 Dify 工作流接入说明文档,明确输入字段、输出字段、发布步骤与插件消费方式 - 清理旧的单成员日摘要提取链路,日级画像统一收敛到群日批量提取路径,减少无效分支和历史残留 - 去除 member_context 内部多处旧 requests 直连调用,统一改为通过 DifyClient 调用 AI 服务 - 优化群日批量结果解析逻辑,只按 wxid 作为唯一主键识别成员,不再依赖昵称做唯一判断 - 新增按 wxid 的结果去重与完整度评分逻辑,遇到重复成员结果时优先保留字段更完整、置信度更高的一条 - 保留现有初始化、增量、周/月聚合与最终画像生成链路,同时剔除 workflow 接入后已无效或低价值的旧逻辑 - 为后续继续收紧 fallback 标记、增强后台质量诊断和优化工作流输出稳定性打下基础
This commit is contained in:
271
plugins/member_context/member_context_workflow.yml
Normal file
271
plugins/member_context/member_context_workflow.yml
Normal file
@@ -0,0 +1,271 @@
|
||||
app:
|
||||
description: 按群和日期提取群成员日画像,输出严格 JSON,供 member_context 插件直接消费
|
||||
icon: 🧠
|
||||
icon_background: '#E0F2FE'
|
||||
mode: workflow
|
||||
name: member_context
|
||||
use_icon_as_answer_icon: false
|
||||
dependencies:
|
||||
- current_identifier: null
|
||||
type: marketplace
|
||||
value:
|
||||
marketplace_plugin_unique_identifier: langgenius/volcengine_maas:0.0.13@d402dc32a505b1b4f27588f10e729209bf413ec263467635774d96c4345bd197
|
||||
kind: app
|
||||
version: 0.3.0
|
||||
workflow:
|
||||
conversation_variables: []
|
||||
environment_variables: []
|
||||
features:
|
||||
file_upload:
|
||||
allowed_file_extensions:
|
||||
- .TXT
|
||||
allowed_file_types:
|
||||
- document
|
||||
allowed_file_upload_methods:
|
||||
- local_file
|
||||
- remote_url
|
||||
enabled: false
|
||||
fileUploadConfig:
|
||||
audio_file_size_limit: 50
|
||||
batch_count_limit: 5
|
||||
file_size_limit: 15
|
||||
image_file_size_limit: 10
|
||||
video_file_size_limit: 100
|
||||
workflow_file_upload_limit: 10
|
||||
image:
|
||||
enabled: false
|
||||
number_limits: 3
|
||||
transfer_methods:
|
||||
- local_file
|
||||
- remote_url
|
||||
number_limits: 3
|
||||
opening_statement: ''
|
||||
retriever_resource:
|
||||
enabled: false
|
||||
sensitive_word_avoidance:
|
||||
enabled: false
|
||||
speech_to_text:
|
||||
enabled: false
|
||||
suggested_questions: []
|
||||
suggested_questions_after_answer:
|
||||
enabled: false
|
||||
text_to_speech:
|
||||
enabled: false
|
||||
language: ''
|
||||
voice: ''
|
||||
graph:
|
||||
edges:
|
||||
- data:
|
||||
isInIteration: false
|
||||
isInLoop: false
|
||||
sourceType: start
|
||||
targetType: llm
|
||||
id: start-source-llm-target
|
||||
selected: false
|
||||
source: 'start_node'
|
||||
sourceHandle: source
|
||||
target: 'llm_node'
|
||||
targetHandle: target
|
||||
type: custom
|
||||
zIndex: 0
|
||||
- data:
|
||||
isInIteration: false
|
||||
isInLoop: false
|
||||
sourceType: llm
|
||||
targetType: end
|
||||
id: llm-source-end-target
|
||||
selected: false
|
||||
source: 'llm_node'
|
||||
sourceHandle: source
|
||||
target: 'end_node'
|
||||
targetHandle: target
|
||||
type: custom
|
||||
zIndex: 0
|
||||
nodes:
|
||||
- data:
|
||||
desc: ''
|
||||
selected: false
|
||||
title: 开始
|
||||
type: start
|
||||
variables:
|
||||
- label: query
|
||||
max_length: 120000
|
||||
options: []
|
||||
required: false
|
||||
type: paragraph
|
||||
variable: query
|
||||
- label: chatroom_id
|
||||
max_length: 128
|
||||
options: []
|
||||
required: true
|
||||
type: text-input
|
||||
variable: chatroom_id
|
||||
- label: digest_date
|
||||
max_length: 32
|
||||
options: []
|
||||
required: true
|
||||
type: text-input
|
||||
variable: digest_date
|
||||
- label: member_labels
|
||||
max_length: 50000
|
||||
options: []
|
||||
required: true
|
||||
type: paragraph
|
||||
variable: member_labels
|
||||
- label: compressed_chat
|
||||
max_length: 200000
|
||||
options: []
|
||||
required: true
|
||||
type: paragraph
|
||||
variable: compressed_chat
|
||||
height: 194
|
||||
id: 'start_node'
|
||||
position:
|
||||
x: -420
|
||||
y: 120
|
||||
positionAbsolute:
|
||||
x: -420
|
||||
y: 120
|
||||
selected: false
|
||||
sourcePosition: right
|
||||
targetPosition: left
|
||||
type: custom
|
||||
width: 244
|
||||
- data:
|
||||
context:
|
||||
enabled: false
|
||||
variable_selector: []
|
||||
default_value:
|
||||
- key: text
|
||||
type: string
|
||||
value: '{"members":[]}'
|
||||
desc: ''
|
||||
error_strategy: default-value
|
||||
model:
|
||||
completion_params:
|
||||
temperature: 0.2
|
||||
mode: chat
|
||||
name: Doubao-1.5-pro-256k
|
||||
provider: langgenius/volcengine_maas/volcengine_maas
|
||||
prompt_template:
|
||||
- id: system_prompt_member_context
|
||||
role: system
|
||||
text: |
|
||||
你是微信群后台的成员日行为证据提取器。
|
||||
|
||||
任务:
|
||||
根据给定的一天群聊记录,只按 wxid 识别成员,输出每个成员当天的结构化行为观察。
|
||||
|
||||
关键规则:
|
||||
1. wxid 是唯一标识。display_name 仅用于展示,不用于身份判定。
|
||||
2. 每个 wxid 最终只能输出一条记录,严禁重复输出同一个 wxid。
|
||||
3. 请先按 wxid 汇总该成员全天发言,再提取结果。
|
||||
4. 即使成员发言以短句为主,只要样本量足够,也必须尽量提炼:
|
||||
- topics
|
||||
- skill_signals
|
||||
- value_preferences
|
||||
- habit_signals
|
||||
- engagement_traits
|
||||
- social_role
|
||||
- temperament_signal
|
||||
- summary_text
|
||||
5. identity_clues、family_signals、life_stage_signals 没有明确公开证据时允许为空。
|
||||
6. 不允许因为“短句较多”就统一输出空数组和通用摘要。
|
||||
7. 不做心理诊断、不做隐私猜测、不把玩笑当事实。
|
||||
8. 只能输出候选成员列表中的 wxid。
|
||||
9. topics 更偏向反复出现的关注方向;skill_signals 更偏向能力表现;value_preferences 更偏向判断偏好;social_role 更偏向当天在群里的实际作用。
|
||||
10. 输出前自行去重,同一个 wxid 只保留一条最完整结果。
|
||||
|
||||
输出要求:
|
||||
- 只输出严格 JSON,不要 markdown,不要解释,不要前后缀。
|
||||
- 输出格式:
|
||||
{
|
||||
"members": [
|
||||
{
|
||||
"wxid": "成员wxid",
|
||||
"display_name": "显示名",
|
||||
"topics": ["主题1"],
|
||||
"identity_clues": ["身份线索1"],
|
||||
"skill_signals": ["技能信号1"],
|
||||
"family_signals": ["家庭线索1"],
|
||||
"life_stage_signals": ["阶段线索1"],
|
||||
"value_preferences": ["价值偏好1"],
|
||||
"interaction_style": "一句中文",
|
||||
"message_pattern": "一句中文",
|
||||
"response_style_hint": "一句中文",
|
||||
"habit_signals": ["习惯1"],
|
||||
"engagement_traits": ["参与特征1"],
|
||||
"decision_style": "一句中文",
|
||||
"social_role": "一句中文",
|
||||
"reply_taboos": ["避坑1"],
|
||||
"temperament_signal": "一句中文",
|
||||
"summary_text": "不超过100字",
|
||||
"representative_messages": ["原话1", "原话2"],
|
||||
"confidence": 0.95
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
字段约束:
|
||||
- topics、skill_signals、value_preferences、habit_signals、engagement_traits 最多 4 个
|
||||
- identity_clues、family_signals、life_stage_signals 最多 3 个
|
||||
- reply_taboos 最多 3 个
|
||||
- representative_messages 最多 3 条
|
||||
- 如果某成员样本明显不足,可以不输出该成员
|
||||
- id: user_prompt_member_context
|
||||
role: user
|
||||
text: |
|
||||
群ID: {{#start_node.chatroom_id#}}
|
||||
日期: {{#start_node.digest_date#}}
|
||||
|
||||
候选成员:
|
||||
{{#start_node.member_labels#}}
|
||||
|
||||
压缩后的群聊记录:
|
||||
{{#start_node.compressed_chat#}}
|
||||
selected: false
|
||||
title: 成员画像提取
|
||||
type: llm
|
||||
variables: []
|
||||
vision:
|
||||
enabled: false
|
||||
height: 98
|
||||
id: 'llm_node'
|
||||
position:
|
||||
x: 10
|
||||
y: 140
|
||||
positionAbsolute:
|
||||
x: 10
|
||||
y: 140
|
||||
selected: false
|
||||
sourcePosition: right
|
||||
targetPosition: left
|
||||
type: custom
|
||||
width: 244
|
||||
- data:
|
||||
desc: ''
|
||||
outputs:
|
||||
- value_selector:
|
||||
- 'llm_node'
|
||||
- text
|
||||
variable: text
|
||||
selected: false
|
||||
title: 结束
|
||||
type: end
|
||||
height: 90
|
||||
id: 'end_node'
|
||||
position:
|
||||
x: 430
|
||||
y: 140
|
||||
positionAbsolute:
|
||||
x: 430
|
||||
y: 140
|
||||
selected: false
|
||||
sourcePosition: right
|
||||
targetPosition: left
|
||||
type: custom
|
||||
width: 244
|
||||
viewport:
|
||||
x: 120
|
||||
y: 180
|
||||
zoom: 0.9
|
||||
Reference in New Issue
Block a user