AutoGen을 활용한 멀티 에이전트 RAG: Granite으로 로컬에서 구축하기

작성자

Kelly Abuelsaad

Architect & Engineer, AI Platform

IBM

Anna Gutowska

AI Engineer, Developer Advocate

IBM

방대하고 비용이 많이 드는 대규모 언어 모델(LLM) 없이도 에이전틱 워크플로를 구축할 수 있을까요? 정답은 '예'입니다. 이 튜토리얼에서는 IBM® Granite를 사용하여 AutoGen으로 로컬에서 멀티 에이전트 RAG 시스템을 구축하는 방법을 보여줍니다.

Agentic RAG 개요

검색 증강 생성(RAG)은 비용이 많이 드는 미세 조정 없이도 다양한 데이터 소스에서 추가 데이터 세트를 LLM에 제공하는 효과적인 방법입니다. 마찬가지로, 에이전틱 RAG는 AI 에이전트가 관련 정보를 검색하면서 하위 작업을 계획하고 실행하는 능력을 활용하여 LLM의 지식 기반을 보완합니다. 이 능력은 전통적인 챗봇에 비해 RAG 애플리케이션의 최적화와 확장성을 크게 향상시킵니다. 이제는 지식 베이스에서 관련 데이터를 추출하기 위해 복잡한 SQL 쿼리를 작성할 필요가 없습니다.

에이전틱 RAG의 미래는 여러 전문화된 에이전트가 최적의 지연 시간과 효율성을 달성하기 위해 협력하는 멀티 에이전트 RAG입니다. Granite 3.2와 같은 작고 효율적인 모델을 사용해 이를 모듈형 에이전트 아키텍처와 결합하여 이러한 협업을 시연해 보겠습니다. 적응형 계획과 도구 또는 함수 호출을 통해 작업을 수행하도록 협력하는 여러 전문 "미니 에이전트"를 활용할 것입니다. 인간과 마찬가지로 에이전트 팀 또는 멀티 에이전트 시스템은 특히 명확하게 정의된 역할과 효과적인 의사소통이 있을 때 개인의 영웅적인 노력보다 더 나은 성과를 거두는 경우가 많습니다.

이 협업을 오케스트레이션하기 위해 로컬 LLM 제공용 Ollama와 상호작용을 위한 Open WebUI 등의 도구와 함께 AutoGen(AG2)을 워크플로와 의사결정을 관리하는 핵심 프레임워크로 사용할 수 있습니다. AutoGen은 Microsoft에서 개발한 멀티 에이전트 AI 애플리케이션을 만들기 위한 프레임워크입니다.특히 이 튜토리얼에서 활용하는 모든 구성 요소는 오픈 소스입니다. 이러한 도구를 함께 사용하면 노트북 내에서 강력하면서도 개인 정보 보호에 충실한 AI 시스템을 구축할 수 있습니다.

멀티 에이전트 아키텍처: 협업이 경쟁을 능가하는 경우

Granite 검색 에이전트는 각 에이전트가 전문화된 역할을 수행하는 모듈식 아키텍처를 기반으로 합니다. 인간과 마찬가지로 에이전트는 정보에 입각한 결정을 내릴 수 있을 만큼의 명확한 지침과 충분한 컨텍스트가 있을 때 최고의 성과를 냅니다. 필터링되지 않은 채팅 기록과 같은 관련 없는 정보가 너무 많으면 '건초 더미 속의 바늘' 문제가 발생할 수 있으며 신호와 노이즈를 구분하기가 점점 더 어려워질 수 있습니다.

에이전틱 아키텍처 다이어그램 에이전트 아키텍처

에이전틱 AI 아키텍처에서 에이전트는 목표를 달성하기 위해 순차적으로 협력합니다. 생성형 AI 시스템은 다음과 같이 구성됩니다.

플래너 에이전트: 워크플로 시작 시 초기 상위 수준 계획을 생성합니다. 예를 들어 사용자가 “우리 팀이 사용하고 있는 프로젝트와 비교 가능한 오픈 소스 프로젝트는 무엇인가요?”라고 묻는다면 에이전트는 다음과 같은 단계별 계획을 세울 것입니다. “1. 팀 문서에서 오픈 소스 기술을 검색합니다. 2. 1단계에서 찾은 프로젝트와 유사한 오픈 소스 프로젝트를 웹에서 검색합니다." 이러한 단계 중 하나라도 실패하거나 결과가 충분하지 않은 경우 나중에 리플렉션 에이전트에서 단계를 조정할 수 있습니다.

연구 어시스턴트: 연구 어시스턴트는 시스템의 핵심 역할을 담당합니다. 이 에이전트는 “팀 문서에서 오픈 소스 기술을 검색”과 같은 지시를 받아 이를 실행합니다. 계획의 첫 번째 단계에서는 계획자 에이전트의 초기 지침을 사용합니다. 후속 단계에서는 이전 단계의 결과에서 큐레이팅된 컨텍스트를 추가로 받습니다.

예를 들어 "웹에서 유사한 오픈 소스 프로젝트를 검색"하라는 지시를 받으면 이전 문서 검색 단계의 결과도 함께 전달받습니다. 지시에 따라 연구 어시스턴트는 웹 검색이나 문서 검색, 또는 두 가지를 병행하여 작업을 수행할 수 있습니다.

단계 비평가: 단계 비평가는 이전 단계의 아웃풋이 주어진 지시를 충분히 충족했는지를 평가하는 역할을 맡습니다. 이 에이전트는 방금 실행된 단일 단계 지시와 그 지시에 대한 아웃풋을 함께 입력으로 받습니다. 단계 비평가가 대화에 참여함으로써 목표 달성 여부가 명확히 검증되며, 이는 다음 단계의 계획에 필요한 근거를 제공합니다.

목표 판정자(Goal Judge): 목표 판정자는 제공된 목표의 모든 요구 사항, 이를 달성하기 위해 작성된 계획, 그리고 지금까지 수집된 정보를 기반으로 최종 목표가 달성되었는지를 판단합니다. 판정자의 아웃풋은 "YES" 또는 "NOT YET" 중 하나이며, 그 뒤에 한두 문장을 넘지 않는 간단한 설명이 이어집니다.

반영 에이전트(Reflection Agent): 반영 에이전트는 실행 의사 결정자 역할을 수행합니다. 이 에이전트는 다음에 어떤 단계를 취할지를 결정하며, 이는 다음 계획된 단계로 진행하거나, 수행 중 발생한 문제를 보완하기 위해 방향을 전환하거나, 목표가 완수되었는지를 확인하는 것일 수 있습니다. 실제 CEO와 마찬가지로 명확한 목표를 인식하고 그 목표 달성을 위해 이루어진(또는 이루어지지 않은) 진행 상황에 대한 간결한 결과를 제공받을 때 최상의 의사 결정을 수행합니다. 반영 에이전트의 아웃풋은 다음에 수행해야 할 단계이거나, 목표가 달성된 경우에는 종료 지침입니다. 반영 에이전트에는 다음 항목들이 제공됩니다.

  • 목표
  • 원래의 계획
  • 마지막으로 실행된 단계
  • 마지막 단계의 성공 또는 실패 결과
  • 이전에 실행된 지시사항들의 간결한 순서(지시 사항만 포함하며 아웃풋은 제외함)

이 항목들을 구조화된 형식으로 제시하면 의사 결정자가 이미 수행된 작업을 명확히 파악하여 다음에 어떤 조치를 취할지 결정할 수 있습니다.

보고서 생성기(Report Generator): 목표가 달성되면 보고서 생성기는 모든 결과를 종합하여 원래의 쿼리에 직접적으로 답하는 통합된 아웃풋을 생성합니다. 프로세스의 각 단계에서 목표 아웃풋이 생성되지만, 보고서 생성기는 이를 모두 통합하여 최종 보고서를 작성합니다.

오픈 소스 도구 활용

초보자에게는 에이전틱 AI 애플리케이션을 처음부터 구축하는 것이 어려울 수 있습니다. 따라서 오픈 소스 도구 세트를 사용해 보겠습니다. Granite Retrieval Agent는 에이전틱 RAG를 위한 여러 도구를 통합합니다.

Open WebUI: 사용자는 Open WebUI에 호스팅된 직관적인 채팅 인터페이스를 통해 시스템과 상호 작용합니다. 이 인터페이스는 "내 프로젝트 노트와 관련된 최신 뉴스 기사를 가져오기"와 같은 쿼리를 제출하고 아웃풋을 확인하는 주요 접점 역할을 합니다.

Python 기반 에이전트(AG2 프레임워크): 시스템의 핵심에는 AutoGen(AG2)을 사용하여 구축된 Python 기반 에이전트가 있습니다. 이 에이전트는 작업을 세분화하고 도구를 동적으로 호출하여 단계를 실행함으로써 워크플로를 조정합니다.

에이전트는 다음 두 가지 기본 도구에 액세스할 수 있습니다.

  • 문서 검색 도구: 업로드된 프로젝트 노트 또는 임베딩으로 저장된 문서가 포함된 벡터 데이터베이스에서 관련 정보를 가져옵니다. 이 벡터 검색은 완전히 별도의 데이터 저장소를 설정하는 대신 Open WebUI 내에 내장된 문서 검색 API를 활용합니다.

  • 웹 검색 도구: 웹 기반 검색을 수행하여 외부 지식과 실시간 정보를 수집합니다. 이 경우에는 SearXNG를 메타 검색 엔진으로 사용합니다.

Ollama: IBM Granite 3.2 LLM은 시스템을 구동하는 언어 모델 역할을 합니다. Ollama를 사용하여 로컬에서 호스팅되며 빠른 추론, 비용 효율성 및 데이터 개인 정보 보호를 보장합니다. 더 큰 모델로 이 프로젝트를 실행하고자 한다면 IBM® watsonx.ai 또는 OpenAI를 통한 API 접근 방식을 권장합니다. 그러나 이 접근 방식은 watsonx.ai 또는 OpenAI API 키가 필요합니다. 이 튜토리얼에서는 대신 로컬에 호스팅된 Ollama를 사용합니다.

이 튜토리얼에서 다루지 않은 기타 일반적인 오픈소스 에이전트 프레임워크로는 LangChainLangGraph, 및 crewAI가 있습니다.

단계

자세한 설정 지침과 전체 프로젝트는  IBM Granite Community GitHub에서 확인할 수 있습니다. 이 튜토리얼의 Jupyter Notebook 버전 역시 GitHub에서 확인할 수 있습니다.

다음 단계들은 Granite 검색 에이전트를 빠르게 설정하기 위한 절차를 제공합니다.

1단계: Olama 설치

Ollama 설치는 공식 Ollama 사이트에서 클라이언트를 다운로드하는 것만큼 간단합니다. Ollama를 설치한 후 다음 명령어를 실행하여 Granite 3.2 LLM을 가져옵니다.

ollama pull granite3.2:8b

이제 Ollama와 Granite이 실행 가능한 상태가 되었습니다.

2 단계. 간단한 에이전트 구축(선택 사항)

에이전틱 워크플로를 구축하기 위한 로우코드 솔루션으로 AutoGen Studio가 있습니다. 그러나 직접 간단한 에이전트를 구축해 보는 것이 완전한 멀티 에이전트 RAG 프로젝트의 설정 구조를 더 잘 이해하는 데 도움이 됩니다. 계속하려면 선호하는 통합 개발 환경(IDE)에서 Jupyter Notebook을 설정하고 터미널에서 다음 명령을 실행하여 가상 환경을 활성화합니다.

python3.11 -m venv venv
source venv/bin/activate

이 간단한 에이전트에는 몇 가지 라이브러리와 모듈이 필요합니다. 다음 항목을 반드시 설치하고 임포트해야 합니다.

!pip install -qU langchain chromadb tf-keras pyautogen "ag2[ollama]" sentence_transformers
import getpass
from autogen.agentchat.contrib.retrieve_assistant_agent import AssistantAgent
from autogen.agentchat.contrib.retrieve_user_proxy_agent import RetrieveUserProxyAgent

Ollama를 통해 가져온 올바른 LLM을 호출하기 위해 로컬에서 설정해야 하는 여러 구성 매개변수가 있습니다.

ollama_llm_config = {
    "config_list": [
        {
            "model": "granite3.2:8b",
            "api_type": "ollama",
        }
    ],
}

이러한 구성 매개변수는 'AssistantAgent' 클래스의 'llm_config' 매개변수에 전달하여 첫 번째 AI 에이전트를 인스턴스화할 수 있습니다.

assistant = AssistantAgent(
    name="assistant",
    system_message="You are a helpful assistant.",
    llm_config=ollama_llm_config,
)

이 에이전트는 Granite 3.2를 사용하여 'ragproxy agent' 에이전트가 반환한 정보를 종합합니다. 추가 컨텍스트로 RAG 에이전트에 제공하는 문서는 GitHub의 AutoGen 저장소에 있는 원시 README Markdown 파일입니다. 또한 검색 에이전트에 특화된 새로운 구성 사전을 전달할 수도 있습니다. 유용하게 사용할 수 있는 추가 키로는 'vector_db', 'chunk_token_size' 및 'embedding_model' 등이 있습니다.

구성 키의 전체 목록은 공식 문서를 참조하세요.

ragproxyagent = RetrieveUserProxyAgent(
    name="ragproxyagent",
    max_consecutive_auto_reply=3,
    is_termination_msg=lambda msg: msg.get("content") is not None or "TERMINATE" in msg["content"],
    system_message = "Context retrieval assistant.",
    retrieve_config={
        "task": "qa",
        "docs_path": "https://raw.githubusercontent.com/microsoft/autogen/main/README.md",
        "get_or_create": True,      
        "collection_name": "autogen_docs",
        "overwrite": True
    },
    code_execution_config=False,
    human_input_mode="NEVER",
)

이제 Initiate와 채팅을 시작하여 컨텍스트로 제공된 문서와 관련된 질문을 할 수 있습니다.

qs = "What languages does AutoGen support?"
result = ragproxyagent.initiate_chat(
    assistant, message=ragproxyagent.message_generator, problem=qs
)  

print(result)

참고로 README 파일 Markdown 콘텐츠는 간결성을 위해 아웃풋에서 수정되었습니다.

아웃풋:

컬렉션을 생성하려고 시도하는 중입니다.

2025-07-21 12:20:36,125 - autogen.agentchat.contrib.retrieve_user_proxy_agent - INFO - 청크 1개를 찾았습니다.
2025-07-21 12:20:36,129 - autogen.agentchat.contrib.vectordb.chromadb - INFO - 임베딩이 제공되지 않습니다. VectorDB의 임베딩 기능을 사용하여 콘텐츠 임베딩을 생성합니다.

VectorDB가 반환한 doc_ids: [['8e9131c7']]
문서 8e9131c7의 내용을 컨텍스트에 추가합니다.

ragproxyagent (어시스턴트에게):

당신은 검색 증강 챗봇입니다. 사용자가 제공한 컨텍스트와 자신의 지식을 바탕으로 질문에 답변합니다.
현재 컨텍스트가 있든 없든 질문에 답할 수 없는 경우 정확히 'UPDATE CONTEXT'라고 응답해야 합니다.
가능한 한 간결하게 답변해야 합니다.

사용자 질문: AutoGen이 지원하는 언어는 무엇인가요?

컨텍스트: 

[REDACTED]


assistant (ragproxyagent에게):

제공된 텍스트는 Microsoft의 오픈소스 프로젝트인 AutoGen의 README 파일로 보입니다. 다음은 그 내용의 요약입니다:

  1. 프로젝트 개요: AutoGen은 복잡하고 분산된 애플리케이션을 생성하고 관리하기 위한 시스템입니다. 여러 언어(C#, Python)를 지원하며 이러한 애플리케이션을 배포하고 확장할 수 있는 런타임 환경을 제공합니다.
  2. 주요 구성 요소: - AutoGen Core: AutoGen 애플리케이션을 구축하기 위한 기본 클래스와 인터페이스가 포함된 핵심 라이브러리입니다. - AutoGen 에이전트: AutoGen 애플리케이션의 라이프사이클을 관리하는 런타임 구성 요소입니다. - AutoGen 런타임 게이트웨이: 에이전트 간의 통신을 용이하게 하고 로드 밸런싱, 확장 및 내결함성을 가능하게 하는 서비스입니다.
  3. 지원 언어: 현재 C# 및 Python이 지원됩니다.
  4. 시작하기: README에는 필요한 패키지를 설치하고, 새 프로젝트를 생성하며, AutoGen 애플리케이션을 구축 및 실행하는 방법이 설명되어 있습니다.
  5. 문서화: API 참조, 가이드, 튜토리얼 등과 같은 상세한 참조 문서에 대한 링크를 제공합니다.
  6. 커뮤니티 및 기여: 프로젝트 기여를 위한 가이드라인을 제공하며 문제 추적, 풀 리퀘스트 및 코딩 표준 등과 같은 정보를 포함합니다.
  7. 법적 고지: 라이선스 정보 및 상표 고지입니다.
  8. 지원 및 FAQ: 질문하는 방법, 문제를 보고하는 방법, 자주 묻는 질문에 대한 답을 찾는 방법에 대한 정보입니다.

README에는 지원되는 각 언어(C#, Python)별로 사용 가능한 패키지와 해당 패키지 관리자(NuGet, PyPI)를 요약한 표도 포함되어 있습니다. 이를 통해 개발자는 자신이 선호하는 언어로 AutoGen을 시작하는 데 필요한 구성 요소를 빠르게 확인할 수 있습니다.


>>>>>>>> TERMINATING RUN (601a53dc-8a5d-4e19-8503-1517fe3c7634): 에이전트 'ragproxyagent'의 종료 메시지 조건이 충족되었습니다.

훌륭합니다! 어시스턴트 에이전트와 RAG 에이전트가 추가 컨텍스트를 성공적으로 통합하여 AutoGen이 현재 지원하는 프로그래밍 언어로 사용자 질문에 정확히 답했습니다. 이를 에이전트들 간의 정보 교환이 이루어지는 그룹 채팅으로 이해할 수 있습니다. 이 예제는 AutoGen을 사용하여 로컬에서 에이전틱 RAG를 구현하는 간단한 데모입니다.

3 단계. Open WebUI 설치

이제 더 발전된 에이전틱 RAG 시스템 구축해 보겠습니다. 터미널에서 Open WebUI를 설치하고 실행합니다.

pip install open-webui
open-webui serve

4단계. 웹 검색 설정

웹 검색은 Open WebUI에 내장된 웹 검색 기능을 활용합니다.

Open WebUI는 여러 검색 제공업체를 지원합니다. 일반적으로 API 키를 필요한 타사 애플리케이션 프로그래밍 인터페이스(API) 서비스를 사용하거나 SearXNG Docker 컨테이너를 로컬로 설정할 수 있습니다. 두 경우 모두 Open WebUI 콘솔에서 검색 제공업체를 설정해야 합니다.

이 설정은 SearXNG에 대한 포인터 또는 API 키 입력 중 하나로, Open WebUI 콘솔의 관리자 패널 > 설정 > 웹 검색 아래에 있습니다.

자세한 지침은 Open WebUI 문서의 안내를 참조하세요.

5단계. Open WebUI에 에이전트 가져오기

1. 브라우저에서 http://localhost:8080/로 이동해 Open WebUI에 액세스합니다. Open WebUI를 처음 실행하는 경우, 사용자 이름과 비밀번호를 등록해야 합니다. 이 정보는 오직 사용의 컴퓨터에만 저장됩니다.

2. 로그인한 후, 좌측 하단에 있는 사용자 이름 아이콘을 클릭합니다. 메뉴에서 관리자 패널을 선택하세요.

3. 함수 탭에서 + 버튼을 클릭해 새 함수를 추가합니다.

4. 함수의 이름(예: 'Granite RAG Agent')과 설명을 각각 입력하세요. 두 값 모두 'str' str 유형으로 입력해야 합니다.

5. 제공된 입력란에 granite_autogen_rag.py Python 스크립트를 붙여넣고 기존 콘텐츠를 대체합니다. 

6. 화면 하단에서 저장 을 클릭합니다.

7. 함수 페이지로 돌아가서 해당 에이전트가 활성화 상태인지 확인합니다.

8. 활성화 토글 옆에 있는 톱니바퀴 아이콘을 클릭하여 추론 끝점, SearXNG 끝점 또는 모델 ID와 같은 설정을 사용자 정의합니다.

이제 새로 생성된 AutoGen 에이전트가 Open WebUI 인터페이스에 모델로 표시됩니다. 이를 선택하고 사용자 쿼리를 입력할 수 있습니다.

6단계. Open WebUI에 문서 로드하기 Open WebUI에서 작업 공간 > 지식으로 이동합니다.

  1. **+**를 클릭하여 새 컬렉션을 만듭니다.
  2. Granite 검색 에이전트가 쿼리할 문서를 업로드합니다.

7단계. Open WebUI에서 웹 검색 설정하기

검색 공급자(예: SearXNG)를 설정하려면 이 가이드를 참고하세요.

설정 매개변수는 다음과 같습니다.

매개변수설명기본값
task_model_id작업 실행용 기본 모델granite3.2:8b
Vision_model_id이미지 분석용 비전 모델granite-vision-3-2-2b
openai_api_urlOpenAI 방식 모델 호출용 API 엔드포인트http://localhost:11434
openai_api_key인증용 API 키ollama
Vision_api_url비전 작업용 엔드포인트http://localhost:11434
model_temperature응답 무작위성 제어0
max_plan_steps에이전트 계획 최대 단계 수6

참고: 이러한 매개변수는 Open WebUI 관리자 패널의 '함수' 섹션에서, 함수 추가 후 톱니바퀴 아이콘을 통해 설정할 수 있습니다.

8단계. 에이전틱 시스템 쿼리

Granite 검색 에이전트는 로컬 문서와 웹 소스를 쿼리해 AG2 기반 RAG를 수행하며, 멀티 에이전트 작업 계획을 세우고 적응형 실행을 적용합니다. 채팅을 시작하고 에이전틱 시스템에 제공된 문서와 관련된 쿼리를 입력하면 실제 동작하는 RAG 체인을 확인할 수 있습니다.

요약

멀티 에이전트 설정을 사용하면 Granite 3.2와 같은 중간 규모의 오픈 소스 모델을 최대한 활용하여 실용적이고 유용한 도구를 만들 수 있습니다. 완전히 오픈 소스 도구로 구축된 이 에이전틱 RAG 아키텍처는 질문 답변 에이전트 및 AI 알고리즘을 설계와 맞춤화의 출발점 역할을 할 수 있습니다. 또한 다양한 사용 사례에 바로 적용할 수도 있습니다. 이 튜토리얼에서는 AutoGen의 기능을 활용하면서 단순하거나 복잡한 에이전틱 시스템을 자세히 살펴볼 수 있었습니다. Granite LLM은 Ollama를 통해 호출되어 이러한 시스템을 완전히 로컬로 탐색할 수 있었습니다. 다음 단계로 더 많은 사용자 지정 도구를 에이전트 시스템에 통합하는 것을 고려해 보세요.

관련 솔루션
IBM AI 에이전트 개발 

IBM watsonx.ai 스튜디오를 사용하여 개발자가 AI 에이전트를 구축, 배포 및 모니터링할 수 있도록 지원합니다.

 

watsonx.ai 살펴보기
인공 지능 솔루션

업계 최고의 AI 전문성과 솔루션 포트폴리오를 보유한 IBM과 함께 AI를 비즈니스에 활용하세요.

AI 솔루션 살펴보기
AI 컨설팅 및 서비스

AI 추가를 통해 중요한 워크플로와 운영을 혁신함으로써 경험, 실시간 의사 결정 및 비즈니스 가치를 극대화합니다.

AI 서비스 살펴보기
다음 단계 안내

사전 구축된 앱과 스킬을 사용자 정의하든, AI 스튜디오를 사용하여 맞춤형 에이전틱 서비스를 구축하고 배포하든, IBM watsonx 플랫폼이 모든 것을 지원합니다.

watsonx Orchestrate 살펴보기 watsonx.ai 살펴보기
각주

[1] Wu, Qingyun, et al. “AutoGen: Enabling Next-Gen LLM Applications via Multi-Agent Conversation Framework.” GitHub, 2023, github.com/microsoft/autogen.