13 changed files with 424 additions and 24 deletions
-
4CLAUDE.md
-
10DEPLOY.md
-
4README.md
-
18src/main/java/com/wok/supportbot/config/ChatModelFactory.java
-
2src/main/java/com/wok/supportbot/config/EmbeddingConfigFixer.java
-
4src/main/java/com/wok/supportbot/config/EmbeddingModelFactory.java
-
4src/main/java/com/wok/supportbot/rag/load/PgVectorStoreConfig.java
-
32src/main/java/com/wok/supportbot/service/AiModelConfigService.java
-
2src/main/resources/add-comments.sql
-
4src/main/resources/application.yml
-
350src/main/resources/init-database.sql
-
10src/main/resources/static/components/ModelConfigManager.js
-
4src/main/resources/support-bot.sql
@ -0,0 +1,350 @@ |
|||||
|
-- ============================================================ |
||||
|
-- AI 智能客服系统 - 数据库初始化脚本 |
||||
|
-- 适用环境: PostgreSQL 12+ 且已安装 pgvector 扩展 |
||||
|
-- 使用方法: psql -U postgres -f init-database.sql |
||||
|
-- ============================================================ |
||||
|
|
||||
|
-- 1. 创建数据库(需在 postgres 默认库下执行) |
||||
|
-- 如果已在目标库中,注释掉下面这行 |
||||
|
CREATE DATABASE support_bot ENCODING 'UTF8' LC_COLLATE 'en_US.UTF-8' LC_CTYPE 'en_US.UTF-8' TEMPLATE template0; |
||||
|
|
||||
|
-- 切换到 support_bot 数据库(psql 命令,非 SQL) |
||||
|
\c support_bot |
||||
|
|
||||
|
-- 2. 安装必要扩展 |
||||
|
CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; |
||||
|
CREATE EXTENSION IF NOT EXISTS vector; |
||||
|
|
||||
|
-- ============================================================ |
||||
|
-- 表 1: chat_message — 聊天消息表 |
||||
|
-- ============================================================ |
||||
|
CREATE TABLE IF NOT EXISTS chat_message ( |
||||
|
id BIGINT PRIMARY KEY, |
||||
|
conversation_id VARCHAR(64) NOT NULL, |
||||
|
message_type VARCHAR(20) NOT NULL, |
||||
|
content TEXT NOT NULL, |
||||
|
metadata JSONB NOT NULL DEFAULT '{}', |
||||
|
create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, |
||||
|
update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, |
||||
|
is_delete BOOLEAN NOT NULL DEFAULT FALSE, |
||||
|
CONSTRAINT chk_message_type CHECK (message_type IN ('USER', 'ASSISTANT', 'SYSTEM')) |
||||
|
); |
||||
|
|
||||
|
CREATE INDEX IF NOT EXISTS idx_chat_message_conversation_id ON chat_message (conversation_id); |
||||
|
CREATE INDEX IF NOT EXISTS idx_chat_message_create_time ON chat_message (create_time DESC); |
||||
|
CREATE INDEX IF NOT EXISTS idx_chat_message_type ON chat_message (message_type); |
||||
|
CREATE INDEX IF NOT EXISTS idx_chat_message_not_deleted ON chat_message (conversation_id) WHERE is_delete = FALSE; |
||||
|
|
||||
|
COMMENT ON TABLE chat_message IS '聊天消息表'; |
||||
|
COMMENT ON COLUMN chat_message.id IS '主键(雪花算法生成)'; |
||||
|
COMMENT ON COLUMN chat_message.conversation_id IS '会话ID'; |
||||
|
COMMENT ON COLUMN chat_message.message_type IS '消息类型: USER / ASSISTANT / SYSTEM'; |
||||
|
COMMENT ON COLUMN chat_message.content IS '消息内容'; |
||||
|
COMMENT ON COLUMN chat_message.metadata IS '元数据(JSON)'; |
||||
|
COMMENT ON COLUMN chat_message.create_time IS '创建时间'; |
||||
|
COMMENT ON COLUMN chat_message.update_time IS '更新时间'; |
||||
|
COMMENT ON COLUMN chat_message.is_delete IS '逻辑删除: FALSE=正常 TRUE=已删除'; |
||||
|
|
||||
|
-- ============================================================ |
||||
|
-- 表 2: knowledge_category — 知识库分类表 |
||||
|
-- ============================================================ |
||||
|
CREATE TABLE IF NOT EXISTS knowledge_category ( |
||||
|
id BIGSERIAL PRIMARY KEY, |
||||
|
name VARCHAR(100) NOT NULL, |
||||
|
description TEXT, |
||||
|
parent_id BIGINT NOT NULL DEFAULT 0, |
||||
|
sort_order INTEGER NOT NULL DEFAULT 0, |
||||
|
document_count INTEGER NOT NULL DEFAULT 0, |
||||
|
create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, |
||||
|
is_delete BOOLEAN NOT NULL DEFAULT FALSE |
||||
|
); |
||||
|
|
||||
|
CREATE INDEX IF NOT EXISTS idx_knowledge_category_parent ON knowledge_category (parent_id); |
||||
|
|
||||
|
COMMENT ON TABLE knowledge_category IS '知识库分类表'; |
||||
|
COMMENT ON COLUMN knowledge_category.id IS '主键'; |
||||
|
COMMENT ON COLUMN knowledge_category.name IS '分类名称'; |
||||
|
COMMENT ON COLUMN knowledge_category.description IS '分类描述'; |
||||
|
COMMENT ON COLUMN knowledge_category.parent_id IS '父分类ID(0 表示顶级分类)'; |
||||
|
COMMENT ON COLUMN knowledge_category.sort_order IS '排序权重'; |
||||
|
COMMENT ON COLUMN knowledge_category.document_count IS '关联文档数(冗余字段)'; |
||||
|
COMMENT ON COLUMN knowledge_category.create_time IS '创建时间'; |
||||
|
COMMENT ON COLUMN knowledge_category.is_delete IS '逻辑删除'; |
||||
|
|
||||
|
-- ============================================================ |
||||
|
-- 表 3: knowledge_document — 知识文档表 |
||||
|
-- ============================================================ |
||||
|
CREATE TABLE IF NOT EXISTS knowledge_document ( |
||||
|
id BIGSERIAL PRIMARY KEY, |
||||
|
title VARCHAR(500) NOT NULL, |
||||
|
source_name VARCHAR(500), |
||||
|
file_type VARCHAR(20) NOT NULL, |
||||
|
file_size BIGINT NOT NULL DEFAULT 0, |
||||
|
content TEXT, |
||||
|
category_id BIGINT NOT NULL DEFAULT 0, |
||||
|
tags JSONB NOT NULL DEFAULT '{}', |
||||
|
chunk_count INTEGER NOT NULL DEFAULT 0, |
||||
|
status VARCHAR(20) NOT NULL DEFAULT 'PROCESSING', |
||||
|
error_message TEXT, |
||||
|
content_hash VARCHAR(64), |
||||
|
create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, |
||||
|
update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, |
||||
|
is_delete BOOLEAN NOT NULL DEFAULT FALSE |
||||
|
); |
||||
|
|
||||
|
CREATE INDEX IF NOT EXISTS idx_knowledge_document_category ON knowledge_document (category_id); |
||||
|
CREATE INDEX IF NOT EXISTS idx_knowledge_document_status ON knowledge_document (status); |
||||
|
CREATE INDEX IF NOT EXISTS idx_knowledge_document_create_time ON knowledge_document (create_time DESC); |
||||
|
CREATE INDEX IF NOT EXISTS idx_knowledge_document_content_hash ON knowledge_document (content_hash); |
||||
|
|
||||
|
COMMENT ON TABLE knowledge_document IS '知识文档表'; |
||||
|
COMMENT ON COLUMN knowledge_document.id IS '主键'; |
||||
|
COMMENT ON COLUMN knowledge_document.title IS '文档标题'; |
||||
|
COMMENT ON COLUMN knowledge_document.source_name IS '原始文件名'; |
||||
|
COMMENT ON COLUMN knowledge_document.file_type IS '文件类型'; |
||||
|
COMMENT ON COLUMN knowledge_document.file_size IS '文件大小(字节)'; |
||||
|
COMMENT ON COLUMN knowledge_document.content IS '原文内容(截断预览)'; |
||||
|
COMMENT ON COLUMN knowledge_document.category_id IS '所属分类ID'; |
||||
|
COMMENT ON COLUMN knowledge_document.tags IS '标签(JSON)'; |
||||
|
COMMENT ON COLUMN knowledge_document.chunk_count IS '分块数量'; |
||||
|
COMMENT ON COLUMN knowledge_document.status IS '状态: PROCESSING / READY / FAILED'; |
||||
|
COMMENT ON COLUMN knowledge_document.error_message IS '处理失败时的错误信息'; |
||||
|
COMMENT ON COLUMN knowledge_document.content_hash IS '内容SHA-256哈希(用于去重)'; |
||||
|
COMMENT ON COLUMN knowledge_document.create_time IS '创建时间'; |
||||
|
COMMENT ON COLUMN knowledge_document.update_time IS '更新时间'; |
||||
|
COMMENT ON COLUMN knowledge_document.is_delete IS '逻辑删除'; |
||||
|
|
||||
|
-- ============================================================ |
||||
|
-- 表 4: customer_service_role — 客服角色表 |
||||
|
-- ============================================================ |
||||
|
CREATE TABLE IF NOT EXISTS customer_service_role ( |
||||
|
id BIGSERIAL PRIMARY KEY, |
||||
|
role_key VARCHAR(64) NOT NULL UNIQUE, |
||||
|
name VARCHAR(100) NOT NULL, |
||||
|
description TEXT, |
||||
|
prompt TEXT, |
||||
|
sort_order INTEGER NOT NULL DEFAULT 0, |
||||
|
enabled BOOLEAN NOT NULL DEFAULT TRUE, |
||||
|
create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, |
||||
|
update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, |
||||
|
is_delete BOOLEAN NOT NULL DEFAULT FALSE |
||||
|
); |
||||
|
|
||||
|
CREATE INDEX IF NOT EXISTS idx_customer_service_role_enabled ON customer_service_role (enabled, sort_order); |
||||
|
|
||||
|
COMMENT ON TABLE customer_service_role IS '客服角色表'; |
||||
|
COMMENT ON COLUMN customer_service_role.id IS '主键'; |
||||
|
COMMENT ON COLUMN customer_service_role.role_key IS '角色标识符(唯一)'; |
||||
|
COMMENT ON COLUMN customer_service_role.name IS '角色名称'; |
||||
|
COMMENT ON COLUMN customer_service_role.description IS '角色描述'; |
||||
|
COMMENT ON COLUMN customer_service_role.prompt IS '系统提示词'; |
||||
|
COMMENT ON COLUMN customer_service_role.sort_order IS '排序权重'; |
||||
|
COMMENT ON COLUMN customer_service_role.enabled IS '是否启用'; |
||||
|
COMMENT ON COLUMN customer_service_role.create_time IS '创建时间'; |
||||
|
COMMENT ON COLUMN customer_service_role.update_time IS '更新时间'; |
||||
|
COMMENT ON COLUMN customer_service_role.is_delete IS '逻辑删除'; |
||||
|
|
||||
|
-- 默认角色种子数据 |
||||
|
INSERT INTO customer_service_role (role_key, name, description, sort_order, enabled) |
||||
|
VALUES ('general', '客服', '通用客服角色', 0, TRUE) |
||||
|
ON CONFLICT (role_key) DO NOTHING; |
||||
|
|
||||
|
INSERT INTO customer_service_role (role_key, name, description, sort_order, enabled) |
||||
|
VALUES ('finance', '财务', '财务相关客服角色', 1, TRUE) |
||||
|
ON CONFLICT (role_key) DO NOTHING; |
||||
|
|
||||
|
INSERT INTO customer_service_role (role_key, name, description, sort_order, enabled) |
||||
|
VALUES ('administration', '行政', '行政相关客服角色', 2, TRUE) |
||||
|
ON CONFLICT (role_key) DO NOTHING; |
||||
|
|
||||
|
-- ============================================================ |
||||
|
-- 表 5: customer_service_role_category — 角色知识库关联表 |
||||
|
-- ============================================================ |
||||
|
CREATE TABLE IF NOT EXISTS customer_service_role_category ( |
||||
|
id BIGSERIAL PRIMARY KEY, |
||||
|
role_id BIGINT NOT NULL, |
||||
|
category_id BIGINT NOT NULL, |
||||
|
create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, |
||||
|
is_delete BOOLEAN NOT NULL DEFAULT FALSE, |
||||
|
CONSTRAINT uq_role_category UNIQUE (role_id, category_id) |
||||
|
); |
||||
|
|
||||
|
CREATE INDEX IF NOT EXISTS idx_customer_service_role_category_role ON customer_service_role_category (role_id); |
||||
|
CREATE INDEX IF NOT EXISTS idx_customer_service_role_category_category ON customer_service_role_category (category_id); |
||||
|
|
||||
|
COMMENT ON TABLE customer_service_role_category IS '客服角色知识库关联表'; |
||||
|
COMMENT ON COLUMN customer_service_role_category.id IS '主键'; |
||||
|
COMMENT ON COLUMN customer_service_role_category.role_id IS '角色ID'; |
||||
|
COMMENT ON COLUMN customer_service_role_category.category_id IS '分类ID'; |
||||
|
COMMENT ON COLUMN customer_service_role_category.create_time IS '创建时间'; |
||||
|
COMMENT ON COLUMN customer_service_role_category.is_delete IS '逻辑删除'; |
||||
|
|
||||
|
-- ============================================================ |
||||
|
-- 表 6: customer_account — 客服账号表 |
||||
|
-- ============================================================ |
||||
|
CREATE TABLE IF NOT EXISTS customer_account ( |
||||
|
id BIGSERIAL PRIMARY KEY, |
||||
|
account_key VARCHAR(64) NOT NULL UNIQUE, |
||||
|
name VARCHAR(100) NOT NULL, |
||||
|
description TEXT, |
||||
|
role_id BIGINT, |
||||
|
enabled BOOLEAN NOT NULL DEFAULT TRUE, |
||||
|
create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, |
||||
|
update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, |
||||
|
is_delete BOOLEAN NOT NULL DEFAULT FALSE |
||||
|
); |
||||
|
|
||||
|
CREATE INDEX IF NOT EXISTS idx_customer_account_role ON customer_account (role_id); |
||||
|
CREATE INDEX IF NOT EXISTS idx_customer_account_enabled ON customer_account (enabled, id); |
||||
|
|
||||
|
COMMENT ON TABLE customer_account IS '客服账号表'; |
||||
|
COMMENT ON COLUMN customer_account.id IS '主键'; |
||||
|
COMMENT ON COLUMN customer_account.account_key IS '账号标识符(唯一)'; |
||||
|
COMMENT ON COLUMN customer_account.name IS '账号名称'; |
||||
|
COMMENT ON COLUMN customer_account.description IS '账号描述'; |
||||
|
COMMENT ON COLUMN customer_account.role_id IS '关联角色ID'; |
||||
|
COMMENT ON COLUMN customer_account.enabled IS '是否启用'; |
||||
|
COMMENT ON COLUMN customer_account.create_time IS '创建时间'; |
||||
|
COMMENT ON COLUMN customer_account.update_time IS '更新时间'; |
||||
|
COMMENT ON COLUMN customer_account.is_delete IS '逻辑删除'; |
||||
|
|
||||
|
-- 默认账号种子数据(引用角色表的 ID) |
||||
|
INSERT INTO customer_account (account_key, name, description, role_id, enabled) |
||||
|
SELECT 'service', '客服账号', '通用客服账号', id, TRUE |
||||
|
FROM customer_service_role WHERE role_key = 'general' |
||||
|
ON CONFLICT (account_key) DO NOTHING; |
||||
|
|
||||
|
INSERT INTO customer_account (account_key, name, description, role_id, enabled) |
||||
|
SELECT 'finance', '财务账号', '财务客服账号', id, TRUE |
||||
|
FROM customer_service_role WHERE role_key = 'finance' |
||||
|
ON CONFLICT (account_key) DO NOTHING; |
||||
|
|
||||
|
INSERT INTO customer_account (account_key, name, description, role_id, enabled) |
||||
|
SELECT 'administration', '行政账号', '行政客服账号', id, TRUE |
||||
|
FROM customer_service_role WHERE role_key = 'administration' |
||||
|
ON CONFLICT (account_key) DO NOTHING; |
||||
|
|
||||
|
-- ============================================================ |
||||
|
-- 表 7: conversation_session — 会话归属表 |
||||
|
-- ============================================================ |
||||
|
CREATE TABLE IF NOT EXISTS conversation_session ( |
||||
|
conversation_id VARCHAR(64) PRIMARY KEY, |
||||
|
account_id BIGINT, |
||||
|
role_id BIGINT, |
||||
|
create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, |
||||
|
update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP |
||||
|
); |
||||
|
|
||||
|
CREATE INDEX IF NOT EXISTS idx_conversation_session_account ON conversation_session (account_id); |
||||
|
CREATE INDEX IF NOT EXISTS idx_conversation_session_role ON conversation_session (role_id); |
||||
|
|
||||
|
COMMENT ON TABLE conversation_session IS '会话归属表'; |
||||
|
COMMENT ON COLUMN conversation_session.conversation_id IS '会话ID(主键)'; |
||||
|
COMMENT ON COLUMN conversation_session.account_id IS '归属账号ID'; |
||||
|
COMMENT ON COLUMN conversation_session.role_id IS '归属角色ID'; |
||||
|
COMMENT ON COLUMN conversation_session.create_time IS '创建时间'; |
||||
|
COMMENT ON COLUMN conversation_session.update_time IS '更新时间'; |
||||
|
|
||||
|
-- ============================================================ |
||||
|
-- 表 8: ai_model_config — AI 大模型配置表 |
||||
|
-- ============================================================ |
||||
|
CREATE TABLE IF NOT EXISTS ai_model_config ( |
||||
|
id BIGSERIAL PRIMARY KEY, |
||||
|
name VARCHAR(100) NOT NULL, |
||||
|
app_type VARCHAR(50) NOT NULL, |
||||
|
provider VARCHAR(50) NOT NULL DEFAULT 'dashscope', |
||||
|
api_key VARCHAR(512) NOT NULL, |
||||
|
model_name VARCHAR(100) NOT NULL, |
||||
|
temperature DOUBLE PRECISION DEFAULT 0.7, |
||||
|
max_tokens INTEGER DEFAULT 2000, |
||||
|
base_url VARCHAR(512), |
||||
|
extra_config JSONB NOT NULL DEFAULT '{}', |
||||
|
is_active BOOLEAN NOT NULL DEFAULT FALSE, |
||||
|
priority INTEGER NOT NULL DEFAULT 0, |
||||
|
description TEXT, |
||||
|
create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, |
||||
|
update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, |
||||
|
is_delete BOOLEAN NOT NULL DEFAULT FALSE |
||||
|
); |
||||
|
|
||||
|
CREATE INDEX IF NOT EXISTS idx_ai_model_config_app_type ON ai_model_config (app_type); |
||||
|
CREATE INDEX IF NOT EXISTS idx_ai_model_config_is_active ON ai_model_config (is_active); |
||||
|
CREATE INDEX IF NOT EXISTS idx_ai_model_config_provider ON ai_model_config (provider); |
||||
|
|
||||
|
COMMENT ON TABLE ai_model_config IS 'AI 大模型配置表'; |
||||
|
COMMENT ON COLUMN ai_model_config.id IS '主键'; |
||||
|
COMMENT ON COLUMN ai_model_config.name IS '配置名称'; |
||||
|
COMMENT ON COLUMN ai_model_config.app_type IS '应用类型: CHAT / PRODUCT_EXTRACT / EMBEDDING / RAG_REWRITE'; |
||||
|
COMMENT ON COLUMN ai_model_config.provider IS '模型提供商'; |
||||
|
COMMENT ON COLUMN ai_model_config.api_key IS 'API Key'; |
||||
|
COMMENT ON COLUMN ai_model_config.model_name IS '模型名称'; |
||||
|
COMMENT ON COLUMN ai_model_config.temperature IS '温度参数'; |
||||
|
COMMENT ON COLUMN ai_model_config.max_tokens IS '最大Token数'; |
||||
|
COMMENT ON COLUMN ai_model_config.base_url IS 'API 基础地址'; |
||||
|
COMMENT ON COLUMN ai_model_config.extra_config IS '扩展配置(JSON,如向量维度等)'; |
||||
|
COMMENT ON COLUMN ai_model_config.is_active IS '是否活跃(同类型互斥)'; |
||||
|
COMMENT ON COLUMN ai_model_config.priority IS '优先级'; |
||||
|
COMMENT ON COLUMN ai_model_config.description IS '描述'; |
||||
|
COMMENT ON COLUMN ai_model_config.create_time IS '创建时间'; |
||||
|
COMMENT ON COLUMN ai_model_config.update_time IS '更新时间'; |
||||
|
COMMENT ON COLUMN ai_model_config.is_delete IS '逻辑删除'; |
||||
|
|
||||
|
-- 默认模型配置种子数据(api_key 占位,部署后在前端修改) |
||||
|
INSERT INTO ai_model_config (name, app_type, provider, api_key, model_name, temperature, max_tokens, is_active, description) |
||||
|
VALUES ('Chat Default', 'CHAT', 'dashscope', 'sk-placeholder', 'qwen-turbo', 0.7, 2000, TRUE, '默认对话模型配置') |
||||
|
ON CONFLICT DO NOTHING; |
||||
|
|
||||
|
INSERT INTO ai_model_config (name, app_type, provider, api_key, model_name, temperature, max_tokens, is_active, description) |
||||
|
VALUES ('Product Extract Default', 'PRODUCT_EXTRACT', 'dashscope', 'sk-placeholder', 'qwen-turbo', 0.1, 2000, TRUE, '默认产品信息提取模型配置') |
||||
|
ON CONFLICT DO NOTHING; |
||||
|
|
||||
|
INSERT INTO ai_model_config (name, app_type, provider, api_key, model_name, temperature, max_tokens, is_active, extra_config, description) |
||||
|
VALUES ('Embedding Default', 'EMBEDDING', 'dashscope', 'sk-placeholder', 'text-embedding-v2', 0.0, 2000, TRUE, '{"dimensions": 1024}', '默认向量化模型配置') |
||||
|
ON CONFLICT DO NOTHING; |
||||
|
|
||||
|
INSERT INTO ai_model_config (name, app_type, provider, api_key, model_name, temperature, max_tokens, is_active, description) |
||||
|
VALUES ('RAG Rewrite Default', 'RAG_REWRITE', 'dashscope', 'sk-placeholder', 'qwen-turbo', 0.3, 2000, TRUE, '默认 RAG 查询重写模型配置') |
||||
|
ON CONFLICT DO NOTHING; |
||||
|
|
||||
|
-- ============================================================ |
||||
|
-- 表 9: vector_store — 向量存储表 |
||||
|
-- 注意: Spring AI PgVectorStore 配置了 initializeSchema(true), |
||||
|
-- 应用启动时会自动建表。此处手动建表作为备份方案。 |
||||
|
-- 向量维度默认 1024,如使用不同维度的 Embedding 模型 |
||||
|
-- 需修改下面的 VECTOR(1024) 并重建。 |
||||
|
-- ============================================================ |
||||
|
CREATE TABLE IF NOT EXISTS vector_store ( |
||||
|
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), |
||||
|
content TEXT NOT NULL, |
||||
|
metadata JSONB NOT NULL DEFAULT '{}', |
||||
|
embedding VECTOR(1024) NOT NULL, |
||||
|
create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, |
||||
|
update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP |
||||
|
); |
||||
|
|
||||
|
-- HNSW 向量索引(余弦距离) |
||||
|
CREATE INDEX IF NOT EXISTS idx_vector_store_embedding ON vector_store |
||||
|
USING hnsw (embedding vector_cosine_ops) WITH (m = 16, ef_construction = 64); |
||||
|
|
||||
|
CREATE INDEX IF NOT EXISTS idx_vector_store_create_time ON vector_store (create_time DESC); |
||||
|
|
||||
|
-- JSONB 元数据 GIN 索引 |
||||
|
CREATE INDEX IF NOT EXISTS idx_vector_store_metadata ON vector_store USING gin (metadata); |
||||
|
|
||||
|
COMMENT ON TABLE vector_store IS '向量存储表(RAG 知识库向量化数据)'; |
||||
|
COMMENT ON COLUMN vector_store.id IS '主键(UUID)'; |
||||
|
COMMENT ON COLUMN vector_store.content IS '文档内容'; |
||||
|
COMMENT ON COLUMN vector_store.metadata IS '元数据(JSON)'; |
||||
|
COMMENT ON COLUMN vector_store.embedding IS '向量嵌入(维度 1024)'; |
||||
|
COMMENT ON COLUMN vector_store.create_time IS '创建时间'; |
||||
|
COMMENT ON COLUMN vector_store.update_time IS '更新时间'; |
||||
|
|
||||
|
-- ============================================================ |
||||
|
-- 完成 |
||||
|
-- ============================================================ |
||||
|
\echo '==========================================' |
||||
|
\echo '数据库 support_bot 初始化完成!' |
||||
|
\echo '共创建 9 张表及对应索引。' |
||||
|
\echo '默认 api-key 为占位符,请在前端' |
||||
|
\echo '「AI 大模型配置管理」页面修改为真实值。' |
||||
|
\echo '==========================================' |
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue