weida_doc/接口文档.md
2024-12-16 11:22:52 +08:00

371 lines
10 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 小维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"
}
```
---