weida_doc/接口文档.md

371 lines
10 KiB
Markdown
Raw Permalink Normal View History

2024-12-16 03:22:52 +00:00
# 小维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"
}
```
---