안녕하세요! 인공지능 기술이 빠르게 발전하면서 LLM(Large Language Model)은 이제 단순히 질문에 답하는 것을 넘어, 복잡한 논쟁을 펼치고 추론하는 능력까지 보여주고 있습니다. 이러한 LLM의 잠재력을 활용하여 흥미로운 AI 토론 웹 앱을 개발하는 방법을 함께 알아보겠습니다.
이 가이드에서는 클로드(Claude)나 제미나이(Gemini)와 같은 최신 LLM을 활용하여 두 AI가 특정 주제에 대해 자동으로 토론하는 시스템을 구현하고, 이를 FastAPI 백엔드와 연동하여 사용하기 쉬운 웹 애플리케이션으로 만드는 실전적인 과정을 다룰 것입니다. 단순히 이론을 넘어 실제 작동하는 AI 토론 플랫폼을 구축하는 데 필요한 핵심 개념과 코드 구조를 살펴보며, 개발자 여러분이 직접 아이디어를 실현할 수 있도록 돕겠습니다.
AI 토론 웹 앱은 교육, 엔터테인먼트, 아이디어 탐색 등 다양한 분야에서 활용될 수 있는 잠재력을 가지고 있습니다. 이 가이드를 통해 여러분만의 독창적인 AI 토론 시스템을 만들어보는 첫걸음을 내딛어 보세요!
AI 토론 시스템의 핵심 이해

AI 토론 시스템은 말 그대로 두 개 이상의 인공지능 에이전트가 특정 주제에 대해 자신의 입장을 옹호하고 상대방의 주장을 반박하며 논쟁을 벌이는 과정입니다. 이 시스템의 핵심은 단연 LLM에 있습니다. LLM은 방대한 텍스트 데이터를 학습하여 인간과 유사한 언어를 생성하고 이해하는 능력을 가지고 있으며, 이는 복잡한 논리 전개와 자연스러운 상호작용을 가능하게 합니다.
- 왜 LLM인가?
LLM은 주어진 프롬프트에 따라 특정 페르소나를 부여받고, 해당 페르소나의 관점에서 일관된 주장을 펼칠 수 있습니다. 또한, 상대방의 발언을 분석하여 적절한 반박 논리를 구성하는 데 탁월한 능력을 보여줍니다. 이는 토론의 역동성을 구현하는 데 필수적인 요소입니다. - 기본 아키텍처 구상
AI 토론 웹 앱의 기본적인 흐름은 다음과 같습니다:
- 사용자가 토론 주제를 입력합니다.
- 백엔드는 두 개의 LLM 에이전트(예: 찬성 측 AI, 반대 측 AI)를 준비합니다.
- 각 LLM 에이전트는 서로의 발언을 입력받아 다음 발언을 생성합니다.
- 생성된 발언은 백엔드를 통해 프론트엔드 사용자 인터페이스에 표시됩니다.
- 정해진 턴(Turn) 수만큼 이 과정이 반복됩니다.
- 프롬프트 엔지니어링의 중요성
LLM의 성능은 프롬프트의 품질에 크게 좌우됩니다. 토론 시스템에서는 LLM에게 명확한 역할(페르소나), 토론 규칙, 발언의 길이 제한 등을 지시하는 정교한 프롬프트가 필요합니다. 예를 들어, '당신은 ~에 찬성하는 입장이며, 상대방의 주장을 반박하고 당신의 논리를 강화해야 합니다. 발언은 100단어를 넘지 않아야 합니다.'와 같은 지시를 포함할 수 있습니다.
LLM 연동 및 토론 로직 구현

실제 LLM과 연동하고 토론 로직을 구현하는 단계는 이 프로젝트의 핵심입니다. 우리는 클로드(Claude)와 제미나이(Gemini) API를 사용하여 AI 에이전트를 만들 것입니다.
LLM API 연동
- 클로드(Claude) API 사용
Anthropic의 Claude API는 강력한 추론 능력과 긴 컨텍스트 윈도우를 제공합니다. Python에서 'anthropic' 라이브러리를 사용하여 쉽게 연동할 수 있습니다. API 키는 환경 변수로 관리하여 보안을 유지하는 것이 중요합니다. - 제미나이(Gemini) API 사용
Google의 Gemini API는 다양한 크기와 모달리티를 지원하며, 무료 티어에서도 충분히 활용할 수 있습니다. 'google-generativeai' 라이브러리를 통해 연동하며, 이 역시 API 키를 환경 변수로 관리해야 합니다.
토론 로직 설계
토론의 핵심은 턴(Turn) 기반의 상호작용입니다. 각 AI는 상대방의 이전 발언을 참고하여 자신의 다음 발언을 생성해야 합니다.
- 프롬프트 구조화
각 LLM 에이전트에게 전달되는 프롬프트는 다음과 같은 요소를 포함해야 합니다:
- 페르소나 부여: '당신은 찬성측 토론자입니다.'
- 토론 주제: '주제는 ~입니다.'
- 이전 대화 기록: 이전 발언들을 모두 포함하여 LLM이 맥락을 이해하고 일관된 토론을 이어갈 수 있도록 합니다.
- 현재 턴 지시: '상대방의 마지막 발언에 대해 반박하고 당신의 주장을 50단어 이내로 펼치세요.'
- 대화 기록 관리
LLM은 이전 대화를 기억하지 못하므로, 매 턴마다 이전 대화 기록을 프롬프트에 포함하여 전달해야 합니다. 이를 위해 발언 목록을 리스트 형태로 관리하는 것이 일반적입니다. - 토론 규칙 적용
최대 턴 수, 발언 길이 제한, 주제 이탈 감지 등 토론의 흐름을 제어하는 규칙을 코드로 구현합니다. 예를 들어, 발언이 너무 길면 잘라내거나, 특정 키워드가 반복되면 주의를 주는 등의 로직을 추가할 수 있습니다.
python
async def generate_response(model, history, persona_prompt, topic, last_opponent_utterance):
full_prompt = f"{persona_prompt}. 주제: {topic}. 이전 대화: {"\n".join(history)}. 상대방의 마지막 발언: {last_opponent_utterance}. 당신의 다음 주장을 50단어 이내로 펼치세요."
response = await model.generate_content(full_prompt)
return response.text
FastAPI로 웹 앱 백엔드 구축

AI 토론 시스템을 웹 서비스로 제공하기 위해 FastAPI를 백엔드 프레임워크로 선택합니다. FastAPI는 고성능, 비동기 지원, 자동 문서화 기능으로 API 개발에 매우 적합합니다.
FastAPI 프로젝트 설정
- 프로젝트 초기화
프로젝트 폴더를 생성하고 필요한 라이브러리(fastapi,uvicorn,anthropic,google-generativeai,python-dotenv)를 설치합니다. - 환경 변수 관리
.env파일에 LLM API 키를 저장하고,python-dotenv라이브러리를 사용하여 로드합니다. - 메인 애플리케이션 파일 구조
main.py파일에 FastAPI 앱 인스턴스를 생성하고 라우터를 정의합니다.
주요 API 엔드포인트 구현
토론 웹 앱을 위한 최소한의 두 가지 엔드포인트가 필요합니다.
/debate/start(POST): 토론 시작
- 사용자로부터 토론 주제를 입력받습니다.
- 두 AI 에이전트의 초기 프롬프트와 페르소나를 설정합니다.
- 초기 대화 기록을 생성하고, 첫 번째 AI의 발언을 요청합니다.
- 토론 ID를 발급하고 현재 상태를 반환합니다.
python
@app.post('/debate/start')
async def start_debate(topic: str):
# 토론 초기화 로직: AI 페르소나 설정, 초기 프롬프트 생성, 첫 발언 요청
debate_id = str(uuid.uuid4())
# ... (데이터베이스에 초기 상태 저장)
return {{'debate_id': debate_id, 'status': 'started', 'first_utterance': '...'}}/debate/{debate_id}/next_turn(POST): 다음 턴 진행
- 특정
debate_id에 해당하는 토론 상태를 로드합니다. - 현재 턴의 AI 에이전트에게 이전 대화 기록과 상대방의 마지막 발언을 전달하여 다음 발언을 생성하도록 요청합니다.
- 새로운 발언과 업데이트된 토론 상태를 반환합니다.
python
@app.post('/debate/{debate_id}/next_turn')
async def next_debate_turn(debate_id: str):
# 데이터베이스에서 debate_id에 해당하는 토론 상태 로드
# 다음 AI의 발언 생성 로직
# ... (업데이트된 상태 데이터베이스에 저장)
return {{'debate_id': debate_id, 'current_turn': 5, 'last_utterance': '...'}}- 특정
데이터 저장은 간단하게 SQLite 데이터베이스를 사용하여 각 토론의 ID, 주제, 대화 기록, 현재 턴 등을 저장할 수 있습니다. SQLAlchemy를 활용하면 모델 정의와 ORM 기능을 편리하게 사용할 수 있습니다.
프론트엔드 연결 및 사용자 경험 고려

백엔드 API가 준비되면, 사용자에게 토론 과정을 시각적으로 보여줄 프론트엔드를 구축해야 합니다. 여기서는 간단한 HTML, CSS, JavaScript 기반의 프론트엔드를 가정합니다.
기본적인 프론트엔드 구조
- 토론 주제 입력 폼
사용자가 토론할 주제를 입력하고 토론을 시작하는 버튼을 제공합니다. 이 버튼 클릭 시/debate/startAPI를 호출합니다. - 대화창
AI들의 발언이 실시간으로 표시되는 영역입니다. 각 발언은 AI의 페르소나와 함께 표시되어 누가 어떤 발언을 했는지 명확하게 구분할 수 있어야 합니다. - 다음 턴 진행 버튼
자동으로 다음 턴이 진행되게 하거나, 사용자가 수동으로 다음 턴을 진행하도록 하는 버튼을 제공할 수 있습니다. 이 버튼 클릭 시/debate/{debate_id}/next_turnAPI를 호출합니다.
사용자 경험(UX) 개선
- 로딩 상태 표시
LLM API 호출은 시간이 걸릴 수 있으므로, AI가 발언을 생성 중일 때 '생각 중...'과 같은 로딩 인디케이터를 표시하여 사용자가 기다리도록 안내해야 합니다. - 스크롤 자동 이동
새로운 발언이 추가될 때마다 대화창이 자동으로 스크롤되어 가장 최근 발언을 볼 수 있도록 합니다. - 에러 처리
API 호출 실패 시 사용자에게 친절한 에러 메시지를 표시하고, 재시도 옵션을 제공합니다. - 반응형 디자인
다양한 기기에서 웹 앱을 사용할 수 있도록 반응형 디자인을 적용하는 것이 좋습니다.
프론트엔드 개발에는 React, Vue, Svelte와 같은 프레임워크를 사용할 수도 있지만, 이 가이드에서는 기본적인 웹 기술만으로도 충분히 구현 가능함을 보여줍니다. 중요한 것은 백엔드에서 제공하는 API를 효과적으로 활용하여 사용자에게 직관적이고 몰입감 있는 경험을 제공하는 것입니다.
결론

이 가이드를 통해 LLM(Claude/Gemini)과 FastAPI를 활용하여 AI 토론 웹 앱을 구축하는 전반적인 과정을 살펴보았습니다. 핵심은 강력한 LLM의 언어 생성 및 추론 능력을 토론 로직에 효과적으로 적용하고, FastAPI로 안정적인 백엔드를 구축하며, 직관적인 프론트엔드로 사용자 경험을 완성하는 것입니다.
물론 이 프로젝트는 무궁무진한 확장 가능성을 가지고 있습니다. 예를 들어, 토론 점수 시스템 추가, 다자간 토론 지원, 토론 기록 요약 기능, 시각화 대시보드 구축 등 다양한 아이디어를 적용할 수 있습니다. 또한, WebSockets을 사용하여 실시간으로 발언을 스트리밍하는 등 더욱 동적인 사용자 경험을 제공할 수도 있습니다.
AI 기술의 발전은 우리가 상상하지 못했던 새로운 애플리케이션의 문을 열어주고 있습니다. 이 가이드가 여러분의 AI 토론 프로젝트를 시작하는 데 유용한 기반이 되기를 바라며, 앞으로도 끊임없이 학습하고 새로운 아이디어를 탐구하며 멋진 개발 여정을 이어나가시길 응원합니다!