基于 DeepSeek R1 蒸馏模型与 Smolagents 的双 LLM Agentic RAG 系统实战指南
基于 DeepSeek R1 蒸馏模型与 Smolagents 的双 LLM Agentic RAG 系统实战指南【免费下载链接】ottomator-agentsAll the open source AI Agents hosted on the oTTomator Live Agent Studio platform!项目地址: https://gitcode.com/GitHub_Trending/ot/ottomator-agents本文围绕 oTTomator Live Agent Studio 开源仓库中的R1 Distill RAG Systemr1-distill-rag展开。该系统以 DeepSeek 的 R1 系列蒸馏模型为核心推理引擎借助 HuggingFace Smolagents 框架构建出推理模型 工具调用模型双 LLM 协作的 Agentic RAG 问答系统可用于对本地 PDF 文档库进行上下文感知的智能问答。读完本文你将掌握完整的本地/云端环境配置、Ollama 自定义模型创建、向量库摄取与 Gradio/Streamlit 双前端运行方案并理解其底层调用链与调优要点。项目概览为什么 RAG 还需要一个推理引擎传统 RAG 的链路通常只有向量检索 生成而 R1 Distill RAG System 的核心设计理念是让检索与生成之间多一层独立推理。系统选用 DeepSeek 的 R1 模型——以其突出的推理能力和指令遵循能力著称——作为核心推理引擎再搭配一个独立的对话/工具调用模型来主导交互流程两者各司其职Reasoning 模型推理模型接收检索到的文档片段进行综合分析并生成简洁、具体的答案Tool calling 模型工具模型负责理解用户意图、决定何时调用 RAG 工具、组织最终回复。这种设计在 r1_smolagent_rag.py 中体现为两个 Smolagents Agent 的嵌套协作下文会详细拆解其实现。环境准备与依赖安装官方 README 给出的标准安装流程如下完整源码位于 r1-distill-rag 目录# 1. 克隆仓库后进入项目目录 # 2. 创建并激活虚拟环境 python -m venv venv # Windows .\venv\Scripts\activate # Unix / MacOS source venv/bin/activate # 3. 安装依赖 pip install -r requirements.txt # 4. 复制环境变量模板 cp .env.example .env依赖清单 requirements.txt 中几个关键组件的版本固定如下值得注意组件版本作用smolagents1.6.0Agent 框架核心CodeAgent / ToolCallingAgent / GradioUIlangchain0.3.17文档加载、文本切分、向量库封装langchain-chroma0.2.1Chroma 向量数据库的 LangChain 集成langchain-community0.3.16DirectoryLoader、PyPDFLoader等社区加载器langchain-huggingface0.1.2HuggingFaceEmbeddings嵌入模型封装chromadb0.6.3向量数据库本体gradio5.14.0默认 Web 交互界面streamlit1.41.1备选 Web 交互界面sentence-transformers3.4.1本地嵌入模型运行库torch2.6.0嵌入模型与本地推理的深度学习后端说明requirements.txt在仓库中以 UTF-16 编码保存若用文本工具直接查看出现乱码可用iconv -f UTF-16 -t UTF-8 requirements.txt转换后阅读。环境变量配置详解云端 API 与本地推理双模式项目通过.env文件中的USE_HUGGINGFACE开关决定走 HuggingFace 云端推理还是 Ollama 本地推理。完整变量定义可参考 .env.example变量含义必填性USE_HUGGINGFACE设为yes使用 HuggingFace APIno使用 Ollama必填HUGGINGFACE_API_TOKENHuggingFace 访问令牌不填也能用但速率限制更严、可选模型更少云端模式建议填REASONING_MODEL_ID推理 LLM 的模型 ID必填TOOL_MODEL_ID工具调用 LLM 的模型 ID必填模式一HuggingFace 云端推理USE_HUGGINGFACEyes HUGGINGFACE_API_TOKENyour_token_here REASONING_MODEL_IDdeepseek-ai/DeepSeek-R1-Distill-Qwen-32B TOOL_MODEL_IDmeta-llama/Llama-3.3-70B-Instruct云端模式适合生产环境无需本地 GPUAPI 稳定可选模型丰富接入方式是在r1_smolagent_rag.py的get_model()函数中通过HfApiModel(model_idmodel_id, tokenhuggingface_api_token)建立模型句柄。模式二Ollama 本地推理USE_HUGGINGFACEno HUGGINGFACE_API_TOKEN REASONING_MODEL_IDdeepseek-r1:7b-8k TOOL_MODEL_IDqwen2.5:14b-instruct-8k本地模式完全离线运行、无需令牌、延迟更低更适合开发调试代价是占用本机较多系统资源。此时get_model()会返回OpenAIServerModel将 Ollama 的 OpenAI 兼容接口作为api_basereturn OpenAIServerModel( model_idmodel_id, api_basehttp://localhost:11434/v1, api_keyollama )Ollama 模型定制扩展上下文窗口的关键步骤Ollama 模式下 README 给出了推荐的模型组合——deepseek-r1:7b做推理、qwen2.5:14b-instruct做对话两者都在本地以 8k 上下文运行。第一步安装并拉取基础模型# 安装 Ollama 后执行 ollama pull deepseek-r1:7b ollama pull qwen2.5:14b-instruct-q4_K_M第二步基于 Modelfile 创建自定义模型仓库在 ollama_models 目录下预置了三份 Modelfile内容均为两行——指定基础模型并放大上下文窗口# ollama_models/Deepseek-r1-7b-8k FROM deepseek-r1:7b PARAMETER num_ctx 8096# ollama_models/Qwen-14b-Instruct-8k FROM qwen2.5:14b-instruct-q4_K_M PARAMETER num_ctx 8096# ollama_models/Qwen-7b-Instruct-8k FROM qwen2.5:7b-instruct-q4_K_M PARAMETER num_ctx 8096PARAMETER num_ctx 8096将默认上下文窗口从 2048 扩大至约 8k这正是 7B/14B 参数模型在装下检索片段 推理链场景下的推荐配置——R1 这类思维链模型会在推理时产生大量中间 token窄上下文会严重截断其思考过程。创建自定义模型的命令Linux / Windowsollama create deepseek-r1:7b-8k -f ollama_models/Deepseek-r1-7b-8k ollama create qwen2.5:14b-instruct-8k -f ollama_models/Qwen-14b-Instruct-8kMacOS 注意需要改用-from参数替代-follama create deepseek-r1:7b-8k -from ollama_models/Deepseek-r1-7b-8k ollama create qwen2.5:14b-instruct-8k -from ollama_models/Qwen-14b-Instruct-8kREADME 也明确提示完全可以自行实验其他模型或不同的上下文窗口大小只需修改ollama_models目录下的 Modelfile 后重新ollama create即可。文档摄取从 PDF 到 Chroma 向量库操作步骤将 PDF 放入data目录仓库已内置 5 份竞争对手分析类示例文档如Competitor_Analysis_Titan_Growth.pdf等位于 r1-distill-rag/data执行摄取脚本生成并持久化向量库python ingest_pdfs.py底层实现解析ingest_pdfs.py 的流程可以拆成三步① 加载与切分load_and_process_pdfs使用DirectoryLoader配合PyPDFLoader递归加载data目录下所有**/*.pdf文件再用RecursiveCharacterTextSplitter按1000 字符块大小、200 字符重叠切分兼顾了检索粒度和上下文连贯性text_splitter RecursiveCharacterTextSplitter( chunk_size1000, chunk_overlap200, length_functionlen, )② 生成嵌入create_vector_store使用HuggingFaceEmbeddings加载sentence-transformers/all-mpnet-base-v2模型并显式指定model_kwargs{device: cpu}即嵌入计算在纯 CPU 上完成无需 GPU。③ 持久化向量库通过Chroma.from_documents(...)写入chroma_db目录值得注意的是脚本在重建前会先shutil.rmtree清空旧向量库保证每次摄入都是干净重建因此更换文档后必须重新执行摄取脚本。启动交互界面Gradio 主入口与 Streamlit 备选方式一Gradio默认python r1_smolagent_rag.py该命令调用GradioUI(primary_agent).launch()启动一个 Gradio Web 界面见 r1_smolagent_rag.py你可以在浏览器中直接向文档库提问。方式二Streamlit备选仓库额外提供了 streamlit.py从r1_smolagent_rag导入primary_agent复用同一套 Agent 逻辑实现了带聊天历史、侧边栏说明与Clear Chat History按钮的对话界面streamlit run streamlit.py其回答生成核心同样是primary_agent.run(prompt, resetFalse)——注意resetFalse保持会话状态跨轮次延续。核心原理拆解双 Agent 协作的调用链r1_smolagent_rag.py是整个系统的灵魂其双 LLM 协作机制可以逐段解读① 推理 AgentCodeAgentreasoning_model get_model(reasoning_model_id) reasoner CodeAgent(tools[], modelreasoning_model, add_base_toolsFalse, max_steps2)推理角色由CodeAgent承担不挂任何外部工具tools[]、add_base_toolsFalsemax_steps2限制其思考轮次专职把检索到的片段提炼成简洁答案。这正是利用 R1 模型推理能力的落点。② RAG 工具rag_with_reasonertool def rag_with_reasoner(user_query: str) - str: docs vectordb.similarity_search(user_query, k3) context \n\n.join(doc.page_content for doc in docs) prompt fBased on the following context, answer the users question. Be concise and specific. If there isnt sufficient information, give as your answer a better query to perform RAG with. Context: {context} Question: {user_query} Answer: response reasoner.run(prompt, resetFalse) return response这是系统中检索 推理的黏合层其工作流为向量检索用similarity_search(user_query, k3)从 Chroma 中取回最多 3 个最相关片段README Notes 中明确说明组装上下文把片段以双换行拼接成context推理生成把上下文 问题交给reasoner即 R1 推理模型产出简明回答Prompt 中还内建了一个自我修正机制——若上下文信息不足模型应输出一个更好的检索查询而不是硬答这体现了 Agentic RAG 的迭代式检索思想。③ 主导对话的 ToolCallingAgenttool_model get_model(tool_model_id) primary_agent ToolCallingAgent(tools[rag_with_reasoner], modeltool_model, add_base_toolsFalse, max_steps3)外层对话由ToolCallingAgent承担它拥有rag_with_reasoner这一个工具max_steps3负责判断何时需要查文档并调用工具再把工具返回的答案组织成最终回复。README 中给出的示例问题——Compare and contrast the services offered by RankBoost and Omni Marketing——正是需要多次检索、交叉对比多份文档的典型场景。整条调用链可概括为用户提问 → 工具模型判断 → 触发 rag_with_reasoner → 向量检索 top-3 → R1 推理模型综合 → 工具模型组织回复两个 LLM 各司其职、层层递进。模型选型对比与调优建议HuggingFace 云端 vs Ollama 本地维度HuggingFace云端Ollama本地适用场景生产环境、云端推理开发调试、本地推理令牌要求需要 API Token获得更好速率限制无需令牌模型范围覆盖面广取决于本机下载的模型运行位置远程 API完全在本机延迟/资源网络延迟本机零开销低延迟但消耗较多系统资源自定义能力依赖 HF 已有模型支持 Modelfile 自定义如扩展上下文可调参数速查表参数位置默认值说明chunk_sizeingest_pdfs.py1000 字符切分块大小chunk_overlap同上200 字符相邻块重叠保持语义连贯嵌入模型同上all-mpnet-base-v2本地 CPU 推理检索数量kr1_smolagent_rag.py3每轮注入上下文的片段数max_steps推理同上2R1 推理 Agent 最大步数max_steps对话同上3主 Agent 最大步数num_ctxollama_models8096本地模型上下文窗口向量库目录运行目录chroma_db持久化位置重建时自动清空调优方向上文档语义粒度较细时可减小chunk_size、增大k以召回更多片段R1 推理链较长时可适当调大max_steps与本地模型的num_ctx。所有改动均只需编辑上述两个 Python 文件与ollama_models下的 Modelfile重新运行摄取与启动脚本即可生效。小结R1 Distill RAG System 通过 Smolagents 将擅长推理的 R1 蒸馏模型与擅长对话调度的工具调用模型组合成一条完整的 Agentic RAG 链路并用 LangChain Chroma 打通了 PDF → 向量库 → 检索 → 推理生成的闭环。它既给出了 HuggingFace 云端与 Ollama 本地两套可直接落地的部署方案也以极小的代码量演示了检索不足时让模型给出更优查询的迭代式检索范式是一个兼具教学价值与实战参考价值的参考实现。【免费下载链接】ottomator-agentsAll the open source AI Agents hosted on the oTTomator Live Agent Studio platform!项目地址: https://gitcode.com/GitHub_Trending/ot/ottomator-agents创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考