371 lines
10 KiB
Markdown
371 lines
10 KiB
Markdown
# 小维AI问答系统接口文档
|
||
|
||
## 1. /upload_qa
|
||
|
||
- **方法**: POST
|
||
- **描述**: 该端点用于上传问答文件。上传的文件可以是 `.txt`, `.md`, `.xls`, `.xlsx` 格式。系统会对上传的文件进行以下处理:
|
||
- 文本分割:将大文本拆分为小段落以提高向量化的效率。
|
||
- 向量化:使用嵌入模型将文本转化为向量。
|
||
- 存储:将向量和元数据存储到数据库和本地向量文件中。
|
||
- **异步处理**:若上传文件较大,处理可能耗时较长,任务会以异步方式执行,前端需通过 `/task_status/<task_id>` 查询任务状态。
|
||
|
||
- **请求参数**:
|
||
- `token` (Header): 用户的身份验证令牌。
|
||
- `method` (FormData): 上传操作的类型,如 `create` 或 `delete`。
|
||
- `qa_name` (FormData): 问答库的名称。
|
||
- `private_flag` (FormData): 问答库的私有标志(整数,1 表示私有,0 表示公开)。
|
||
- `files` (FormData): 上传的文件列表。
|
||
|
||
- **返回值**:
|
||
```json
|
||
{
|
||
"code": 1,
|
||
"message": "任务已提交",
|
||
"task_id": "unique-task-id",
|
||
"qa_name": "知识库名称",
|
||
"time_left": "预计剩余时间(秒)"
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 2. /operate_qa
|
||
|
||
- **方法**: POST
|
||
- **描述**: 该端点用于操作向量库,包括以下功能:
|
||
- 查询问答库中的文件或内容。
|
||
- 编辑现有问答记录。
|
||
- 删除指定问答内容。
|
||
- 新增问答记录。
|
||
|
||
- **请求参数**:
|
||
- `token` (Header): 用户的身份验证令牌。
|
||
- `method` (JSON): 操作类型,支持以下值:
|
||
- `list_qa_files`: 列出问答库中的文件。
|
||
- `list_qa_content`: 列出问答内容。
|
||
- `query_qa_content`: 根据条件查询问答内容。
|
||
- `edit_qa_content`: 编辑问答内容。
|
||
- `delete_qa_content`: 删除指定问答内容。
|
||
- `add_qa_content`: 新增问答内容。
|
||
- `query_fields` (JSON): 查询条件字段(用于精确匹配)。
|
||
- `fuzzy_fields` (JSON): 模糊查询字段(仅对 `query_qa_content` 有效)。
|
||
- `edit_fields` (JSON): 编辑字段(仅对 `edit_qa_content` 有效)。
|
||
|
||
- **返回值**:
|
||
```json
|
||
{
|
||
"code": 1,
|
||
"message": "操作成功",
|
||
"records": [
|
||
{
|
||
"sys_id": "记录ID",
|
||
"question": "问题内容",
|
||
"answer": "回答内容",
|
||
"qa_name": "知识库名称",
|
||
"source": "来源文件名",
|
||
"raw_text": "原始文本",
|
||
"score": "相似度分数"
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 3. /chat_qa
|
||
|
||
- **方法**: POST
|
||
- **描述**: 用户可以通过该端点与问答系统进行交互。系统会根据用户输入的问题,从向量库中查找最相关的问答记录并返回结果。
|
||
|
||
- **请求参数**:
|
||
- `token` (Header): 用户的身份验证令牌。
|
||
- `qa_name` (JSON): 问答库的名称(支持多个)。
|
||
- `query` (JSON): 用户输入的问题。
|
||
- `uuid` (JSON): 用户会话的唯一标识符(可选)。
|
||
|
||
- **返回值**:
|
||
```json
|
||
{
|
||
"code": 1,
|
||
"message": "问题答案",
|
||
"qa_name": "相关知识库",
|
||
"source": "来源文件名",
|
||
"flag": true,
|
||
"related_content": [
|
||
{
|
||
"question": "相关问题",
|
||
"answer": "相关回答",
|
||
"qa_name": "知识库名称",
|
||
"source": "来源文件名",
|
||
"score": "相似度分数"
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 4. /task_status/<task_id>
|
||
|
||
- **方法**: GET
|
||
- **描述**: 查询后台任务的状态。通过任务 ID 检查任务的执行情况。
|
||
|
||
- **请求参数**:
|
||
- `task_id` (Path): 任务的唯一标识符。
|
||
|
||
- **返回值**:
|
||
```json
|
||
{
|
||
"code": 200,
|
||
"message": "任务已完成",
|
||
"status": "SUCCESS"
|
||
}
|
||
```
|
||
或:
|
||
```json
|
||
{
|
||
"code": 200,
|
||
"message": "后台任务正在运行",
|
||
"status": "PENDING"
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 5. /change_question
|
||
|
||
- **方法**: POST
|
||
- **描述**: 用户可以通过该端点更改问题的内容,系统会返回相关的问答记录。
|
||
|
||
- **请求参数**:
|
||
- `qa_name` (JSON): 问答库的名称(支持多个)。
|
||
- `query` (JSON): 用户输入的问题。
|
||
- `cur_page` (JSON): 当前页码(默认为 1)。
|
||
|
||
- **返回值**:
|
||
```json
|
||
{
|
||
"code": 1,
|
||
"message": "",
|
||
"flag": true,
|
||
"related_content": [
|
||
{
|
||
"question": "相关问题",
|
||
"answer": "相关回答",
|
||
"qa_name": "知识库名称",
|
||
"source": "来源文件名",
|
||
"score": "相似度分数"
|
||
}
|
||
],
|
||
"question_counts": "相关问题总数",
|
||
"cur_page": 1
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 6. /default_answers
|
||
|
||
- **方法**: POST
|
||
- **描述**: 管理默认回答,包括新增、更新、删除和查询。
|
||
|
||
- **请求参数**:
|
||
- `token` (Header): 用户的身份验证令牌。
|
||
- `method` (JSON): 操作类型(`add`, `update`, `delete`, `list`)。
|
||
- `qa_name` (JSON): 知识库的名称。
|
||
- `answer` (JSON): 默认回答内容(新增或更新时必填)。
|
||
- `keywords` (JSON): 关键字(可选)。
|
||
|
||
- **返回值**:
|
||
```json
|
||
{
|
||
"code": 1,
|
||
"message": "操作成功",
|
||
"data": [
|
||
{
|
||
"sys_id": "回答ID",
|
||
"answer": "回答内容",
|
||
"keywords": "相关关键字",
|
||
"create_time": "创建时间"
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 7. /transfer_qa
|
||
|
||
- **方法**: POST
|
||
- **描述**: 将问答记录从一个知识库转移到另一个知识库。
|
||
|
||
- **请求参数**:
|
||
- `token` (Header): 用户的身份验证令牌。
|
||
- `target_qa` (JSON): 目标知识库的名称。
|
||
- `qa_ids` (JSON): 要转移的问答记录 ID 列表。
|
||
|
||
- **返回值**:
|
||
```json
|
||
{
|
||
"code": 1,
|
||
"message": "成功转移 3 条问答对",
|
||
"data": {
|
||
"transferred_records": [
|
||
{
|
||
"sys_id": "记录ID",
|
||
"question": "问题",
|
||
"answer": "答案",
|
||
"source_qa": "源知识库"
|
||
}
|
||
],
|
||
"target_qa": "目标知识库"
|
||
}
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 8. /update_qa_fields
|
||
|
||
- **方法**: POST
|
||
- **描述**: 更新问答记录的字段。
|
||
|
||
- **请求参数**:
|
||
- `token` (Header): 用户的身份验证令牌。
|
||
- `sys_id` (JSON): 要更新的问答记录的 ID。
|
||
- `answer_type` (JSON): 新的答案类型。
|
||
- `category` (JSON): 新的分类。
|
||
|
||
- **返回值**:
|
||
```json
|
||
{
|
||
"code": 1,
|
||
"message": "更新成功",
|
||
"data": {
|
||
"sys_id": "记录ID",
|
||
"question": "问题",
|
||
"answer_type": "新答案类型",
|
||
"category": "新分类"
|
||
}
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 数据结构描述
|
||
|
||
### 数据库结构
|
||
- **Roles**: 用户角色表,包含角色 ID 和角色名称。
|
||
- **Users**: 用户表,包含用户 ID、账号、密码哈希和角色 ID。
|
||
- **QAKnowledge**: 问答知识库表,包含问题、答案、来源、知识库名称等。
|
||
- **DefaultAnswers**: 默认回答表,包含默认回答 ID、回答内容、关键字等。
|
||
- **DefaultAnswerConfig**: 默认回答配置表,包含配置的回答 ID 列表、随机使用标志等。
|
||
|
||
---
|
||
|
||
## 交互逻辑
|
||
|
||
1. **前端应用**: 用户通过前端应用发送请求。
|
||
2. **Java 服务**: 接收请求并调用本服务的 API。
|
||
3. **本服务**: 处理 API 请求并返回结果。
|
||
4. **数据库更新**: Java 服务和本服务分别更新其数据库。
|
||
|
||
```mermaid
|
||
graph TD;
|
||
A[前端应用] -->|发送请求| B[Java 服务]
|
||
B -->|处理请求| C[本服务]
|
||
C -->|返回结果| B
|
||
B -->|返回结果| A
|
||
A -->|用户输入| B
|
||
B -->|更新数据库| D[Java 服务数据库]
|
||
C -->|更新数据库| E[本服务数据库]
|
||
```
|
||
|
||
在上述代码中,涉及 **异步操作** 的部分主要集中在需要执行时间较长的任务,例如文件处理、向量化、模型预测等。以下是需要前端轮询 `task_status` 以获取任务完成状态的部分,以及每个部分的详细说明。
|
||
|
||
---
|
||
|
||
## **异步操作**
|
||
### 1. **`upload_qa` 方法的异步任务**
|
||
```python
|
||
future = executor.submit(add_qa_task_, upload_path, vs_path, create_id, private_flag, file_list, hash_list, qa_name)
|
||
tasks[task_id] = future
|
||
```
|
||
|
||
**描述**:
|
||
- 在 `upload_qa` 接口中,`add_qa_task_` 函数通过 `ThreadPoolExecutor` 异步执行。
|
||
- 该任务负责对上传的文件进行处理,包括文本加载、拆分、向量化、存储和数据库操作。
|
||
- 返回的 `task_id` 供前端使用,通过轮询 `/task_status/<task_id>` 获取任务进度。
|
||
|
||
**需要轮询字段**:
|
||
- `task_id`: 任务唯一标识。
|
||
- 状态值包括:
|
||
- `PENDING`: 正在处理。
|
||
- `SUCCESS`: 完成。
|
||
- `ERROR`: 出错。
|
||
|
||
---
|
||
|
||
### 2. **`test_qa` 方法的异步任务**
|
||
```python
|
||
future = executor.submit(add_qa_task_, upload_path, vs_path, 3, False, file_list, hash_list, 'test')
|
||
tasks[task_id] = future
|
||
```
|
||
|
||
**描述**:
|
||
- 用于测试上传和处理文件的功能,逻辑与 `upload_qa` 类似。
|
||
- 前端需要通过 `task_id` 查询任务状态。
|
||
|
||
**需要轮询字段**:
|
||
- 同上,`task_id` 是关键字段。
|
||
|
||
---
|
||
|
||
### **通用异步任务的状态查询接口**
|
||
#### `task_status` 接口
|
||
```python
|
||
@app.route('/task_status/<task_id>', methods=['GET'])
|
||
def task_status(task_id):
|
||
...
|
||
if task.done():
|
||
...
|
||
ret_dict['status'] = "SUCCESS" if result else "ERROR"
|
||
else:
|
||
ret_dict['status'] = "PENDING"
|
||
```
|
||
|
||
**描述**:
|
||
- 通用接口,用于查询所有异步任务的状态。
|
||
- 返回值 `status` 表示任务的当前状态:
|
||
- `PENDING`: 任务尚未完成。
|
||
- `SUCCESS`: 任务成功完成。
|
||
- `ERROR`: 任务失败。
|
||
|
||
---
|
||
|
||
### **轮询场景详细说明**
|
||
1. **轮询间隔**:
|
||
- 前端每隔 1-2 秒向 `/task_status/<task_id>` 发起一次请求。
|
||
- 使用任务完成 (`SUCCESS` 或 `ERROR`) 的响应作为停止轮询的标志。
|
||
|
||
2. **任务完成后的操作**:
|
||
- **任务成功 (`SUCCESS`)**:
|
||
- 显示任务处理完成的消息。
|
||
- 根据任务结果更新页面数据或触发后续操作。
|
||
- **任务失败 (`ERROR`)**:
|
||
- 显示失败原因,允许用户重新发起任务。
|
||
|
||
3. **接口使用示例**:
|
||
- `GET /task_status/<task_id>`:
|
||
- **请求参数**:`task_id`。
|
||
- **响应示例**:
|
||
```json
|
||
{
|
||
"code": 200,
|
||
"message": "后台任务已完成",
|
||
"status": "SUCCESS"
|
||
}
|
||
```
|
||
|
||
---
|