Apidog

올인원 협업 API 개발 플랫폼

API 설계

API 문서

API 디버깅

API 모킹

API 자동화 테스트

SmolAgents와 Deepseek R1으로 AI 에이전트 구축하기

Young-jae

Young-jae

Updated on February 19, 2025

소개

고급 추론 모델과 경량 프레임워크의 통합은 AI 시스템이 정보를 검색, 처리 및 표현하는 방식을 변화시키고 있습니다. 이 가이드는 DeepSeek R1라는 고성능 추론 모델과 SmolAgents라는 허깅페이스의 미니멀리스트 에이전트 프레임워크를 사용하여 검색 강화 생성(RAG) 시스템을 구축할 것입니다. 이 시스템은 효율적인 문서 처리, 지능형 검색 및 인간과 유사한 추론을 가능하게 하여 연구, 고객 지원 및 지식 관리 애플리케이션에 최적입니다.

💡
DeepSeek R1과 작업할 때 작업 흐름을 간소화할 수 있는 강력한 API 관리 도구를 찾고 있다면 Apidog를 놓치지 마세요. 오늘 무료로 Apidog를 다운로드할 수 있으며, DeepSeek R1과 같은 프로젝트와 완벽하게 작동하여 개발 여정을 더 매끄럽고 즐겁게 만들어줍니다!
버튼

설정을 실행하기 위한 시스템 요구사항

AI 에이전트는 네 가지 핵심 작업을 수행합니다:

  1. PDF 로드 및 처리: 문서를 검색 가능한 텍스트 덩어리로 변환합니다.
  2. 벡터 데이터베이스 생성: 빠른 의미 검색을 위한 임베딩을 저장합니다.
  3. 검색 및 추론: DeepSeek R1을 사용하여 검색된 데이터를 분석하고 답변을 생성합니다.
  4. 사용자와 상호작용: 원활한 상호작용을 위한 대화형 인터페이스를 제공합니다.


단계 1: PDF 문서 로드 및 처리

도구 및 라이브러리

  • LangChain: 문서 로드 및 텍스트 분할을 위한 도구입니다.
  • ChromaDB: 임베딩을 저장하기 위한 경량 벡터 데이터베이스입니다.
  • 허깅페이스 임베딩: 텍스트를 벡터 표현으로 변환하기 위해 사용됩니다.

구현

1.1 PDF 파일 로드

LangChain의 DirectoryLoader를 사용하여 디렉토리에서 모든 PDF를 로드합니다. 각 PDF는 처리하기 위해 페이지로 분할됩니다.

from langchain_community.document_loaders import DirectoryLoader, PyPDFLoader  
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.vectorstores 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) 파이프라인 구축

도구 설계

DeepSeek R1의 추론 기능과 문서 검색을 결합한 RAG 도구를 생성합니다.

from smolagents import tool  

@tool  
def rag_with_reasoner(user_query: str) -> str:  
    # 관련 문서 검색  
    docs = vectordb.similarity_search(user_query, k=3)  
    context = "\n\n".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()  

사용자 인터페이스

UI는 실시간 상호작용을 위한 간단한 웹 인터페이스를 제공합니다:

  • 사용자가 쿼리를 입력합니다.
  • 에이전트가 문서를 검색하고, DeepSeek R1로 추론하며, 답변을 반환합니다.

DeepSeek R1과 SmolAgents의 통합은 복잡한 쿼리를 dissect하는 향상된 추론, ChromaDB의 빠른 의미 검색을 통한 효율적인 검색, 그리고 비싼 클라우드 API에 대한 의존성을 우회하기 위한 비용 효율적인 로컬 배치를 결합한 강력한 AI 솔루션을 제공합니다. 그 확장 가능한 아키텍처는 새로운 도구의 원활한 통합을 허용하여 연구(기술 문서 분석), 고객 지원(자주 묻는 질문 해결), 지식 관리(정적 리소스를 인터랙티브 시스템으로 변환)와 같은 다양한 애플리케이션에 이상적입니다.

향후 향상은 Word, HTML 및 마크다운을 포함한 문서 지원을 확대하고, 더 넓은 맥락을 위한 실시간 웹 검색 통합, 시간이 지남에 따라 답변 정확도를 개선하기 위한 피드백 루프 구현을 포함할 수 있습니다. 이 프레임워크는 다양한 요구에 맞춘 지능적이고 적응형 AI 어시스턴트를 구축하기 위한 다재다능한 기반을 제공합니다.