feat(aihr): align BRD scenarios and SOP seed content

This commit is contained in:
2026-07-14 23:04:23 +08:00
parent cabdfafa17
commit 0a30fe7034
8 changed files with 205 additions and 5 deletions
+13 -3
View File
@@ -93,7 +93,9 @@ INSERT INTO `aihr_knowledge_info`
VALUES
(1001, '000000', '投诉处理 SOP', '业主投诉的接待、记录、派单、反馈和闭环确认。', '\n\n', 120, 5, 0.5, 800, NULL, NULL, 1, 1.0, '回答必须引用投诉处理 SOP 片段,不得编造未命中的金额、责任和时限。', NOW(), NOW(), 'seed:sop'),
(1002, '000000', '催缴沟通 SOP', '缴费提醒、费用争议回应、服务问题承接。', '\n\n', 120, 5, 0.5, 800, NULL, NULL, 1, 1.0, '回答必须区分服务整改与费用义务。', NOW(), NOW(), 'seed:sop'),
(1003, '000000', '报修跟进 SOP', '报修接单、派工、现场反馈、复核关闭。', '\n\n', 120, 5, 0.5, 800, NULL, NULL, 1, 1.0, '回答必须给出明确节点和责任人。', NOW(), NOW(), 'seed:sop')
(1003, '000000', '报修跟进 SOP', '报修接单、派工、现场反馈、复核关闭。', '\n\n', 120, 5, 0.5, 800, NULL, NULL, 1, 1.0, '回答必须给出明确节点和责任人。', NOW(), NOW(), 'seed:sop'),
(1201, '000000', '增值服务需求识别 SOP', '基于业主真实需求介绍增值服务,明确适用范围、价格和取消规则。', '\n\n', 120, 5, 0.5, 800, NULL, NULL, 1, 1.0, '只能基于已确认的服务目录和价目口径回答,不得编造优惠或效果承诺。', NOW(), NOW(), 'seed:sop:brd-supplement'),
(1202, '000000', '日常服务回访 SOP', '服务完成后的满意度确认、遗留问题记录、责任人和回访节点。', '\n\n', 120, 5, 0.5, 800, NULL, NULL, 1, 1.0, '已完成不等于已闭环,回答必须包含满意度确认、责任人和下一次回访节点。', NOW(), NOW(), 'seed:sop:brd-supplement')
ON DUPLICATE KEY UPDATE
`description` = VALUES(`description`),
`system_prompt` = VALUES(`system_prompt`),
@@ -104,7 +106,9 @@ INSERT INTO `aihr_knowledge_attach`
VALUES
(1001, '000000', 1001, 'sop_complaint_v1', '投诉处理 SOP v1.0', 'sop', 2, NOW(), NOW(), 'owner:品质组'),
(1002, '000000', 1002, 'sop_payment_v1', '催缴沟通 SOP v1.0', 'sop', 2, NOW(), NOW(), 'owner:财务组'),
(1003, '000000', 1003, 'sop_repair_v1', '报修跟进 SOP v1.0', 'sop', 2, NOW(), NOW(), 'owner:工程组')
(1003, '000000', 1003, 'sop_repair_v1', '报修跟进 SOP v1.0', 'sop', 2, NOW(), NOW(), 'owner:工程组'),
(1201, '000000', 1201, 'sop_service_promotion_v1', '增值服务需求识别 SOP v1.0', 'sop', 2, NOW(), NOW(), 'seed:sop:brd-supplement'),
(1202, '000000', 1202, 'sop_daily_service_v1', '日常服务回访 SOP v1.0', 'sop', 2, NOW(), NOW(), 'seed:sop:brd-supplement')
ON DUPLICATE KEY UPDATE
`status` = VALUES(`status`),
`update_time` = NOW();
@@ -120,7 +124,13 @@ VALUES
(100203, '000000', 1002, 3, 'sop_payment_v1', '对服务整改事项设置跟进责任人,并在约定时间内反馈处理进度。', NOW(), NOW(), 'seed:sop'),
(100301, '000000', 1003, 1, 'sop_repair_v1', '报修超时跟进前,必须确认工单编号、责任班组、当前状态和超时原因。', NOW(), NOW(), 'seed:sop'),
(100302, '000000', 1003, 2, 'sop_repair_v1', '向业主同步下一次反馈或到场时间,避免只说尽快处理。', NOW(), NOW(), 'seed:sop'),
(100303, '000000', 1003, 3, 'sop_repair_v1', '维修完成后需向业主确认处理效果,再补充关闭证据并关闭工单。', NOW(), NOW(), 'seed:sop')
(100303, '000000', 1003, 3, 'sop_repair_v1', '维修完成后需向业主确认处理效果,再补充关闭证据并关闭工单。', NOW(), NOW(), 'seed:sop'),
(120101, '000000', 1201, 1, 'sop_service_promotion_v1', '介绍增值服务前,先确认业主的家庭场景、实际需求、预算和期望结果,不直接罗列产品。', NOW(), NOW(), 'seed:sop:brd-supplement'),
(120102, '000000', 1201, 2, 'sop_service_promotion_v1', '服务介绍必须说明适用范围、正式价目、办理路径和取消规则;未确认的信息不得口头承诺。', NOW(), NOW(), 'seed:sop:brd-supplement'),
(120103, '000000', 1201, 3, 'sop_service_promotion_v1', '业主暂不需要时应记录需求和后续咨询方式,不以夸大效果、强行推销或虚构优惠促成转化。', NOW(), NOW(), 'seed:sop:brd-supplement'),
(120201, '000000', 1202, 1, 'sop_daily_service_v1', '服务完成后要确认业主是否满意、是否还有遗留问题,并记录新的服务需求。', NOW(), NOW(), 'seed:sop:brd-supplement'),
(120202, '000000', 1202, 2, 'sop_daily_service_v1', '对未解决事项明确责任人、下一次反馈时间和记录方式,不能只说已经处理。', NOW(), NOW(), 'seed:sop:brd-supplement'),
(120203, '000000', 1202, 3, 'sop_daily_service_v1', '回访结束后更新服务记录;业主再次反馈时,应能沿用既有记录继续处理,避免重复询问。', NOW(), NOW(), 'seed:sop:brd-supplement')
ON DUPLICATE KEY UPDATE
`content` = VALUES(`content`),
`update_time` = NOW();
+9 -1
View File
@@ -341,7 +341,15 @@ VALUES
('000000', 'emergency-security', '陌生人尾随求助', '生活顾问', '突发求助', '住宅', 3,
'夜间回家、感到被尾随、需要安全协助的业主', '我刚进小区感觉有人跟着我,你们保安在哪里?', '安全求助', '希望马上获得陪同和安全确认', '要求业主自己确认、轻描淡写、泄露巡逻盲区', '先确认位置、安排安保、保持通话或引导到安全点', '安全巡逻SOP;突发求助SOP',
'确认实时位置,安排安保接应,引导到明亮公共区域并保留记录', '提示不要透露安防盲区', '训练夜间安全求助的接警式沟通。', '张三', 54, 82,
'[{"customer":"我刚进小区感觉有人跟着我,你们保安在哪里?","coachHint":"先确认当前位置和是否安全,安排安保接应。","emotion":86,"trust":62},{"customer":"我要不要直接回家?","coachHint":"引导到明亮公共区域或岗亭,保持联系。","emotion":76,"trust":82}]', 1, 120, NOW(), NOW())
'[{"customer":"我刚进小区感觉有人跟着我,你们保安在哪里?","coachHint":"先确认当前位置和是否安全,安排安保接应。","emotion":86,"trust":62},{"customer":"我要不要直接回家?","coachHint":"引导到明亮公共区域或岗亭,保持联系。","emotion":76,"trust":82}]', 1, 120, NOW(), NOW()),
('000000', 'service-promotion-needs', '增值服务需求识别与推介', '生活顾问', '服务推介/增值', '住宅', 2,
'关注生活品质、但对营销话术敏感的业主', '最近家里老人要长期出门,社区有没有更方便的生活服务?', '识别真实需求并介绍适配的增值服务', '希望得到有用建议而不是被强行推销', '不问需求就罗列产品、夸大承诺、把推介当成收费催促', '先确认家庭场景和预算,再介绍适配服务并说明价格与取消规则', '增值服务推介SOP;客户需求识别SOP',
'先提问确认需求,再说明服务适用范围、价格口径和后续咨询路径', '提示不得编造优惠、效果或未确认的服务承诺', '训练生活顾问在真实需求基础上完成合规的增值服务介绍。', '张三', 63, 84,
'[{"customer":"我不喜欢被推销,你先说这个服务到底能解决什么问题。","coachHint":"先复述业主需求,再说明适用场景,不要直接报一串产品。","emotion":68,"trust":72},{"customer":"那具体多少钱?可以随时取消吗?","coachHint":"金额和取消规则必须以正式价目与合同口径为准,不能现场编造。","emotion":58,"trust":84}]', 1, 130, NOW(), NOW()),
('000000', 'daily-service-followup', '日常服务主动回访', '生活顾问', '日常服务', '住宅', 1,
'刚办理过服务、希望有人持续跟进的业主', '上次你们帮我处理完了,我想知道后面还会有人跟进吗?', '完成日常服务回访与问题闭环', '希望被持续关注,避免问题处理后无人回应', '只说已经完成、不给回访节点、不记录新的服务需求', '确认结果是否满足、记录新问题、约定回访节点并留下服务记录', '日常服务回访SOP;服务闭环SOP',
'确认满意度和遗留问题,明确责任人、回访时间和记录方式', '提示已完成不等于已闭环,必须确认业主感受和后续动作', '训练生活顾问把一次性服务延伸为有记录、有节点的日常回访。', '张三', 66, 85,
'[{"customer":"事情是处理了,但我不知道以后有问题找谁。","coachHint":"确认当前结果和遗留问题,给出明确联系人和回访节点。","emotion":62,"trust":74},{"customer":"那你们会记下来吗?别下次又要从头说。","coachHint":"说明服务记录和后续跟进方式,避免只做口头承诺。","emotion":54,"trust":85}]', 1, 140, NOW(), NOW())
ON DUPLICATE KEY UPDATE
`scenario_name` = VALUES(`scenario_name`),
`position` = VALUES(`position`),
@@ -0,0 +1,34 @@
-- AIHR BRD 住宅 SOP 补充迁移(MySQL 8.x)
-- 补齐服务推介与日常服务两类可检索 SOP;不写入正式评审数据,可重复执行。
INSERT INTO `aihr_knowledge_info`
(`id`, `tenant_id`, `name`, `description`, `separator`, `overlap_char`, `retrieve_limit`, `similarity_threshold`, `text_block_size`, `vector_model`, `embedding_model`, `enable_hybrid`, `hybrid_alpha`, `system_prompt`, `create_time`, `update_time`, `remark`)
VALUES
(1201, '000000', '增值服务需求识别 SOP', '基于业主真实需求介绍增值服务,明确适用范围、价格和取消规则。', '\n\n', 120, 5, 0.5, 800, NULL, NULL, 1, 1.0, '只能基于已确认的服务目录和价目口径回答,不得编造优惠或效果承诺。', NOW(), NOW(), 'seed:sop:brd-supplement'),
(1202, '000000', '日常服务回访 SOP', '服务完成后的满意度确认、遗留问题记录、责任人和回访节点。', '\n\n', 120, 5, 0.5, 800, NULL, NULL, 1, 1.0, '已完成不等于已闭环,回答必须包含满意度确认、责任人和下一次回访节点。', NOW(), NOW(), 'seed:sop:brd-supplement')
ON DUPLICATE KEY UPDATE
`description` = VALUES(`description`),
`system_prompt` = VALUES(`system_prompt`),
`update_time` = NOW();
INSERT INTO `aihr_knowledge_attach`
(`id`, `tenant_id`, `knowledge_id`, `doc_id`, `name`, `type`, `status`, `create_time`, `update_time`, `remark`)
VALUES
(1201, '000000', 1201, 'sop_service_promotion_v1', '增值服务需求识别 SOP v1.0', 'sop', 2, NOW(), NOW(), 'seed:sop:brd-supplement'),
(1202, '000000', 1202, 'sop_daily_service_v1', '日常服务回访 SOP v1.0', 'sop', 2, NOW(), NOW(), 'seed:sop:brd-supplement')
ON DUPLICATE KEY UPDATE
`status` = VALUES(`status`),
`update_time` = NOW();
INSERT INTO `aihr_knowledge_fragment`
(`id`, `tenant_id`, `knowledge_id`, `idx`, `doc_id`, `content`, `create_time`, `update_time`, `remark`)
VALUES
(120101, '000000', 1201, 1, 'sop_service_promotion_v1', '介绍增值服务前,先确认业主的家庭场景、实际需求、预算和期望结果,不直接罗列产品。', NOW(), NOW(), 'seed:sop:brd-supplement'),
(120102, '000000', 1201, 2, 'sop_service_promotion_v1', '服务介绍必须说明适用范围、正式价目、办理路径和取消规则;未确认的信息不得口头承诺。', NOW(), NOW(), 'seed:sop:brd-supplement'),
(120103, '000000', 1201, 3, 'sop_service_promotion_v1', '业主暂不需要时应记录需求和后续咨询方式,不以夸大效果、强行推销或虚构优惠促成转化。', NOW(), NOW(), 'seed:sop:brd-supplement'),
(120201, '000000', 1202, 1, 'sop_daily_service_v1', '服务完成后要确认业主是否满意、是否还有遗留问题,并记录新的服务需求。', NOW(), NOW(), 'seed:sop:brd-supplement'),
(120202, '000000', 1202, 2, 'sop_daily_service_v1', '对未解决事项明确责任人、下一次反馈时间和记录方式,不能只说已经处理。', NOW(), NOW(), 'seed:sop:brd-supplement'),
(120203, '000000', 1202, 3, 'sop_daily_service_v1', '回访结束后更新服务记录;业主再次反馈时,应能沿用既有记录继续处理,避免重复询问。', NOW(), NOW(), 'seed:sop:brd-supplement')
ON DUPLICATE KEY UPDATE
`content` = VALUES(`content`),
`update_time` = NOW();
@@ -0,0 +1,73 @@
-- AIHR BRD 补充场景迁移(MySQL 8.x)
-- 补齐 BRD 4.3.4 的服务推介与日常服务场景;不写入正式试点训练、校准或评审数据,可重复执行。
INSERT INTO `aihr_practice_scenario`
(`tenant_id`, `scenario_code`, `scenario_name`, `position`, `scenario_type`, `project_type`, `difficulty`,
`customer_persona`, `opening_text`, `explicit_need`, `hidden_need`, `irritants`, `delights`, `sop_refs`,
`success_criteria`, `strategy`, `goal`, `trainee_name`, `trust_start`, `trust_end`, `rounds_json`, `enabled`, `sort_order`, `create_time`, `update_time`)
VALUES
('000000', 'service-promotion-needs', '增值服务需求识别与推介', '生活顾问', '服务推介/增值', '住宅', 2,
'关注生活品质、但对营销话术敏感的业主', '最近家里老人要长期出门,社区有没有更方便的生活服务?', '识别真实需求并介绍适配的增值服务', '希望得到有用建议而不是被强行推销', '不问需求就罗列产品、夸大承诺、把推介当成收费催促', '先确认家庭场景和预算,再介绍适配服务并说明价格与取消规则', '增值服务推介SOP;客户需求识别SOP',
'先提问确认需求,再说明服务适用范围、价格口径和后续咨询路径', '提示不得编造优惠、效果或未确认的服务承诺', '训练生活顾问在真实需求基础上完成合规的增值服务介绍。', '张三', 63, 84,
'[{"customer":"我不喜欢被推销,你先说这个服务到底能解决什么问题。","coachHint":"先复述业主需求,再说明适用场景,不要直接报一串产品。","emotion":68,"trust":72},{"customer":"那具体多少钱?可以随时取消吗?","coachHint":"金额和取消规则必须以正式价目与合同口径为准,不能现场编造。","emotion":58,"trust":84}]', 1, 130, NOW(), NOW()),
('000000', 'daily-service-followup', '日常服务主动回访', '生活顾问', '日常服务', '住宅', 1,
'刚办理过服务、希望有人持续跟进的业主', '上次你们帮我处理完了,我想知道后面还会有人跟进吗?', '完成日常服务回访与问题闭环', '希望被持续关注,避免问题处理后无人回应', '只说已经完成、不给回访节点、不记录新的服务需求', '确认结果是否满足、记录新问题、约定回访节点并留下服务记录', '日常服务回访SOP;服务闭环SOP',
'确认满意度和遗留问题,明确责任人、回访时间和记录方式', '提示已完成不等于已闭环,必须确认业主感受和后续动作', '训练生活顾问把一次性服务延伸为有记录、有节点的日常回访。', '张三', 66, 85,
'[{"customer":"事情是处理了,但我不知道以后有问题找谁。","coachHint":"确认当前结果和遗留问题,给出明确联系人和回访节点。","emotion":62,"trust":74},{"customer":"那你们会记下来吗?别下次又要从头说。","coachHint":"说明服务记录和后续跟进方式,避免只做口头承诺。","emotion":54,"trust":85}]', 1, 140, NOW(), NOW())
ON DUPLICATE KEY UPDATE
`scenario_name` = VALUES(`scenario_name`),
`position` = VALUES(`position`),
`scenario_type` = VALUES(`scenario_type`),
`project_type` = VALUES(`project_type`),
`difficulty` = VALUES(`difficulty`),
`customer_persona` = VALUES(`customer_persona`),
`opening_text` = VALUES(`opening_text`),
`explicit_need` = VALUES(`explicit_need`),
`hidden_need` = VALUES(`hidden_need`),
`irritants` = VALUES(`irritants`),
`delights` = VALUES(`delights`),
`sop_refs` = VALUES(`sop_refs`),
`success_criteria` = VALUES(`success_criteria`),
`strategy` = VALUES(`strategy`),
`goal` = VALUES(`goal`),
`trainee_name` = VALUES(`trainee_name`),
`trust_start` = VALUES(`trust_start`),
`trust_end` = VALUES(`trust_end`),
`rounds_json` = VALUES(`rounds_json`),
`enabled` = VALUES(`enabled`),
`sort_order` = VALUES(`sort_order`),
`update_time` = VALUES(`update_time`);
INSERT INTO `aihr_practice_rubric`
(`tenant_id`, `rubric_code`, `scenario_code`, `rubric_name`, `version`, `enabled`, `description`, `create_time`, `update_time`)
SELECT `tenant_id`, CONCAT('rubric-', `scenario_code`), `scenario_code`, CONCAT(`scenario_name`, ' Rubric'),
'v1', 1, '生活顾问试点五维评分标准', NOW(), NOW()
FROM `aihr_practice_scenario`
WHERE `tenant_id` = '000000'
AND `scenario_code` IN ('service-promotion-needs', 'daily-service-followup')
ON DUPLICATE KEY UPDATE
`rubric_name` = VALUES(`rubric_name`),
`scenario_code` = VALUES(`scenario_code`),
`enabled` = VALUES(`enabled`),
`description` = VALUES(`description`),
`update_time` = VALUES(`update_time`);
INSERT INTO `aihr_practice_rubric_dimension`
(`tenant_id`, `rubric_code`, `dimension_code`, `dimension_name`, `weight`, `description`, `sort_order`, `create_time`, `update_time`)
SELECT r.`tenant_id`, r.`rubric_code`, d.`dimension_code`, d.`dimension_name`, d.`weight`, d.`description`, d.`sort_order`, NOW(), NOW()
FROM `aihr_practice_rubric` r
JOIN (
SELECT 'task_completion' AS `dimension_code`, '任务完成度' AS `dimension_name`, 0.40 AS `weight`, '问题解决有效性、服务闭环率、SOP关键点执行率' AS `description`, 10 AS `sort_order`
UNION ALL SELECT 'standardization', '话术规范性', 0.25, '流程完整性、沟通合规、用语专业度', 20
UNION ALL SELECT 'emotion', '情绪管理能力', 0.20, '共情、语速语气控制、业主情绪引导安抚有效性', 30
UNION ALL SELECT 'response_timeliness', '响应时效', 0.10, '首响时长、处理周期、跟进频率', 40
UNION ALL SELECT 'marketing', '增值转化潜力', 0.05, '需求识别、服务介绍时机与合规表达', 50
) d
WHERE r.`tenant_id` = '000000'
AND r.`scenario_code` IN ('service-promotion-needs', 'daily-service-followup')
ON DUPLICATE KEY UPDATE
`dimension_name` = VALUES(`dimension_name`),
`weight` = VALUES(`weight`),
`description` = VALUES(`description`),
`sort_order` = VALUES(`sort_order`),
`update_time` = VALUES(`update_time`);