-- ============================= -- 知识库管理模块 -- 支持:招投标知识库、客服知识库、企业内部知识库 -- ============================= 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, -- 流水号 agent_id VARCHAR(50) NOT NULL, -- 智能体id knowledge_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格式:索引配置、检索参数等) service_type VARCHAR(50), -- 服务类型(bidding/customer_service/internal,冗余kb_type便于查询) 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 (knowledge_id), UNIQUE (optsn) ); CREATE INDEX idx_kb_type ON knowledge.tb_knowledge_base(kb_type) WHERE deleted = false; CREATE INDEX idx_kb_service ON knowledge.tb_knowledge_base(service_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.service_type IS '服务类型(冗余存储便于快速过滤,与kb_type保持一致)'; 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 knowledge_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 INTEGER DEFAULT 1, -- 文档版本号(仅做记录) root_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 service_type VARCHAR(50), -- 服务类型(继承自知识库) 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), ); CREATE INDEX idx_doc_kb ON knowledge.tb_knowledge_document(knowledge_id) WHERE deleted = false; CREATE INDEX idx_doc_service ON knowledge.tb_knowledge_document(service_type) 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; CREATE INDEX idx_doc_root ON knowledge.tb_knowledge_document(root_doc_id) WHERE deleted = false; COMMENT ON TABLE knowledge.tb_knowledge_document IS '知识文档表(文档级元数据,版本控制在chunk级别)'; COMMENT ON COLUMN knowledge.tb_knowledge_document.service_type IS '服务类型(从知识库继承,用于服务间隔离)'; COMMENT ON COLUMN knowledge.tb_knowledge_document.version IS '文档版本号(仅做记录,实际版本控制在chunk级别)'; COMMENT ON COLUMN knowledge.tb_knowledge_document.root_doc_id IS '根文档ID(用于文档整体版本管理,可选)'; 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 knowledge_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-图片 version INTEGER DEFAULT 1, -- chunk版本号(每次修改自动+1) root_chunk_id VARCHAR(50), -- 根chunk ID(同一chunk的不同版本共享此ID) is_current BOOLEAN DEFAULT true, -- 是否当前使用的版本 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), ); 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(knowledge_id) WHERE deleted = false; CREATE INDEX idx_chunk_root_current ON knowledge.tb_knowledge_chunk(root_chunk_id, is_current) WHERE deleted = false; CREATE INDEX idx_chunk_current ON knowledge.tb_knowledge_chunk(is_current) WHERE deleted = false AND is_current = true; -- 向量检索索引(需要安装pgvector扩展,建议只索引当前版本) -- CREATE INDEX idx_chunk_embedding ON knowledge.tb_knowledge_chunk USING ivfflat (embedding vector_cosine_ops) WITH (lists = 100) WHERE deleted = false AND is_current = true; COMMENT ON TABLE knowledge.tb_knowledge_chunk IS '知识文档片段表(RAG检索基本单位,支持chunk级版本控制)'; COMMENT ON COLUMN knowledge.tb_knowledge_chunk.version IS 'chunk版本号(整数,每次修改自动+1)'; COMMENT ON COLUMN knowledge.tb_knowledge_chunk.root_chunk_id IS '根chunk ID(同一chunk的所有版本共享此ID,首次创建时等于chunk_id)'; COMMENT ON COLUMN knowledge.tb_knowledge_chunk.is_current IS '是否当前使用的版本(每个root_chunk_id只有一个is_current=true,RAG检索时只使用当前版本)'; COMMENT ON COLUMN knowledge.tb_knowledge_chunk.embedding IS '向量嵌入(需要pgvector扩展,建议只为is_current=true的chunk生成)'; -- 知识访问日志表 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 knowledge_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(knowledge_id, create_time DESC); COMMENT ON TABLE knowledge.tb_knowledge_access_log IS '知识访问日志表';