优化AI,使用qwen
This commit is contained in:
@@ -0,0 +1,79 @@
|
||||
CREATE TABLE IF NOT EXISTS `la_ai_kb_document` (
|
||||
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
|
||||
`domain` varchar(32) NOT NULL DEFAULT '' COMMENT 'article/post/lottery',
|
||||
`subtype` varchar(32) NOT NULL DEFAULT '' COMMENT 'article/post/draw_result/ai_history',
|
||||
`source_id` bigint unsigned NOT NULL DEFAULT 0,
|
||||
`title` varchar(255) NOT NULL DEFAULT '',
|
||||
`summary` text NULL,
|
||||
`canonical_text` longtext NULL,
|
||||
`keywords` text NULL,
|
||||
`metadata_json` json NULL,
|
||||
`source_created_at` int unsigned NOT NULL DEFAULT 0,
|
||||
`source_updated_at` int unsigned NOT NULL DEFAULT 0,
|
||||
`content_hash` varchar(64) NOT NULL DEFAULT '',
|
||||
`is_active` tinyint unsigned NOT NULL DEFAULT 1,
|
||||
`create_time` int unsigned NOT NULL DEFAULT 0,
|
||||
`update_time` int unsigned NOT NULL DEFAULT 0,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uk_domain_subtype_source` (`domain`, `subtype`, `source_id`),
|
||||
KEY `idx_domain_active` (`domain`, `is_active`),
|
||||
KEY `idx_source_updated` (`source_updated_at`),
|
||||
FULLTEXT KEY `ft_doc_text` (`title`, `summary`, `canonical_text`, `keywords`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='AI知识库文档主表';
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `la_ai_kb_chunk` (
|
||||
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
|
||||
`document_id` bigint unsigned NOT NULL DEFAULT 0,
|
||||
`collection_name` varchar(32) NOT NULL DEFAULT 'global',
|
||||
`chunk_index` int unsigned NOT NULL DEFAULT 0,
|
||||
`chunk_text` mediumtext NULL,
|
||||
`embedding_json` mediumtext NULL,
|
||||
`embedding_model` varchar(100) NOT NULL DEFAULT '',
|
||||
`embedding_dim` int unsigned NOT NULL DEFAULT 0,
|
||||
`vector_norm` decimal(20,8) NOT NULL DEFAULT 0.00000000,
|
||||
`keyword_text` text NULL,
|
||||
`create_time` int unsigned NOT NULL DEFAULT 0,
|
||||
`update_time` int unsigned NOT NULL DEFAULT 0,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uk_document_chunk` (`document_id`, `chunk_index`),
|
||||
KEY `idx_document` (`document_id`),
|
||||
KEY `idx_collection` (`collection_name`),
|
||||
FULLTEXT KEY `ft_chunk_text` (`chunk_text`, `keyword_text`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='AI知识库切片表';
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `la_ai_kb_sync_job` (
|
||||
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
|
||||
`domain` varchar(32) NOT NULL DEFAULT '',
|
||||
`subtype` varchar(32) NOT NULL DEFAULT '',
|
||||
`source_id` bigint unsigned NOT NULL DEFAULT 0,
|
||||
`action` varchar(16) NOT NULL DEFAULT 'upsert',
|
||||
`priority` int unsigned NOT NULL DEFAULT 100,
|
||||
`status` tinyint unsigned NOT NULL DEFAULT 0 COMMENT '0待处理1处理中2成功3失败',
|
||||
`retry_count` int unsigned NOT NULL DEFAULT 0,
|
||||
`error_msg` varchar(500) NOT NULL DEFAULT '',
|
||||
`scheduled_at` int unsigned NOT NULL DEFAULT 0,
|
||||
`processed_at` int unsigned NOT NULL DEFAULT 0,
|
||||
`create_time` int unsigned NOT NULL DEFAULT 0,
|
||||
`update_time` int unsigned NOT NULL DEFAULT 0,
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_status_schedule` (`status`, `scheduled_at`),
|
||||
KEY `idx_domain_source` (`domain`, `subtype`, `source_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='AI知识库同步任务表';
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `la_ai_kb_query_log` (
|
||||
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
|
||||
`user_id` int unsigned NOT NULL DEFAULT 0,
|
||||
`scene` varchar(50) NOT NULL DEFAULT '',
|
||||
`ref_id` bigint unsigned NOT NULL DEFAULT 0,
|
||||
`query_text` text NULL,
|
||||
`filters_json` json NULL,
|
||||
`hit_docs_json` json NULL,
|
||||
`tokens_used` int unsigned NOT NULL DEFAULT 0,
|
||||
`cost_ms` int unsigned NOT NULL DEFAULT 0,
|
||||
`status` tinyint unsigned NOT NULL DEFAULT 1 COMMENT '1成功2失败',
|
||||
`create_time` int unsigned NOT NULL DEFAULT 0,
|
||||
`update_time` int unsigned NOT NULL DEFAULT 0,
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_scene_ref` (`scene`, `ref_id`),
|
||||
KEY `idx_user_time` (`user_id`, `create_time`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='AI知识库查询日志';
|
||||
@@ -0,0 +1,39 @@
|
||||
INSERT INTO `la_ai_config` (`name`, `value`, `remark`, `create_time`, `update_time`)
|
||||
SELECT 'embedding_api_key', '', '知识库 Embedding API Key', UNIX_TIMESTAMP(), UNIX_TIMESTAMP()
|
||||
WHERE NOT EXISTS (SELECT 1 FROM `la_ai_config` WHERE `name` = 'embedding_api_key');
|
||||
|
||||
INSERT INTO `la_ai_config` (`name`, `value`, `remark`, `create_time`, `update_time`)
|
||||
SELECT 'embedding_base_url', '', '知识库 Embedding API Base URL', UNIX_TIMESTAMP(), UNIX_TIMESTAMP()
|
||||
WHERE NOT EXISTS (SELECT 1 FROM `la_ai_config` WHERE `name` = 'embedding_base_url');
|
||||
|
||||
INSERT INTO `la_ai_config` (`name`, `value`, `remark`, `create_time`, `update_time`)
|
||||
SELECT 'embedding_model', '', '知识库 Embedding 模型名', UNIX_TIMESTAMP(), UNIX_TIMESTAMP()
|
||||
WHERE NOT EXISTS (SELECT 1 FROM `la_ai_config` WHERE `name` = 'embedding_model');
|
||||
|
||||
INSERT INTO `la_ai_config` (`name`, `value`, `remark`, `create_time`, `update_time`)
|
||||
SELECT 'embedding_dim', '1024', '知识库 Embedding 维度', UNIX_TIMESTAMP(), UNIX_TIMESTAMP()
|
||||
WHERE NOT EXISTS (SELECT 1 FROM `la_ai_config` WHERE `name` = 'embedding_dim');
|
||||
|
||||
INSERT INTO `la_ai_config` (`name`, `value`, `remark`, `create_time`, `update_time`)
|
||||
SELECT 'kb_chunk_size', '600', '知识库切片长度', UNIX_TIMESTAMP(), UNIX_TIMESTAMP()
|
||||
WHERE NOT EXISTS (SELECT 1 FROM `la_ai_config` WHERE `name` = 'kb_chunk_size');
|
||||
|
||||
INSERT INTO `la_ai_config` (`name`, `value`, `remark`, `create_time`, `update_time`)
|
||||
SELECT 'kb_chunk_overlap', '80', '知识库切片重叠长度', UNIX_TIMESTAMP(), UNIX_TIMESTAMP()
|
||||
WHERE NOT EXISTS (SELECT 1 FROM `la_ai_config` WHERE `name` = 'kb_chunk_overlap');
|
||||
|
||||
INSERT INTO `la_ai_config` (`name`, `value`, `remark`, `create_time`, `update_time`)
|
||||
SELECT 'kb_fulltext_topn', '200', '知识库全文候选数量', UNIX_TIMESTAMP(), UNIX_TIMESTAMP()
|
||||
WHERE NOT EXISTS (SELECT 1 FROM `la_ai_config` WHERE `name` = 'kb_fulltext_topn');
|
||||
|
||||
INSERT INTO `la_ai_config` (`name`, `value`, `remark`, `create_time`, `update_time`)
|
||||
SELECT 'kb_vector_topn', '30', '知识库向量重排数量', UNIX_TIMESTAMP(), UNIX_TIMESTAMP()
|
||||
WHERE NOT EXISTS (SELECT 1 FROM `la_ai_config` WHERE `name` = 'kb_vector_topn');
|
||||
|
||||
INSERT INTO `la_ai_config` (`name`, `value`, `remark`, `create_time`, `update_time`)
|
||||
SELECT 'kb_final_topk', '8', '知识库最终召回数量', UNIX_TIMESTAMP(), UNIX_TIMESTAMP()
|
||||
WHERE NOT EXISTS (SELECT 1 FROM `la_ai_config` WHERE `name` = 'kb_final_topk');
|
||||
|
||||
INSERT INTO `la_ai_config` (`name`, `value`, `remark`, `create_time`, `update_time`)
|
||||
SELECT 'post_analysis_prompt', '', '帖子知识库分析提示词', UNIX_TIMESTAMP(), UNIX_TIMESTAMP()
|
||||
WHERE NOT EXISTS (SELECT 1 FROM `la_ai_config` WHERE `name` = 'post_analysis_prompt');
|
||||
@@ -0,0 +1,11 @@
|
||||
INSERT INTO `la_ai_config` (`name`, `value`, `remark`, `create_time`, `update_time`)
|
||||
SELECT 'openai_api_key', '', 'GPT-4o 翻译 API Key', UNIX_TIMESTAMP(), UNIX_TIMESTAMP()
|
||||
WHERE NOT EXISTS (SELECT 1 FROM `la_ai_config` WHERE `name` = 'openai_api_key');
|
||||
|
||||
INSERT INTO `la_ai_config` (`name`, `value`, `remark`, `create_time`, `update_time`)
|
||||
SELECT 'openai_base_url', 'https://api.openai.com', 'GPT-4o 翻译 API Base URL(不带 /v1)', UNIX_TIMESTAMP(), UNIX_TIMESTAMP()
|
||||
WHERE NOT EXISTS (SELECT 1 FROM `la_ai_config` WHERE `name` = 'openai_base_url');
|
||||
|
||||
INSERT INTO `la_ai_config` (`name`, `value`, `remark`, `create_time`, `update_time`)
|
||||
SELECT 'openai_translation_model', 'gpt-4o', '世界杯资讯 / 特朗普帖子翻译模型', UNIX_TIMESTAMP(), UNIX_TIMESTAMP()
|
||||
WHERE NOT EXISTS (SELECT 1 FROM `la_ai_config` WHERE `name` = 'openai_translation_model');
|
||||
@@ -0,0 +1,26 @@
|
||||
INSERT INTO `la_system_menu` (`pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`)
|
||||
SELECT COALESCE((SELECT `pid` FROM `la_system_menu` WHERE `perms` = 'ai.aiConfig/lists' LIMIT 1), 0), 'C', '知识库配置', '', 0, 'ai.kbConfig/lists', 'kb_config', 'ai/kb_config/index', '', '', 0, 1, 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()
|
||||
WHERE NOT EXISTS (SELECT 1 FROM `la_system_menu` WHERE `perms` = 'ai.kbConfig/lists');
|
||||
|
||||
INSERT INTO `la_system_menu` (`pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`)
|
||||
SELECT COALESCE((SELECT `pid` FROM `la_system_menu` WHERE `perms` = 'ai.aiConfig/lists' LIMIT 1), 0), 'C', '知识文档', '', 0, 'ai.kbDocument/lists', 'kb_document', 'ai/kb_document/index', '', '', 0, 1, 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()
|
||||
WHERE NOT EXISTS (SELECT 1 FROM `la_system_menu` WHERE `perms` = 'ai.kbDocument/lists');
|
||||
|
||||
INSERT INTO `la_system_menu` (`pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`)
|
||||
SELECT COALESCE((SELECT `pid` FROM `la_system_menu` WHERE `perms` = 'ai.aiConfig/lists' LIMIT 1), 0), 'C', '同步任务', '', 0, 'ai.kbSyncJob/lists', 'kb_sync_job', 'ai/kb_sync_job/index', '', '', 0, 1, 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()
|
||||
WHERE NOT EXISTS (SELECT 1 FROM `la_system_menu` WHERE `perms` = 'ai.kbSyncJob/lists');
|
||||
|
||||
INSERT INTO `la_system_menu` (`pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`)
|
||||
SELECT COALESCE((SELECT `pid` FROM `la_system_menu` WHERE `perms` = 'ai.aiConfig/lists' LIMIT 1), 0), 'C', '查询日志', '', 0, 'ai.kbQueryLog/lists', 'kb_query_log', 'ai/kb_query_log/index', '', '', 0, 1, 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()
|
||||
WHERE NOT EXISTS (SELECT 1 FROM `la_system_menu` WHERE `perms` = 'ai.kbQueryLog/lists');
|
||||
|
||||
INSERT INTO `la_system_role_menu` (`role_id`, `menu_id`)
|
||||
SELECT 1, m.id
|
||||
FROM `la_system_menu` m
|
||||
WHERE m.`perms` IN ('ai.kbConfig/lists', 'ai.kbDocument/lists', 'ai.kbSyncJob/lists', 'ai.kbQueryLog/lists')
|
||||
AND NOT EXISTS (
|
||||
SELECT 1
|
||||
FROM `la_system_role_menu` rm
|
||||
WHERE rm.`role_id` = 1
|
||||
AND rm.`menu_id` = m.`id`
|
||||
);
|
||||
@@ -0,0 +1,14 @@
|
||||
INSERT INTO `la_system_menu` (`pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`)
|
||||
SELECT 70, 'C', 'AI评论任务', '', 0, 'article.ai_comment_task/lists', 'ai_comment_task', 'article/ai_comment_task/index', '', '', 0, 1, 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()
|
||||
WHERE NOT EXISTS (
|
||||
SELECT 1 FROM `la_system_menu`
|
||||
WHERE `perms` = 'article.ai_comment_task/lists'
|
||||
);
|
||||
|
||||
INSERT INTO `la_system_role_menu` (`role_id`, `menu_id`)
|
||||
SELECT 1, (SELECT id FROM `la_system_menu` WHERE `perms` = 'article.ai_comment_task/lists' LIMIT 1)
|
||||
WHERE NOT EXISTS (
|
||||
SELECT 1 FROM `la_system_role_menu` rm
|
||||
JOIN `la_system_menu` m ON m.id = rm.menu_id
|
||||
WHERE m.perms = 'article.ai_comment_task/lists'
|
||||
);
|
||||
@@ -0,0 +1,7 @@
|
||||
INSERT INTO `la_ai_config` (`name`, `value`, `remark`, `create_time`, `update_time`)
|
||||
SELECT 'mtranserver_base_url', 'http://127.0.0.1:8989', '本地 MTranServer 翻译服务地址', UNIX_TIMESTAMP(), UNIX_TIMESTAMP()
|
||||
WHERE NOT EXISTS (SELECT 1 FROM `la_ai_config` WHERE `name` = 'mtranserver_base_url');
|
||||
|
||||
INSERT INTO `la_ai_config` (`name`, `value`, `remark`, `create_time`, `update_time`)
|
||||
SELECT 'mtranserver_api_token', '', '本地 MTranServer API Token(如未配置可留空)', UNIX_TIMESTAMP(), UNIX_TIMESTAMP()
|
||||
WHERE NOT EXISTS (SELECT 1 FROM `la_ai_config` WHERE `name` = 'mtranserver_api_token');
|
||||
Reference in New Issue
Block a user