RAG技术深度解析:从基础Agent到复杂推理Deep Search的架构实践
重磅推荐专栏:
《大模型AIGC》
《课程大纲》
《知识星球》
本专栏致力于探索和讨论当今最前沿的技术趋势和应用领域,包括但不限于ChatGPT和Stable Diffusion等。我们将深入研究大型模型的开发和应用,以及与之相关的人工智能生成内容(AIGC)技术。通过深入的技术解析和实践经验分享,旨在帮助读者更好地理解和应用这些领域的最新进展
一、什么是 RAG Agent?
1. 从信息处理到智能生成
在自然语言处理领域,传统问答系统往往面临两大难题:如何突破模型知识边界?如何保障回答的可信度?RAG(Retrieval-Augmented Generation)架构应运而生。而当我们以工程视角实现RAG时,就需要一个标准化的载体——RAG Agent。
2. 代码解构:RAG Agent的骨骼
观察示例代码中的RAGAgent类,我们可以看到一个典型实现:
class RAGAgent(BaseAgent):def retrieve(self, query: str, **kwargs) -> Tuple[List[RetrievalResult], int, dict]:# 检索核心逻辑def query(self, query: str, **kwargs) -> Tuple[str, List[RetrievalResult], int]:# 端到端查询流程
这个类继承自BaseAgent,体现了面向接口编程思想。两个核心方法retrieve和query分别对应RAG的两大阶段:
2.1 检索阶段(Retrieve)
• 输入:自然语言查询
• 处理:向量数据库相似度检索
• 输出:RetrievalResult列表(包含文档片段、相似度分数等)
# 示例返回结构
[RetrievalResult(content="深度学习模型...", score=0.92),RetrievalResult(content="神经网络结构...", score=0.88)
]
2.2 生成阶段(Generate)
• 输入:原始查询 + 检索结果
• 处理:LLM融合信息生成最终回答
• 输出:自然语言回答 + 参考溯源
3. 技术实现的三重保障
1. 可观测性设计
返回元组中的int类型token计数器,为成本监控提供基础:
def query(...) -> Tuple[str, List[RetrievalResult], int]:# 最后一个int即为token消耗总量
2. 扩展性架构
**kwargs参数的设计允许灵活接入:
• 检索参数控制(top_k、相似度阈值)
• 生成参数调节(temperature、max_length)
• 多路召回扩展
3. 类型安全
通过类型注解确保接口规范:
• List[RetrievalResult]保证检索结果结构统一
• Tuple明确约定返回顺序
4. RAG Agent的独特优势
对比传统问答系统,该架构具有显著优势:
| 维度 | 传统问答 | RAG Agent |
|---|---|---|
| 知识边界 | 依赖训练数据 | 动态扩展 |
| 数据新鲜度 | 静态知识 | 实时更新 |
| 可解释性 | 黑盒响应 | 溯源支持 |
| 维护成本 | 全量重训 | 增量更新 |
5. 典型应用场景
-
企业知识库问答
将内部文档库作为检索源,确保回答符合企业规范 -
学术研究助手
连接论文数据库,生成带文献引用的综述 -
智能客服系统
基于最新产品文档生成准确话术
二、揭秘Naive RAG:从代码实例看检索增强生成系统的核心架构
1. 智能路由系统:知识库的"导航助手"
1.1 路由决策的核心代码
当我们向系统提问"如何预防糖尿病并发症"时,路由模块通过以下代码实现知识库选择:
# 生成路由提示模板
prompt = """
"QUESTION": 如何预防糖尿病并发症
"COLLECTION_INFO": [{"collection_name": "medical_encyclopedia", "description": "疾病百科全书"},{"collection_name": "drug_database", "description": "药品说明书库"}
]
"""# 大模型返回的响应示例
model_response = "['medical_encyclopedia']"# 解析模型响应
selected_collections = literal_eval(model_response) # 得到['medical_encyclopedia']
1.2 路由异常处理机制
当遇到未描述的知识库时,系统自动将其纳入检索范围:
# 处理无描述的知识库
for collection in all_collections:if not collection.description:selected_collections.append(collection.name) # 自动加入检索列表# 包含默认知识库
if vector_db.default_collection:selected_collections.append("default_medical") # 确保基础医学库被检索
2. 智能检索引擎:知识挖掘的"矿工"
2.1 分布式检索实现
当选择3个知识库且设置top_k=15时,检索分配逻辑如下:
top_k_per_collection = 15 // 3 = 5 # 每个库检索5条
results = []
for collection in selected_collections:res = vector_db.search(query_vector, top_k=5,filter="category=='糖尿病'")results.extend(res)
2.2 上下文扩展技术
原始检索结果与扩展后对比:
# 原始文本片段
原始结果: "血糖监测是糖尿病管理的基础"# 扩展后文本
{"text": "血糖监测是糖尿病管理的基础","wider_text": "《糖尿病防治指南》第3章指出:患者应定期进行血糖监测...(完整段落)"
}
3. 答案生成引擎:信息整合的"分析师"
3.1 结构化提示模板
系统将检索结果转换为XML格式的输入:
mini_chunk_str = '''
<chunk_1>
《中国2型糖尿病防治指南》建议:所有糖尿病患者...
</chunk_1>
<chunk_2>
美国ADA指南强调:饮食控制需要配合定期运动...
</chunk_2>'''
3.2 生成过程示例
最终提交给LLM的提示模板:
您是一位医疗分析专家,请根据以下资料回答问题:原始问题:如何预防糖尿病并发症?相关文献:
<chunk_1>...糖尿病监测标准...</chunk_1>
<chunk_2>...饮食控制方案...</chunk_2>
4. 核心架构设计解析
4.1 模块化设计思想
类初始化展现的组件解耦:
class NaiveRAG:def __init__(self, llm, embedding_model, vector_db):self.llm = llm # 可替换GPT-4/Claude等模型self.embedding = embedding # 支持多种文本编码器self.vector_db = vector_db # 兼容各类向量数据库
4.2 全链路可观测性
系统运行时的关键日志输出:
[SYSTEM] 在[相关文章:
RAG技术深度解析:从基础Agent到复杂推理Deep Search的架构实践
重磅推荐专栏: 《大模型AIGC》 《课程大纲》 《知识星球》 本专栏致力于探索和讨论当今最前沿的技术趋势和应用领域,包括但不限于ChatGPT和Stable Diffusion等。我们将深入研究大型模型的开发和应用,以及与之相关的人工智能生成内容(AIGC)技术。通过深入的技术解析和实践经…...
OpenCV计算摄影学(18)平滑图像中的纹理区域同时保留边缘信息函数textureFlattening()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::textureFlattening 是 OpenCV 中用于图像处理的一个函数,旨在平滑图像中的纹理区域,同时保留边缘信息。该技术特别适…...
“此电脑”中删除WPS云盘方法(百度网盘通用)
📣此方法适用于卸载WPS云盘后,WPS云盘图标依然在此电脑中显示的问题。 原理:通过注册来进行删除 步骤: WIN键R,打开运行窗口,输入regedit命令,来打开【注册表编辑器】; 从左侧,依…...
Agent革命:Manus如何用工作流拆解掀起AI生产力革命
一、现象级产品的诞生背景 2025年3月6日,一款名为Manus的AI产品在技术圈引发地震式传播。其官方测试数据显示:在GAIA基准测试中,基础任务准确率达86.5%(接近人类水平),中高级任务完成率突破57%。这标志着A…...
四款GIS工具箱软件解析:满足企业多样化空间数据需求
概述 随着地理信息系统(GIS)在城市规划、环境监测、资源管理等领域的广泛应用,各种GIS工具箱软件不断涌现,为用户提供了强大的数据处理、空间分析和地图制图功能。本文将为大家介绍4款GIS工具箱软件,这些软件各具特色…...
nginx 配置403页面(已亲测)
问题:GET请求访问漏洞url即可看到泄露的内网ip 解决方式: 1.配置nginx 不显示真实Ip 2.限制接口只能是POST请求 具体配置: 编写一个403.html 在nginx的配置文件中,配置location参数: location /api/validationCode…...
After Effects的图钉与关键帧动画
姜 子 博 引言 在数字媒体时代,动态图形和视觉效果在信息传播和表达中扮演着越来越重要的角色。After Effects 作为行业领先的软件,提供了丰富的工具和功能,帮助用户创作出令人惊叹的视觉作品。图钉工具和关键帧动画是 AE 中实现复杂动画效…...
SAP DOI EXCEL宏的使用
OAOR里上传EXCEL模版 屏幕初始化PBO创建DOI EXCEL对象,并填充EXCEL内容 *&---------------------------------------------------------------------* *& Module INIT_DOI_DISPLAY_9100 OUTPUT *&--------------------------------------------…...
新编大学应用英语综合教程3 U校园全套参考答案
获取全套答案: 链接:https://pan.quark.cn/s/abaa0338724e...
高考數學。。。
2024上 具体来说,直线的参数方程可以写为: x1t y−t z1t 二、简答题(本大题共5小题,每小题7分,共35分。) 12.数学学习评价不仅要关注结果评价,也要关注过程评价。简要说明过程评价应关注哪几个方面。…...
STM32 子设备通过CAN发送数据到主设备
采集ADC、GPS经纬坐标、温湿度数据、大气压数据通过CAN方式发送给主设备端,帧ID按照如下定义: 我尼玛一个标准帧ID位数据是11位,扩展帧才是111829位,它说最开头的是四位是真类型,并给我如下解释: 它把帧的定…...
HCIA-IP路由动态-RIP
一、概念 动态路由是指路由器通过运行动态路由协议(RIP、OSPF等),自动学习和发现网络中的路由信息。路由器之间通过交换路由协议数据包,互相通告自己所知道的网络信息,从而构建和更新路由表。 二、RIP(路由信息协议)…...
CentOS7离线部署安装docker和docker-compose
CentOS7离线部署安装docker和docker-compose 安装包准备 docker下载地址、docker-compose下载地址 docker和docker-compose版本对应关系 注:本次安装部署选择的版本是 docker:docker-28.0.1.tgzdocker-compose:docker-compose-linux-x86_6…...
Sora与AGI的结合:从多模态模型到智能体推理的演进
全文目录: 开篇语前言前言:AGI的挑战与Sora的突破Sora的多模态学习架构:支撑智能体推理的基础1. **多模态学习的核心:信息融合与交叉理解**2. **智能体推理:从感知到决策** Sora如何推动AGI的发展:自主学习…...
Core Speech Kit(基础语音服务)
文章目录 一、Core Speech Kit简介场景介绍约束与限制二、文本转语音1. 场景介绍2. 约束与限制3. 开发步骤4. 设置播报策略设置数字播报策略插入静音停顿指定汉字发音5. 开发实例三、语音识别约束与限制开发步骤开发实例一、Core Speech Kit简介 Core Speech Kit(基础语音服务…...
VsCode 快捷键备忘
移动光标及选择文本 Ctrl ← / → :以单词为单位移动游标Home / End:光标移到行首/行位Ctrl Home / End:光标移到文件首和文件尾Ctrl Shift \:在匹配的分隔符之间跳转 配对的分隔符 是指分隔代码元素的字符,比如字…...
配置 Thunderbird 以使用 QQ 邮箱
配置 Thunderbird 以使用 QQ 邮箱 本片文章的操作系统为 windws 10 ,thunder bird 客户端版本为 128.7.1esr(64位)。注意到其他文章的图片中 thunder bird 的 ui 界面和我这个不一样,导致看起来不太方便,所以这里写一篇博客。不同版本的 thu…...
如何使用MyBatis进行多表查询
前言 在实际开发中,对数据库的操作通常会涉及多张表,MyBatis提供了关联映射,这些关联映射可以很好地处理表与表,对象与对象之间的的关联关系。 一对一查询 步骤: 先确定表的一对一关系确定好实体类,添加关…...
第六课:数据存储三剑客:CSV/JSON/MySQL
在Python的数据存储与处理领域,CSV、JSON和MySQL被广大开发者誉为“数据存储三剑客”。它们各自在不同的场景下发挥着重要作用,无论是简单的数据交换、轻量级的数据存储,还是复杂的关系型数据库管理,都能找到它们的身影。本文将详…...
Python通过SSH隧道访问数据库
本文介绍通过sshtunnel类库建立SSH隧道,使用paramiko通过SSH来访问数据库。 实现了两种建立SSH方式:公私钥验证、密码验证。 公私钥可读本地,也可读取Aws S3上的私钥文件。 本质上就是在本机建立SSH隧道,然后将访问DB转发到本地SS…...
Aws batch task 无法拉取ECR 镜像unable to pull secrets or registry auth 问题排查
AWS batch task使用了自定义镜像,在提作业后出现错误 具体错误是ResourceInitializationError: unable to pull secrets or registry auth: The task cannot pull registry auth from Amazon ECR: There is a connection issue between the task and Amazon ECR. C…...
立即释放 Mac 空间!Duplicate File Finder 8 重复文件高速清理工具
Duplicate File Finder 专业的 Mac 重复文件清理工具。查找并删除重复的文件、文件夹,甚至相似的照片。 不要让无用的文件占用磁盘上的宝贵空间。 整理你的 Mac。用最好的重复文件查找器来管理你的文件集合。 扫描任何磁盘或文件夹 主文件夹、照片/音乐库、外部磁…...
quillEditor 禁用复制粘贴图片,以及class转style等问题
<template><div><div class"search-term"><el-form :inline"true" :model"searchInfo" class"demo-form-inline"><el-form-item label"案例标题"><el-input v-model"searchInfo.titl…...
快速掌握EasyOCR应用实战指南
EasyOCR 是一个开源的、支持多语言(28种)和多文档格式(PDF/PNG/JPG/TIFF等)的 OCR(光学字符识别)工具库,由 Hugging Face 团队维护。其目标是简化 OCR 的开发流程,提供易用、高性能的…...
ubuntu22.04本地部署OpenWebUI
一、简介 Open WebUI 是一个可扩展、功能丰富且用户友好的自托管 AI 平台,旨在完全离线运行。它支持各种 LLM 运行器,如 Ollama 和 OpenAI 兼容的 API,并内置了 RAG 推理引擎,使其成为强大的 AI 部署解决方案。 二、安装 方法 …...
JavaScript(最后一个元素的索引就是数组的长度减 1)array.length - 1
在不同的编程语言中,表示数组中最后一个元素的方法略有不同,但基本思路都是利用数组的长度或索引来实现。 以下是一些常见编程语言中获取数组最后一个元素的方法: 1. JavaScript: 使用 array.length - 1 索引: 这是最常见和传统的方法。Java…...
【Leetcode 每日一题】2597. 美丽子集的数目
问题背景 给你一个由正整数组成的数组 n u m s nums nums 和一个 正 整数 k k k。 如果 n u m s nums nums 的子集中,任意两个整数的绝对差均不等于 k k k,则认为该子数组是一个 美丽 子集。 返回数组 n u m s nums nums 中 非空 且 美丽 的子集数…...
jupyter配置多个核心
CMD输入 先创建虚拟环境 "D:\Program Files\Python37\python.exe" -m venv myenv激活虚拟环境 myenv\Scripts\activate"D:\Program Files\Python37\python.exe" -m pip install ipykernel "D:\Program Files\Python37\python.exe" -m ipykern…...
【Linux系统编程】初识系统编程
目录 一、什么是系统编程1. 系统编程的定义2. 系统编程的特点3. 系统编程的应用领域4. 系统编程的核心概念5. 系统编程的工具和技术 二、操作系统四大基本功能1. 进程管理(Process Management)2. 内存管理(Memory Management)3. 文…...
Python-列表和元组
列表 列表是什么, 元组是什么 编程中, 经常需要使用变量, 来保存/表示数据. 如果代码中需要表示的数据个数比较少, 我们直接创建多个变量即可. 但是有的时候, 代码中需要表示的数据特别多, 甚至也不知道要表示多少个数据. 这个时候, 就需要用到列表. 列表是一种让程序猿在代…...
