LazyLLM×RAG× 满血 DeepSeek - R1×Agent:商用知识库赋能本地部署,开启 “文理双全” 新引擎
在代码的深海与数学的星空之间,国产自研旗舰 DeepSeek-R1 正以千亿级参数为舟,强大的推理和理解能力为帆,破浪前行。它不仅是代码战场上的解码高手,更是数学迷宫中的推理大师。当 LazyLLM 引擎与之并肩,一场关于算法与逻辑的盛宴悄然开启。
为何要结合 RAG?——DeepSeek-R1 的局限性及 RAG 的互补价值

尽管 DeepSeek-R1 具备上述优势,但其静态知识库更新成本高和实时检索效率不足的特性,可能在动态教育场景中受限(现在,我们询问一个问题 “何为大学”,希望得到的是儒家经典中《大学》里面关于该问题的解释,但是下面 DeepSeek-R1 给的回答非常宽泛)。
而 RAG(检索增强生成)技术可以通过以下方式弥补(DeepSee-R1 结合 RAG 后的回答如下):

动态知识更新 —— 解决模型 “知识截止” 问题
痛点:DeepSeek-R1 的预训练知识依赖固定数据集,难以实时跟进教学热点(如新教材、学科竞赛题)。
RAG 解决方案:通过对接教育领域数据库(如教材库、试题库),实现知识的动态检索与增量学习,确保内容始终与时俱进。
精准领域聚焦 —— 提升垂直场景响应效率
痛点:通用大模型在细分学科(如古诗词格律、几何证明)中可能因 “泛化过度” 导致细节丢失。
RAG 解决方案:结合领域知识图谱与向量数据库,快速定位相关知识点(如《九章算术》中的方程术),强化垂直场景下的专业性。
成本与性能平衡 —— 轻量级部署的关键
痛点:直接调用 DeepSeek-R1 需要云端算力支持,对教育机构而言成本高昂且存在延迟风险。
RAG 解决方案:通过本地部署 RAG 系统,实现 “离线化、低功耗、高响应” 的教育终端适配。
技术整合的价值:从 ” 单点智能” 到 ” 系统智能”
本文以 DeepSeek-R1 这一里程碑式大语言模型为核心,凭借其贯通文理的跨学科智慧,聚焦其在教育领域的两大实践,构建一款文理智能小助手 AI 应用。该应用主要由以下三部分构成:
国学大师教学助手
基于 RAG×DeepSeek-R1 技术,构建一个贯通古今的智能导师,能够精准解析国学经典篇章,并以对话形式传授文化精髓。
数学求解器工具
通过知识蒸馏技术,将 DeepSeek-R1 的数学推理能力迁移到轻量级小模型(如 InternLM2-7B-Chat),打造高效、可解释的数学问题解决引擎。
Agentic RAG 协作
最终将上述工具融合为具备自主规划能力的智能系统,实现从 “被动检索” 到 “主动求解” 的跃迁。
接下来
让我们一起走进这一技术实践的全景
DeepSeek-R1 驱动的教学助手如何让国学焕发新生?
数学求解器如何在小学算术题中展现专家级思维链?
目睹 Agentic RAG 如何重构人机协作的未来图景!

每一次问答
都是智能与人文的深度对话
【部署 DeepSeek-R1 满血版】
一、环境准备
LazyLLM 是一款构建多 Agent 大模型应用的开发框架(已在 GitHub 上开源),协助开发者用极低的成本构建复杂的 AI 应用,并可以持续的迭代优化效果。

LazyLLM 支持用 pip 直接安装,您可以通过以下代码轻松完成安装(不同安装方式分别对应不同功能的使用):
安装 LazyLLM 基础功能的最小依赖包。可以支持线上各类模型的微调和推理。

安装 LazyLLM 的所有功能最小依赖包。不仅支持线上模型的微调和推理,而且支持离线模型的微调(主要依赖 LLaMA-Factory)和推理(主要依赖 vLLM)。

安装 LazyLLM 的所有依赖包,所有功能以及高级功能都支持,比如自动框架选择(AutoFinetune、AutoDeploy 等)、更多的离线推理工具(如增加 LightLLM 等工具)、更多的离线训练工具(如增加 AlpacaloraFinetune、CollieFinetune 等工具)。

二、本地部署
下面是使用本地部署 DeepSeek-R1 模型的代码展示:

这里采用了张量并行和流水并行来切分 DeepSeek-R1,将其分布式地部署到 2 个节点的 16 张卡上。
三、线上使用
如果本地没有算力资源,我们也可以使用 LazyLLM 直接调用线上的 DeepSeek-R1 大模型(LazyLLM 接入了各大主流的在线大模型,包括:OpenAI、SenseNova、GLM、KIMI、QWen、DouBao、DeepSeek 等)。在此之前,我们需要配置下相关的环境变量。首先如果没有对应平台的账号,就需要先在平台注册一个账号,然后根据下面平台对应的获取 API key 的链接获取所需要的 key (注意:sensenova 需要获取两个 key),并设置对应的环境变量:

例如,配置商汤的日日新平台的环境变量:

下面是使用线上的 DeepSeek-R1 模型的代码演示:

运行后,我们通过线上的模型开启一段对话,如下:

【关于 RAG】
一、定义与核心思想
检索增强生成(Retrieval-augmented Generation,RAG)是当前备受关注的大模型前沿技术之一。其工作原理是,当模型需要生成文本或回答问题时,首先会从一个庞大的文档集合中检索出相关的信息。这些检索到的信息随后会被用于指导生成过程,从而显著提高生成文本的质量和准确性。那我们为什么需要 RAG 技术呢?因为有时大模型在一定特定领域不能准确理解我们的意思,生成我们想要的答案,比如你是一个文学爱好者,想了解国学中 “大学” 的相关内容,直接询问 DeepSeek-R1 会得到如下的回答:

显然这并不是我们期望得到的答复,此时就需要用到 RAG 技术,RAG 的基本流程如下图所示:

①. 检索(Retrieval)
负责从外部知识库中获取与查询相关的数据。
使用向量相似性度量等方法来查找最相关的信息。
②. 增强(Augmented)
整合外部信息与模型内部知识库。
结合上下文进行多轮信息补充和优化。
③. 生成(Generatation)
使用大型语言模型(大模型)将检索到的信息与自身的知识库相结合。
合成一个连贯、准确且符合上下文的响应。
首先,用户输入问题或提示词 → 系统接收到输入后,会根据相关算法和策略从各种数据源(如知识库、数据库、网页等)中检索与输入内容相关的信息 → 将检索到的信息与语言模型相结合 → 语言模型基于这些检索到的信息以及自身的知识和算法进行处理和生成 → 最终输出与用户输入相关的、有针对性的回复内容,以帮助用户解决问题或获取所需信息。
由上面的流程可知,最基本的 RAG 包括三个核心组件:文档集合、检索组件、生成组件。接下来我们将分别介绍在 LazyLLM 中如何调用代码执行这三个部分。
二、使用 LazyLLM 实现 RAG
1. 文档集合
RAG 的核心是从文档集合进行文档检索,文档集合中可以有各种各样的文档格式:可以是 DOCX,PDF,PPT 等富文本或者 Markdown 这样的纯文本,也可能是从某个 API 获取的内容(如通过搜索引擎检索得到的相关信息)等等。由于集合内的文档格式各异,针对这些不同格式的文档,我们需要特定的解析器来提取其中有用的文本、图片、表格、音频和视频等内容。LazyLLM 中提供了 Document 类作为各类文档集合的解析器,可以支持 DOCX,PDF,PPT,EXCEL 等常见的富文本内容提取。提取到的文档内容会被存储在 Document 类中将用于后续检索。使用: Document 的代码如下所示:

在上面的代码中,在 "/content/docs/" 目录下放置待检索文档,然后执行代码即可完成自动将该目录下的文档载入 Document 类。
⚠️ 您需要在此处传入绝对路径,或者是以当前目录为基础的相对路径,其他情况下需要您通过环境变量 LAZYLLM_DATA_PATH 指定您的文档所在目录再传入相对路径。
2. 检索组件
文档集合中的文档不一定都和用户要查询的内容相关,因此需要通过检索组件从文档中筛选出和用户查询相关的文档。LazyLLM 中执行检索功能的是 Retriever 组件,下面这行代码声明检索组件需要在 doc 这个文档中的 Coarse chunk 节点组利用 bm25_chinese 相似度进行检索,最终返回相似度最高的 3 个节点。此处只简单介绍如何使用 Retriever 组件,更多检索组件相关细节您可以查阅 LazyLLM 官方文档。

3. 生成组件
有了检索到的内容,结合我们提问的问题,将二者共同输入给生成组件,即可得我们想要的答案。这里的生成组件就是大模型,接下来我们将以线上大模型为例说明 lazyllm 是如何调用大模型的。LazyLLM 通过 OnlineChatModule 统一调用线上大模型接口,不管您使用的 OpenAPI 接口还是 SenseNova 接口,或者是其他平台提供的接口,LazyLLM 均为您进行了规范的参数封装,您只需要根据自己的需求将平台和模型名称等参数传给对应的模块即可:

您还可以通过内置的 prompt 方法,为大模型设置提示词:

4.RAG 的完整实现
有了以上三个组件,我们将他们依次组装起来,就得到了完整版本的 RAG:

最终的输出结果如下:

【利用 LazyLLM 结合业务数据蒸馏小模型】
基于 知识蒸馏(Knowledge Distillation) 技术,我们可以将 DeepSeek-R1 大型语言模型的数学推理能力迁移至轻量级小模型(如 InternLM2-7B-Chat),构建一个高效的数学求解器。核心目标包括:
能力迁移:模仿专家模型(Teacher Model)的推理逻辑与答案生成策略,弥补小模型在复杂数学任务中的性能短板;
思维链验证:探究分步推理过程(Chain-of-Thought)对模型可解释性与准确率的提升作用;
高效训练范式:通过多轮迭代蒸馏策略,优化小模型在有限标注数据下的学习效果。
一、方法论设计
数据集选择与预处理
1. 原始数据集
选用 GSM8K(Grade School Math 8K),包含 8,000+ 小学数学问题(训练集:7473 题,测试集:1319 题),覆盖算术运算、应用题等类型。每个问题附带自然语言解析步骤与数值答案,并且答案都以 \n#### ans
开头,该特性方便对模型的推理效果有一个明确的数值评价。

2. 蒸馏数据集
这里我们对 GSM8K 数据集中的训练数据集进行重建,以获得用于蒸馏小模型的训练集。数据集重建的目的在于:我们希望获得一个带有思维链的且最终提供正确格式和正确答案的回答。主要过程是:
提取 GSM8K 数据集的训练集:7473 个题目,去除其中的回答,仅保留提问。
将 7473 个题目喂给 DeepSeek-R1,保存其对应的输出来作为新的回答,即实现问答对的重建。
其中有几个关键点:
输出格式要求:DeepSeek-R1 输出标准答案的格式统一为
\\boxed{true_answer}
,便于自动评测。

最大化并行请求:根据算力资源调整并发线程(可根据供应商的并发量限制来最大化设置),提升推理的速度。
答案过滤标准:

重试机制
- 不达标处理:未满足条件的题目自动进入重试队列,循环最多 15 次;
- 目的:确保最终数据集的高质量(过滤冷启动 / 低质量样本)。
最终得到构造的满足需求的问答对如下:

其中:

微调方法
1. 技术选型:采用 LoRA(Low-Rank Adaptation) 实现轻量微调,显著降低计算开销;
2. 参数配置:
- 优化目标:最小化生成答案与蒸馏数据的差异;
- 主要参数:

- 训练数据:
蒸馏数据集:包含思维链的问答对,用于训练模型的分步推理能力。
评估体系
在获得微调的模型之后,需要对模型进行评测。这里我们采用如下标准:最终数值结果必须在boxed{ans}
中,且ans
结果和标准答案一致;从下面结果我们可以看到,蒸馏后的模型确实要比蒸馏前的模型好。

评测标准:
- 数值正确性:生成答案与标准答案完全匹配(忽略格式差异);
- 格式合规性:答案需以 \\boxed{...}
包裹。
对比实验设计:
- 蒸馏前模型:未经优化的原始小模型;
- 蒸馏后模型:基于完整蒸馏数据微调的模型;
- 基准模型:DeepSeek-R1 作为性能上限参考。
二、代码实现
1. 获取数据文档
首先我们需要获得数据集:GSM8K。

在上面代码中:
创建数据目录:调用
build_data_path
生成存储目录,定义训练集路径train_path
和评测集路径eval_path
。数据集转换:
加载数据:通过 ModelScope API 获取 GSM8K 数据集;
字段映射:将原始字段
question
→instruction
,answer
→output
,适配后续微调需求。保存数据:将处理后的训练集和评测集分别存入
train_path
和eval_path
。
经过以上步骤,我们就预处理好了数据集 GSM8K。
2. 蒸馏数据
接下来我们基于预处理好的训练集,将它处理后喂给 DeepSeek-R1 来实现数据的蒸馏,以构造出新的训练集。

上面代码中,我们定义了一个 distill_dataset
来实现对数据的蒸馏:
加载数据:
distill_dataset
调用load_data
加载预处理后的训练集,支持通过demo
参数快速调试(仅加载单条数据)。并发推理:基于 LazyLLM 的
warp
工作流并发调用 DeepSeek-R1 模型(通过_concurrent
控制并发量)。迭代筛选:
- 提取问题 (
instruction
) 并触发推理流程;- 使用
filter
函数筛选符合标准的答案(含\\boxed{{true_answer}}
和 标签),存入res_list
;- 未通过的数据作为新输入循环推理,最多重试 15 次。
结果保存:最终输出合格数据
distilled_train_data.json
和失败记录left_data.json
。关键参数:
-_concurrent
:控制并发推理线程数;-demo
:调试模式开关(加载单条数据);-
重试上限:15 次(过滤低质量 / 冷启动样本)。
下面代码是 filter 的实现细节 (对 DeepSeek-R1 的推理结果进行筛选,只保留带有思维链,且答案和格式都正确的结果):

3. 微调模型
在上一步获得训练集的基础上,我们可以基于 LazyLLM 来实现微调、推理和评测。代码如下:

上面代码中,获取数据和蒸馏数据已经在前面内容介绍,这里我们直接来看微调模型:
数据准备:从评测集抽取
instruction
作为推理数据集infer_data
,并绑定为.evalset(infer_data)
。微调配置:

4. 模型评测
在获得了评测集的推理结果之后,我们可以实现一个caculate_score
对其结果进行评测:

上述代码中主要从推理结果中捕获 boxed 所包含的正确答案,并和标准答案做对比,相等就可以累加一分。最后以字符串的方式返回总得分和分数占比。至此,这就是基于 LazyLLM 的对 DeepSeek-R1 蒸馏小模型的实现,完整的代码脚本详见:LazyLLM/examples/distill_deepseek_r1.py
【Agentic RAG】

一、定义与核心思想
Agentic RAG 是一种结合 AI Agent 的检索增强生成(RAG)技术,其核心在于通过引入智能代理(Agent)替代或增强传统 RAG 中的检索组件,使系统具备更强的自主决策、多源信息整合和动态交互能力。
核心类比
传统 RAG:如同 “带着书本去考试的考生 “,依赖静态知识库检索生成答案;
Agentic RAG:如同 “带着专家去考试的考生”,专家(Agent)可动态调用工具、多源检索、迭代优化答案生成过程。

以上图片展现了 Agentic RAG 与传统 RAG 的区别。Agentic RAG 核心思想是引入智能体概念,让系统中的智能体具有自主性、目标导向性等特征,能更自主灵活地进行任务处理和信息整合,通过多智能体协作、层级结构等方式更好地应对复杂任务。下面的表格从多维度展现了两者的区别。

技术价值
降低对标注数据的依赖:通过 Agent 自主检索和工具调用,弥补领域知识不足的问题;
提升复杂任务处理能力:支持跨领域推理(如法律咨询需结合法规库、案例库和判例搜索);
增强可解释性:Agent 的决策路径可追溯(如 “为何选择此数据源?”→“因相关性评分最高”)。
二、基本原理与组成
核心组件
Agentic RAG 由以下关键组件构成:

工作流程
1. 输入 Query
用户提出问题(如 “如何优化电客服响应?”)。
2.Agent 驱动检索
动态规划:Agent 将任务分解为子任务(如 “检索客服话术库”“分析用户反馈数据”);
多源调用:并行调用知识库、数据库、网络搜索等工具获取信息;
迭代优化:若首次检索结果不足,Agent 自动调整策略(如更换关键词、调用计算工具)。
3. 上下文增强
Agent 将检索到的碎片化信息整合为连贯上下文,补充缺失知识(如关联历史案例)。
4. 生成回答
LLM 基于增强后的上下文生成最终回复,并可能触发 Agent 二次迭代(如 “是否需要补充医疗数据?”)。
三、Agent 工作流类型
AI Agent 有很多类型的工作流程,其灵活性正源于 Agent 的不同行为模式,常见类型如下:
Agentic RAG 由以下关键组件构成:

四、Agentic RAG 整合
接下来我们将搭建下面这样一个框架,包括 Retrival Agent、RAG、Math Expert 以及 Generative Component 四个部分。首先用户提出问题 Query 后首先由代理 Retrival Agent 收到,该代理将调用 RAG 或 Math Expert 两个工具之一,调用后得到的结果将传递给 Generative,输出 Response。

RAG 组件
首先参照第一章节内容我们搭建如下的基础 rag 流程:

上述代码中,我们采用了重排序组件 Rerank,其基本思想是:在初步检索后,通过一个额外的模型对检索结果进行再次排序以提高最终的效果。
注意,当我们调用多个平台的线上模型时,需要在 OnlineModule 中传入相应的 api_key,传入方法为 api_key="您的 api_key",如果您已经配置了环境变量,则可以通过 api_key=lazyllm.config ['qwen_api_key'] 直接指定传入。
接下来我们将该方法注册为 Agent 的工具,方法也非常简单:

通过装饰器 @fc_register ("tool") 进行注册,返回上面搭建的 ppl_rag 即可。
math_expert
通过如下代码注册并调用第二章我们蒸馏得到的模型:

上述代码中,我们通过 TranableModule 调用本地模型。LazyLLM 中的 TrainableModule 为所有本地模型 (包括 llm、Embedding 等) 提供服务,可用于本地模型的训练、微调和推理。调用本地大模型依赖于其推理服务,我们回顾一下使用本地模型进行推理的步骤:
1. 通过 VLLM 等框架启动本地模型服务;
2. 在 python 脚本中进行接口调用。
LazyLLM 提供了一种非常 lazy 的实现方式,只需将模型所在的路径传入 LazyLLM 的 TrainableModule 然后通过 start () 函数启动服务即可。这里需要您传入模型文件的绝对路径,或者配置环境变量 “LAZYLLM_MODEL_PATH” 指定模型所在的目录,然后将模型名称传入 TrainableModule。如果您本地没有该模型,LazyLLM 会为您下载对应模型并存入模型缓存目录,默认情况下会下载到您的家目录下的 ".lazyllm/model" 目录;您可以通过配置 “LAZYLLM_MODEL_CACHE_DIR” 环境变量指定模型缓存目录。
完整流程
有了以上两个工具,我们即可构建 Agentic RAG 的完整流程:

最后可以通过 LazyLLM 中的 WebModule 将您的 RAG 应用封装为一个 Web 应用,在图像界面中进行对话:

最终的效果如下:


欢迎移步 “LazyLLM” gzh,与更多开发者交流!
版权声明: 本文为 InfoQ 作者【商汤万象开发者】的原创文章。
原文链接:【http://xie.infoq.cn/article/8d73f59445985fcddd2131441】。文章转载请联系作者。
评论