微信扫码
与创始人交个朋友
我要投稿
在数字化浪潮的推动下,企业与个人面临着信息过载的挑战。如何快速从海量文档中检索信息、解答问题,已成为提升工作效率的关键。有道QAnything引擎以其RAG技术,为这一问题提供了创新的解决方案。本文将深入解析QAnything的技术原理、应用场景,并提供代码实践,为开发者和技术爱好者提供全面的认识和应用指南。
QAnything是由有道开源的基于RAG技术的本地知识库问答系统。它能够处理包括PDF、Word、Excel、图片等在内的多种文件格式,为用户提供智能化的信息获取体验。
QAnything的架构设计中,Rerank环节被特别强调,通过两阶段检索排名有效解决了大规模数据检索的退化问题。
知识库数据量大的场景下两阶段优势非常明显,如果只用一阶段embedding检索,随着数据量增大会出现检索退化的问题,如下图中绿线所示,二阶段rerank重排后能实现准确率稳定增长,即数据越多,效果越好。
conda create -n qanything-python python=3.10conda activate qanything-pythongit clone -b qanything-python https://github.com/netease-youdao/QAnything.gitcd QAnythingpip install -r requirements.txt# 请根据使用环境选择启动脚本:bash scripts/xxx(内部调用纯python启动代码,可手动修改python启动命令)
bash scripts/run_for_3B_in_Linux_or_WSL.sh
在Windows WSL或Linux环境下运行7B大模型(自研Qwen-7B-QAnything)要求显存>=24GB
bash scripts/run_for_7B_in_Linux_or_WSL.sh
bash scripts/run_for_openai_api_with_cpu_in_Linux_or_WSL.sh
补充说明:
通义千问DashScope支持:
支持任意与Openai API接口兼容的其他API,例:通义千问DashScopeAPI
按照约定修改sh脚本中的-b(openai_api_base),-k(openai_api_key),-n(openai_api_model_name)等参数即可
ollama支持:
同样使用Openai API兼容接口:
例如:当本地运行ollama run llama3,修改scripts/run_for_openai_api_with_cpu_in_Linux_or_WSL.sh内容为:
bash scripts/base_run.sh -s "LinuxOrWSL" -w 4 -m 19530 -q 8777 -o -b 'http://localhost:11434/v1' -k 'ollama' -n 'llama3' -l '4096'
bash scripts/run_for_openai_api_with_gpu_in_Linux_or_WSL.sh
4.访问UI界面
启动成功后可在访问前端页面使用
在浏览器中打开http://{your_host}:8777/qanything/即可
注意:末尾的斜杠不可省略,否则会出现404错误
URL:http://{your_host}:8777/api/local_doc_qa/new_knowledge_base
import requests
import json
url = "http://{your_host}:8777/api/local_doc_qa/new_knowledge_base"
headers = {
"Content-Type": "application/json"
}
data = {
"user_id": "zzp",
"kb_name": "kb_test"
}
response = requests.post(url, headers=headers, data=json.dumps(data))
print(response.status_code)
print(response.text)
```
响应示例
```python
{
"code": 200, //状态码
"msg": "success create knowledge base KBd728811ed16b46f9a2946e28dd5c9939", //提示信息
"data": {
"kb_id": "KB4c50de98d6b548af9aa0bc5e10b2e3a7", //知识库id
"kb_name": "kb_test", //知识库名称
"timestamp": "202401251057" // 创建时间戳
}
}
import osimport requestsurl = "http://{your_host}:8777/api/local_doc_qa/upload_files"folder_path = "./docx_data" # 文件所在文件夹,注意是文件夹!!data = {"user_id": "zzp","kb_id": "KB6dae785cdd5d47a997e890521acbe1c9","mode": "soft"}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)
响应示例
{"code": 200, //状态码"msg": "success,后台正在飞速上传文件,请耐心等待", //提示信息"data": [{"file_id": "1b6c0781fb9245b2973504cb031cc2f3", //文件id"file_name": "网易有道智云平台产品介绍2023.6.ppt", //文件名"status": "gray", //文件状态(red:入库失败-切分失败,green,成功入库,yellow:入库失败-milvus失败,gray:正在入库)"bytes": 17925, //文件大小(字节数)"timestamp": "202401251056" // 上传时间},{"file_id": "aeaec708c7a34952b7de484fb3374f5d","file_name": "有道知识库问答产品介绍.pptx","status": "gray","bytes": 12928, //文件大小(字节数)"timestamp": "202401251056" // 上传时间}] //文件列表}
3) 上传网页文件(POST)
URL:http://{your_host}:8777/api/local_doc_qa/upload_weblink
上传网页文件请求参数(Body)
请求示例
import requestsimport jsonurl = "http://{your_host}:8777/api/local_doc_qa/upload_weblink"headers = {"Content-Type": "application/json"}data = {"user_id": "zzp","kb_id": "KBb1dd58e8485443ce81166d24f6febda7","url": "https://ai.youdao.com/DOCSIRMA/html/trans/api/wbfy/index.html"}response = requests.post(url, headers=headers, data=json.dumps(data))print(response.status_code)print(response.text)
响应示例
{"code": 200,"msg": "success,后台正在飞速上传文件,请耐心等待","data": [{"file_id": "9a49392e633d4c6f87e0af51e8c80a86","file_name": "https://ai.youdao.com/DOCSIRMA/html/trans/api/wbfy/index.html","status": "gray","bytes": 0, // 网页文件无法显示大小"timestamp": "202401261809"}]}
import requestsimport jsonurl = "http://{your_host}:8777/api/local_doc_qa/list_knowledge_base"headers = {"Content-Type": "application/json"}data = {"user_id": "zzp"}response = requests.post(url, headers=headers, data=json.dumps(data))print(response.status_code)print(response.text)
响应示例
{
"code": 200, //状态码
"data": [
{
"kb_id": "KB973d4aea07f14c60ae1974404a636ad4", //知识库id
"kb_name": "dataset_s_1" //知识库名称
}
] //知识库列表
}
有道QAnything作为一项创新的技术实践,不仅展示了RAG技术的应用潜力,也为开发者提供了一个强大的工具,以解决实际问题。随着技术的不断进步和社区的共同努力,我们期待QAnything在未来能够带来更多的创新和便利。
53AI,企业落地应用大模型首选服务商
产品:大模型应用平台+智能体定制开发+落地咨询服务
承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业