-- ============================= -- 知识库管理模块 -- 支持:招投标知识库、客服知识库、企业内部知识库 -- ============================= CREATE SCHEMA IF NOT EXISTS knowledge; -- 知识库表(多租户知识库定义) DROP TABLE IF EXISTS knowledge.tb_knowledge_base CASCADE; CREATE TABLE knowledge.tb_knowledge_base ( optsn VARCHAR(50) NOT NULL, -- 流水号 kb_id VARCHAR(50) NOT NULL, -- 知识库ID name VARCHAR(255) NOT NULL, -- 知识库名称 kb_type VARCHAR(50) NOT NULL, -- 知识库类型:bidding-招投标/customer_service-客服/internal-内部协同 access_level VARCHAR(20) NOT NULL DEFAULT 'private', -- 访问级别:public-公开/private-私有/internal-内部 description TEXT, -- 知识库描述 storage_path VARCHAR(500), -- 存储路径 version VARCHAR(20) DEFAULT '1.0', -- 当前版本号 config JSONB DEFAULT NULL, -- 知识库配置(JSON格式:索引配置、检索参数等) dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径 status VARCHAR(20) NOT NULL DEFAULT 'active', -- 状态:active-激活/inactive-停用/archived-归档 creator VARCHAR(50) DEFAULT NULL, -- 创建者 updater VARCHAR(50) DEFAULT NULL, -- 更新者 create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间 delete_time TIMESTAMPTZ DEFAULT NULL, -- 删除时间 deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除 PRIMARY KEY (kb_id), UNIQUE (optsn) ); CREATE INDEX idx_kb_type ON knowledge.tb_knowledge_base(kb_type) WHERE deleted = false; CREATE INDEX idx_kb_dept_path ON knowledge.tb_knowledge_base(dept_path) WHERE deleted = false; COMMENT ON TABLE knowledge.tb_knowledge_base IS '知识库表'; COMMENT ON COLUMN knowledge.tb_knowledge_base.kb_type IS '知识库类型:bidding-招投标/customer_service-客服/internal-内部协同'; COMMENT ON COLUMN knowledge.tb_knowledge_base.access_level IS '访问级别:public-公开/private-私有/internal-内部'; -- 知识文档表 DROP TABLE IF EXISTS knowledge.tb_knowledge_document CASCADE; CREATE TABLE knowledge.tb_knowledge_document ( optsn VARCHAR(50) NOT NULL, -- 流水号 doc_id VARCHAR(50) NOT NULL, -- 文档ID kb_id VARCHAR(50) NOT NULL, -- 所属知识库ID title VARCHAR(500) NOT NULL, -- 文档标题 doc_type VARCHAR(50) NOT NULL, -- 文档类型:text-文本/pdf/word/excel/image/video category VARCHAR(100), -- 文档分类(自动或手动分类) content TEXT, -- 文档内容(文本类型) content_summary TEXT, -- 内容摘要(AI生成) file_id VARCHAR(50), -- 关联文件表ID file_path VARCHAR(500), -- 文件路径 file_size BIGINT, -- 文件大小(字节) mime_type VARCHAR(100), -- MIME类型 version VARCHAR(20) DEFAULT '1.0', -- 文档版本号 parent_doc_id VARCHAR(50), -- 父文档ID(用于版本管理) tags TEXT[], -- 文档标签数组 keywords TEXT[], -- 关键词数组(AI提取) embedding_status VARCHAR(20) DEFAULT 'pending', -- 向量化状态:pending-待处理/processing-处理中/completed-完成/failed-失败 embedding_model VARCHAR(100), -- 使用的向量化模型 chunk_count INTEGER DEFAULT 0, -- 切片数量 metadata JSONB DEFAULT NULL, -- 文档元数据(JSON格式) source_url VARCHAR(500), -- 来源URL dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径 status VARCHAR(20) NOT NULL DEFAULT 'active', -- 状态:active-激活/inactive-停用/archived-归档 creator VARCHAR(50) DEFAULT NULL, -- 创建者 updater VARCHAR(50) DEFAULT NULL, -- 更新者 create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间 delete_time TIMESTAMPTZ DEFAULT NULL, -- 删除时间 deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除 PRIMARY KEY (doc_id), UNIQUE (optsn), FOREIGN KEY (kb_id) REFERENCES knowledge.tb_knowledge_base(kb_id) ); CREATE INDEX idx_doc_kb ON knowledge.tb_knowledge_document(kb_id) WHERE deleted = false; CREATE INDEX idx_doc_category ON knowledge.tb_knowledge_document(category) WHERE deleted = false; CREATE INDEX idx_doc_embedding_status ON knowledge.tb_knowledge_document(embedding_status) WHERE deleted = false; CREATE INDEX idx_doc_tags ON knowledge.tb_knowledge_document USING GIN(tags) WHERE deleted = false; COMMENT ON TABLE knowledge.tb_knowledge_document IS '知识文档表'; COMMENT ON COLUMN knowledge.tb_knowledge_document.embedding_status IS '向量化状态:pending/processing/completed/failed'; -- 知识文档片段表(用于RAG检索) DROP TABLE IF EXISTS knowledge.tb_knowledge_chunk CASCADE; CREATE TABLE knowledge.tb_knowledge_chunk ( optsn VARCHAR(50) NOT NULL, -- 流水号 chunk_id VARCHAR(50) NOT NULL, -- 片段ID doc_id VARCHAR(50) NOT NULL, -- 所属文档ID kb_id VARCHAR(50) NOT NULL, -- 所属知识库ID chunk_index INTEGER NOT NULL, -- 片段索引(在文档中的顺序) content TEXT NOT NULL, -- 片段内容 content_length INTEGER, -- 内容长度 embedding vector(1536), -- 向量嵌入(假设使用OpenAI 1536维) chunk_type VARCHAR(20) DEFAULT 'text', -- 片段类型:text-文本/table-表格/image-图片 position_info JSONB, -- 位置信息(页码、坐标等) metadata JSONB, -- 片段元数据 dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径 creator VARCHAR(50) DEFAULT NULL, -- 创建者 create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间 deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除 PRIMARY KEY (chunk_id), UNIQUE (optsn), FOREIGN KEY (doc_id) REFERENCES knowledge.tb_knowledge_document(doc_id), FOREIGN KEY (kb_id) REFERENCES knowledge.tb_knowledge_base(kb_id) ); CREATE INDEX idx_chunk_doc ON knowledge.tb_knowledge_chunk(doc_id) WHERE deleted = false; CREATE INDEX idx_chunk_kb ON knowledge.tb_knowledge_chunk(kb_id) WHERE deleted = false; -- 向量检索索引(需要安装pgvector扩展) -- CREATE INDEX idx_chunk_embedding ON knowledge.tb_knowledge_chunk USING ivfflat (embedding vector_cosine_ops) WITH (lists = 100); COMMENT ON TABLE knowledge.tb_knowledge_chunk IS '知识文档片段表(RAG检索)'; COMMENT ON COLUMN knowledge.tb_knowledge_chunk.embedding IS '向量嵌入(需要pgvector扩展)'; -- 知识访问日志表 DROP TABLE IF EXISTS knowledge.tb_knowledge_access_log CASCADE; CREATE TABLE knowledge.tb_knowledge_access_log ( optsn VARCHAR(50) NOT NULL, -- 流水号 log_id VARCHAR(50) NOT NULL, -- 日志ID kb_id VARCHAR(50), -- 知识库ID doc_id VARCHAR(50), -- 文档ID user_id VARCHAR(50) NOT NULL, -- 用户ID access_type VARCHAR(20) NOT NULL, -- 访问类型:view-查看/download-下载/search-搜索/edit-编辑 query_text TEXT, -- 搜索查询文本 result_count INTEGER, -- 搜索结果数量 ip_address VARCHAR(45), -- IP地址 user_agent TEXT, -- 用户代理 dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径 create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 PRIMARY KEY (log_id), UNIQUE (optsn) ); CREATE INDEX idx_access_log_user ON knowledge.tb_knowledge_access_log(user_id, create_time DESC); CREATE INDEX idx_access_log_kb ON knowledge.tb_knowledge_access_log(kb_id, create_time DESC); COMMENT ON TABLE knowledge.tb_knowledge_access_log IS '知识访问日志表';