티스토리 뷰

카테고리 없음

개인 블로그 학습 챗봇

데이터조이 2025. 2. 26. 01:02
반응형

데이터 준비 - pdf to text 로 만들기. 

 

코드 짜기. 

text 를 embedding 벡터로. 

prompt 짜고, message 

 

 

그리고 나서 FastAPI() 만들기. 

from fastapi import FastAPI, Request
from pydantic import BaseModel


app = FastAPI()
# Pydantic 모델 정의: 카카오톡에서 전달하는 데이터 구조
class KakaoUserRequest(BaseModel):
    utterance: str

class KakaoRequest(BaseModel):
    userRequest: KakaoUserRequest

@app.post("/kakao/chatbot")
async def kakao_chatbot(request_data: KakaoRequest):
    # 이제 request_data는 Pydantic 모델 타입이므로, Swagger에 스키마가 표시됩니다.
    user_input = request_data.userRequest.utterance

    prompt = create_prompt(user_input)
    chatbot_response = generate_response(prompt)

    return {
        "version": "2.0",
        "template": {
            "outputs": [
                {"simpleText": {"text": chatbot_response}}
            ]
        }
    }

아래같이만 하면 No parameters 라고 떠서 Swagger UI에서 테스트할 때 어려움.

더보기

 

  • No parameters라고 뜨는 이유는 FastAPI의 엔드포인트(/kakao/chatbot)가 요청 본문(body)을 받도록 되어 있지 않거나, Pydantic 모델이 올바르게 설정되지 않았기 때문일 가능성이 높습니다.
  • Pydantic 모델 사용
    • KakaoUserRequest: 사용자의 utterance를 담는 모델
    • KakaoRequest: 실제로 카카오톡에서 받는 JSON 구조를 나타내며, 내부에 userRequest 필드가 있고, 그 타입은 KakaoUserRequest입니다.
  • 엔드포인트 수정
    • 함수 파라미터를 request_data: KakaoRequest로 변경하면, FastAPI가 자동으로 요청 본문(JSON)을 파싱하여 해당 모델로 변환합니다.
    • 이로 인해 Swagger UI에서는 요청 본문에 대한 파라미터 정보를 확인할 수 있습니다.

 

# 카카오톡 챗봇에서 메시지를 받는 엔드포인트
@app.post("/kakao/chatbot")
async def kakao_chatbot(request: Request):
    data = await request.json()
    user_input = data['userRequest']['utterance']  # 카카오에서 받은 메시지

    prompt = create_prompt(user_input)
    chatbot_response = generate_response(prompt)

    return {
        "version": "2.0",
        "template": {
            "outputs": [
                {"simpleText": {"text": chatbot_response}}
            ]
        }
    }

 

실행은

uvicorn blog_bot_api:app --host 0.0.0.0 --port 8000 이렇게 시킴.  (ASGI 서버. 파일이름:FastAPI인스턴스이름.)

확인은 http://localhost:8000/docs 이렇게 함. -FastAPI에서 제공하는 자동 문서화 페이지(Interactive API docs. Swagger UI)

 

 

 

[EC2]

 

로컬에서 해봤으면 EC2에서 해봐야지. 

접속은 ssh -i "kakaobotkeypair.pem" ec2-user@아이피 (chmod 400 kakaobotkeypair.pem)

보안 그룹 → 인바운드 규칙 확인

  • 포트 22 (SSH) 가 허용되어야 함. 

EC2생성하고 Python 설치하기 (링크) - chroma DB 쓸거면 "sudo yum install sqlite-devel -y" 이거 미리 해야됨. 

 

그리고 나서 로컬 파일 옮기기 (scp -i /Users/yeongsun/Downloads/kakaobotkeypair.pem -r joy_data ec2-user@ec2-{숫자들}.ap-northeast-2.compute.amazonaws.com:/home/ec2-user)

 

그리고 나서 Fast API 서버 실행 하기. 

노헙으로. 띄우기. (ex. nohup uvicorn main:app --host 0.0.0.0 --port 8000 > uvicorn.log 2>&1 &)

보안 그룹 → 인바운드 규칙 확인

  • 포트 8000 (TCP) 가 허용되어야 함. 
  •  

[카카오]

웹훅 URL을 EC2 서버의 FastAPI 엔드포인트로 설정 (http://${EC2_PUBLIC_IP}:8000/kakao/chatbot) 이렇게 하면 됨.

이러면 챗봇에 메시지 보내면 FastAPI가 OpenAi API 호출해서 응답 반환함. 

 

[EC2번외]

> 보안을 강화하기 위해 nginxAWS Application Load Balancer 등을 이용해 리버스 프록시 설정을 하는 것도 추천드립니다. <- 생략함.

 

  • 보안:
    • API 키와 민감 정보는 환경 변수 또는 AWS Secrets Manager 등 안전한 방법으로 관리합니다.
    • EC2 보안 그룹 및 Nginx 설정을 통해 서버를 외부 공격으로부터 보호하세요.
  • 로그 및 모니터링:
    • 로그 파일을 관리하고, CloudWatch 등의 도구로 모니터링을 설정하면 문제 발생 시 빠르게 대응할 수 있습니다.
    •  
from fastapi import FastAPI, Request
import json
import datetime

app = FastAPI()

LOG_FILE = "chat_logs.txt"  # 로그 파일 경로

def save_log(user_id, message):
    """카카오톡에서 받은 발화를 로그 파일에 저장"""
    timestamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    log_entry = f"{timestamp} | User: {user_id} | Message: {message}\n"
    
    with open(LOG_FILE, "a", encoding="utf-8") as f:
        f.write(log_entry)

@app.post("/kakao")
async def kakao_webhook(request: Request):
    """카카오톡에서 요청을 받을 엔드포인트"""
    data = await request.json()
    
    # 카카오톡에서 전송된 메시지 가져오기
    user_id = data["userRequest"]["user"]["id"]  # 사용자 ID
    user_message = data["userRequest"]["utterance"]  # 사용자의 발화

    # 로그 저장
    save_log(user_id, user_message)

    # 응답 반환
    return {
        "version": "2.0",
        "template": {
            "outputs": [
                {
                    "simpleText": {
                        "text": f"'{user_message}' 를(을) 받았습니다!"
                    }
                }
            ]
        }
    }

 

 

반응형
댓글
Total
Today
Yesterday
공지사항
최근에 올라온 글
글 보관함