150 lines
9.2 KiB
SQL
150 lines
9.2 KiB
SQL
-- AI Chat Service 数据库迁移
|
||
-- 创建人设表、用户记忆表、配置表
|
||
|
||
-- ============================================
|
||
-- 1. ai_personas 表 - 人设表
|
||
-- 存储用户创建的 AI 聊天人设配置
|
||
-- ============================================
|
||
CREATE TABLE IF NOT EXISTS ai_personas (
|
||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(), -- 人设唯一标识符
|
||
user_id BIGINT NOT NULL, -- 所属用户 ID
|
||
name VARCHAR(64) NOT NULL, -- 人设名称
|
||
description TEXT, -- 人设描述/简介
|
||
avatar_url VARCHAR(512), -- 头像 URL
|
||
talk_style VARCHAR(256), -- 说话风格描述
|
||
system_prompt TEXT NOT NULL, -- 系统提示词(人设核心定义)
|
||
is_default BOOLEAN DEFAULT FALSE, -- 是否为默认人设
|
||
created_at BIGINT NOT NULL DEFAULT EXTRACT(EPOCH FROM NOW()) * 1000, -- 创建时间(毫秒时间戳)
|
||
updated_at BIGINT NOT NULL DEFAULT EXTRACT(EPOCH FROM NOW()) * 1000 -- 更新时间(毫秒时间戳)
|
||
);
|
||
|
||
-- 索引
|
||
CREATE INDEX IF NOT EXISTS idx_ai_personas_user_id ON ai_personas(user_id);
|
||
CREATE UNIQUE INDEX IF NOT EXISTS idx_ai_personas_user_default ON ai_personas(user_id) WHERE is_default = TRUE;
|
||
|
||
-- ============================================
|
||
-- 2. ai_user_memories 表 - 用户长期记忆表
|
||
-- 存储用户的长期记忆信息,用于 AI 对话时召回
|
||
-- ============================================
|
||
CREATE TABLE IF NOT EXISTS ai_user_memories (
|
||
id SERIAL PRIMARY KEY, -- 记忆唯一标识符
|
||
user_id BIGINT NOT NULL, -- 所属用户 ID
|
||
content TEXT NOT NULL, -- 记忆内容
|
||
keywords TEXT[], -- 关键词数组(用于检索)
|
||
weight INTEGER DEFAULT 50, -- 权重(0-100,影响召回优先级)
|
||
is_core BOOLEAN DEFAULT FALSE, -- 是否为核心记忆(核心记忆优先召回)
|
||
created_at BIGINT NOT NULL DEFAULT EXTRACT(EPOCH FROM NOW()) * 1000, -- 创建时间
|
||
updated_at BIGINT NOT NULL DEFAULT EXTRACT(EPOCH FROM NOW()) * 1000 -- 更新时间
|
||
);
|
||
|
||
-- 索引
|
||
CREATE INDEX IF NOT EXISTS idx_ai_user_memories_user_id ON ai_user_memories(user_id);
|
||
CREATE INDEX IF NOT EXISTS idx_ai_user_memories_keywords ON ai_user_memories USING GIN(keywords);
|
||
CREATE INDEX IF NOT EXISTS idx_ai_user_memories_weight ON ai_user_memories(weight DESC);
|
||
|
||
-- ============================================
|
||
-- 3. ai_chat_configs 表 - AI Chat 配置表
|
||
-- 存储 AI Chat 服务的各类配置项
|
||
-- ============================================
|
||
CREATE TABLE IF NOT EXISTS ai_chat_configs (
|
||
id SERIAL PRIMARY KEY, -- 配置项唯一 ID
|
||
config_key VARCHAR(128) NOT NULL UNIQUE, -- 配置键
|
||
config_value TEXT NOT NULL, -- 配置值
|
||
config_type VARCHAR(32) NOT NULL DEFAULT 'string', -- 配置类型(string/number/boolean/json)
|
||
category VARCHAR(64) NOT NULL, -- 配置分类(redis/llm/dialog/token/circuit/summary)
|
||
description VARCHAR(256), -- 配置描述
|
||
is_encrypted BOOLEAN DEFAULT FALSE, -- 是否加密存储(加密字段不返回明文)
|
||
updated_at BIGINT NOT NULL DEFAULT EXTRACT(EPOCH FROM NOW()) * 1000, -- 更新时间
|
||
created_at BIGINT NOT NULL DEFAULT EXTRACT(EPOCH FROM NOW()) * 1000 -- 创建时间
|
||
);
|
||
|
||
-- 索引
|
||
CREATE INDEX IF NOT EXISTS idx_ai_chat_configs_category ON ai_chat_configs(category);
|
||
CREATE INDEX IF NOT EXISTS idx_ai_chat_configs_key ON ai_chat_configs(config_key);
|
||
|
||
-- 初始配置数据
|
||
INSERT INTO ai_chat_configs (config_key, config_value, config_type, category, description, is_encrypted) VALUES
|
||
-- Redis 配置
|
||
('redis.host', '127.0.0.1', 'string', 'redis', 'Redis 主机地址', FALSE),
|
||
('redis.port', '6379', 'number', 'redis', 'Redis 端口', FALSE),
|
||
('redis.password', '123456', 'string', 'redis', 'Redis 密码', TRUE),
|
||
('redis.db', '0', 'number', 'redis', 'Redis 数据库编号', FALSE),
|
||
|
||
-- MiniMax 大模型配置
|
||
('minimax.api_key', '', 'string', 'llm', 'MiniMax API Key', TRUE),
|
||
('minimax.api_url', 'https://api.minimaxi.com/v1', 'string', 'llm', 'MiniMax API 地址', FALSE),
|
||
('minimax.model', 'M2-her', 'string', 'llm', 'MiniMax 模型名称', FALSE),
|
||
|
||
-- 通义备用模型配置
|
||
('qwen.api_key', '', 'string', 'llm', '通义 API Key', TRUE),
|
||
('qwen.api_url', 'https://dashscope.aliyuncs.com/compatible-mode/v1', 'string', 'llm', '通义 API 地址', FALSE),
|
||
('qwen.model', 'qwen-plus', 'string', 'llm', '通义模型名称', FALSE),
|
||
|
||
-- 对话配置
|
||
('dialog.max_context_turns', '10', 'number', 'dialog', '最大上下文轮数', FALSE),
|
||
('dialog.context_expire_seconds', '86400', 'number', 'dialog', '上下文过期时间(秒)', FALSE),
|
||
('dialog.memory_recall_topn', '5', 'number', 'dialog', '记忆召回返回条数', FALSE),
|
||
('dialog.fallback_threshold', '3', 'number', 'dialog', '模型降级连续失败次数阈值', FALSE),
|
||
('dialog.slow_response_ms', '5000', 'number', 'dialog', '慢响应判定阈值(毫秒)', FALSE),
|
||
|
||
-- AI Token 限制配置
|
||
('token.max_total', '32000', 'number', 'token', '总 Token 上限', FALSE),
|
||
('token.max_history', '24000', 'number', 'token', '对话历史最大 Token', FALSE),
|
||
('token.max_system', '4000', 'number', 'token', 'System Prompt 最大 Token', FALSE),
|
||
('token.max_memory', '2000', 'number', 'token', '记忆召回最大 Token', FALSE),
|
||
('token.reserved', '2000', 'number', 'token', '保留空间 Token', FALSE),
|
||
|
||
-- 熔断配置
|
||
('circuit.max_fail_count', '5', 'number', 'circuit', '熔断连续失败次数', FALSE),
|
||
('circuit.breaker_timeout', '60', 'number', 'circuit', '熔断恢复超时(秒)', FALSE),
|
||
|
||
-- 摘要配置
|
||
('summary.trigger_turns', '10', 'number', 'summary', '自动摘要触发轮数', FALSE),
|
||
('summary.max_length', '100', 'number', 'summary', '摘要最大字数', FALSE)
|
||
ON CONFLICT (config_key) DO NOTHING;
|
||
|
||
-- ============================================
|
||
-- 表结构注释
|
||
-- ============================================
|
||
COMMENT ON TABLE ai_personas IS 'AI 人设表 - 存储用户创建的聊天人设配置';
|
||
COMMENT ON TABLE ai_user_memories IS '用户长期记忆表 - 存储用户记忆信息,用于对话时召回';
|
||
COMMENT ON TABLE ai_chat_configs IS 'AI Chat 配置表 - 存储服务各类配置项';
|
||
|
||
-- ============================================
|
||
-- ai_personas 列注释
|
||
-- ============================================
|
||
COMMENT ON COLUMN ai_personas.id IS '人设唯一标识符';
|
||
COMMENT ON COLUMN ai_personas.user_id IS '所属用户ID';
|
||
COMMENT ON COLUMN ai_personas.name IS '人设名称';
|
||
COMMENT ON COLUMN ai_personas.description IS '人设描述/简介';
|
||
COMMENT ON COLUMN ai_personas.avatar_url IS '人设头像URL';
|
||
COMMENT ON COLUMN ai_personas.talk_style IS 'AI说话风格描述';
|
||
COMMENT ON COLUMN ai_personas.system_prompt IS '系统提示词,定义人设核心性格和行为';
|
||
COMMENT ON COLUMN ai_personas.is_default IS '是否为用户的默认人设';
|
||
COMMENT ON COLUMN ai_personas.created_at IS '记录创建时间(毫秒时间戳)';
|
||
COMMENT ON COLUMN ai_personas.updated_at IS '记录更新时间(毫秒时间戳)';
|
||
|
||
-- ============================================
|
||
-- ai_user_memories 列注释
|
||
-- ============================================
|
||
COMMENT ON COLUMN ai_user_memories.id IS '记忆记录唯一ID';
|
||
COMMENT ON COLUMN ai_user_memories.user_id IS '所属用户ID';
|
||
COMMENT ON COLUMN ai_user_memories.content IS '记忆内容文本';
|
||
COMMENT ON COLUMN ai_user_memories.keywords IS '关键词数组,用于记忆检索';
|
||
COMMENT ON COLUMN ai_user_memories.weight IS '记忆权重(0-100),影响召回优先级';
|
||
COMMENT ON COLUMN ai_user_memories.is_core IS '是否为核心记忆,核心记忆优先召回';
|
||
COMMENT ON COLUMN ai_user_memories.created_at IS '记忆创建时间';
|
||
COMMENT ON COLUMN ai_user_memories.updated_at IS '记忆更新时间';
|
||
|
||
-- ============================================
|
||
-- ai_chat_configs 列注释
|
||
-- ============================================
|
||
COMMENT ON COLUMN ai_chat_configs.id IS '配置项唯一ID';
|
||
COMMENT ON COLUMN ai_chat_configs.config_key IS '配置键名称';
|
||
COMMENT ON COLUMN ai_chat_configs.config_value IS '配置值';
|
||
COMMENT ON COLUMN ai_chat_configs.config_type IS '配置类型:string/number/boolean/json';
|
||
COMMENT ON COLUMN ai_chat_configs.category IS '配置分类:redis/llm/dialog/token/circuit/summary';
|
||
COMMENT ON COLUMN ai_chat_configs.description IS '配置项的中文描述';
|
||
COMMENT ON COLUMN ai_chat_configs.is_encrypted IS '是否加密存储,加密字段不会返回明文';
|
||
COMMENT ON COLUMN ai_chat_configs.updated_at IS '配置更新时间';
|
||
COMMENT ON COLUMN ai_chat_configs.created_at IS '配置创建时间'; |