# 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 | 子埋点 ID(1~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/double):25 个 - 全文检索(text+standard):9 个 - 不可检索(index:false):4 个(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 人