實戰(zhàn)指南)
基于 DeepSeek R1 蒸餾模型與 Smolagents 的雙 LLM Agentic RAG 系統(tǒng)實戰(zhàn)指南【免費下載鏈接】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展開。該系統(tǒng)以 DeepSeek 的 R1 系列蒸餾模型為核心推理引擎借助 HuggingFace Smolagents 框架構(gòu)建出推理模型 工具調(diào)用模型雙 LLM 協(xié)作的 Agentic RAG 問答系統(tǒng)可用于對本地 PDF 文檔庫進行上下文感知的智能問答。讀完本文你將掌握完整的本地/云端環(huán)境配置、Ollama 自定義模型創(chuàng)建、向量庫攝取與 Gradio/Streamlit 雙前端運行方案并理解其底層調(diào)用鏈與調(diào)優(yōu)要點。項目概覽為什么 RAG 還需要一個推理引擎?zhèn)鹘y(tǒng) RAG 的鏈路通常只有向量檢索 生成而 R1 Distill RAG System 的核心設(shè)計理念是讓檢索與生成之間多一層獨立推理。系統(tǒng)選用 DeepSeek 的 R1 模型——以其突出的推理能力和指令遵循能力著稱——作為核心推理引擎再搭配一個獨立的對話/工具調(diào)用模型來主導(dǎo)交互流程兩者各司其職Reasoning 模型推理模型接收檢索到的文檔片段進行綜合分析并生成簡潔、具體的答案Tool calling 模型工具模型負責(zé)理解用戶意圖、決定何時調(diào)用 RAG 工具、組織最終回復(fù)。這種設(shè)計在 r1_smolagent_rag.py 中體現(xiàn)為兩個 Smolagents Agent 的嵌套協(xié)作下文會詳細拆解其實現(xiàn)。環(huán)境準(zhǔn)備與依賴安裝官方 README 給出的標(biāo)準(zhǔn)安裝流程如下完整源碼位于 r1-distill-rag 目錄# 1. 克隆倉庫后進入項目目錄 # 2. 創(chuàng)建并激活虛擬環(huán)境 python -m venv venv # Windows .\venv\Scripts\activate # Unix / MacOS source venv/bin/activate # 3. 安裝依賴 pip install -r requirements.txt # 4. 復(fù)制環(huán)境變量模板 cp .env.example .env依賴清單 requirements.txt 中幾個關(guān)鍵組件的版本固定如下值得注意組件版本作用smolagents1.6.0Agent 框架核心CodeAgent / ToolCallingAgent / GradioUIlangchain0.3.17文檔加載、文本切分、向量庫封裝langchain-chroma0.2.1Chroma 向量數(shù)據(jù)庫的 LangChain 集成langchain-community0.3.16DirectoryLoader、PyPDFLoader等社區(qū)加載器langchain-huggingface0.1.2HuggingFaceEmbeddings嵌入模型封裝chromadb0.6.3向量數(shù)據(jù)庫本體gradio5.14.0默認 Web 交互界面streamlit1.41.1備選 Web 交互界面sentence-transformers3.4.1本地嵌入模型運行庫torch2.6.0嵌入模型與本地推理的深度學(xué)習(xí)后端說明requirements.txt在倉庫中以 UTF-16 編碼保存若用文本工具直接查看出現(xiàn)亂碼可用iconv -f UTF-16 -t UTF-8 requirements.txt轉(zhuǎn)換后閱讀。環(huán)境變量配置詳解云端 API 與本地推理雙模式項目通過.env文件中的USE_HUGGINGFACE開關(guān)決定走 HuggingFace 云端推理還是 Ollama 本地推理。完整變量定義可參考 .env.example變量含義必填性USE_HUGGINGFACE設(shè)為yes使用 HuggingFace APIno使用 Ollama必填HUGGINGFACE_API_TOKENHuggingFace 訪問令牌不填也能用但速率限制更嚴、可選模型更少云端模式建議填REASONING_MODEL_ID推理 LLM 的模型 ID必填TOOL_MODEL_ID工具調(diào)用 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云端模式適合生產(chǎn)環(huán)境無需本地 GPUAPI 穩(wěn)定可選模型豐富接入方式是在r1_smolagent_rag.py的get_model()函數(shù)中通過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本地模式完全離線運行、無需令牌、延遲更低更適合開發(fā)調(diào)試代價是占用本機較多系統(tǒng)資源。此時get_model()會返回OpenAIServerModel將 Ollama 的 OpenAI 兼容接口作為api_basereturn OpenAIServerModel( model_idmodel_id, api_basehttp://localhost:11434/v1, api_keyollama )Ollama 模型定制擴展上下文窗口的關(guān)鍵步驟Ollama 模式下 README 給出了推薦的模型組合——deepseek-r1:7b做推理、qwen2.5:14b-instruct做對話兩者都在本地以 8k 上下文運行。第一步安裝并拉取基礎(chǔ)模型# 安裝 Ollama 后執(zhí)行 ollama pull deepseek-r1:7b ollama pull qwen2.5:14b-instruct-q4_K_M第二步基于 Modelfile 創(chuàng)建自定義模型倉庫在 ollama_models 目錄下預(yù)置了三份 Modelfile內(nèi)容均為兩行——指定基礎(chǔ)模型并放大上下文窗口# 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 參數(shù)模型在裝下檢索片段 推理鏈場景下的推薦配置——R1 這類思維鏈模型會在推理時產(chǎn)生大量中間 token窄上下文會嚴重截斷其思考過程。創(chuàng)建自定義模型的命令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參數(shù)替代-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目錄倉庫已內(nèi)置 5 份競爭對手分析類示例文檔如Competitor_Analysis_Titan_Growth.pdf等位于 r1-distill-rag/data執(zhí)行攝取腳本生成并持久化向量庫python ingest_pdfs.py底層實現(xiàn)解析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清空舊向量庫保證每次攝入都是干凈重建因此更換文檔后必須重新執(zhí)行攝取腳本。啟動交互界面Gradio 主入口與 Streamlit 備選方式一Gradio默認python r1_smolagent_rag.py該命令調(diào)用GradioUI(primary_agent).launch()啟動一個 Gradio Web 界面見 r1_smolagent_rag.py你可以在瀏覽器中直接向文檔庫提問。方式二Streamlit備選倉庫額外提供了 streamlit.py從r1_smolagent_rag導(dǎo)入primary_agent復(fù)用同一套 Agent 邏輯實現(xiàn)了帶聊天歷史、側(cè)邊欄說明與Clear Chat History按鈕的對話界面streamlit run streamlit.py其回答生成核心同樣是primary_agent.run(prompt, resetFalse)——注意resetFalse保持會話狀態(tài)跨輪次延續(xù)。核心原理拆解雙 Agent 協(xié)作的調(diào)用鏈r1_smolagent_rag.py是整個系統(tǒng)的靈魂其雙 LLM 協(xié)作機制可以逐段解讀① 推理 AgentCodeAgentreasoning_model get_model(reasoning_model_id) reasoner CodeAgent(tools[], modelreasoning_model, add_base_toolsFalse, max_steps2)推理角色由CodeAgent承擔(dān)不掛任何外部工具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這是系統(tǒng)中檢索 推理的黏合層其工作流為向量檢索用similarity_search(user_query, k3)從 Chroma 中取回最多 3 個最相關(guān)片段README Notes 中明確說明組裝上下文把片段以雙換行拼接成context推理生成把上下文 問題交給reasoner即 R1 推理模型產(chǎn)出簡明回答Prompt 中還內(nèi)建了一個自我修正機制——若上下文信息不足模型應(yīng)輸出一個更好的檢索查詢而不是硬答這體現(xiàn)了 Agentic RAG 的迭代式檢索思想。③ 主導(dǎo)對話的 ToolCallingAgenttool_model get_model(tool_model_id) primary_agent ToolCallingAgent(tools[rag_with_reasoner], modeltool_model, add_base_toolsFalse, max_steps3)外層對話由ToolCallingAgent承擔(dān)它擁有rag_with_reasoner這一個工具max_steps3負責(zé)判斷何時需要查文檔并調(diào)用工具再把工具返回的答案組織成最終回復(fù)。README 中給出的示例問題——Compare and contrast the services offered by RankBoost and Omni Marketing——正是需要多次檢索、交叉對比多份文檔的典型場景。整條調(diào)用鏈可概括為用戶提問 → 工具模型判斷 → 觸發(fā) rag_with_reasoner → 向量檢索 top-3 → R1 推理模型綜合 → 工具模型組織回復(fù)兩個 LLM 各司其職、層層遞進。模型選型對比與調(diào)優(yōu)建議HuggingFace 云端 vs Ollama 本地維度HuggingFace云端Ollama本地適用場景生產(chǎn)環(huán)境、云端推理開發(fā)調(diào)試、本地推理令牌要求需要 API Token獲得更好速率限制無需令牌模型范圍覆蓋面廣取決于本機下載的模型運行位置遠程 API完全在本機延遲/資源網(wǎng)絡(luò)延遲本機零開銷低延遲但消耗較多系統(tǒng)資源自定義能力依賴 HF 已有模型支持 Modelfile 自定義如擴展上下文可調(diào)參數(shù)速查表參數(shù)位置默認值說明chunk_sizeingest_pdfs.py1000 字符切分塊大小chunk_overlap同上200 字符相鄰塊重疊保持語義連貫嵌入模型同上all-mpnet-base-v2本地 CPU 推理檢索數(shù)量kr1_smolagent_rag.py3每輪注入上下文的片段數(shù)max_steps推理同上2R1 推理 Agent 最大步數(shù)max_steps對話同上3主 Agent 最大步數(shù)num_ctxollama_models8096本地模型上下文窗口向量庫目錄運行目錄chroma_db持久化位置重建時自動清空調(diào)優(yōu)方向上文檔語義粒度較細時可減小chunk_size、增大k以召回更多片段R1 推理鏈較長時可適當(dāng)調(diào)大max_steps與本地模型的num_ctx。所有改動均只需編輯上述兩個 Python 文件與ollama_models下的 Modelfile重新運行攝取與啟動腳本即可生效。小結(jié)R1 Distill RAG System 通過 Smolagents 將擅長推理的 R1 蒸餾模型與擅長對話調(diào)度的工具調(diào)用模型組合成一條完整的 Agentic RAG 鏈路并用 LangChain Chroma 打通了 PDF → 向量庫 → 檢索 → 推理生成的閉環(huán)。它既給出了 HuggingFace 云端與 Ollama 本地兩套可直接落地的部署方案也以極小的代碼量演示了檢索不足時讓模型給出更優(yōu)查詢的迭代式檢索范式是一個兼具教學(xué)價值與實戰(zhàn)參考價值的參考實現(xiàn)?!久赓M下載鏈接】ottomator-agentsAll the open source AI Agents hosted on the oTTomator Live Agent Studio platform!項目地址: https://gitcode.com/GitHub_Trending/ot/ottomator-agents創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考