feat(ai): 新增AI模块功能
- 添加Ollama配置参数,包括基础URL、模型设置、超时配置等 - 创建AI知识库相关数据库表(文档表和分段表) - 实现AI数据分析服务,支持订单数据查询和分析 - 开发AI聊天控制器,提供模型列表、对话和流式对话功能 - 构建知识库RAG服务,支持文档上传、CMS同步和问答功能 - 添加多种AI相关的DTO类和实体类 - 实现AI嵌入向量计算和相似度匹配算法 - 集成Tika用于文档内容提取和解析
This commit is contained in:
61
docs/ai/README.md
Normal file
61
docs/ai/README.md
Normal file
@@ -0,0 +1,61 @@
|
||||
# AI 模块(Ollama + RAG + 订单分析)
|
||||
|
||||
## 1. 配置
|
||||
|
||||
见 `src/main/resources/application.yml`:
|
||||
|
||||
- `ai.ollama.base-url`:主地址(例如 `https://ai-api.websoft.top`)
|
||||
- `ai.ollama.fallback-url`:备用地址(例如 `http://47.119.165.234:11434`)
|
||||
- `ai.ollama.chat-model`:对话模型(`qwen3.5:cloud`)
|
||||
- `ai.ollama.embed-model`:向量模型(`qwen3-embedding:4b`)
|
||||
|
||||
## 2. 建表(知识库)
|
||||
|
||||
执行:`docs/ai/ai_kb_tables.sql`
|
||||
|
||||
## 3. API
|
||||
|
||||
说明:所有接口默认需要登录(`@PreAuthorize("isAuthenticated()")`),并且要求能够拿到 `tenantId`(header 或登录用户)。
|
||||
|
||||
### 3.1 对话
|
||||
|
||||
- `GET /api/ai/models`:获取 Ollama 模型列表
|
||||
- `POST /api/ai/chat`:非流式对话
|
||||
- `POST /api/ai/chat/stream`:流式对话(SSE)
|
||||
- `GET /api/ai/chat/stream?prompt=...`:流式对话(SSE,适配 EventSource)
|
||||
|
||||
请求示例(非流式):
|
||||
```json
|
||||
{
|
||||
"prompt": "帮我写一个退款流程说明"
|
||||
}
|
||||
```
|
||||
|
||||
### 3.2 知识库(RAG)
|
||||
|
||||
- `POST /api/ai/kb/upload`:上传文档入库(建议 txt/md/html)
|
||||
- `POST /api/ai/kb/sync/cms`:同步 CMS 已发布文章到知识库(当前租户)
|
||||
- `POST /api/ai/kb/query`:仅检索 topK
|
||||
- `POST /api/ai/kb/ask`:检索 + 生成答案(答案要求引用 chunk_id)
|
||||
|
||||
请求示例(ask):
|
||||
```json
|
||||
{
|
||||
"question": "怎么开具发票?",
|
||||
"topK": 5
|
||||
}
|
||||
```
|
||||
|
||||
### 3.3 商城订单分析(按租户/按天)
|
||||
|
||||
- `POST /api/ai/analytics/query`:返回按天指标数据
|
||||
- `POST /api/ai/analytics/ask`:基于指标数据生成分析结论
|
||||
|
||||
请求示例(ask):
|
||||
```json
|
||||
{
|
||||
"question": "最近30天支付率有没有明显下滑?请给出原因排查建议。",
|
||||
"startDate": "2026-02-01",
|
||||
"endDate": "2026-02-27"
|
||||
}
|
||||
```
|
||||
39
docs/ai/ai_kb_tables.sql
Normal file
39
docs/ai/ai_kb_tables.sql
Normal file
@@ -0,0 +1,39 @@
|
||||
-- AI 知识库(RAG)建表脚本(MySQL)
|
||||
-- 说明:本项目使用 MyBatis-Plus 默认命名规则(AiKbDocument -> ai_kb_document)。
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `ai_kb_document` (
|
||||
`document_id` INT NOT NULL AUTO_INCREMENT COMMENT '文档ID',
|
||||
`title` VARCHAR(255) NULL COMMENT '标题',
|
||||
`source_type` VARCHAR(32) NULL COMMENT '来源类型:upload/cms',
|
||||
`source_id` INT NULL COMMENT '来源ID(如 cms.article_id)',
|
||||
`source_ref` VARCHAR(255) NULL COMMENT '来源引用(如文件名、文章 code)',
|
||||
`content_hash` CHAR(64) NULL COMMENT '内容hash(SHA-256),用于增量同步',
|
||||
`status` TINYINT NULL DEFAULT 0 COMMENT '状态',
|
||||
`deleted` TINYINT NULL DEFAULT 0 COMMENT '逻辑删除:0否1是',
|
||||
`tenant_id` INT NOT NULL COMMENT '租户ID',
|
||||
`update_time` DATETIME NULL COMMENT '更新时间',
|
||||
`create_time` DATETIME NULL COMMENT '创建时间',
|
||||
PRIMARY KEY (`document_id`),
|
||||
KEY `idx_ai_kb_document_tenant` (`tenant_id`),
|
||||
KEY `idx_ai_kb_document_source` (`tenant_id`, `source_type`, `source_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='AI 知识库文档';
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `ai_kb_chunk` (
|
||||
`id` INT NOT NULL AUTO_INCREMENT COMMENT '自增ID',
|
||||
`document_id` INT NOT NULL COMMENT '文档ID',
|
||||
`chunk_id` VARCHAR(64) NOT NULL COMMENT 'chunk 唯一ID(用于引用)',
|
||||
`chunk_index` INT NULL COMMENT 'chunk 序号',
|
||||
`title` VARCHAR(255) NULL COMMENT '标题(冗余,便于展示)',
|
||||
`content` LONGTEXT NULL COMMENT 'chunk 文本',
|
||||
`content_hash` CHAR(64) NULL COMMENT 'chunk 内容hash',
|
||||
`embedding` LONGTEXT NULL COMMENT 'embedding(JSON数组)',
|
||||
`embedding_norm` DOUBLE NULL COMMENT 'embedding L2 范数',
|
||||
`deleted` TINYINT NULL DEFAULT 0 COMMENT '逻辑删除:0否1是',
|
||||
`tenant_id` INT NOT NULL COMMENT '租户ID',
|
||||
`create_time` DATETIME NULL COMMENT '创建时间',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uk_ai_kb_chunk_chunk_id` (`chunk_id`),
|
||||
KEY `idx_ai_kb_chunk_tenant` (`tenant_id`),
|
||||
KEY `idx_ai_kb_chunk_document` (`document_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='AI 知识库 chunk';
|
||||
|
||||
Reference in New Issue
Block a user