跳到主要内容

版本 0.10 数据模型设计

生成时间:2026-01-12 14:30:00
最后更新:2026-01-12 (Memory 系统重设计)

YOLOX 技术方案:数据模型设计 (V0.10)

本方案基于 React Native + Golang (Eino) + PostgreSQL/Supabase + Milvus 架构,针对用户冷启动、动态 Prompt 组装、Memory 系统及知识库需求进行数据建模。

数据归属说明

由于 Memory 系统的复杂性,数据模型按服务边界划分:

服务管理的数据说明
yolox-server (Backend)users, conversations, messages, topics 等用户基础数据、会话管理
yolox-rag (RAG)user_profiles, memory_items, conversation_summaries 等Memory 存储与检索

Backend 通过 RPC/HTTP 调用 RAG 服务获取 Memory 数据,不直接读写 Memory 相关表。


1. Backend 数据表设计 (yolox-server)

users (用户基础表)

字段名类型说明约束
idUUID用户唯一标识PRIMARY KEY, DEFAULT gen_random_uuid()
phone_numberVARCHAR(20)手机号(用于登录)NOT NULL, UNIQUE, INDEX
nicknameVARCHAR(64)用户昵称NOT NULL
avatar_urlTEXT头像存储地址 (R2)-
created_atTIMESTAMPTZ注册时间NOT NULL, DEFAULT NOW()
last_loginTIMESTAMPTZ最后登录时间-
is_onboardedBOOLEAN是否完成冷启动问卷NOT NULL, DEFAULT FALSE

onboarding_surveys (问卷配置表)

字段名类型说明约束
idUUID问卷 IDPRIMARY KEY
titleVARCHAR(255)问卷标题NOT NULL
questionsJSONB题目列表 (含题干、选项、单多选类型)NOT NULL
is_activeBOOLEAN是否启用DEFAULT TRUE
versionINTEGER版本号NOT NULL

user_onboarding_responses (用户问卷结果表)

字段名类型说明约束
idUUID记录 IDPRIMARY KEY
user_idUUID用户 IDFOREIGN KEY users.id
survey_idUUID问卷 IDFOREIGN KEY onboarding_surveys.id
answersJSONB用户回答内容 (选项 ID 列表)NOT NULL
created_atTIMESTAMPTZ提交时间DEFAULT NOW()

topics (话题配置表)

字段名类型说明约束
idUUID话题 IDPRIMARY KEY
titleVARCHAR(128)话题标题NOT NULL
cover_imageTEXT话题封面图 (R2)-
button_textVARCHAR(32)按钮文案DEFAULT '开始对话'
priorityINTEGER权重级别 (用于 Banner 展示)DEFAULT 0
categoryVARCHAR(64)话题分类 (关系/健康/人生)INDEX
system_prompt_templateTEXT该话题的基础 System PromptNOT NULL
is_recommendedBOOLEAN是否作为冷启动推荐候选DEFAULT FALSE

conversations (会话管理表)

字段名类型说明约束
idUUID会话 IDPRIMARY KEY
user_idUUID用户 IDFOREIGN KEY users.id, INDEX
topic_idUUID关联话题 IDFOREIGN KEY topics.id
titleVARCHAR(255)会话标题 (AI 自动生成或手动修改)-
is_starredBOOLEAN是否收藏DEFAULT FALSE
statusVARCHAR(20)状态 (active/archived)DEFAULT 'active'
created_atTIMESTAMPTZ创建时间INDEX
updated_atTIMESTAMPTZ最后活跃时间INDEX

messages (对话消息表)

字段名类型说明约束
idUUID消息 IDPRIMARY KEY
conversation_idUUID会话 IDFOREIGN KEY conversations.id, INDEX
roleVARCHAR(20)角色 (user/assistant/system)NOT NULL
contentTEXT文本内容NOT NULL
audio_urlTEXT语音文件地址 (R2)-
message_typeVARCHAR(20)类型 (text/voice/insight)DEFAULT 'text'
metadataJSONB扩展信息 (ASR 原始结果/Token 消耗等)-
created_atTIMESTAMPTZ发送时间DEFAULT NOW()

insights (对话总结/Artifacts 表)

字段名类型说明约束
idUUIDInsight IDPRIMARY KEY
conversation_idUUID会话 IDFOREIGN KEY conversations.id
contentTEXT总结内容 (Markdown)NOT NULL
user_feedbackINTEGER用户反馈 (1:有用, -1:无用, 0:未评价)DEFAULT 0
created_atTIMESTAMPTZ生成时间DEFAULT NOW()

verification_codes (验证码表)

字段名类型说明约束
idUUID验证码记录 IDPRIMARY KEY
phone_numberVARCHAR(20)手机号NOT NULL, INDEX
codeVARCHAR(6)验证码(6位数字)NOT NULL
expires_atTIMESTAMPTZ过期时间(通常5-10分钟)NOT NULL
is_usedBOOLEAN是否已使用NOT NULL, DEFAULT FALSE
created_atTIMESTAMPTZ创建时间NOT NULL, DEFAULT NOW()

invitation_codes (邀请码表)

字段名类型说明约束
idUUID邀请码 IDPRIMARY KEY
codeVARCHAR(32)邀请码(唯一标识)NOT NULL, UNIQUE, INDEX
created_byUUID创建者用户 ID(管理员)FOREIGN KEY users.id
expires_atTIMESTAMPTZ过期时间(1个月有效期)NOT NULL
is_usedBOOLEAN是否已使用NOT NULL, DEFAULT FALSE
used_byUUID使用该邀请码的用户 IDFOREIGN KEY users.id
used_atTIMESTAMPTZ使用时间-
created_atTIMESTAMPTZ创建时间NOT NULL, DEFAULT NOW()

2. RAG Memory 数据表设计 (yolox-rag)

Memory 系统采用分层存储架构,将用户记忆拆分为细粒度的可检索单元

2.1 Memory 分层模型

┌─────────────────────────────────────────────────────────────────────┐
│ User Memory Architecture │
├─────────────────────────────────────────────────────────────────────┤
│ Layer 1: User Profile (用户画像) │
│ • 基础信息、沟通风格、性格特征、核心困扰 │
│ • 更新频率:低,仅在新信息出现时更新 │
├─────────────────────────────────────────────────────────────────────┤
│ Layer 2: Memory Items (记忆条目) │
│ • 事实记忆、事件记忆、情绪记忆、偏好记忆等 │
│ • 更新频率:中高,每次对话可能提取多条 │
│ • 支持向量检索 + 时间衰减 │
├─────────────────────────────────────────────────────────────────────┤
│ Layer 3: Conversation Summaries (对话摘要) │
│ • 每次对话的结构化摘要 │
│ • 关联到具体的 conversation_id │
├─────────────────────────────────────────────────────────────────────┤
│ Layer 4: Information Boundaries (信息边界) │
│ • 标记哪些信息已知,避免重复提问 │
└─────────────────────────────────────────────────────────────────────┘

2.2 user_profiles (用户画像表)

字段名类型说明约束
user_idUUID用户 IDPRIMARY KEY
basic_infoJSONB基础信息NOT NULL, DEFAULT ''
communication_styleJSONB沟通风格NOT NULL, DEFAULT ''
personalityJSONB性格特征NOT NULL, DEFAULT ''
core_concernsTEXT[]核心困扰标签列表NOT NULL, DEFAULT ''
updated_atTIMESTAMPTZ最后更新时间DEFAULT NOW()
versionINTEGER版本号(乐观锁)DEFAULT 1

字段说明:

// basic_info 示例
{
"age": 28,
"gender": "female",
"occupation": "产品经理",
"location": "北京"
}

// communication_style 示例
{
"expression": "细腻", // 表达方式
"emotion": "敏感", // 情绪特点
"language": "偏文艺" // 语言风格
}

// personality 示例
{
"mbti": "INFJ",
"traits": ["内向", "共情力强", "追求完美"]
}

// core_concerns 示例
["异地恋问题", "职业倦怠", "原生家庭"]

2.3 memory_items (记忆条目表)

字段名类型说明约束
idUUID记忆 IDPRIMARY KEY, DEFAULT gen_random_uuid()
user_idUUID用户 IDNOT NULL, INDEX
memory_typeVARCHAR(32)记忆类型NOT NULL, INDEX
categoryVARCHAR(64)分类标签INDEX
contentTEXT记忆内容(自然语言)NOT NULL
structured_dataJSONB结构化数据(可选)DEFAULT ''
source_conversation_idUUID来源会话 ID-
source_message_idsUUID[]来源消息 ID 列表DEFAULT ''
confidenceFLOAT置信度 (0-1)DEFAULT 0.8
importanceINTEGER重要度 (1-5)DEFAULT 3
is_verifiedBOOLEAN是否经用户确认DEFAULT FALSE
is_deletedBOOLEAN是否软删除DEFAULT FALSE
superseded_byUUID被哪条记忆取代-
expires_atTIMESTAMPTZ过期时间(临时性记忆)-
created_atTIMESTAMPTZ创建时间DEFAULT NOW(), INDEX
updated_atTIMESTAMPTZ更新时间DEFAULT NOW()

memory_type 枚举值:

类型说明示例
fact事实记忆"和男友异地恋3年"
event事件记忆"昨天因为视频通话吵架了"
emotion情绪记忆"对这段关系感到疲惫"
preference偏好记忆"喜欢在晚上聊天"
goal目标记忆"想要改善沟通模式"
progress进展记忆"开始尝试每天视频通话"

category 枚举值:

分类说明
relationship亲密关系
health身心健康
career职业发展
family家庭关系
finance财务相关
general通用/其他

2.4 conversation_summaries (对话摘要表)

字段名类型说明约束
idUUID摘要 IDPRIMARY KEY, DEFAULT gen_random_uuid()
conversation_idUUID会话 IDNOT NULL, UNIQUE
user_idUUID用户 IDNOT NULL, INDEX
summaryTEXT对话摘要(200-500字)NOT NULL
key_pointsTEXT[]关键要点列表DEFAULT ''
extracted_memory_idsUUID[]提取的记忆 ID 列表DEFAULT ''
topic_tagsVARCHAR(64)[]话题标签DEFAULT ''
emotional_toneVARCHAR(32)整体情绪基调-
created_atTIMESTAMPTZ创建时间DEFAULT NOW()

2.5 information_boundaries (信息边界表)

字段名类型说明约束
idUUID记录 IDPRIMARY KEY, DEFAULT gen_random_uuid()
user_idUUID用户 IDNOT NULL, INDEX
question_typeVARCHAR(64)问题类型NOT NULL
is_knownBOOLEAN是否已知DEFAULT TRUE
source_memory_idUUID对应记忆条目 ID-
last_asked_atTIMESTAMPTZ最后询问时间-
created_atTIMESTAMPTZ创建时间DEFAULT NOW()

question_type 常见值:

  • age - 年龄
  • occupation - 职业
  • location - 所在地
  • relationship_status - 关系状态
  • partner_info - 伴侣信息
  • health_condition - 健康状况
  • family_situation - 家庭情况

UNIQUE 约束: (user_id, question_type)


3. 向量数据库设计 (Milvus)

3.1 knowledge_base (知识库 - Module 2)

字段名类型说明备注
pkInt64主键 ID自动增长
vectorFloatVector(1536)知识片段向量text-embedding-3-small
contentString知识文本内容原始文本
topic_categoryString话题分类标签用于 Pre-filtering
knowledge_typeString知识类型expert/case/skill
source_refString来源引用书名/链接/脚本库 ID

3.2 memory_vectors (用户记忆向量 - Module 1)

字段名类型说明备注
pkInt64主键 ID自动增长
memory_idString关联 memory_items.id用于回查 PostgreSQL
user_idString用户 ID用于过滤
vectorFloatVector(1536)记忆内容向量text-embedding-3-small
memory_typeString记忆类型用于过滤
categoryString分类标签用于过滤
importanceInt32重要度用于排序/过滤
created_atInt64创建时间戳用于时间衰减计算

索引配置:

index_params = {
"index_type": "IVF_FLAT", # 或 HNSW
"metric_type": "IP", # Inner Product
"params": {"nlist": 128}
}

4. 关系与索引说明

4.1 服务间数据关系

┌─────────────────────────────────────────────────────────────────────┐
│ Backend (yolox-server) │
│ ┌─────────┐ ┌───────────────┐ ┌──────────┐ │
│ │ users │───▶│ conversations │───▶│ messages │ │
│ └────┬────┘ └───────────────┘ └──────────┘ │
│ │ │ │
└───────┼─────────────────┼───────────────────────────────────────────┘
│ user_id │ conversation_id
▼ ▼
┌───────────────────────────────────────────────────────────────────┐
│ RAG (yolox-rag) │
│ ┌───────────────┐ ┌──────────────┐ ┌────────────────────────┐ │
│ │ user_profiles │ │ memory_items │ │ conversation_summaries │ │
│ └───────────────┘ └──────────────┘ └────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌───────────────┐ │
│ │memory_vectors │ (Milvus) │
│ └───────────────┘ │
└───────────────────────────────────────────────────────────────────┘

4.2 Backend 核心索引

索引用途
users(phone_number)手机号登录快速查询
conversations(user_id, is_starred, updated_at DESC)侧边栏历史列表
messages(conversation_id, created_at ASC)对话消息流加载
verification_codes(phone_number, expires_at, is_used)验证码查询
invitation_codes(code, is_used, expires_at)邀请码验证

4.3 RAG Memory 核心索引

索引用途
memory_items(user_id, memory_type) WHERE NOT is_deleted按类型查询记忆
memory_items(user_id, category) WHERE NOT is_deleted按分类查询记忆
memory_items(user_id, created_at DESC) WHERE NOT is_deleted时间排序
memory_items(user_id, importance DESC) WHERE NOT is_deleted重要度排序
conversation_summaries(user_id, created_at DESC)最近对话摘要
information_boundaries(user_id, question_type) UNIQUE信息边界查询

5. Memory 检索策略

5.1 混合检索算法

在 Prompt 组装时,RAG 服务使用以下策略检索相关记忆:

最终分数 = 向量相似度 × 时间衰减权重 × (重要度/5) × 话题相关性加权

其中:
- 时间衰减:decay = 0.5 ^ (age_days / 30),半衰期 30 天
- 话题加权:当前话题相关的记忆 × 1.3

5.2 Context Window 预算分配

Module 1 总预算约 3000 tokens:

组成部分Token 预算策略
User Profile~500固定加载
Memory Items (Top 5-10)~1000向量检索 + 排序
Recent Events (Top 3)~600按时间筛选
Last Conversation Summary~500固定加载
Information Boundaries~400固定加载

6. 基础设施关联

基础设施用途
PostgreSQL (Backend)存储用户信息、会话、消息、话题配置等
PostgreSQL (RAG)存储 Memory 结构化数据(user_profiles, memory_items 等)
Milvus存储知识库向量 (knowledge_base) 和记忆向量 (memory_vectors)
Cloudflare R2存储头像、话题封面、语音文件等二进制资源
消息队列Backend 触发 RAG 异步提取记忆任务

7. 废弃说明

user_memories (已废弃)

原设计将所有用户记忆存储在单表的三个字段中:

  • persona (JSONB)
  • history_summary (TEXT)
  • information_boundary (JSONB)

废弃原因

  1. history_summary 为全量文本,无法增量更新
  2. 无法按语义检索相关记忆
  3. 无时间衰减机制
  4. 无法溯源到具体对话

迁移方案:数据拆分写入新的 user_profilesmemory_itemsinformation_boundaries 表。