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

news2024/11/15 10:20:24

目录

  • 引言
  • 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 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)

响应示例

{
  "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 requests

url = "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 json

url = "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 json

url = "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.coloradmin.cn/o/1922988.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

美团收银Android一面凉经(2024)

美团收银Android一面凉经(2024) 笔者作为一名双非二本毕业7年老Android, 最近面试了不少公司, 目前已告一段落, 整理一下各家的面试问题, 打算陆续发布出来, 供有缘人参考。今天给大家带来的是《美团收银Android一面凉经(2024)》。 应聘岗位: 美团餐饮PaaS平台Android开发工程师…

我的第128天创作纪念日

🌈个人主页:是店小二呀 🌈C语言笔记专栏:C语言笔记 🌈C笔记专栏: C笔记 🌈初阶数据结构笔记专栏: 初阶数据结构笔记 🌈喜欢的诗句:无人扶我青云志 我自踏雪至山巅 文章…

从LeetCode215看排序算法

目录 LeetCode215 数组的第K个最大元素 ① 第一反应:java的内置排序Arrays.sort() ② 冒泡排序 ③归并排序(先分解再合并) ④快速排序(边分解边排序) ⑤堆排序 LeetCode215 数组的第K个最大元素 给定整数数组 nums…

谈谈软件交互设计

谈谈软件交互设计 交互设计的由来 交互设计(Interaction Design)这一概念,最初是由IDEO创始人之一Bill.Moggridge(莫格里奇)1984年在一次会议上提出。他设计了世界上第一台笔记本电脑Compass,并写作出版了在交互设计领域影响深远的《Designing Interactions》一书,被称…

【分库】分库的核心原则

目录 分库的核心原则 前言 分区透明性与一致性保证 弹性伸缩性与容错性设计 数据安全与访问控制机制 分库的核心原则 前言 在设计和实施分库策略时,遵循一系列核心原则是至关重要的,以确保系统不仅能够在当前规模下高效运行,还能够随着…

Aop切面编程(2)--代理模式

1、代理模式的理解:不修改A对象的代码的基础上,对A代码块进行拓展。通过创建ProxyA代理对象,拓展A对象并调用A对象的核心功能; 即:不修改对象的源码基础上,创建代理对象,进行功能的附加和增强&…

【边缘计算网关教程】4.西门子PPI协议对接

前景回顾:【边缘计算网关教程】3.创建第二个流程-CSDN博客 目录 1. 硬件连接 2. PLC串口参数 2.1. 打开STEP7软件 2.2. 查看通信参数 3. 网关设置 3.1. PLC连接设置 3.2. 数据点位设置 3.3. 测试 西门子 PPI 协议 适配PLC:S7-200 西门子S7-200 PLC…

Python爬虫之路(2):爬天气情况

hello hello~ ,这里是绝命Coding——老白~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹 💥个人主页:绝命Coding-CSDN博客 &a…

Stable Diffusion 深度探索:从入门到精通的全方位教程

在人工智能艺术创作的浪潮中,Stable Diffusion 作为一股不可忽视的力量,正以其独特的魅力吸引着无数创作者和科技爱好者的目光。本文旨在为大家提供一份详尽的 Stable Diffusion 教程,从基础概念到高级应用,带领你一步步走进这个充…

k8s record 20240710 监控

不是adaptor 是opetator 案例 监控有了,日志搜集呢? 一、kubelet 的小弟 kubelet — 负责维护容器的生命周期,节点和集群其他部分通信 cAdvisor 集成在 Kubernetes 的 kubelet 中,能够自动发现和监控集群中所有的容器。dockers…

基于SpringBoot+Vue的数码论坛系统(带1w+文档)

基于SpringBootVue的数码论坛系统(带1w文档) 基于SpringBootVue的数码论坛系统(带1w文档) 数码论坛系统能够通过互联网得到广泛的、全面的宣传,让尽可能多的用户了解和熟知数码论坛系统的便捷高效,不仅为用户提供了服务,而且也推广了自己&…

SpringBoot整合JWT示例教程

1. JWT简介 JSON Web Token (JWT) 是一种开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间作为 JSON 对象安全地传输信息。由于这些信息是经过数字签名的,因此可以被验证和信任。JWT 通常用于身份验…

深度学习论文: YOLOv5, YOLOv8 and YOLOv10: The Go-To Detectors for Real-time Vision

深度学习论文: YOLOv5, YOLOv8 and YOLOv10: The Go-To Detectors for Real-time Vision YOLOv5, YOLOv8 and YOLOv10: The Go-To Detectors for Real-time Vision PDF:https://arxiv.org/pdf/2407.02988v1 PyTorch: https://github.com/shanglianlm0525/PyTorch-Networks 1 概…

51单片机-第三节-LCD1602调试工具,矩阵键盘

一、LCD调试工具函数: 使用: 所有函数,前两个参数,均为指定显示位置。 四个参数的,第四个参数,为保留位数,少的保留后面(123,2 -> 23),多的前面补零。 …

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《天气数据驱动下基于深度主动学习的新型电力系统供需失衡风险快速评估方法 》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

Apache-Flink未授权访问高危漏洞修复

漏洞等级 高危漏洞!!! 一、漏洞描述 攻击者没有获取到登录权限或未授权的情况下,或者不需要输入密码,即可通过直接输入网站控制台主页面地址,或者不允许查看的链接便可进行访问,同时进行操作。 二、修复建议 根据业务/系统具体情况,结合如下建议做出具体选择: 配…

产品经理-研发流程-敏捷开发-迭代-需求评审及产品规划(15)

敏捷开发是以用户的需求进化为核心,采用迭代、循序渐进的方法进行软件开发。 通俗来说,敏捷开发是一个软件开发流程,是一个采用了迭代方法的开发流程 简单来说,迭代就是把一个大产品拆分出一些最小的实现单位。完成不同的迭代就最…

交易平台Zero Hash现已支持SUI交易

Zero Hash是一家领先的加密货币和稳定币基础设施平台,为包括Stripe、Shift4和Franklin Templeton在内的公司提供支持,现在也支持对SUI的访问。此举使Zero Hash的客户及其终端用户能够使用SUI。 提供API和SDK以及专注于无缝连接法币、加密货币和稳定币的…

Python | Leetcode Python题解之第231题2的幂

题目: 题解: class Solution:BIG 2**30def isPowerOfTwo(self, n: int) -> bool:return n > 0 and Solution.BIG % n 0

【Redis】哨兵(sentinel)

文章目录 一、哨兵是什么?二、 哨兵sentinel文件参数三、 模仿主机redis宕机四、哨兵运行流程和选举原理SDOWN主观下线ODOWN客观下线 五、 使用建议 以下是本篇文章正文内容 一、哨兵是什么? 哨兵巡查监控后台master主机是否故障,如果故障了…