QAnything源码学习

news2025/2/23 21:35:06

以下解读基于时间:20241218

概述

官方架构图如下:

该有的模块基本上都有了:

  1. Query理解
  2. 检索
    1. 召回
    2. 重排
  1. 大模型生成
  2. 数据入库

下面就从以上几个模块分别看看对应的源码

讲源码之前还是想先讲讲这个项目的目录结构,这样可能会更方便理解一点。主逻辑源码主要在qanything_kernel中

主逻辑源码分布

所有的配置都在这里

qanything_kernel/configs/model_config.py

主要提供了一些必要的中间组件,不涉及主流程逻辑,但是为主流程提供了可用的各种组件。包括存储、向量化、大模型、重排功能

从目录名就可以看出来,这是核心模块,是RAG全流程的具象化。着重关注qanything_kernel/core/retriever/parent_retriever.pyqanything_kernel/core/local_doc_qa.py两个文件

一些独立的微服务,例如embedding和rerank服务分别在connector中被封装成具有相应功能的客户端

主服务,没啥好讲的,大部分用户在界面上需要用到的功能对应的路由都在这里

Query理解

query理解这块理论上能做的还是比较多的,包括意图识别、query改写等

从源码来看,qanything目前应该是只做了一次query改写。具体的代码在qanything_kernel/core/chains/condense_q_chain.py,这里主要是将一个聊天中的用户问题基于聊天历史改写为一个独立且语义完整的query,这样做首先肯定能降低检索的难度,其次当聊天历史较长时即便丢弃早期的历史依然不会出现当前query不能很好理解的问题。具体的调用在qanything_kernel/core/local_doc_qa.py(这个文件比较关键,其中还包含了检索、重排等核心组件的调用)

定义

qanything_kernel/core/chains/condense_q_chain.py

调用

qanything_kernel/core/local_doc_qa.py

检索

召回

主要用了ES基于BM25的字面相似度以及使用Milvus的Embedding相似度做召回也就是架构图中的1st Retrieval,一般来说这两路召回作为一个baseline已经够了,后续可以基于业务场景添加更多路召回

具体的实现和调用如下,ES这块比较简单,langchain有直接可用的组件,直接用就完事了。

定义

qanything_kernel/core/retriever/elasticsearchstore.py

调用

qanything_kernel/core/retriever/parent_retriever.py

Milvus的话,qanything_kernel/core/retriever/vectorstore.py中实现了一个供retrieval使用的客户端,以及继承自langchain_community的Milvus类复写了embedding化文本添加到数据库的aadd_texts方法。并且依赖于一个YouDaoEmbeddings类 (qanything_kernel/connector/embedding/embedding_for_online_client.py) ,这个类依赖于独立启动的embedding微服务 (qanything_kernel/dependent_server/embedding_server/embedding_server.py) 并提供了一些embedding文本的方法。

Milvus客户端

qanything_kernel/core/retriever/vectorstore.py

Milvus的复写

qanything_kernel/core/retriever/vectorstore.py

给整个服务提供embedding能力

qanything_kernel/connector/embedding/embedding_for_online_client.py

独立的embedding服务

qanything_kernel/dependent_server/embedding_server/embedding_server.py

retrieval中的调用

qanything_kernel/core/retriever/parent_retriever.py

合并es和milvus向量检索的结果

qanything_kernel/core/retriever/parent_retriever.py

由于还要做模型层面的重排,所以这里就是直接将两路召回的结果放到一个列表里,并没有做任何的简单的排序。作为baseline的话,其实rerank也可以先不做,可以直接基于一些规则做个简单的得分加权排个序就行,或者使用RRF也行

重排

重排这块相对来说比较简单清晰,首先定义定义了一个YouDaoRerank (qanything_kernel/connector/rerank/rerank_for_online_client.py),然后这个client依赖于一个独立的rerank服务 (qanything_kernel/dependent_server/rerank_server/rerank_server.py),这个服务的能力来源于部署的onnx模型(qanything_kernel/dependent_server/rerank_server/rerank_onnx_backend.py),这个rerank模型不同于召回的模型,它应该是交互式的不同于召回的双塔分别编码。

rerank客户端

rerank独立服务

rerank模型后端

retrieval中的调用

大模型生成

这块就整体来说感觉是最简单的,将前面排序好的文档放进来结合prompt给出结果就行。来看看qanything具体还有哪些细节,步骤如下:

  1. 看看query有没有和faq匹配上,如果匹配上了直接返回faq里的答案,不经过大模型了
  2. 如果没有匹配上faq,再看有没有检索到文档,对应着不同的prompt模版
  3. 完了就是调用大模型生成答案了

数据入库

这一步和在线问答服务是解耦的,当你上传文件时,服务只是将文件的元信息存到数据库,并将文件保存到本地。然后由这个数据结构化入库服务将本地文件进行chunk,依次保存到milvus和es中

数据chunk入库

qanything_kernel/core/retriever/parent_retriever.py

小结

总的来说,感觉qanything还是比较好读的,各模块之间比较解耦,魔改复用应该也比较方便,唯一不太好读的就是检索部分,因为用了langchain,我对langchain非常不熟悉,所以它的一些类的怎么使用,要复写哪些方法都不是很清楚,而且有些具体的逻辑层层追溯看起来有点晕。不过这些细节不影响整体的理解和阅读。rerank部分就比较友好了,都是纯手敲的,没有借助三方工具。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2262786.html

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

相关文章

【LeetCode】每日一题 2024_12_19 找到稳定山的下标(模拟)

前言 每天和你一起刷 LeetCode 每日一题~ 最近力扣的每日一题出的比较烂,难度过山车,导致近期的更新都三天打鱼,两天断更了 . . . LeetCode 启动! 题目:找到稳定山的下标 代码与解题思路 先读题:最重要…

Android笔记【19】

具体示例 run: val result someObject.run {// 这里可以使用 thisthis.someMethod() }let: val result someObject?.let {// 这里使用 itit.someMethod() }with: val result with(someObject) {// 这里使用 thissomeMethod() }apply: val obj SomeClass().apply {// 这里使…

【一篇搞定配置】如何在Ubuntu上配置单机/伪分布式Hadoop

🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀各种软件安装与配置_十二月的猫的博客-CSDN博客 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目录 1.…

Webpack简单介绍及安装

一、介绍 Webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler)。它将应用程序中的所有依赖项(JavaScript、图片、CSS 等)打包成一个或多个 bundle。这样做的主要目的是减少加载时间和提高应用程序的加载性能…

moviepy 给视频添加字幕 - python 实现

DataBall 助力快速掌握数据集的信息和使用方式,会员享有 百种数据集,持续增加中。 需要更多数据资源和技术解决方案,知识星球: “DataBall - X 数据球(free)” -------------------------------------------------------------…

用户体验与SEO的结合:如何优化网站以提升谷歌排名?

在SEO领域,算法、关键词和技术手段固然重要,但归根结底,谷歌的核心理念是提供最优质的用户体验。无论算法如何变化,用户体验始终是影响谷歌排名的重要因素之一。一个友好、直观的网站不仅能留住用户,还能直接提升搜索引…

python总说的cd是什么

以下适用于windows环境 cd就是change directory的缩写,即改变目录。 讲cd命令之前,先来看看提示符是什么意思。现在的提示符是c:\> c:说明现在的工作盘是c盘,\告诉我们当前的工作目录是根目录。 >的作用是把工作目录和我们要输入的…

电感的基本概念

电感的定义: 电感一般是由导线绕成空芯线圈或带铁芯的线圈而制成。 当线圈中有电流通过时,线圈周围就会产生磁场,当线圈中流过的是直流电流时,线圆周围就会产生固定的磁场,线圈产生的物理现象就是电磁铁,当…

基于 mzt-biz-log 实现接口调用日志记录

🎯导读:mzt-biz-log 是一个用于记录操作日志的通用组件,旨在追踪系统中“谁”在“何时”对“何事”执行了“何种操作”。该组件通过简单的注解配置,如 LogRecord,即可实现接口调用的日志记录,支持成功与失败…

芯片级IO (Pad) Ring IP Checklist

SoC top顶层数字后端实现都会涉及到IO Ring (PAD Ring)的设计。这里面包括VDD IO,VDDIO IO, Signal IO, Corner IO,Filler IO,IO power cut cell等等。 数字后端零基础入门系列 | Innovus零基础LAB学习Day2 数字IC后端实现TOP F…

OpenHarmony-3.HDF Display子系统(6)

Display 子系统 1.Display驱动模型介绍 当前操作系统和 SOC 种类繁多,各厂商的显示屏器件也各有不同,随之针对器件的驱动代码也不尽相同,往往是某一款器件驱动,只适用于某单一内核系统或 SOC,如果要迁移到其他内核或者…

一个日期范围选择框的设计

一个日期范围选择框的设计 一个日期范围选择框 这是一个日期范围选择框的设计,除了可以选择开始日期、结束日期之外。还要一些按钮用于快速选择日期范围: Today今天Yesterday昨天Today & Yesterday今天和昨天This month当月Last month上个月Last w…

【中标麒麟服务器操作系统实例分享】java应用DNS解析异常分析及处理

了解更多银河麒麟操作系统全新产品,请点击访问 麒麟软件产品专区:https://product.kylinos.cn 开发者专区:https://developer.kylinos.cn 文档中心:https://documentkylinos.cn 情况描述 中标麒麟服务器操作系统V7运行在 ARM虚…

React 第十七节 useMemo用法详解

概述 useMemo 是React 中的一个HOOK,用于根据依赖在每次渲染时候缓存计算结果; 大白话就是,只有依赖项发生变化时候,才会重新渲染为新计算的值,否则就还是取原来的值,有点类似 vue 中的 computed 计算属性…

景联文科技:精准语音标注,驱动语音技术新发展

在人工智能迅速发展的今天,语音技术的应用已经渗透到我们生活的方方面面。从智能音箱、语音助手到自动语音识别系统,高质量的语音数据是这些应用成功的关键。景联文科技作为领先的AI数据服务提供商,专注于为客户提供高精度、高效的语音标注服…

中文分词学习

1.安装 jieba 库 !pip install jieba jieba 库是用于中文分词的工具,它通过精确的分词算法来处理文本。通过分词可以将中文句子拆分成单独的词语,这对于自然语言处理任务非常重要,比如文本分类、情感分析、关键词提取。 2.中文文本分词处理…

Android 动画深度解析

一、Android 动画发展历程与核心类型总览 自 Android 诞生起,动画系统便不断推陈出新。早期存在补间动画(Tween Animation)与帧动画(Frame Animation),而 Android 3.0 重磅引入属性动画(Proper…

Linux-ubuntu之主频和时钟配置

Linux-ubuntu之主频和时钟配置 一,主频二,其它时钟配置1.PLL2和PLL3的PFD0-3设置2.AHB_CLK_ROOT3.IPG 和 PERCLK时钟 三,总结 一,主频 24MHz 晶振为内核和其它外设提供时钟源,经电路后到PLL1变为996MHZ,再…

Autosar入门_汽车电子控制器

上一篇 | 返回主目录 汽车电子控制器 1 汽车电子控制器定义2 从功能角度来看构成2.1 车门控制器简单示例2.1.1 解锁过程分析2.1.2 无框车窗短降2.1.3 下电控制电耗2.2 控制器几大基本功能 3 从硬件构成角度看构成3.1 芯片类别说明3.2 芯片与功能联系 1 汽车电子控制器定义 汽…

变压器“变压”和“变流”说明

变压器可以改变交流电压的大小,也可以改变交流电流的大小。 改变交流电压 变压器既可以升高交流电压,也能降低交流电压。在忽略电能损耗的情况下,变 压器电压U、二次电压U2与烧组匝数N、二次烧组匝数的关系为: n称为匝数比或电…