티스토리 뷰
데이터 준비 - 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번외]
> 보안을 강화하기 위해 nginx나 AWS 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