如何使用SmolAgents和Deepseek R1构建AI代理 - Apidog

作者:API传播员 · 2025-12-11 · 阅读时间:4分钟
本指南详细介绍了如何使用SmolAgents和DeepSeek R1构建AI代理,实现检索增强生成(RAG)系统,包括PDF文档加载、向量数据库创建、智能推理和用户交互,适用于研究、客户支持和知识管理等场景,强调本地部署和可扩展性。

简介

高级推理模型与轻量级框架的结合正在革新人工智能(AI)系统在信息检索、处理和呈现方面的能力。在本指南中,我们将使用 DeepSeek R1(一种高性能推理模型)和 SmolAgents(来自 Hugging Face 的极简代理框架)构建一个检索增强生成(RAG)系统。该系统能够高效处理文档、进行智能搜索和类人推理,非常适合应用于研究、客户支持和知识管理等场景。


AI代理的核心功能

在本项目中,AI 代理将实现以下四项核心任务:

  1. 加载和处理 PDF 文档:将文档转化为可搜索的文本块。
  2. 创建向量数据库:存储嵌入以支持快速语义搜索。
  3. 检索与推理:利用 DeepSeek R1 分析检索到的数据并生成答案。
  4. 与用户交互:通过对话式界面实现无缝互动。

步骤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/