QAnything介面主要包括7個介面:新建知識庫、檢視知識庫、刪除知識庫;上傳檔案、獲取檔案列表、刪除檔案;問答。
一.新建知識庫(POST)
1.URL
http://{your_host}:8777/api/local_doc_qa/new_knowledge_base
2.請求引數(Body)
引數名 |
示例引數值 |
是否必填 |
引數型別 |
描述說明 |
user_id |
"zzp" |
是 |
String |
使用者id (如需使用前端填zzp不要更換) |
kb_name |
"kb_test" |
是 |
String |
知識庫名稱 (可以隨意指定) |
3.請求示例
{
"user_id": "zzp", //使用者id
"kb_name": "kb_test" //知識庫名稱
}
4.響應示例
{
"code": 200, //狀態碼
"msg": "success", //提示資訊
"data": {
"kb_id": "KB4c50de98d6b548af9aa0bc5e10b2e3a7", //知識庫id
"kb_name": "kb_test" //知識庫名稱
}
}
二.上傳檔案(POST)
1.URL
http://{your_host}:8777/api/local_doc_qa/upload_files
說明:Content-Type: multipart/form-data
2.請求引數(Body)
引數名 |
示例引數值 |
是否必填 |
引數型別 |
描述說明 |
files |
檔案二進位制 |
是 |
[檔案型別] |
需要上傳的檔案,可多選(當use_lcoal_file為true時,選擇無效) |
user_id |
"zzp" |
是 |
String |
使用者id |
kb_id |
"KBb1dd58e8485443ce81166d24f6febda7" |
是 |
String |
知識庫id |
mode |
"strong" |
是 |
String |
上傳模式,soft:檔名重複的檔案不再上傳,strong:檔名重複的檔案強制上傳 |
use_local_file |
FALSE |
是 |
Boolean |
是否使用本地目錄上傳檔案:「source/data」,可選:【true,false】 |
3.請求示例
同步請求示例:
import os
import requests
url = "http://{your_host}:8777/api/local_doc_qa/upload_files"
folder_path = "./docx_data"
data = {
"user_id": "zzp",
"kb_id": "KB6dae785cdd5d47a997e890521acbe1c9"
}
files = []
for root, dirs, file_names in os.walk(folder_path):
for file_name in file_names:
if file_name.endswith(".md"): # 只上傳md檔案
file_path = os.path.join(root, file_name)
files.append(("files", open(file_path, "rb")))
response = requests.post(url, files=files, data=data)
print(response.text)
非同步請求示例:
import argparse
import os
import sys
import json
import aiohttp
import asyncio
import time
import random
import string
import hashlib
import statistics
files = []
for root, dirs, file_names in os.walk("./docx_data"):
for file_name in file_names:
if file_name.endswith(".docx"): # 只上傳docx檔案
file_path = os.path.join(root, file_name)
# if len(file_path) < 50:
# print(file_path)
files.append(file_path)
print(len(files))
response_times = []
async def send_request(round_, files):
print(len(files))
url = 'http://{your_host}:8777/api/local_doc_qa/upload_files'
data = aiohttp.FormData()
data.add_field('user_id', 'zzp')
data.add_field('kb_id', 'KBf1dafefdb08742f89530acb7e9ed66dd')
data.add_field('mode', 'soft')
total_size = 0
for file_path in files:
# print(file_path)
file_size = os.path.getsize(file_path)
total_size += file_size
data.add_field('files', open(file_path, 'rb'))
print('size:', total_size / (1024 * 1024))
try:
start_time = time.time()
async with aiohttp.ClientSession() as session:
async with session.post(url, data=data) as response:
end_time = time.time()
response_times.append(end_time - start_time)
print(f"round_:{round_}, 響應狀態碼: {response.status}, 響應時間: {end_time - start_time}秒")
#print(await response.json())
except Exception as e:
print(f"請求傳送失敗: {e}")
async def main():
start_time = time.time()
num = int(sys.argv[1]) // 一次上傳數量,http協議限制一次請求data不能大於100M,請自行控制數量
round_ = 0
r_files = files[:num]
tasks = []
task = asyncio.create_task(send_request(round_, r_files))
tasks.append(task)
await asyncio.gather(*tasks)
print(f"請求完成")
end_time = time.time()
total_requests = len(response_times)
total_time = end_time - start_time
qps = total_requests / total_time
print(f"total_time:{total_time}")
if __name__ == '__main__':
asyncio.run(main())
4.響應示例
{
"code": 200, //狀態碼
"msg": "success,後臺正在飛速上傳檔案,請耐心等待", //提示資訊
"data": [
{
"file_id": "1b6c0781fb9245b2973504cb031cc2f3", //檔案id
"file_name": "網易有道智雲平臺產品介紹2023.6.ppt", //檔名
"status": "gray" //檔案狀態(red:入庫失敗-切分失敗,green,成功入庫,yellow:入庫失敗-milvus失敗,gray:正在入庫)
},
{
"file_id": "aeaec708c7a34952b7de484fb3374f5d",
"file_name": "有道知識庫問答產品介紹.pptx",
"status": "gray"
},
{
"file_id": "8ee98a88457c414a986a09c536fedde9",
"file_name": "韋小寶身份證.jpg",
"status": "gray"
},
{
"file_id": "67af479f907b497cadb30c6e4b2d3fbc",
"file_name": "成長中心-輔導老師日常問題文件.pdf",
"status": "gray"
}
] //檔案列表
}
三.檢視知識庫(POST)
1.URL
http://{your_host}:8777/api/local_doc_qa/list_knowledge_base
2.請求引數(Body)
引數名 |
示例引數值 |
是否必填 |
引數型別 |
描述說明 |
user_id |
"zzp" |
是 |
String |
使用者id |
3.請求示例
{
"user_id": "zzp" //使用者id
}
4.響應示例
{
"code": 200, //狀態碼
"msg": "success", //提示資訊
"data": [
{
"kb_id": "KB973d4aea07f14c60ae1974404a636ad4", //知識庫id
"kb_name": "kb_test" //知識庫名稱
}
] //知識庫列表
}
四.獲取檔案列表(POST)
1.URL
http://{your_host}:8777/api/local_doc_qa/list_files
2.請求引數(Body)
引數名 |
示例引數值 |
是否必填 |
引數型別 |
描述說明 |
user_id |
"zzp" |
是 |
String |
使用者id |
kb_id |
"KBb1dd58e8485443ce81166d24f6febda7" |
是 |
String |
知識庫id |
3.請求示例
{
"user_id": "zzp", //使用者id 注意需要滿足 只含有字母 數字 和下劃線且字母開頭 的要求
"kb_id": "KBb1dd58e8485443ce81166d24f6febda7" //知識庫id
}
4.響應示例
{
"code": 200, //狀態碼
"msg": "success", //提示資訊
"data": {
"total": { // 知識庫所有檔案狀態
"green": 100,
"red": 1,
"gray": 1,
"yellow": 1,
},
"details": { // 每個檔案的具體狀態
{
"file_id": "21a9f13832594b0f936b62a54254543b", //檔案id
"file_name": "有道知識庫問答產品介紹.pptx", //檔名
"status": "green" //檔案狀態(red:入庫失敗-切分失敗,green,成功入庫,yellow:入庫失敗-milvus失敗,gray:正在入庫)
},
{
"file_id": "333e69374a8d4b9bac54f274291f313e", //檔案id
"file_name": "網易有道智雲平臺產品介紹2023.6.ppt", //檔名
"status": "green" //檔案狀態(red:入庫失敗-切分失敗,green,成功入庫,yellow:入庫失敗-milvus失敗,gray:正在入庫)
},
{
"file_id": "709d6c3e071947038645f1f26ad99c6f", //檔案id
"file_name": "韋小寶身份證.jpg", //檔名
"status": "green" //檔案狀態(red:入庫失敗-切分失敗,green,成功入庫,yellow:入庫失敗-milvus失敗,gray:正在入庫)
},
{
"file_id": "85297c0b56104028913e89b6834c1a39", //檔案id
"file_name": "成長中心-輔導老師日常問題文件.pdf", //檔名
"status": "green" //檔案狀態(red:入庫失敗-切分失敗,green,成功入庫,yellow:入庫失敗-milvus失敗,gray:正在入庫)
},
}
}
}
五.問答(POST)
1.URL
http://{your_host}:8777/api/local_doc_qa/local_doc_chat
2.請求引數(Body)
引數名 |
示例引數值 |
是否必填 |
引數型別 |
描述說明 |
user_id |
"zzp" |
是 |
String |
使用者id |
kb_ids |
["KBb1dd58e8485443ce81166d24f6febda7"] |
是 |
Array |
知識庫id的列表,支援多個知識庫聯合問答 |
question |
"保險單號是多少?" |
是 |
String |
知識庫id的列表,支援多個知識庫聯合問答 |
history |
[["question1","answer1"],["question2","answer2"]] |
是 |
Array |
歷史對話 |
3.請求示例
{
"user_id": "zzp", //使用者id
"kb_ids": ["KBb1dd58e8485443ce81166d24f6febda7"], //知識庫id,支援多個知識庫聯合問答
"question": "保險單號是多少?", //使用者問題
"history": [] //歷史對話:List[str]
}
4.響應示例
{
"code": 200, //狀態碼
"msg": "success", //提示資訊
"question": "保險單號是多少?", //使用者問題
"response": "保險單號是601J389343982022000536", //模型回答
"related_questions": [], //相關問題
"history": [
[
"保險單號是多少?",
"保險單號是601J389343982022000536。"
]
], //歷史對話:List[List[str]]
"source_documents": [
{
"file_id": "f9b794233c304dd5b5a010f2ead67f51", //文字內容對應的檔案id
"file_name": "一嗨案件支付三者車損、人傷保險賠款及權益轉讓授權書.docx", //文字內容對應的檔名
"content": "未支付第三者車損、人傷賠款及同意直賠第三者確認書 華泰財產保險有限公司 北京 分公司: 本人租用一嗨在貴司承保車輛(車牌號:京KML920)商業險保單號: 601J389343982022000536、交強險保單號: 601J310028493882022000570, 對 2023 年 03 月 25日所發生的保險事故(事故號: 9010020230325004124)中所涉及的交強險和商業險的保險賠款總金額 (依:三者京AFT5538定損金額), 同意支付給本次事故中第三者方。 在此本人確認:本人從未支付給第三者方任何賠償,且承諾不就本次事故再向貴司及一嗨進行索賠。 同時本人保證如上述內容不屬實、違反承諾,造成保險人損失的,由本人承擔賠償責任。 確認人(駕駛員)簽字: 第三者方簽字: 聯絡電話: 聯絡電話: 確認日期: 年 月 日", //文字內容
"retrieval_query": "保險單號是多少?", //文字內容對應的問題
"score": "3.5585756", //相關性得分,分數越高越相關
"embed_version": "local_v0.0.1_20230525_6d4019f1559aef84abc2ab8257e1ad4c" //embedding模型版本號
}
], //知識庫相關文字內容
"rematched_source_documents": [] //重新匹配的文字內容
}
六.刪除檔案(POST)
1.URL
http://{your_host}:8777/api/local_doc_qa/delete_files
2.請求引數(Body)
引數名 |
示例引數值 |
是否必填 |
引數型別 |
描述說明 |
user_id |
"zzp" |
是 |
String |
使用者id |
kb_id |
"KB1271e71c36ec4028a6542586946a3906" |
是 |
String |
知識庫id |
file_ids |
["73ff7cf76ff34c8aa3a5a0b4ba3cf534"] |
是 |
Array |
要刪除檔案的id,支援批次刪除 |
3.請求示例
{
"user_id": "zzp", //使用者id
"kb_id": "KB1271e71c36ec4028a6542586946a3906", //知識庫id
"file_ids": [
"73ff7cf76ff34c8aa3a5a0b4ba3cf534"
] //檔案id列表
}
4.響應示例
{
"code": 200, //狀態碼
"msg": "documents ['73ff7cf76ff34c8aa3a5a0b4ba3cf534'] delete success" //提示資訊
}
七.刪除知識庫(POST)
1.URL
http://{your_host}:8777/api/local_doc_qa/delete_knowledge_base
2.請求引數(Body)
引數名 |
示例引數值 |
是否必填 |
引數型別 |
描述說明 |
user_id |
"zzp" |
是 |
String |
使用者id |
kb_ids |
["KB1cd81f2bc515437294bda1934a20b235"] |
是 |
Array |
要刪除的知識庫id,支援批次刪除 |
3.請求示例
{
"user_id": "zzp", //使用者id
"kb_ids": [
"KB1cd81f2bc515437294bda1934a20b235"
] //知識庫id列表
}
4.響應示例
{
"code": 200, //狀態碼
"msg": "Knowledge Base [('KB1cd81f2bc515437294bda1934a20b235',)] delete success" //提示資訊
}
參考文獻
[1] https://github.com/netease-youdao/QAnything/blob/develop_for_v1.2.2/docs/API.md