如何使用SmolAgents和Deepseek R1构建AI代理 - Apidog
简介
高级推理模型与轻量级框架的结合正在革新人工智能(AI)系统在信息检索、处理和呈现方面的能力。在本指南中,我们将使用 DeepSeek R1(一种高性能推理模型)和 SmolAgents(来自 Hugging Face 的极简代理框架)构建一个检索增强生成(RAG)系统。该系统能够高效处理文档、进行智能搜索和类人推理,非常适合应用于研究、客户支持和知识管理等场景。
AI代理的核心功能
在本项目中,AI 代理将实现以下四项核心任务:
- 加载和处理 PDF 文档:将文档转化为可搜索的文本块。
- 创建向量数据库:存储嵌入以支持快速语义搜索。
- 检索与推理:利用 DeepSeek R1 分析检索到的数据并生成答案。
- 与用户交互:通过对话式界面实现无缝互动。
步骤1:加载和处理 PDF 文档
工具和库
以下工具和库将用于实现 PDF 文档的加载和处理:
- LangChain:用于文档加载和文本分割。
- ChromaDB:轻量级向量数据库,用于存储嵌入。
- Hugging Face 嵌入模型:将文本转化为向量表示。
实施
1.1 加载 PDF 文件
使用 LangChain 的 DirectoryLoader 从指定目录加载所有 PDF 文件,并将每个 PDF 分割为页面进行处理。
from langchain_community.document_loaders import DirectoryLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
def load_and_process_pdfs(data_dir: str):
loader = DirectoryLoader(data_dir, glob="**/*.pdf", loader_cls=PyPDFLoader)
documents = loader.load()
# 将文档分割成块
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200, length_function=len)
return text_splitter.split_documents(documents)
1.2 创建向量存储
将文本块转化为嵌入,并存储在 ChromaDB 中以支持高效检索。
from langchain_huggingface import HuggingFaceEmbeddings
from langchain_community.vectorstore import Chroma
import os
import shutil
def create_vector_store(chunks, persist_directory: str):
if os.path.exists(persist_directory):
shutil.rmtree(persist_directory)
embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-mpnet-base-v2", model_kwargs={"device": 'cpu'})
vectordb = Chroma.from_documents(documents=chunks, embedding=embeddings, persist_directory=persist_directory)
return vectordb
关键考虑因素
- 块大小:设置为 1000 个字符,重叠部分为 200 个字符,以平衡上下文保留和检索效率。
- 嵌入模型:
all-mpnet-base-v2提供高质量的句子嵌入。
步骤2:使用 DeepSeek R1 实现推理代理
为什么选择 DeepSeek R1?
DeepSeek R1 专注于多步骤推理,能够分解复杂查询、推断关系并生成结构化答案,非常适合处理复杂问题。
初始化推理模型
通过 Ollama 配置 DeepSeek R1 以支持本地推理:
from smolagents import OpenAIServerModel, CodeAgent
reasoning_model_id = "deepseek-r1:7b"
def get_model(model_id):
return OpenAIServerModel(model_id=model_id, api_base="http://localhost:11434/v1", api_key="ollama")
reasoning_model = get_model(reasoning_model_id)
reasoner = CodeAgent(tools=[], model=reasoning_model, add_base_tools=False, max_steps=2)
步骤3:构建检索增强生成(RAG)管道
工具设计
创建一个 RAG 工具,将文档检索与 DeepSeek R1 的推理能力相结合:
from smolagents import tool
@tool
def rag_with_reasoner(user_query: str) -> str:
# 检索相关文档
docs = vectordb.similarity_search(user_query, k=3)
context = "nn".join(doc.page_content for doc in docs)
# 生成推理提示
prompt = f"""基于以下上下文,简洁地回答用户的问题。如果信息不足,建议进行精炼查询。
上下文:{context}
问题:{user_query}
答案:"""
return reasoner.run(prompt, reset=False)
主要功能
- 上下文提示:将检索到的文档插入提示中,以生成有依据的回答。
- 回退机制:当数据不足时,模型会建议更好的查询方式。
步骤4:部署主要 AI 代理
协调工作流程
主代理由 Llama 3.2 提供支持,负责管理用户交互并调用 RAG 工具:
from smolagents import ToolCallingAgent, GradioUI
tool_model = get_model("llama3.2")
primary_agent = ToolCallingAgent(tools=[rag_with_reasoner], model=tool_model, add_base_tools=False, max_steps=3)
def main():
GradioUI(primary_agent).launch()
if __name__ == "__main__":
main()
用户界面
用户界面通过简单的 Web 界面提供实时交互:
- 用户输入查询。
- 代理通过 DeepSeek R1 检索文档并推理,返回答案。
总结
通过整合 DeepSeek R1 和 SmolAgents,我们构建了一个强大的 AI 解决方案。该系统结合了增强推理能力、ChromaDB 的快速语义搜索以及经济高效的本地部署,能够绕过对昂贵云 API 的依赖。其可扩展的架构支持无缝集成新工具,非常适合研究、客户支持和知识管理等应用场景。
未来,该框架可以进一步扩展功能,例如支持更多文档格式(如 Word、HTML 和 Markdown)、整合实时网络搜索以获取更广泛的上下文,以及通过反馈机制不断优化答案的准确性。这为构建智能、自适应的 AI 助手提供了坚实的基础。
原文链接: https://apidog.com/blog/smolagents-deepseek/
最新文章
- 通过 SEO rank API 获取百度关键词排名
- 音乐情绪可视化:Cyanite.ai 音乐情感分析API如何帮助我们理解音乐
- 从Flask到FastAPI的平滑迁移
- 什么是 API 即服务?
- 5大API故障原因可能正在干扰您的集成工作
- 如何获取Perplexity AI API Key 密钥(分步指南)
- 轻松翻译网页内容:Python 实现 kimi网页版 翻译功能
- 身份证OCR识别API在Java、Python、PHP中的使用教程
- 精通.NET Web API:构建强大API的最佳实践
- Flask、FastAPI 与 Django 框架比较:Python Web 应用开发教程
- 十大 API 安全供应商
- REST API接口命名的最佳实践