【RAG检索增强生成】有道QAnything深度解析与实践

server/2024/9/23 7:18:08/

目录

  • 引言
  • 1、QAnything简介
  • 2、技术解析
    • 2.1 RAG技术核心
    • 2.2 QAnything架构
    • 2.3 模型与算法
  • 3、应用场景
    • 3.1 企业知识管理
    • 3.2 教育与学术研究
    • 3.3 客户服务
  • 4、部署实践
    • 4.1 环境准备
    • 4.2 安装QAnything
    • 4.3 启动运行
    • 4.4 访问UI界面
    • 4.4 API使用
    • 4.4.1 新建知识库(POST)
    • 4.4.2上传文件(POST)
    • 4.4.3上传网页文件(POST)
    • 4.4.3查看知识库(POST)
  • 结语


引言

在数字化浪潮的推动下,企业与个人面临着信息过载的挑战。如何快速从海量文档中检索信息、解答问题,已成为提升工作效率的关键。有道QAnything引擎以其RAG技术,为这一问题提供了创新的解决方案。本文将深入解析QAnything的技术原理、应用场景,并提供代码实践,为开发者和技术爱好者提供全面的认识和应用指南。

1、QAnything简介

QAnything是由有道开源的基于RAG技术的本地知识库问答系统。它能够处理包括PDF、Word、Excel、图片等在内的多种文件格式,为用户提供智能化的信息获取体验。
在这里插入图片描述

技术特点与优势

  • 多格式支持:无缝处理PDF、Word、图片等格式,适应多样化的文档需求。
  • 高准确率:通过精确追溯文档段落来源,确保信息的准确性。
  • 数据安全:支持纯本地部署,保障用户数据的安全性和隐私。
  • 扩展性:无文档数量上限,适用于从小规模到企业级的广泛应用。

2、技术解析

2.1 RAG技术核心

RAG技术结合了信息检索和文本生成两大技术,通过从海量文档中检索相关信息,再利用自然语言生成技术将信息以人类可读的方式呈现。

2.2 QAnything架构

QAnything的架构设计中,Rerank环节被特别强调,通过两阶段检索排名有效解决了大规模数据检索的退化问题。
知识库数据量大的场景下两阶段优势非常明显,如果只用一阶段embedding检索,随着数据量增大会出现检索退化的问题,如下图中绿线所示,二阶段rerank重排后能实现准确率稳定增长,即数据越多,效果越好。
在这里插入图片描述

2.3 模型与算法

  • BCEmbedding模型:有道采用的先进语义嵌入排序模型,将文档转化为向量表示,提升检索效率。
  • 深度学习模型:在文本生成方面,通过大量数据训练,生成更自然、流畅的答案。

3、应用场景

3.1 企业知识管理

QAnything在企业知识管理领域的应用,通过智能检索和问答,极大提高了企业内部信息的利用效率。

3.2 教育与学术研究

在教育领域,QAnything辅助学术研究,提供文献资料的深入分析和总结,加速知识发现过程。

3.3 客户服务

作为智能客服系统的一部分,QAnything能够提供基于用户文档的自动问答服务,有效减轻客服工作量,提升客户满意度。

4、部署实践

4.1 环境准备

确保系统满足QAnything运行的先决条件,包括Python环境、必要的库文件和依赖服务。
Python 3.10+ (建议使用aoaconda3来管理Python环境)
System
1)Linux: CPU模式:无,非CPU模式:glibc 2.28+ and Cuda 12.0+ (来源于onnxruntime-gpu cuda12.x版本的依赖,如果低于2.28自动切换onnxruntime)
2)Windows: CPU模式:WSL with Ubuntu 18.04+ ,非CPU模式:WSL with Ubuntu 20.04+ 和 桌面版GEFORCE EXPERIENCE 535.104+
3)MacOS(M1/M2/M3): 使用Openai-API兼容接口模式:无,本地大模型模式:Xcode 15.0+(llamacpp依赖Xcode)

4.2 安装QAnything

下载本项目并执行
通过Git命令克隆QAnything的GitHub仓库到本地环境

conda create -n qanything-python python=3.10
conda activate qanything-python
git clone -b qanything-python https://github.com/netease-youdao/QAnything.git
cd QAnything
pip install -r requirements.txt
# 请根据使用环境选择启动脚本:bash scripts/xxx(内部调用纯python启动代码,可手动修改python启动命令)

4.3 启动运行

在Windows WSL或Linux环境下运行3B大模型(MiniChat-2-3B)要求显存>=10GB

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

在Windows WSL或Linux环境下运行Openai API,仅使用CPU(纯CPU模式)
在scripts/run_for_openai_api_with_cpu_in_Linux_or_WSL.sh中补充api-key等参数

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’

在Windows WSL或Linux环境下运行Openai API,使用GPU
在scripts/run_for_openai_api_with_gpu_in_Linux_or_WSL.sh中补充api-key等参数

bash scripts/run_for_openai_api_with_gpu_in_Linux_or_WSL.sh

4.4 访问UI界面

启动成功后可在访问前端页面使用
在浏览器中打开http://{your_host}:8777/qanything/
即可使用UI界面
注意末尾的斜杠不可省略,否则会出现404错误

4.4 API使用

全局参数
我们提供用户区分的功能,每个接口中有 user_id 的参数,如果需要请传入 user_id 的值。
user_id 需要满足: 以字母开头,只允许包含字母,数字或下划线。
如果不需要区分不同用户,传入 user_id="zzp"即可
注意当且仅当user_id="zzp"时通过API传入的信息与前端页面互通

4.4.1 新建知识库(POST)

URL:http://{your_host}:8777/api/local_doc_qa/new_knowledge_base
新建知识库请求参数(Body)
在这里插入图片描述

请求示例

import requests
import jsonurl = "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)

响应示例

{"code": 200, //状态码"msg": "success create knowledge base KBd728811ed16b46f9a2946e28dd5c9939", //提示信息"data": {"kb_id": "KB4c50de98d6b548af9aa0bc5e10b2e3a7", //知识库id"kb_name": "kb_test", //知识库名称"timestamp": "202401251057" // 创建时间戳}
}

4.4.2上传文件(POST)

URL:http://{your_host}:8777/api/local_doc_qa/upload_files
Content-Type: multipart/form-data
上传文件请求参数(Body)
在这里插入图片描述

请求示例

import os
import 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" // 上传时间}] //文件列表
}

4.4.3上传网页文件(POST)

URL:http://{your_host}:8777/api/local_doc_qa/upload_weblink
上传网页文件请求参数(Body)
在这里插入图片描述

请求示例

import requests
import 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"}]
}

4.4.3查看知识库(POST)

URL:http://{your_host}:8777/api/local_doc_qa/list_knowledge_base
查看知识库请求参数(Body)
在这里插入图片描述

请求示例

import requests
import 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" //知识库名称}] //知识库列表
}

其他API使用可参考:
https://github.com/netease-youdao/QAnything/blob/master/docs/API.md

结语

有道QAnything作为一项创新的技术实践,不仅展示了RAG技术的应用潜力,也为开发者提供了一个强大的工具,以解决实际问题。随着技术的不断进步和社区的共同努力,我们期待QAnything在未来能够带来更多的创新和便利。同时,我们也鼓励开发者参与到QAnything的开源社区中,共同推动技术的发展。

在这里插入图片描述

🎯🔖更多专栏系列文章:AI大模型提示工程完全指南AI大模型探索之路(零基础入门)AI大模型预训练微调进阶AI大模型开源精选实践AI大模型RAG应用探索实践🔥🔥🔥 其他专栏可以查看博客主页📑

😎 作者介绍:我是寻道AI小兵,资深程序老猿,从业10年+、互联网系统架构师,目前专注于AIGC的探索。
📖 技术交流:欢迎关注【小兵的AI视界】公众号或扫描下方👇二维码,加入技术交流群,开启编程探索之旅。
💘精心准备📚500本编程经典书籍、💎AI专业教程,以及高效AI工具。等你加入,与我们一同成长,共铸辉煌未来。
如果文章内容对您有所触动,别忘了点赞、⭐关注,收藏!加入我,让我们携手同行AI的探索之旅,一起开启智能时代的大门!


http://www.ppmy.cn/server/59915.html

相关文章

TLP152 光耦合器:工程师的可靠选择

东芝的 TLP152 光耦合器是一款稳健且多功能的组件,能够满足各种高速和高可靠性应用中的工程师需求。本文将深入探讨 TLP152 的技术特性、优点和应用,突出其在市场中的独特性。 主要特点和规格 TLP152 光耦合器集成了一颗铝镓砷(GaAlAs&…

NC398 腐烂的苹果

题目来源:牛客 题目描述: 给定一个 𝑛𝑚 nm 的网格,其中每个单元格中可能有三种值中的一个 0 , 1 , 2。 其中 0 表示这个格子为空、1 表示这个格子有一个完好的苹果,2 表示这个格子有一个腐烂的苹果。 腐…

java实现图片转pdf

参考文档:java代码实现快速创建一个1000页的pdf文档-CSDN博客

SpringBoot的动态代理默认用的哪个???

在 Spring Boot 中,动态代理的默认实现方式取决于被代理的对象的类型和具体配置: JDK 动态代理: 当代理的对象实现了一个或多个接口时,Spring 默认使用 JDK 动态代理。JDK 动态代理只能代理实现了接口的类。 CGLIB 动态代理&…

通用详情页的打造

背景介绍 大家都知道,详情页承载了站内的核心流量。它的量级到底有多大呢? 我们来看一下,日均播放次数数亿次,这么大的流量,其重要程度可想而知。 在这样一个页面,每一个功能都是大量业务的汇总点。 作为…

JAVA基础知识思维导图分享

这里为大家分享我自己之前做的一份JAVA基础知识思维导图: 由于太大了上传不了,需要的友友们,可以私信我哦(Q:3193045624发)!

OpenCV一个简单的摄像头调用与关闭

在使用OpenCV(Open Source Computer Vision Library)进行摄像头调用与关闭时,通常使用cv2.VideoCapture()函数来调用摄像头,并通过适当的方式关闭它。 调用摄像头 首先,需要导入OpenCV库(通常简写为cv2&a…

科技与水利的完美融合:从数据采集到智能决策,全面解析智慧水利解决方案如何助力水利行业实现智能化管理

本文关键词:智慧水利、智慧水利工程、智慧水利发展前景、智慧水利技术、智慧水利信息化系统、智慧水利解决方案、数字水利和智慧水利、数字水利工程、数字水利建设、数字水利概念、人水和协、智慧水库、智慧水库管理平台、智慧水库建设方案、智慧水库解决方案、智慧…