ai_member_xiaoxi/memory/2026-06-25-1700.md
2026-06-26 08:00:01 +08:00

523 lines
19 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.

# Session: 2026-06-25 17:00:23 GMT+8
- **Session Key**: agent:main:feishu:direct:ou_e63ce6b760ad39382852472f28fbe2a2
- **Session ID**: 65bf7bd1-fb56-419f-b300-cee2cfe6cb01
- **Source**: feishu
## Conversation Summary
assistant: 我再看看每张表里的一些样例数据,方便你理解字段的实际内容:
assistant: 好了,以下是两张埋点表的完整数据结构:
---
## 📊 埋点数据结构
线上 PostgreSQL `vala_bi` 库中有两张埋点表:
---
### 1. `growth_activity_behavior`(增长活动行为埋点)
**数据量:** 38,063 条
| 字段 | 类型 | 说明 |
|------|------|------|
| id | int | 自增主键 |
| es_id | varchar(255) | ES 原始 ID唯一 |
| account_id | int | 账号 ID=0 为匿名) |
| account_name | varchar(255) | 账号名 |
| **activity** | text | 活动标识(目前有 `900`、`26100` 两种) |
| **behavior** | varchar(255) | 行为类型 |
| **sub_behavior** | varchar(255) | 子行为类型 |
| **source** | varchar(255) | 来源入口 |
| **info** | text | 扩展 JSON`{"h5_url_parameter":"zz"}` |
| user_id | int | 设备/会话级 ID |
| user_name | varchar(255) | 用户名 |
| created_at | timestamp | 事件时间 |
**behavior 枚举:**
- H5 购买流程sub: H5 页面曝光时 / 商品切换点击 / 支付成功 / 立即购买按钮点击)
- 落地页曝光、落地页主按钮点击
- 获取验证码点击、获取验证码结果
- 手机号弹窗关闭点击、挽留弹窗按钮点击
**source 枚举:** homebuttom、course、seasonList、seasonNav、AD、空
**索引:** created_at、user_id、es_id (唯一)
---
### 2. `user_behavior_buried_points`(端内学习行为埋点)
**数据量:** 65,549 条
| 字段 | 类型 | 说明 |
|------|------|------|
| id | int | 自增主键 |
| **burying_point_id** | int | 埋点 ID目前有 `1000`、`1100` |
| burying_point_name | varchar(255) | 埋点名称 |
| **burying_point_sub_id** | int | 子埋点 ID1~5 |
| burying_point_sub_name | varchar(255) | 子埋点名称 |
| account_id | int | 账号 ID |
| account_name | varchar(255) | 账号名 |
| character_id | int | 角色 ID |
| character_name | varchar(255) | 角色名 |
| **active_time** | int | 事件时间戳(秒) |
| version_id | varchar(255) | 客户端版本 |
| **step_duration** | int | 步骤耗时(秒) |
| finish_status | varchar(255) | 完成状态 |
| season_package_id | int | 季度包 ID |
| season_package_name | varchar(255) | 季度包名 |
| unit_id | int | 单元 ID |
| unit_name | varchar(255) | 单元名 |
| lesson_id | int | 课时 ID |
| lesson_name | varchar(255) | 课时名 |
| component_id | int | 组件 ID |
| component_name | varchar(255) | 组件名 |
| **c_type** | varchar(255) | 组件类型(如 `core_listening_drag` |
| c_id | varchar(255) | 组件实例 ID |
| learning_module_id | int | 学习模块 ID |
| learning_module_name | varchar(255) | 学习模块名 |
| learning_point_id | int | 知识点 ID |
| learning_point_name | varchar(255) | 知识点名 |
| card_id | int | 卡片 ID |
| card_name | varchar(255) | 卡片名 |
| data_version | varchar(255) | 数据版本 |
| ex2 | text | 扩展字段 2 |
| ex3 | text | 扩展字段 3 |
| es_id | varchar(255) | ES 原始 ID |
**索引:** account_id、character_id、active_time、burying_point_id
---
**总结:**
- `growth_activity_behavior` → 偏增长侧H5购买漏斗、落地页、验证码等转化行为
- `user_behavior_buried_points` → 偏端内学习侧(课程组件级的学习交互行为,粒度到 card 级别)
需要我进一步分析某张表的具体数据分布或字段含义吗?
user: [message_id: om_x100b6cfaf809bce0b12c638b6dd832a]
李承龙: 我想看看es库里面的数据结构
assistant: 业务索引不少,我来看看主要的几个索引的字段结构:
assistant: 再看看其他几个业务索引的结构:
assistant: 好了,全部查完了。以下是 Online ES 库的完整数据结构梳理:
---
## 📊 Online ES 数据结构总览
线上 ES 共有 **18 个业务索引**(排除系统索引),按功能模块分类如下:
---
### 一、用户行为埋点类
| 索引 | 数据量 | 说明 |
|------|--------|------|
| `user_behavior_buried_points` | **3741万** (11.6GB) | 端内学习行为埋点(组件级) |
| `growth_activity_behavior` | 4.4万 (14MB) | 增长活动行为H5购买漏斗/落地页) |
| `user-audio` | **496万** (2.7GB) | 用户音频交互记录 |
| `word_sentence_learn_data` | 439 (381KB) | 单词/句子学习数据 |
---
### 二、LLM/AI 服务日志类
| 索引 | 数据量 | 说明 |
|------|--------|------|
| `llm_api_stat` | **601万** (1GB) | LLM API 调用统计token用量/耗时) |
| `llm_roleplayagent_round_log` | **160万** (6.4GB) | 角色扮演对话日志(每轮对话详情) |
| `llm_pron_eval` | **215万** (1.8GB) | 发音评测日志 |
| `llm_asr_log` | **290万** (1.9GB) | 语音识别(ASR)日志 |
| `llm_realtime_asr_log` | **125万** (586MB) | 实时流式ASR日志 |
| `llm_tts_log` | **284万** (1.7GB) | 文本转语音(TTS)日志 |
| `llm_image_speaking` | **62万** (419MB) | 看图说话交互日志 |
| `llm_ai_tools_log` | **31万** (279MB) | AI 工具调用日志(翻译/图片处理/检测等) |
| `llm_api_error_based_correction` | 6.7万 (42MB) | 纠错API日志 |
| `llm_api_writing` | 9418 (6.4MB) | 写作API日志 |
| `llm_core_speaking_monologue` | 590 (940KB) | 独白口语练习日志 |
| `llm_scene_chat_log` | 55 (360KB) | 场景对话日志 |
| `llm_instruction_control_log` | 3298 (21MB) | 指令控制日志 |
---
### 三、其他
| 索引 | 数据量 | 说明 |
|------|--------|------|
| `echo_trace-write` | 3321 (6.7MB) | 小葵销售bot会话轨迹日志 |
| `vala-user-chat-log` | 1547 (4.2MB) | 用户聊天对话日志 |
| `llm_api_knowledge_card_transition` | 23 (78KB) | 知识卡片转换日志 |
| `llm_audio_denoise` | 0 | 音频降噪(空) |
| `pronunciation_eval_logs` | 4 (62KB) | 旧版发音评测日志(已废弃) |
---
### 四、核心索引字段详解
#### 1. `user_behavior_buried_points`3741万条最大业务索引
```
accountId(long) - 账号ID
characterId(long) - 角色ID
buryingPointId(long) - 埋点ID
buryingPointSubId(long)- 子埋点ID
activeTime(long) - 事件时间戳
stepDuration(long) - 步骤耗时
cType(text) - 组件类型
cId(text) - 组件实例ID
componentId(long) - 组件ID
lessonId(long) - 课时ID
unitId(long) - 单元ID
seasonPackageId(long) - 季度包ID
learningModuleId(long) - 学习模块ID
learningPointId(long) - 知识点ID
cardId(long) - 卡片ID
courseLevel(keyword) - 课程等级
finishStatus(text) - 完成状态
action(keyword) - 动作
button(keyword) - 按钮
location(keyword) - 位置
dataVersion(keyword) - 数据版本
num1/num2/num3(double)- 数值扩展
ex2~ex6(keyword) - 字符扩展
versionId(text) - 客户端版本
```
#### 2. `llm_roleplayagent_round_log`160万条AI对话核心
```
user_id(keyword) - 用户ID
session_id(keyword) - 会话ID
config_id(keyword) - 配置ID
npc_id(keyword) - NPC ID
current_round(long) - 当前轮数
round(long) - 总轮数
user_input(keyword) - 用户输入
user_text(keyword) - 用户原文
npc_message(keyword) - NPC回复
npc_translation(keyword) - NPC翻译
hint_msg(keyword) - 提示信息
feedback(keyword) - 语法反馈
grammar_rating(long) - 语法评分
score(long) - 总分
score_ratio(float) - 得分率
task_completed(bool) - 任务完成
final_completed(bool) - 最终完成
llm_model(keyword) - 使用模型
execution_time_ms(float) - 执行耗时
timestamp(long) - 时间戳
subtask_status(nested) - 子任务完成状态
round_eval_dict(nested)- 每轮评分详情
```
#### 3. `llm_api_stat`601万条API统计
```
api_source(keyword) - API来源
service_name(keyword) - 服务名称
input_tokens(long) - 输入token数
output_tokens(long) - 输出token数
time_s(float) - 耗时(秒)
write_time_int(long) - 写入时间戳
write_time_str(keyword)- 写入时间串
```
#### 4. `echo_trace-write`(小葵会话轨迹)
```
contact_id(keyword) - 联系人ID
bot_wxid(keyword) - Bot微信ID
session_id(keyword) - 会话ID
skill(keyword) - 当前技能
stage(keyword) - 当前阶段
step(keyword) - 当前步骤
data.event(keyword) - 事件类型
data.current_stage - 当前阶段
data.current_vars - 当前变量(手机号/绑定状态/账号信息等)
data.replies(keyword) - 回复内容
timestamp(date) - 时间
```
---
需要我进一步查看某个具体索引的样例数据,或者按特定维度做分析吗?
user: [message_id: om_x100b6cfa8ddf34a8b34f7f9a184e54a]
李承龙: 索引user_behavior_buried_points的字段都有哪些
assistant: `user_behavior_buried_points` 索引的完整字段列表如下:
| 字段名 | 类型 | 可检索 | 说明 |
|--------|------|--------|------|
| `accountId` | long | ✅ | 账号ID |
| `accountName` | text | ❌ (index:false) | 账号名称 |
| `action` | keyword | ✅ | 动作类型 |
| `activeTime` | long | ✅ | 事件时间戳(秒级) |
| `buryingPointId` | long | ✅ | 埋点ID |
| `buryingPointName` | text | ❌ (index:false) | 埋点名称 |
| `buryingPointSubId` | long | ✅ | 子埋点ID |
| `buryingPointSubName` | text | ❌ (index:false) | 子埋点名称 |
| `button` | keyword | ✅ | 按钮标识 |
| `cId` | text (standard) | ✅ | 组件实例ID |
| `cType` | text (standard) | ✅ | 组件类型(如 core_listening_drag |
| `cardId` | long | ✅ | 卡片ID |
| `cardName` | text (standard) | ✅ | 卡片名称 |
| `characterId` | long | ✅ | 角色ID |
| `characterName` | text | ❌ (index:false) | 角色名称 |
| `componentId` | long | ✅ | 组件ID |
| `componentName` | text (standard) | ✅ | 组件名称 |
| `courseLevel` | keyword | ✅ | 课程等级(如 L1、L2 |
| `dataVersion` | keyword | ✅ | 数据版本 |
| `ex2` | keyword | ✅ | 扩展字段2 |
| `ex3` | keyword | ✅ | 扩展字段3 |
| `ex4` | keyword | ✅ | 扩展字段4 |
| `ex5` | keyword | ✅ | 扩展字段5 |
| `ex6` | keyword | ✅ | 扩展字段6 |
| `finishStatus` | text | ✅ | 完成状态 |
| `learningModuleId` | long | ✅ | 学习模块ID |
| `learningModuleName` | text (standard) | ✅ | 学习模块名称 |
| `learningPointId` | long | ✅ | 知识点ID |
| `learningPointName` | text (standard) | ✅ | 知识点名称 |
| `lessonId` | long | ✅ | 课时ID |
| `lessonName` | text (standard) | ✅ | 课时名称 |
| `location` | keyword | ✅ | 位置标识 |
| `num1` | double | ✅ | 数值扩展1 |
| `num2` | double | ✅ | 数值扩展2 |
| `num3` | double | ✅ | 数值扩展3 |
| `seasonPackageId` | long | ✅ | 季度包ID |
| `seasonPackageName` | text (standard) | ✅ | 季度包名称 |
| `stepDuration` | long | ✅ | 步骤耗时(秒) |
| `unitId` | long | ✅ | 单元ID |
| `unitName` | text (standard) | ✅ | 单元名称 |
| `versionId` | text | ✅ | 客户端版本号 |
**总计 38 个字段**,其中:
- 可精确检索keyword/long/double25 个
- 全文检索text+standard9 个
- 不可检索index:false4 个accountName、buryingPointName、buryingPointSubName、characterName
数据量 **3741万条**,占用 11.6GB。
user: [message_id: om_x100b6cfa8859f8e8b16f7789094ee17]
李承龙: buryingPointName和buryingPointSubName都有哪些
assistant: 由于 `buryingPointName``buryingPointSubName` 字段是 `index: false`(不可检索/聚合),我需要通过查文档来获取它们的实际值:
assistant: 整理完毕,以下是完整的 `buryingPointName``buryingPointSubName` 枚举:
---
## buryingPointId → buryingPointName 对照表
| buryingPointId | buryingPointName | 数据量 |
|---|---|---|
| 100 | 登录创角流程 | 87万 |
| 101 | *(空)* | 1.9万 |
| 102 | *(空)* | 6.3万 |
| 103 | *(空)* | 40万 |
| 200 | 新手引导流程 | 2.2万 |
| 300 | 关卡内操作 | 450万 |
| 400 | 组件内操作 | **2651万** |
| 500 | 主框架操作 | 130万 |
| 600 | 收集页操作 | 12万 |
| 700 | 知识模块操作 | 6.2万 |
| 800 | 交易相关流程 | 2.2万 |
| 900 | *(空)* | 64 |
| 1000 | *(空)* | 5万 |
| 1100 | *(空)* | 1.6万 |
| 1200 | *(空)* | 276万 |
| 1300 | *(空)* | 69万 |
---
## buryingPointSubId → buryingPointSubName 对照表
### 100 - 登录创角流程
| subId | subName |
|---|---|
| 15 | 点击启动时 |
| 16 | 点击切换账号时 |
| 17 | 点击选择角色时 |
| 19 | 点击出发时 |
| 21 | 选择性别男 |
| 22 | 选择性别女 |
| 23 | 点击随机按钮时 |
| 24 | 点击键入名字框体时 |
| 25 | 点击选择生日框体时 |
| 26 | 点击下一步时 |
| 27 | 点击上一步时 |
| 28~72 | *(空,后期新增的未命名子埋点)* |
### 200 - 新手引导流程
| subId | subName |
|---|---|
| 1 | 点击无人机附近地面时 |
| 2 | 点击触发无人机气泡时 |
| 3 | 点击正确选项时 |
| 4 | 点击错误选项时 |
| 5 | 点击轻点后说话按钮时 |
| 6 | 点击发送按钮时 |
| 8 | 点击小喇叭播放语音时 |
| 9 | 点击重试一次按钮时 |
| 10 | 点击解锁手环时 |
### 300 - 关卡内操作
| subId | subName |
|---|---|
| 1 | 点击气泡触发组件时 |
| 2 | TimeAction触发组件时 |
| 3 | 点击打开任务板 |
| 4 | 点击关闭任务板 |
| 5 | 点击任务板开始自动寻路时 |
| 6 | 自动寻路触发组件时 |
| 9 | 打开Brainy界面时 |
| 10 | 打开备忘录时 |
| 12 | 点击知识模块时 |
| 13 | 点击知识点时 |
| 14 | 点击下一个问题时 |
| 15 | 点击关闭界面时 |
| 16 | 点击完成时 |
| 17 | 点击开始知识回顾时 |
### 400 - 组件内操作最大2651万条
| subId | subName |
|---|---|
| 1 | 组件通过时 |
| 2 | 组件失败结果为Fail时 |
| 3 | 组件结果为Pass时 |
| 4 | 组件结果为Good时 |
| 5 | 组件结果为Excellent时 |
| 6 | 点击离开时 |
| 8 | 点击下一句时 |
| 9 | 点击播放音频时 |
| 10 | 点击展开释义时 |
| 11 | 点击选项时 |
| 12 | 点击下一句时 |
| 13 | 点击播放音频时 |
| 14 | 点击展开释义时 |
| 15 | 点击查看文本时 |
| 19 | 点击选项时 |
| 20 | 点击提示按钮时 |
| 35 | 点击选项时 |
| 36 | 点击继续时 |
| 37 | 点击收起时 |
| 38 | 点击展开时 |
| 39 | 点击翻译时 |
| 40 | 点击要翻译的句子时 |
| 41 | 点击退出翻译时 |
| 42 | 点击小喇叭时 |
| 43 | 点击开始任务时 |
| 44 | 点击麦克风按钮时 |
| 45 | 点击发送时 |
| 46 | 点击取消发送时 |
| 47 | 点击小喇叭时 |
| 50 | 打开Brainy时 |
| 51 | 关闭Brainy时 |
| 52 | 点击Brainy小喇叭时 |
| 53~158 | *(空,后期新增)* |
### 500 - 主框架操作
| subId | subName |
|---|---|
| 1 | 点击关卡卡片时 |
| 2 | 点击开始关卡时 |
| 3 | 点击继续关卡时 |
| 4 | 点击查看结算记录列表时 |
| 5 | 点击重新开始时 |
| 6 | 点击继续时 |
| 7 | 点击关闭「是否继续」的二次弹窗时 |
| 8 | 点击下发导航条切换故事时 |
| 9 | 点击下方Story按钮时 |
| 10 | 点击下方Collection按钮时 |
| 11 | 点击学习中心按钮时 |
| 12 | 点击学习模块按钮时 |
| 13 | 点击能力训练按钮时 |
| 14 | 点击单元挑战按钮时 |
| 15 | 点击进入角色信息页面按钮时 |
### 600 - 收集页操作
| subId | subName |
|---|---|
| 1 | 点击引导高亮的卡牌时 |
| 2 | 点击立刻升级时 |
| 3 | 点击卡牌详情时 |
| 4 | 点击关闭卡牌详情时 |
| 5 | 点击立刻升级时 |
| 6 | 点击购买高光时刻二次确认弹窗确认时 |
| 7 | 点击购买高光时刻二次确认弹窗返回时 |
| 8 | 点击加号时 |
| 9 | 点击减号时 |
| 10 | 点击加号时 |
| 11 | 点击再想想时 |
| 12 | 点击兑换时 |
### 700 - 知识模块操作
| subId | subName |
|---|---|
| 1 | 点击知识模块页签时 |
| 2 | 点击能力训练页签时 |
| 3 | 点击知识模块卡片时 |
| 5 | 点击知识点时 |
| 15 | 练习中点击选项时 |
| 16 | 练习中点击选好了时 |
| 17 | 练习中点击小喇叭时 |
| 18 | 练习结束点击离开按钮时 |
| 19 | 点击进入挑战按钮时 |
| 20 | 点击离开挑战按钮时 |
| 21 | 离开挑战二次确认点击放弃时 |
| 22 | 离开挑战二次确认点击继续时 |
| 23 | 重新进入挑战点击继续时 |
| 24 | 重新进入挑战点击重新开始时 |
| 25 | 点击选项时 |
| 26 | 点击上一题时 |
| 27 | 点击下一题时 |
| 28 | 点击我不会了跳过时 |
| 29 | 点击麦克风按钮时 |
| 30 | 点击麦克风按钮取消时 |
| 31 | 点击麦克风按钮发送时 |
| 32 | 点击返回主页时 |
| 33 | 点击查看题目时 |
| 34 | 点击选过的题目跳转时 |
### 800 - 交易相关流程
| subId | subName |
|---|---|
| 1 | 点击 S1 季度包入口时 |
| 17 | 点击「我的订单」入口时 |
| 22 | 点击活动入口「完课福利」时 |
| 29 | 点击主框架底部的 S2 按钮时 |
### 900 / 1000 / 1100 / 1200 / 1300
这几个埋点的 `buryingPointName``buryingPointSubName` **均为空字符串**属于较新的埋点尚未在数据中写入名称字段。只有数字ID可区分。
---
**总结:** 已命名的核心模块是 100登录创角、200新手引导、300关卡、400组件、500主框架、600收集页、700知识模块、800交易。900~1300 是较新添加的埋点,名称字段为空,需要结合客户端代码才能确认具体含义。
user: [message_id: om_x100b6cfa9e89c4bcb39e400681a27a5]
李承龙: [Replying to: "由于 buryingPointName 和 buryingPointSubName 字段是 index: false不可检索/聚合),我需要通过查文档来获取它们的实际值:"]
查的什么文档
Reply target of current user message (untrusted, for context):
```json
{
"body": "由于 buryingPointName 和 buryingPointSubName 字段是 index: false不可检索/聚合),我需要通过查文档来获取它们的实际值:"
}
```
assistant: 抱歉表述不准确。这里说的"查文档"不是指什么外部文档,而是指 **直接从 ES 索引中取样本数据document**
因为 `buryingPointName``buryingPointSubName` 这两个字段被设置为 `index: false`,意味着:
- ❌ 不能对它们做 `terms` 聚合(无法直接列出所有枚举值)
- ❌ 不能用它们做搜索/过滤
所以我的做法是:按每个 `buryingPointId`这个字段可聚合分别取一条原始记录ES document从返回的 `_source` 里读出对应的 `buryingPointName``buryingPointSubName` 字段值。
本质就是:**用可检索的 ID 字段做查询条件 → 取返回的原始文档 → 读里面不可检索的 name 字段**。
user: [message_id: om_x100b6cfa94e298b0b20966c5200f3ae]
李承龙: 统计一下埋点id1100子id1有多少用户以及有多少次
assistant: 埋点 ID=1100子 ID=1
- **总次数:** 8,281 次
- **去重用户数accountId** 5,216 人