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)技术。通过深入的技术解析和实践经…...
6.过拟合处理:确保模型泛化能力的实践指南——大模型开发深度学习理论基础
在深度学习开发中,过拟合是一个常见且具有挑战性的问题。当模型在训练集上表现优秀,但在测试集或新数据上性能大幅下降时,就说明模型“记住”了训练数据中的噪声而非学习到泛化规律。本文将从实际开发角度系统讲解如何应对过拟合,…...
【玩转23种Java设计模式】结构型模式篇:组合模式
软件设计模式(Design pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。 汇总目录链接&…...
专业工具,提供多种磁盘分区方案
随着时间的推移,电脑的磁盘空间往往会越来越紧张,许多人都经历过磁盘空间不足的困扰。虽然通过清理垃圾文件可以获得一定的改善,但随着文件和软件的增多,磁盘空间仍然可能显得捉襟见肘。在这种情况下,将其他磁盘的闲置…...
SELinux 概述
SELinux 概述 概念 SELinux(Security-Enhanced Linux)是美国国家安全局在 Linux 开源社区的帮助下开发的一个强制访问控制(MAC,Mandatory Access Control)的安全子系统。它确保服务进程仅能访问它们应有的资源。 例…...
【十三】Golang 通道
💢欢迎来到张胤尘的开源技术站 💥开源如江河,汇聚众志成。代码似星辰,照亮行征程。开源精神长,传承永不忘。携手共前行,未来更辉煌💥 文章目录 通道通道声明初始化缓冲机制无缓冲通道代码示例 带…...
DeepSeek专题:DeepSeek-V2核心知识点速览
AIGCmagic社区知识星球是国内首个以AIGC全栈技术与商业变现为主线的学习交流平台,涉及AI绘画、AI视频、大模型、AI多模态、数字人以及全行业AIGC赋能等100应用方向。星球内部包含海量学习资源、专业问答、前沿资讯、内推招聘、AI课程、AIGC模型、AIGC数据集和源码等…...
Oracle19c进入EM Express(Oracle企业管理器)详细步骤
以下是使用Oracle 19c进入Oracle Enterprise Manager Database Express(EM Express)的详细步骤: ### **步骤 1:确认EM Express配置状态** 1. **登录数据库服务器** 使用Oracle用户或管理员权限账户登录操作系统。 2. **查看EM…...
游戏引擎学习第140天
回顾并为今天的内容做准备 目前代码的进展到了声音混音的部分。昨天我详细解释了声音的处理方式,声音在技术上是一个非常特别的存在,但在游戏中进行声音混音的需求其实相对简单明了,所以今天的任务应该不会太具挑战性。 今天我们会编写一个…...
C++--迭代器(iterator)介绍---主要介绍vector和string中的迭代器
目录 一、迭代器(iterator)的定义 二、迭代器的类别 三、使用迭代器 3.1 迭代器运算符 3.2 迭代器的简单应用:使用迭代器将string对象的第一个字母改为大写 3.3 将迭代器从一个元素移动到另外一个元素 3.4 迭代器运算 3.5 迭代器的复…...
RuleOS:区块链开发的“新引擎”,点燃Web3创新之火
RuleOS:区块链开发的“新引擎”,点燃Web3创新之火 在区块链技术的浪潮中,RuleOS宛如一台强劲的“新引擎”,为个人和企业开发去中心化应用(DApp)注入了前所未有的动力。它以独特的设计理念和强大的功能特性&…...
机器学习之强化学习
引言 在人工智能的众多分支中,强化学习(Reinforcement Learning, RL) 因其独特的学习范式而备受关注。与依赖标注数据的监督学习或探索数据结构的无监督学习不同,强化学习的核心是智能体(Agent)通过与环境…...
基于 uni-app 和 Vue3 开发的汉字书写练习应用
基于 uni-app 和 Vue3 开发的汉字书写练习应用 前言 本文介绍了如何使用 uni-app Vue3 uview-plus 开发一个汉字书写练习应用。该应用支持笔画演示、书写练习、进度保存等功能,可以帮助用户学习汉字书写。 在线演示 演示地址: http://demo.xiyueta.com/case/w…...
每天五分钟深度学习PyTorch:向更深的卷积神经网络挑战的ResNet
本文重点 ResNet大名鼎鼎,它是由何恺明团队设计的,它获取了2015年ImageNet冠军,它很好的解决了当神经网络层数过多出现的难以训练的问题,它创造性的设计了跳跃连接的方式,使得卷积神经网络的层数出现了大幅度提升,设置可以达到上千层,可以说resnet对于网络模型的设计具…...
electron + vue3 + vite 主进程到渲染进程的单向通信
用示例讲解下主进程到渲染进程的单向通信 初始版本项目结构可参考项目:https://github.com/ylpxzx/electron-forge-project/tree/init_project 主进程到渲染进程(单向) 以Electron官方文档给出的”主进程主动触发动作,发送内容给渲…...
《白帽子讲 Web 安全》之身份认证
目录 引言 一、概述 二、密码安全性 三、认证方式 (一)HTTP 认证 (二)表单登录 (三)客户端证书 (四)一次性密码(OTP) (五)多因…...
postgrel
首先按照惯例,肯定是需要对PostgreSQL数据库进行一系列信息收集的,常用的命令有以下这些:-- 版本信息select version();show server_version;select pg_read_file(PG_VERSION, 0, 200);-- 数字版本信息包括小版号SHOW server_version_num;SEL…...
Java基础——java8+新特性——方法引用(::)
1. 什么是方法引用? 定义:Java 8 引入的语法糖,用于 简化 Lambda 表达式,直接引用已有的方法。 符号:使用 :: 双冒号操作符。 本质:将方法作为函数式接口的实例传。 2. 方法引用的四种类型 类型 语法 …...
基于SpringBoot的商城管理系统(源码+部署教程)
运行环境 数据库:MySql 编译器:Intellij IDEA 前端运行环境:node.js v12.13.0 JAVA版本:JDK 1.8 主要功能 基于Springboot的商城管理系统包含管理端和用户端两个部分,主要功能有: 管理端 首页商品列…...
uniapp实现的个人中心页面(仿小红书)
采用 uniapp 实现的一款仿小红书个人中心页面模板,支持vue2、vue3, 同时适配H5、小程序等多端多应用。 简约美观大方 可到插件市场下载尝试: https://ext.dcloud.net.cn/plugin?id22516 示例...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...
css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...
MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
MySQL 主从同步异常处理
阅读原文:https://www.xiaozaoshu.top/articles/mysql-m-s-update-pk MySQL 做双主,遇到的这个错误: Could not execute Update_rows event on table ... Error_code: 1032是 MySQL 主从复制时的经典错误之一,通常表示ÿ…...
LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用
中达瑞和自2005年成立以来,一直在光谱成像领域深度钻研和发展,始终致力于研发高性能、高可靠性的光谱成像相机,为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...
离线语音识别方案分析
随着人工智能技术的不断发展,语音识别技术也得到了广泛的应用,从智能家居到车载系统,语音识别正在改变我们与设备的交互方式。尤其是离线语音识别,由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力,广…...
上位机开发过程中的设计模式体会(1):工厂方法模式、单例模式和生成器模式
简介 在我的 QT/C 开发工作中,合理运用设计模式极大地提高了代码的可维护性和可扩展性。本文将分享我在实际项目中应用的三种创造型模式:工厂方法模式、单例模式和生成器模式。 1. 工厂模式 (Factory Pattern) 应用场景 在我的 QT 项目中曾经有一个需…...
