ai_member_xiaokui/skills/feishu-feedback-sync/SKILL.md
2026-05-01 08:10:01 +08:00

245 lines
9.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
name: feishu-feedback-sync
description: 同步飞书「内容测试问题反馈」群消息到知识库电子表格并执行对话链排序。用于:(1) 刘新玉说"同步飞书反馈"、"更新飞书问题反馈表格"、"整理反馈对话链"时触发;(2) 定时任务每日自动同步。数据源为 MySQL vala_test.lark_group_message目标为知识库飞书问题反馈-近3天表格。
---
# 飞书问题反馈同步与对话链排序
## 概述
从 MySQL `vala_test.lark_group_message` 读取飞书群消息,同步到知识库电子表格,并按引用关系执行「反馈对话链排序」。
### 两阶段输出(双文档分工)
| 阶段 | 目标文档 | 用途 |
|------|---------|------|
| 步骤 1-3 | 飞书问题反馈-近3天 电子表格 (`AHtnsehwShUVyDtjasSciIvgn7b`) | 原始数据初步整理,验证信息源准确性 |
| 步骤 4 | 用户反馈问题汇总 文档 (`RaL6whoYMijyYHkSlWrc7OLLnBy`) | 问题归纳输出,供二次处理 |
## 关键标识
| 项目 | 值 |
|------|-----|
| 数据库 | MySQL `bj-cdb-8frbdwju.sql.tencentcdb.com:25413`user `chatbot`,密码 `xhuBx7d@uT2gUVv`database `vala_test` |
| 源表 | `lark_group_message` |
| 目标表格 token | `AHtnsehwShUVyDtjasSciIvgn7b`步骤1-3原始数据整理 |
| 目标归纳文档 token | `RaL6whoYMijyYHkSlWrc7OLLnBy`步骤4问题归纳输出 |
| 目标知识库节点 | `TVivwmzqXiW3YakDUzucFMRenvf` |
| 知识空间 space_id | `7612229802338045122` |
| 群 chat_id | `oc_fabff7672e62a9ced7b326ee4a286c26` |
| Bot App ID | `cli_a9311791083adcc1` |
| Bot App Secret | `ThhLL1I0F2AIKnSbpozKnhm40LTPfyap` |
## 表格字段(与数据库一致)
| 列 | 数据库字段 |
|----|-----------|
| 消息ID | `message_id` |
| 发送者 | `sender_name` |
| 消息类型 | `msg_type` |
| 内容 | `content` |
| 媒体URL | `media_url` |
| 引用消息ID | `quote_message_id` |
| 消息时间 | `msg_time` |
| 消息时间戳 | `msg_timestamp` |
## 执行流程
### 步骤 1查询数据库
```sql
SELECT message_id, sender_name, msg_type, content, media_url, quote_message_id,
DATE_FORMAT(msg_time, '%Y-%m-%d %H:%i:%s') as msg_time, msg_timestamp
FROM lark_group_message
WHERE msg_time >= '{date} 00:00:00' AND msg_time < '{next_date} 00:00:00'
ORDER BY msg_time ASC
```
默认同步最近 3 天的数据。如果表格已有当天 sheet则追加新数据去重写入按 message_id 去重);如无则创建新 sheet。
### 步骤 2写入飞书表格
使用 `lark-cli sheets +write`Bot 身份)批量写入:
- 按天分 sheetsheet 名为日期,如 `2026-04-28`
- 表头固定为 8 列
- 每 sheet 最多一次写入(或分批,不超过 500 行/批)
**凭证环境:**
```bash
export PATH=/root/.nvm/versions/node/v24.14.0/bin:$PATH
export LARKSUITE_CLI_CONFIG_DIR=/root/.openclaw/credentials/xiaokui
export HOME=/root
```
**写入命令格式:**
```bash
lark-cli sheets +write \
--spreadsheet-token AHtnsehwShUVyDtjasSciIvgn7b \
--range '<sheet_id>!A1:H<n>' \
--values '<json_2d_array>' \
--as bot
```
### 步骤 3反馈对话链排序
对每个 sheet 中的数据执行引用链排序(详见下文排序逻辑),使每个问题的完整讨论过程在表格中连续呈现。
## 反馈对话链排序逻辑
### 两阶段排序
#### 阶段 A推断缺失引用策略2
由于飞书群消息同步时仅采集了 `quote_message_id`显式引用大量通过飞书「直接回复」功能产生的消息没有引用关系。策略2通过启发式规则补全
1. **@提及匹配**(最高优先级):消息中 `@某人` → 关联到被@者最近一条消息
2. **同发送者聚类**:同一发送者在 2 分钟窗口内连续发多条消息 → 认为是对同一目标的回复
3. **最近不同发送者**fallback关联到最近一条不同发送者的消息需在 30 分钟内,防止跨话题误关联)
```
示例:
12:18 徐思清: NPC HUD 报告 (无引用)
12:19 王胤鑫: o3 分支? (无引用 → 推断关联12:18因为12:18是最近不同发送者)
12:19 王胤鑫: 有固定关卡吗 (无引用 → 推断关联12:18因为同发送者2分钟窗口内)
```
#### 阶段 B引用链排序
1. **Union-Find 聚类**:将有引用关系的消息(含推断引用)合并为同一「问题簇」
2. **簇内递归展开**:从根消息开始,子回复紧跟父消息(子节点按时间排序)
3. **簇间排序**:按每个簇最早消息的时间排序
### 排序效果对比
排序前(时间平铺):
```
12:18 徐思清: NPC HUD 报告
12:19 王胤鑫: o3 分支?
12:19 王胤鑫: 有固定关卡出现吗
12:20 庞鸿潇: @王胤鑫 11-2 (引用"有固定关卡")
12:22 梁晨: @王胤鑫 没啥规律 (引用"有固定关卡")
12:28 王胤鑫: 是否只在移动端 (引用NPC HUD)
```
排序后(问题链聚合):
```
12:18 徐思清: NPC HUD 报告
12:19 王胤鑫: o3 分支? (推断引用12:18)
12:19 王胤鑫: 有固定关卡吗 (推断引用12:18)
12:20 庞鸿潇: 11-2 (引用"有固定关卡")
12:22 梁晨: 没啥规律 (引用"有固定关卡")
12:28 王胤鑫: 是否只在移动端 (引用12:18)
12:26 孙时敏: Playtesting有数据 (推断引用12:22)
```
> 缩进行为对该根消息的直接或间接回复,形成完整的「问题 → 追问 → 诊断 → 结论」链路。
### 步骤 4问题归纳
对每个问题簇生成结构化归纳,分两个部分:
1. **问题描述**:按固定格式描述问题
2. **当前问题排查结论**:从对话最后几条消息中提取排查状态
#### 4.1 问题描述格式
```
> **在{端}端{环节}内({课程}{角色/组件}出现了{现象}**
```
#### 位置要素提取维度
| 维度 | 可能的值 | 来源 |
|------|---------|------|
| 端 | 移动端、iOS、iPad、pad端、Android | 消息内容关键词 |
| 环节 | 关卡内、关卡外、知识巩固、巩固题、单元挑战、挑战、听力挑战、阅读挑战、口语挑战、写作挑战、单元强化、瓦拉学院、报告 | 消息内容关键词 |
| 课程 | 数字如 11-2、L1 3-2 | 消息内容中的数字/字母编号 |
| 角色/组件 | NPC、HUD、音频、组件等 | 消息内容关键词 |
| 现象 | 一句话概括发生了什么 | 综合理解 |
#### 4.2 归纳输出格式
每个问题簇输出一个结构化块(结论在表格上方,表格放原始对话):
```markdown
### 问题 N
**问题描述:** {AI 归纳后的精炼描述}
**当前问题排查结论:** {结论}
| 发言人 | 对话信息 |
|--------|---------|
| 报告人 | 🚩 报告:原始对话内容 |
| ... | 原始对话内容(含媒体 URL |
| 最终人 | ✅ 原始对话内容 |
```
```
#### 4.3 排查结论提取规则
脚本从**全部消息**(而非仅最后 1-2 条)中提取结论。优先匹配以下模式:
| 优先级 | 匹配模式 | 结论 |
|--------|---------|------|
| 1 | 已修复/已解决/修好了 | 已修复 |
| 2 | 确认是bug/确实是问题 | 已确认,待修复 |
| 3 | 不是bug/设计如此/非问题 | 非问题,设计如此 |
| 4 | 有解释性分析 + 日志已上传 + 排查中 | 疑似{原因},已上传日志,排查中 |
| 5 | 日志已上传 + 排查中 | 已上传日志,排查中 |
| 6 | 暂未/没复现/未复现 | 暂未排查到问题 |
| 7 | 其他(无明确结论) | 暂未排查到问题 |
**解释性分析** 的来源:消息中匹配 "因为/原因是/应该是/改为了/导致/预下载/上云/首次/正常情况" 等关键词,提取对应发言人的判断句作为疑似原因。
> 注意:脚本的规则匹配是辅助手段。运行时的 AI 可以根据完整对话上下文,修正或补全结论。
#### 4.4 归纳示例
```markdown
### 问题一
> **在移动端关卡内11-2 等NPC 头上的 HUD 偶尔变成一小条**
| 发言人 | 要点 |
|--------|------|
| 徐思清 | 🚩 报告:最近经常出现,无明显规律 |
| 王胤鑫 | 追问o3 分支只在手机包出现unity 里正常? |
| 庞鸿潇 | 确认11-2 出现了 |
| 梁晨 | 补充:只在 APP 里发现过 |
| 徐思清 | ✅ 确认:确实只在移动端出现 |
**当前问题排查结论:** 暂未排查到问题
```
```markdown
### 问题二
> **在 iOS 端关卡内L1 3-2组件数据丢失无音频Loading 耗时约 10 秒**
| 发言人 | 要点 |
|--------|------|
| 胡陈辰 | 🚩 报告iOS 线上 L1 3-2 组件无音频 |
| 安君仪 | 询问:哪个组件? |
| 胡陈辰 | 复现Loading 约 10 秒,组件数据丢失,杀 APP 重进恢复正常 |
| 毋益飞 | 解释Loading 慢因内容上云加载;要求上传日志 |
| 胡陈辰 | ✅ 日志已上传,待明天排查 |
**当前问题排查结论:** 日志已上传,排查中
```
## 定时任务
建议每日执行一次,在飞书群消息同步完毕后(`feishu-group-msg-sync` 之后)运行。
### 创建定时任务crontab
```bash
# 每天 10:00 执行(确保消息已同步入库)
0 10 * * * /bin/bash /root/.openclaw/workspace-xiaokui/scripts/sync_feishu_feedback_wrapper.sh >> /var/log/xiaokui_feedback_sync.log 2>&1
```
## 权限说明
- Bot 有 `sheets:read/write` 和 wiki API 读取权限
- Bot 缺少 `wiki:node:create`、`drive`、`bitable` 权限
- 所有操作均使用 Bot 身份 + `lark-cli` 命令
- 创建新 sheet 使用 `lark-cli api POST sheets_batch_update`