CAMEL-AI와 OpenAI를 활용한 Qdrant Agentic RAG Discord 봇

CAMEL-AI와 OpenAI를 활용한 Qdrant Agentic RAG Discord 봇 (tutorials-build-essentials-agentic-rag-camelai-discord)

전통적인 RAG 기법은 맥락을 수동적으로 가져와서 응답을 생성하는 방식이에요. 반면 agentic RAG는 챗봇이 능동적으로 의사 결정을 하고, 다단계 추론(multi-step reasoning)을 수행하는 방식이에요. 데이터를 단순히 가져오는 대신, 챗봇이 스스로 결정을 내리고 다양한 데이터 소스와 동적으로 상호작용하며 맥락에 맞게 적응하죠. 훨씬 더 역동적이고 지능적인 접근 방식이에요.

이 튜토리얼에서는 Qdrant, CAMEL-AI, OpenAI를 사용해 완전히 동작하는 챗봇을 만들어 볼 거예요.

시작해 볼게요!

시간: 45분 난이도: 중급 Colab에서 열기

워크플로우 개요 (Workflow Overview)

우리 Agentic RAG 워크플로우를 크게 보면 다음과 같아요.

단계 설명
1. 환경 설정 필수 라이브러리(camel-ai, qdrant-client, discord.py)를 설치하고 Python 환경을 구성해요.
2. OpenAI 임베딩 인스턴스 설정 OpenAI 계정을 만들고 API 키를 생성한 뒤 임베딩 모델을 구성해요.
3. Qdrant 클라이언트 구성 Qdrant Cloud에 가입하고 클러스터를 만든 뒤 QdrantStorage를 구성하고 API 연결을 설정해요.
4. 데이터 스크래핑·처리 VectorRetriever로 Qdrant 문서를 스크래핑하고, 텍스트를 청크로 나눈 뒤 Qdrant에 임베딩을 저장해요.
5. CAMEL-AI ChatAgent 설정 다단계 추론과 맥락 인지 응답을 위해 OpenAI 모델로 CAMEL-AI ChatAgent를 만들고 초기화해요.
6. Discord 봇 생성·구성 Discord Developer Portal에서 새 봇을 등록하고 서버에 초대한 뒤 권한을 활성화해요.
7. Discord 봇 구축 Discord.py를 CAMEL-AI·Qdrant와 통합해 맥락을 검색하고 지능적인 응답을 생성해요.
8. 봇 테스트 실제 Discord 서버에서 봇을 실행하고 관련성 높은 맥락 있는 답변을 제공하는지 확인해요.

아키텍처 다이어그램 (Architecture Diagram)

아래는 챗봇의 워크플로우와 상호작용을 나타낸 아키텍처 다이어그램이에요.

아키텍처 다이어그램

워크플로우는 vector_retriever.process() 메서드로 URL의 콘텐츠를 스크래핑·청크화·upsert하는 것에서 시작해요. 이 메서드는 OpenAI 임베딩 인스턴스로 임베딩을 생성해요. 이 임베딩은 메타데이터와 함께 QdrantStorage 클래스를 거쳐 Qdrant에 인덱싱·저장돼요.

사용자가 Discord 봇을 통해 쿼리를 보내면, vector_retriever.query()가 이를 처리해요. 이 메서드는 먼저 쿼리를 OpenAI Embeddings로 임베딩한 뒤 QdrantStorage를 통해 Qdrant에서 가장 관련성 높은 결과를 가져와요. 검색된 맥락(예: 관련 문서 스니펫)은 CAMEL-AI 아래의 OpenAI 기반 Qdrant Agent에 전달되고, 이 에이전트는 맥락을 인지한 최종 응답을 생성해요.

Qdrant Agent는 GPT_4O_MINI 언어 모델로 검색된 벡터를 처리해 사용자 쿼리에 맥락적으로 관련된 응답을 만들어요. 이 응답은 다시 Discord 봇을 통해 사용자에게 전달되면서 흐름이 완료돼요.


Step 1: 환경 설정 (Environment Setup)

구현에 들어가기 전에, 우리가 사용할 스택의 전체적인 개요를 살펴볼게요.

구성 요소 목적
Qdrant 문서 임베딩을 저장하고 쿼리하기 위한 벡터 데이터베이스
OpenAI 벡터 표현과 챗봇 응답을 생성하는 임베딩·언어 모델
CAMEL-AI 대화 흐름, 검색, AI 에이전트 상호작용을 관리하는 프레임워크
Discord API 챗봇을 배포하고 상호작용하는 플랫폼

의존성 설치 (Install Dependencies)

필요한 모든 의존성을 포함하는 CAMEL-AI를 설치할게요.

!pip install camel-ai[all]==0.2.17

Step 2: OpenAI 임베딩 인스턴스 설정

  1. OpenAI 계정 생성: OpenAI에 가서 계정이 없다면 가입해요.

  2. API 키 생성:

    • 로그인 후 오른쪽 상단의 프로필 아이콘을 클릭하고 API keys를 선택해요.
    • Create new secret key를 클릭해요.
    • 생성된 API 키를 복사해 안전하게 보관해요. 다시는 볼 수 없으니 주의해요.

코드에서 OpenAI 클라이언트를 설정하는 방법은 다음과 같아요.

프로젝트 디렉터리에 .env 파일을 만들고 API 키를 추가해요.

OPENAI_API_KEY=<your_openai_api_key>

<your_openai_api_key>를 실제 API 키로 반드시 교체해 주세요.

이제 OpenAI 클라이언트를 실행해요.

import openai
import os
from dotenv import load_dotenv

load_dotenv()

openai_client = openai.Client(
    api_key=os.getenv("OPENAI_API_KEY")
)

임베딩 인스턴스를 설정하기 위해 text embedding 3 large를 사용할 거예요.

from camel.embeddings import OpenAIEmbedding
from camel.types import EmbeddingModelType

embedding_instance = OpenAIEmbedding(model_type=EmbeddingModelType.TEXT_EMBEDDING_3_LARGE)

Step 3: Qdrant 클라이언트 구성

이 튜토리얼에서는 Qdrant Cloud Free Tier를 사용할 거예요. 설정 방법은 다음과 같아요.

  1. 계정 생성: Qdrant Cloud에서 Qdrant Cloud 계정에 가입해요.

  2. 클러스터 생성:

    • Overview 섹션으로 이동해요.
    • Create First Cluster의 온보딩 안내에 따라 클러스터를 설정해요.
    • 클러스터를 만들면 API Key가 발급돼요. 나중에 필요하니 복사해 안전하게 보관해요.
  3. 클러스터 프로비저닝 대기:

    • 새 클러스터가 Clusters 섹션에 나타날 거예요.

Qdrant Cloud 정보를 얻은 뒤 .env 파일에 추가해요.

QDRANT_CLOUD_URL=<your-qdrant-cloud-url>
QDRANT_CLOUD_API_KEY=<your-api-key>

QdrantStorage 구성

QdrantStorage는 컬렉션에 필요한 모든 작업을 위해 Qdrant 클라이언트와 연결을 처리해요.

from camel.retrievers import VectorRetriever

# 컬렉션 이름 정의
collection_name = "qdrant-agent"

storage_instance = QdrantStorage(
    vector_dim=embedding_instance.get_output_dim(),
    url_and_api_key=(
        qdrant_cloud_url,
        qdrant_api_key,
    ),
    collection_name=collection_name,
)

<your-qdrant-cloud-url><your-api-key> 필드를 반드시 업데이트해 주세요.


Step 4: 데이터 스크래핑·처리

CamelAI VectorRetriever 라이브러리를 사용할 거예요. 이 라이브러리는 파일이나 URL의 콘텐츠를 처리해 청크로 나누고, 임베딩을 지정된 Qdrant 컬렉션에 저장해요.

from camel.retrievers import VectorRetriever

vector_retriever = VectorRetriever(embedding_model=embedding_instance,
                                   storage=storage_instance)

qdrant_urls = [
    "https://qdrant.tech/documentation/overview",
    "/documentation/installation",
    "/documentation/search/filtering",
    "/documentation/manage-data/indexing",
    "/documentation/scaling/distributed_deployment",
    "/documentation/manage-data/quantization"
    # 필요에 따라 URL을 더 추가
]

for qdrant_url in qdrant_urls:
  vector_retriever.process(
      content=qdrant_url,
  )

Step 5: CAMEL-AI ChatAgent 인스턴스 설정

OpenAI 모델을 정의하고 CAMEL-AI ChatAgent 인스턴스를 만들어요.

from camel.configs import ChatGPTConfig
from camel.models import ModelFactory
from camel.types import ModelPlatformType, ModelType
from camel.agents import ChatAgent

# ChatGPT 구성 생성
config = ChatGPTConfig(temperature=0.2).as_dict()

# 구성을 사용해 OpenAI 모델 생성
openai_model = ModelFactory.create(
    model_platform=ModelPlatformType.OPENAI,
    model_type=ModelType.GPT_4O_MINI,
    model_config_dict=config,
)

assistant_sys_msg = """You are a helpful assistant to answer question,
         I will give you the Original Query and Retrieved Context,
        answer the Original Query based on the Retrieved Context,
        if you can't answer the question just say I don't know."""

qdrant_agent = ChatAgent(system_message=assistant_sys_msg, model=openai_model)

Step 6: Discord 봇 생성·구성

이제 봇을 살려 볼게요! 봇은 사용자들이 우리가 만든 agentic RAG 시스템과 상호작용할 수 있는 인터페이스 역할을 해요.

새 Discord 봇 생성

  1. Discord Developer Portal로 이동해 Discord 계정으로 로그인해요.
  2. New Application 버튼을 클릭해요.
  3. 애플리케이션 이름을 정하고 Create를 클릭해요.
  4. 왼쪽 사이드바의 Bot 탭으로 이동해 Add Bot을 클릭해요.
  5. 봇이 생성되면 Token 섹션 아래의 Reset Token을 클릭해 새 봇 토큰을 생성해요. 나중에 필요하니 안전하게 복사해 보관해요.

봇을 서버에 초대

  1. OAuth2 탭으로 이동한 뒤 URL Generator 섹션으로 가요.
  2. Scopes 아래에서 bot을 선택해요.
  3. Bot Permissions 아래에서 필요한 권한을 선택해요.
    • Send Messages
    • Read Message History
  4. 생성된 URL을 복사해 브라우저에 붙여 넣어요.
  5. 봇을 초대할 서버를 선택하고 Authorize를 클릭해요.

봇 권한 부여

  1. Bot 탭으로 돌아가요.
  2. Privileged Gateway Intents 아래에서 다음을 활성화해요.
    • Server Members Intent
    • Message Content Intent

이제 봇을 코드와 통합할 준비가 됐어요.

Step 7: Discord 봇 구축

.env 파일에 추가해요.

DISCORD_BOT_TOKEN=<your-discord-bot-token>

discord.py를 사용해 사용자와 상호작용하고 응답 전에 Qdrant에서 맥락을 검색하는 간단한 Discord 봇을 만들 거예요.

from camel.bots import DiscordApp
import nest_asyncio
import discord

nest_asyncio.apply()
discord_q_bot = DiscordApp(token=os.getenv("DISCORD_BOT_TOKEN"))

@discord_q_bot.client.event # 채널에 메시지가 전송되면 트리거
async def on_message(message: discord.Message):
    if message.author == discord_q_bot.client.user:
        return

    if message.type != discord.MessageType.default:
        return

    if message.author.bot:
        return
    user_input = message.content

    retrieved_info = vector_retriever.query(
        query=user_input, top_k=10, similarity_threshold=0.6
    )

    user_msg = str(retrieved_info)
    assistant_response = qdrant_agent.step(user_msg)
    response_content = assistant_response.msgs[0].content

    if len(response_content) > 2000: # discord 메시지 길이 제한
        for chunk in [response_content[i:i+2000] for i in range(0, len(response_content), 2000)]:
            await message.channel.send(chunk)
    else:
        await message.channel.send(response_content)

discord_q_bot.run()

Step 9: 봇 테스트

  1. Discord Developer Portal의 OAuth2 URL을 사용해 봇을 Discord 서버에 초대해요.
  2. 노트북을 실행해요.
  3. Discord 서버에서 봇과 채팅을 시작해요. 봇이 Qdrant에서 맥락을 검색하고 쿼리에 기반한 관련 답변을 제공할 거예요.

agentic-rag-discord-bot-what-is-quantization


결론 (Conclusion)

수고했어요! Qdrant로 관련 정보를 검색하고, OpenAI로 지능적인 응답을 생성하며, CAMEL-AI로 다단계 추론을 처리하는 agentic RAG 기반 Discord 봇을 만들었어요. 간단히 정리하면 다음과 같아요.

  • 스마트 지식 검색: 이제 챗봇이 Qdrant의 벡터 검색으로 대규모 데이터셋에서 관련 정보를 가져올 수 있어요.
  • CAMEL-AI로 자율 추론: 텍스트를 그대로 반복하는 대신 다단계 추론을 가능하게 해요.
  • 실시간 Discord 배포: Discord에서 챗봇을 런칭해 실제 사용자를 위해 상호작용하도록 만들었어요.

CAMEL-AI의 가장 큰 장점 중 하나는 제공하는 추상화예요. 덕분에 저수준 구현 세부 사항에 신경 쓰는 대신 지능적인 상호작용을 설계하는 데 집중할 수 있어요.

이제 확장 가능하고 자율적인 지식 시스템을 필요로 하는 더 복잡한 실제 문제에 도전할 준비가 됐어요.

출처: Qdrant 공식문서 - Qdrant Agentic RAG Discord Bot with CAMEL-AI and OpenAI

더 알아보기 (Learn more)