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분 | 난이도: 중급 |
|---|
워크플로우 개요 (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 임베딩 인스턴스 설정
-
OpenAI 계정 생성: OpenAI에 가서 계정이 없다면 가입해요.
-
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를 사용할 거예요. 설정 방법은 다음과 같아요.
-
계정 생성: Qdrant Cloud에서 Qdrant Cloud 계정에 가입해요.
-
클러스터 생성:
- Overview 섹션으로 이동해요.
- Create First Cluster의 온보딩 안내에 따라 클러스터를 설정해요.
- 클러스터를 만들면 API Key가 발급돼요. 나중에 필요하니 복사해 안전하게 보관해요.
-
클러스터 프로비저닝 대기:
- 새 클러스터가 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 봇 생성
- Discord Developer Portal로 이동해 Discord 계정으로 로그인해요.
- New Application 버튼을 클릭해요.
- 애플리케이션 이름을 정하고 Create를 클릭해요.
- 왼쪽 사이드바의 Bot 탭으로 이동해 Add Bot을 클릭해요.
- 봇이 생성되면 Token 섹션 아래의 Reset Token을 클릭해 새 봇 토큰을 생성해요. 나중에 필요하니 안전하게 복사해 보관해요.
봇을 서버에 초대
- OAuth2 탭으로 이동한 뒤 URL Generator 섹션으로 가요.
- Scopes 아래에서 bot을 선택해요.
- Bot Permissions 아래에서 필요한 권한을 선택해요.
- Send Messages
- Read Message History
- 생성된 URL을 복사해 브라우저에 붙여 넣어요.
- 봇을 초대할 서버를 선택하고 Authorize를 클릭해요.
봇 권한 부여
- Bot 탭으로 돌아가요.
- 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: 봇 테스트
- Discord Developer Portal의 OAuth2 URL을 사용해 봇을 Discord 서버에 초대해요.
- 노트북을 실행해요.
- Discord 서버에서 봇과 채팅을 시작해요. 봇이 Qdrant에서 맥락을 검색하고 쿼리에 기반한 관련 답변을 제공할 거예요.

결론 (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