feat: 累积功能变更 — 聊天集成、租户管理、小程序更新、ETL 增强、迁移脚本
包含多个会话的累积代码变更: - backend: AI 聊天服务、触发器调度、认证增强、WebSocket、调度器最小间隔 - admin-web: ETL 状态页、任务管理、调度配置、登录优化 - miniprogram: 看板页面、聊天集成、UI 组件、导航更新 - etl: DWS 新任务(finance_area_daily/board_cache)、连接器增强 - tenant-admin: 项目初始化 - db: 19 个迁移脚本(etl_feiqiu 11 + zqyy_app 8) - packages/shared: 枚举和工具函数更新 - tools: 数据库工具、报表生成、健康检查 - docs: PRD/架构/部署/合约文档更新 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -1,22 +1,51 @@
|
||||
# 百炼平台 AI 应用提示词(Qwen3.5-Plus)
|
||||
|
||||
> 本文档定义 8 个 AI 应用的系统提示词(System Prompt),供百炼平台配置使用。
|
||||
> 模型:Qwen3.5-Plus
|
||||
> 模型:Qwen3.5-Plus(应用 1、5)/ Qwen3-Max-Preview(应用 2、3、4、6、7、8)
|
||||
> 所有应用均启用深度思考模式(enable_thinking=true)
|
||||
> 权威来源:`docs/prd/specs/P5-miniapp-ai-integration.md` + `docs/prd/AI需求2.md`
|
||||
> 首条 Prompt(用户消息)由后端代码在调用时拼接 JSON 数据,结构定义见 P5 spec「首条 Prompt 数据结构」章节。
|
||||
> NS2 实现代码:`apps/backend/app/ai/`(data_fetchers + apps 子包),属性测试:`tests/test_data_fetchers/` + `tests/test_ai_apps/`
|
||||
|
||||
### 应用 ID 与环境变量映射(2026-03-05 更新)
|
||||
> 最后同步时间:2026-03-21(从百炼控制台获取线上配置并对齐)
|
||||
|
||||
| 应用 | 名称 | 环境变量 Key | 百炼应用 ID |
|
||||
|------|------|-------------|------------|
|
||||
| 应用 1 | 通用对话 | `BAILIAN_APP_ID_1_CHAT` | `979dabe6f22a43989632b8c662cac97c` |
|
||||
| 应用 2 | 财务洞察 | `BAILIAN_APP_ID_2_FINANCE` | `1dcdb5f39c3040b6af8ef79215b9b051` |
|
||||
| 应用 3 | 客户数据维客线索分析 | `BAILIAN_APP_ID_3_CLUE` | `708bf45439cd48c7ab9a514d03482890` |
|
||||
| 应用 4 | 关系分析/任务建议 | `BAILIAN_APP_ID_4_ANALYSIS` | `ea7b1c374f574b9a925a2fb5789a9b90` |
|
||||
| 应用 5 | 话术参考 | `BAILIAN_APP_ID_5_TACTICS` | `46f54e6053df4bb0b83be29366025cf6` |
|
||||
| 应用 6 | 备注分析 | `BAILIAN_APP_ID_6_NOTE` | `025bb344146b4e4e8be30c444adab3b4` |
|
||||
| 应用 7 | 客户分析 | `BAILIAN_APP_ID_7_CUSTOMER` | `df35e06991b24d49971c03c6428a9c87` |
|
||||
| 应用 8 | 维客线索整理 | `BAILIAN_APP_ID_8_CONSOLIDATE` | `407dfb89283b4196934eec5fefe3ebc2` |
|
||||
### NS2 后端实现要点(2026-03-21 更新)
|
||||
|
||||
应用 1 支持 10 种页面入口上下文(contextType),由 `page_context.py` 文本化后注入首条消息:
|
||||
|
||||
| contextType | 入口页面 | 数据来源(代码实际查询) |
|
||||
|-------------|---------|------------------------|
|
||||
| `task-detail` | 任务详情 | App: `biz.coach_tasks` + `biz.coach_tasks_member_view` + `biz.coach_tasks_assistant_view` + `biz.notes` + `biz.ai_cache`(app4_analysis) |
|
||||
| `task-list` | 任务列表 | App: `biz.coach_tasks`(按 status 分组统计;有 contextId 时复用 task-detail) |
|
||||
| `customer-detail` | 客户详情 | FDW: `fdw_etl.v_dim_member`(scd2_is_current=1) + `fdw_etl.v_dwd_settlement_head` + `fdw_etl.v_dws_member_consumption_summary`;App: `member_retention_clue` |
|
||||
| `coach-detail` | 助教详情 | FDW: `fdw_etl.v_dim_assistant`;App: `biz.coach_tasks`(按 status 分组统计) |
|
||||
| `board-finance` | 财务看板 | FDW: `fdw_etl.v_dwd_settlement_head`(settle_type IN 1,3,近 1 月汇总) |
|
||||
| `board-customer` | 客户看板 | FDW: `fdw_etl.v_dwd_settlement_head` JOIN `fdw_etl.v_dim_member`(Top 10 客户) |
|
||||
| `board-coach` | 助教看板 | FDW: `fdw_etl.v_dwd_assistant_service_log` JOIN `fdw_etl.v_dim_assistant`(Top 10 助教) |
|
||||
| `performance` | 绩效页 | FDW: `fdw_etl.v_dws_assistant_salary_calc` JOIN `fdw_etl.v_dim_assistant` |
|
||||
| `customer-service-records` | 服务记录 | FDW: `fdw_etl.v_dwd_assistant_service_log`(is_trash=false,近 10 条) |
|
||||
| `my-profile` | 个人中心 | 无查询(静态文本:"当前为个人信息页面,可查询个人绩效和任务情况") |
|
||||
|
||||
应用 3-7 的 `biz_params` 注入机制:后端 `run()` 函数接收 `member_id`/`assistant_id`/`site_id` 等参数,通过 data_fetchers 层查询数据库拼接 JSON,作为首条用户消息发送。
|
||||
|
||||
Token 预算约束:应用 3-7 的数据文本化后限制在 ≤8000 字符以内(单个 fetcher 输出),应用 1 页面上下文 ≤2000 字符(`MAX_PAGE_CONTEXT_LENGTH = 2000`),应用 1 system prompt 总长 ≤4000 字符(`_MAX_SYSTEM_PROMPT_LEN = 4000`)。超限时按优先级截断。
|
||||
|
||||
### 应用 ID 与环境变量映射(2026-03-22 更新,P14 DashScope 迁移)
|
||||
|
||||
| 应用 | 名称 | 环境变量 Key | 百炼应用 ID | 选用模型 | temperature |
|
||||
|------|------|-------------|------------|----------|-------------|
|
||||
| 应用 1 | 通用对话 | `DASHSCOPE_APP_ID_1_CHAT` | `979dabe6f22a43989632b8c662cac97c` | Qwen3.5-Plus | 0.7 |
|
||||
| 应用 2 | 财务洞察 | `DASHSCOPE_APP_ID_2_FINANCE` | `1dcdb5f39c3040b6af8ef79215b9b051` | Qwen3-Max-Preview | 0 |
|
||||
| 应用 3 | 客户数据维客线索分析 | `DASHSCOPE_APP_ID_3_CLUE` | `708bf45439cd48c7ab9a514d03482890` | Qwen3-Max-Preview | 0 |
|
||||
| 应用 4 | 关系分析/任务建议 | `DASHSCOPE_APP_ID_4_ANALYSIS` | `ea7b1c374f574b9a925a2fb5789a9b90` | Qwen3-Max-Preview | 0 |
|
||||
| 应用 5 | 话术参考 | `DASHSCOPE_APP_ID_5_TACTICS` | `46f54e6053df4bb0b83be29366025cf6` | Qwen3.5-Plus | 0.8 |
|
||||
| 应用 6 | 备注分析 | `DASHSCOPE_APP_ID_6_NOTE` | `025bb344146b4e4e8be30c444adab3b4` | Qwen3-Max-Preview | 0 |
|
||||
| 应用 7 | 客户分析 | `DASHSCOPE_APP_ID_7_CUSTOMER` | `df35e06991b24d49971c03c6428a9c87` | Qwen3-Max-Preview | 0 |
|
||||
| 应用 8 | 维客线索整理 | `DASHSCOPE_APP_ID_8_CONSOLIDATE` | `407dfb89283b4196934eec5fefe3ebc2` | Qwen3-Max-Preview | 0 |
|
||||
|
||||
> P14 变更:环境变量前缀从 `BAILIAN_*` 迁移到 `DASHSCOPE_*`,SDK 从 `openai` 迁移到 `dashscope`(Application API)。
|
||||
> 新增环境变量:`DASHSCOPE_API_KEY`、`DASHSCOPE_WORKSPACE_ID`(可选)、`INTERNAL_API_TOKEN`、`BACKEND_API_URL`。
|
||||
> 已删除:`BAILIAN_BASE_URL`、`BAILIAN_MODEL`(Application API 通过 app_id 指定应用,不需要 base_url 和 model)。
|
||||
|
||||
### 前端消费方式速查
|
||||
|
||||
@@ -47,7 +76,7 @@
|
||||
|
||||
```text
|
||||
# 角色
|
||||
你是一位台球门店运营助手,服务于"浪浪桌球"品牌旗下门店。你擅长通过 MCP 工具查询数据库,为门店工作人员提供数据查询、经营分析和客户管理方面的支持。
|
||||
你是一位台球门店运营助手。你擅长通过 MCP 工具查询数据库,为门店工作人员提供数据查询、经营分析和客户管理方面的支持。
|
||||
|
||||
当前用户信息:
|
||||
- 用户ID:{{User_ID}}
|
||||
@@ -108,7 +137,9 @@
|
||||
- 使用简体中文回复。
|
||||
- 数据展示清晰,适当使用表格格式。
|
||||
- 对异常数据主动提示(如金额为负、数据缺失等)。
|
||||
- 禁止对未提供的内容进行捏造,如果涉及推荐内容(如推荐活动介绍等),则明确说明以推介店内活动信息为准,禁止输出未知信息!
|
||||
- 不确定的信息不要编造,如实告知用户。
|
||||
- 回答抓住重点,简洁直接,不宜过长。(必须是400字以内)
|
||||
|
||||
## 参考文档
|
||||
- 当通过 MCP 查询数据库时,请参考"桌球运营小程序 SQL"内的 markdown 文档。
|
||||
@@ -179,7 +210,7 @@ json
|
||||
- 仅返回 JSON 数组,不要包含任何其他文字。
|
||||
|
||||
## 限制
|
||||
- 仅基于传入的数据进行分析,不要编造数据。
|
||||
- 仅基于传入的数据进行分析,不要编造数据。禁止臆想内容!
|
||||
- 如果某项数据缺失或为零,在分析中如实说明,不要跳过。
|
||||
- 营业日以 08:00 为分界点(如"本月"= 当月1日 08:00 ~ 次月1日 08:00)。
|
||||
```
|
||||
@@ -259,7 +290,7 @@ json
|
||||
- 首次分析时可能没有历史参考信息,正常输出即可。
|
||||
|
||||
## 限制
|
||||
- 仅基于传入的客观数据进行分析,不要编造数据。
|
||||
- 仅基于传入的客观数据进行分析,不要编造数据。禁止臆想数据!
|
||||
- 不要分析备注内容(那是应用 6 的职责)。
|
||||
- 使用简体中文。
|
||||
```
|
||||
@@ -332,6 +363,7 @@ json
|
||||
- 使用简体中文。
|
||||
- 行动建议要考虑台球门店的实际场景(如微信联系、到店时主动招呼、推荐活动等)。
|
||||
- 不要给出过于笼统的建议(如"多关注客户"),必须具体到可执行的动作。
|
||||
- 禁止对未提供的内容进行捏造,如果涉及推荐内容(如推荐活动介绍等),则明确说明以推介店内活动信息为准,禁止输出未知信息!
|
||||
```
|
||||
|
||||
---
|
||||
@@ -354,7 +386,6 @@ json
|
||||
- **任务**:根据任务类型和客户特征,生成适合的沟通话术。
|
||||
- 召回话术:针对长时间未到店的客户,自然地引导回店。
|
||||
- 维护话术:针对活跃客户,增强粘性和好感。
|
||||
- 充值引导:针对余额不足的客户,自然地引导充值。
|
||||
|
||||
### 技能2: 个性化定制
|
||||
- **任务**:基于客户的偏好和历史,让话术更有针对性。
|
||||
@@ -366,7 +397,7 @@ json
|
||||
- **任务**:确保话术自然、得体、有效。
|
||||
- 语气亲切但不过分热情,像朋友间的自然对话。
|
||||
- 避免过于商业化的推销感。
|
||||
- 提供多种话术选择,适应不同沟通场景(微信消息、电话、到店面对面)。
|
||||
- 均为微信发送消息。
|
||||
|
||||
## 输出格式(强制)
|
||||
|
||||
@@ -377,15 +408,14 @@ json
|
||||
{
|
||||
"tactics": [
|
||||
{
|
||||
"content": "话术内容(含场景说明和具体话术文本,150字内)"
|
||||
"content": "话术内容(直接输出可以复制发送给客户的话术,150字内)"
|
||||
}
|
||||
]
|
||||
}
|
||||
"""
|
||||
|
||||
### 输出规则
|
||||
- 返回 2-4 条话术,覆盖不同沟通场景或切入角度。
|
||||
- 每条话术包含简短的场景说明(什么时候用)和具体的话术文本。
|
||||
- 返回 2-4 条话术,覆盖不同营销场景或切入角度。
|
||||
- 话术文本要口语化,可以直接复制使用。
|
||||
- 仅返回 JSON,不要包含任何其他文字。
|
||||
|
||||
@@ -393,7 +423,8 @@ json
|
||||
- 使用简体中文,口语化表达。
|
||||
- 话术要符合台球门店助教的身份和语境。
|
||||
- 不要使用过于正式或书面化的表达。
|
||||
- 基于传入的客户信息和任务建议(应用 4 返回)生成话术,不要编造客户信息。
|
||||
- 基于传入的客户信息和任务建议(应用 4 返回)生成话术,不要编造客户信息。禁止臆想内容!
|
||||
- 禁止对未提供的内容进行捏造,如果涉及推荐内容(如推荐活动介绍等),则明确说明以推介店内活动信息为准,禁止输出未知信息!
|
||||
```
|
||||
|
||||
---
|
||||
@@ -467,7 +498,7 @@ json
|
||||
- `客户基础`:会员等级、注册时间、基本属性、个人信息等
|
||||
- `消费习惯`:消费频率、金额、时段、支付方式等
|
||||
- `玩法偏好`:台球类型、包厢偏好、团建倾向等
|
||||
- `促销偏好`:对活动的反应、价格敏感度、充值意愿等
|
||||
- `促销接受`:对活动的反应、价格敏感度、充值意愿等
|
||||
- `社交关系`:常带朋友、固定球搭子、社交圈等
|
||||
- `重要反馈`:投诉、建议、特殊需求、满意度等
|
||||
|
||||
@@ -565,7 +596,7 @@ json
|
||||
- 首次分析时可能没有历史参考信息,正常输出即可。
|
||||
|
||||
## 限制
|
||||
- 仅基于传入的数据进行分析,不要编造数据。
|
||||
- 仅基于传入的数据进行分析,不要编造数据。禁止臆想内容!
|
||||
- 使用简体中文。
|
||||
- 策略建议要符合台球门店的实际运营场景。
|
||||
```
|
||||
@@ -624,7 +655,7 @@ json
|
||||
- `客户基础`:会员等级、注册时间、基本属性、个人信息等
|
||||
- `消费习惯`:消费频率、金额、时段、支付方式等
|
||||
- `玩法偏好`:台球类型、包厢偏好、团建倾向等
|
||||
- `促销偏好`:对活动的反应、价格敏感度、充值意愿等
|
||||
- `促销接受`:对活动的反应、价格敏感度、充值意愿等
|
||||
- `社交关系`:常带朋友、固定球搭子、社交圈等
|
||||
- `重要反馈`:投诉、建议、特殊需求、满意度等
|
||||
|
||||
@@ -640,3 +671,42 @@ json
|
||||
- 不要删除任何你认为"价值不高"的线索(价值判断已由上游应用完成)。
|
||||
- 使用简体中文。
|
||||
```
|
||||
|
||||
|
||||
---
|
||||
|
||||
## 附录:代码审计对照表(2026-03-21)
|
||||
|
||||
> 基于 `apps/backend/app/ai/` 实际代码与本文档描述的逐项对比。
|
||||
|
||||
### 已修正的差异
|
||||
|
||||
| # | 位置 | 原文档描述 | 代码实际实现 | 修正说明 |
|
||||
|---|------|-----------|-------------|---------|
|
||||
| 1 | 应用 1 · `board-finance` | `v_dws_finance_daily_summary` | `fdw_etl.v_dwd_settlement_head`(settle_type IN 1,3,近 1 月 SUM/AVG) | 代码直接查 DWD 结算头表做聚合,未使用 DWS 财务日汇总视图 |
|
||||
| 2 | 应用 1 · `board-customer` | `v_dim_member` | `fdw_etl.v_dwd_settlement_head` JOIN `fdw_etl.v_dim_member`(Top 10 按 items_sum DESC) | 代码从结算头表聚合消费金额,JOIN 会员维度表取昵称 |
|
||||
| 3 | 应用 1 · `board-coach` | `v_dim_assistant` | `fdw_etl.v_dwd_assistant_service_log` JOIN `fdw_etl.v_dim_assistant`(Top 10 按 service_count DESC) | 代码从服务日志表聚合,JOIN 助教维度表取昵称 |
|
||||
| 4 | 应用 1 · `performance` | `v_dws_assistant_monthly_summary` | `fdw_etl.v_dws_assistant_salary_calc` JOIN `fdw_etl.v_dim_assistant` | 代码查的是薪资计算表,不是月度汇总表 |
|
||||
| 5 | 应用 1 · `customer-service-records` | `v_dwd_settlement_head` | `fdw_etl.v_dwd_assistant_service_log`(is_trash=false,LIMIT 10) | 代码查的是助教服务日志表,不是结算头表 |
|
||||
| 6 | 应用 1 · `my-profile` | `auth.users` | 无数据库查询(返回静态文本) | 代码未查 auth.users,直接返回固定提示文本 |
|
||||
| 7 | 应用 1 · `task-detail` | `v_dwd_settlement_head` | `biz.coach_tasks` + `biz.notes` + `biz.ai_cache` | 代码未查 ETL 结算头表,仅查业务库任务/备注/AI缓存 |
|
||||
| 8 | 应用 1 · `customer-detail` | `biz.notes` | `member_retention_clue`(维客线索) | 代码查的是维客线索表而非备注表;另外还查了 `v_dws_member_consumption_summary` 取余额 |
|
||||
| 9 | Token 预算 | 应用 1 页面上下文 ≤4000 字符 | `MAX_PAGE_CONTEXT_LENGTH = 2000`(page_context.py),`_MAX_SYSTEM_PROMPT_LEN = 4000`(app1_chat.py) | 页面上下文截断阈值是 2000,4000 是 system prompt 总长上限 |
|
||||
|
||||
### 确认一致的部分
|
||||
|
||||
- ✅ 应用 1 的 10 种 contextType 名称与 `SUPPORTED_PAGE_TYPES` 完全一致
|
||||
- ✅ 应用 2 的 8 个时间维度编码与 `TIME_DIMENSIONS` 完全一致
|
||||
- ✅ 应用 2 的 prompt 结构(task + data + reference)与 `app2_finance_prompt.py` 一致
|
||||
- ✅ 应用 2 的字段映射(items_sum 口径、助教费用拆分)与代码一致
|
||||
- ✅ 应用 3 的 category 枚举限定 3 个值(客户基础、消费习惯、玩法偏好)
|
||||
- ✅ 应用 6 的 category 枚举限定 6 个值(含促销接受、社交关系、重要反馈)
|
||||
- ✅ 应用 3/6/7 共用 `member_data.py`(fetch_member_consumption_data)
|
||||
- ✅ 应用 4/5 共用 `assistant_data.py`(fetch_assistant_info + fetch_service_history)
|
||||
- ✅ 应用 8 的 source 判断规则(ai_consumption / ai_note / 混合→ai_consumption)
|
||||
- ✅ 所有 FDW 查询使用 `is_trash=false` 排除废单
|
||||
- ✅ 会员信息通过 `scd2_is_current=1` 过滤
|
||||
- ✅ 金额口径统一使用 items_sum,禁止 consume_money
|
||||
- ✅ 应用 ID 与环境变量映射表与代码常量一致
|
||||
- ✅ 前端消费方式速查表与缓存写入逻辑一致
|
||||
- ✅ 应用 3-7 的 system message 上限 ≤8000 字符
|
||||
|
||||
Reference in New Issue
Block a user