카카오톡 챗봇을 만들고 싶은 거북이의 사례 2탄! Fast API와 퍼플렉시티를 활용한 카톡봇만들기

소개

지난번에는 자바스크립트만 활용해서 간단한 카톡봇을 만들어봤습니다. 하지만 이번에는 한 단계 더 나아가 서버 기반의 카톡봇을 구축해보기로 했습니다. 이는 17기 스터디 뉴스레터 과제 중 하나로, 퍼플렉시티 API와 FastAPI(Python) 를 활용해 카카오톡과 실시간으로 대화할 수 있는 봇을 만드는 실험이었습니다.

진행 방법

🔧 사전 준비

  • 퍼플렉시티 API Key 발급

  • 중고 안드로이드폰 구입 및 새로운 카카오계정 생성

  • 메신저봇 설치 및 연동

  • 디지털오션(DigitalOcean) 가입 및 서버 생성

🛠 사용 도구 및 활용법

  • 퍼플렉시티 API: 사용자 질문에 대한 AI 응답 생성

  • FastAPI (Python): REST API 서버 구성 및 라우팅 처리

  • 디지털오션: FastAPI 서버를 클라우드에 배포하여 항상 응답 가능하도록 유지

  • 메신저봇: 카카오톡 메시지 송수신 인터페이스 역할

  • 안드로이드폰 + 새 카카오계정: 실사용 테스트용 장비 및 계정 세팅

🛠 과정

  1. 디지털오션 - fast API 시스템 등록하기

    • 우측, 콘솔을 클릭

버튼이 강조된 화면의 스크린 샷
  • 아래와 같이 콘솔 화면이 나옵니다.

컴퓨터 화면을 보여주는 컴퓨터 화면의 스크린 샷
  • 서비스파일 생성 (예시)

한국 웹 사이트의 스크린 샷
흑백 그림의 흑백 그림의 흑백 그림의 흑백 사진
  • 서비스 리로드 -> 시작 -> 자동실행 -> 상태확인 (될 때까지 반복하기)

단어와 함께 한국 앱의 스크린 샷
  • 메신져봇 파이썬 코드

"""
FastAPI 기반 Perplexity 검색 서버
"""

from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
import httpx
import os
from dotenv import load_dotenv

# 환경변수 로딩
load_dotenv()
PERPLEXITY_API_KEY = os.getenv("PERPLEXITY_API_KEY")

app = FastAPI(title="Perplexity 검색 서버")

API_TIMEOUT = 30  # 초

class SearchRequest(BaseModel):
    query: str

class SearchResponse(BaseModel):
    answer: str

# Perplexity API 호출 함수
async def call_perplexity(query: str) -> str:
    headers = {
        "Authorization": f"Bearer {PERPLEXITY_API_KEY}",
        "Content-Type": "application/json"
    }
    data = {
        "model": "sonar-pro",
        "messages": [{"role": "user", "content": query}]
    }
    try:
        async with httpx.AsyncClient() as client:
            response = await client.post(
                "https://api.perplexity.ai/chat/completions",
                headers=headers,
                json=data,
                timeout=API_TIMEOUT
            )
            if response.status_code == 200:
                result = response.json()
                return result.get("choices", [{}])[0].get("message", {}).get("content", "응답 없음")
            else:
                return f"❌ API 오류: HTTP {response.status_code}"
    except httpx.TimeoutException:
        return "⏱️ 요청 시간이 초과되었습니다."
    except Exception as e:
        return f"❌ 예외 발생: {str(e)}"

@app.post("/search", response_model=SearchResponse)
async def search(request: SearchRequest):
    if not PERPLEXITY_API_KEY:
        raise HTTPException(status_code=500, detail="API 키가 설정되지 않았습니다.")
    answer = await call_perplexity(request.query)
    return SearchResponse(answer=answer)

@app.get("/")
async def health_check():
    return {"status": "ok", "service": "Perplexity 검색 서버"}
  1. 퍼플랙시티 카톡봇 응답결과

    한국어 문자 메시지의 스크린 샷
    한국어 문자 메시지의 스크린 샷

결과와 배운 점

  • 퍼플렉시티 기반 카톡봇은 약간 반박자 느린 응답이지만, 실시간 대화에는 큰 무리가 없었습니다 👍

  • 서버 셋업과 파일등록 과정은 초보에게는 쉽지 않았지만, 레오님의 도움으로 무사히 구축 완료했습니다 🙏

  • 기술적인 문제보다도 ‘같이 하는 사람’의 중요성을 다시금 느낄 수 있었던 프로젝트였습니다.

  • 이번 성공을 바탕으로 다음 과제는 '카톡 요약봇' 도전 예정입니다!

도움 받은 글

  • 복받어 현우님 2주차 강의 교안

독자에게 한마디

혼자 하지 말고 함께 하세요! 💬

같이 하면 막막한 서버 설치도, 버그 해결도 한결 수월해집니다 😊혼자 했으면 성공하지 못 했을텐데 '레오님' 도움으로 복잡했던 서버 설치를 마칠 수 있었습니다.

옆에서 도와주는 사람의 중요성과 너무 감사하다고 마음입니다.

이번 기수 스터디가 끝나기 전에 카톡요약봇 만들기도 성공해보겠습니다.

2
1개의 답글

👉 이 게시글도 읽어보세요