티스토리 뷰

회사에서 ai에이전트 개발하고 있지 않고 그냥 집에서 잠깐 시간내어 ai랑 티키타카 하여 만들어 본 예제입니다. 정답같은 예제가 아니니 참고만 하세요!

 

좀 마음에 안드는 부분은 인사말 건네는데 LLM이 돌아간다는 게 좀 낭비라고 생각된다. 실제로 한다면 인사말과 인사말에 대한 첫 아웃풋 토큰값들은 캐싱해놔야 비용을 절약할 수 있을 거 같다.

import os
import re
import json
import google.generativeai as genai
from dotenv import load_dotenv
load_dotenv()

# Google API 키 설정
# GOOGLE_API_KEY 환경 변수에 API 키를 설정하거나, 직접 입력하세요.
# 직접 입력 예: genai.configure(api_key="YOUR_API_KEY")
genai.configure(api_key=os.environ["GOOGLE_API_KEY"])

def extract_json_from_response(text):
    """
    response.text에서 JSON 영역만 추출하여 파싱하는 함수
    
    Args:
        text (str): 응답 텍스트
    
    Returns:
        dict: 파싱된 JSON 객체, 파싱 실패 시 None
    """
    # ```json과 ``` 사이의 내용을 추출하는 정규표현식
    json_pattern = r'```json\s*\n(.*?)\n```'
    match = re.search(json_pattern, text, re.DOTALL)
    
    if match:
        json_str = match.group(1)
        try:
            return json.loads(json_str)
        except json.JSONDecodeError as e:
            print(f"JSON 파싱 오류: {e}")
            return None
    return None

# 사용할 Gemini 모델 설정
model = genai.GenerativeModel('gemini-flash-lite-latest',
system_instruction=
"""
당신은 사용자와 대화하며 영화 취향을 파악하여 맞춤형 영화를 추천하는 AI 챗봇입니다.
대화를 통해 다음 2가지 정보를 수집해야 합니다:
1. 선호하는 장르 (액션, 로맨스, 코미디, 스릴러, SF 등)
2. 원하는 분위기 (가벼운, 무거운, 감동적인, 긴장감 있는 등)

2가지 정보가 모두 수집되면 적절한 영화를 추천하고 다음 형식으로 출력한 후 대화를 종료합니다.
# Output
대화 종료
```json
{
    "genre": "선호 장르",
    "mood": "원하는 분위기",
    "recommended_movie": "추천 영화 제목"
}
```
""")

# 채팅 세션 시작
chat = model.start_chat(history=[])

print("영화 추천 AI 챗봇입니다. 대화를 시작하세요. 종료하려면 'quit'를 입력하세요.\n")

# Gemini가 먼저 인사하도록 하기
initial_response = chat.send_message("안녕하세요. 영화 추천을 시작하겠습니다. 인사말을 건네주세요.")
print(f"Gemini: {initial_response.text}\n")

while True:
    user_input = input("You: ")
    if user_input.lower() == 'quit':
        break

    response = chat.send_message(user_input)
    print(f"Gemini: {response.text}")

    if "대화 종료" in response.text:
        # JSON 영역 파싱
        result = extract_json_from_response(response.text)
        if result:
            print("\n=== 파싱된 JSON 데이터 ===")
            print(json.dumps(result, ensure_ascii=False, indent=2))
        break

 

 

 

 


대화 예시

 

영화 추천 AI 챗봇입니다. 대화를 시작하세요. 종료하려면 'quit'를 입력하세요.

Gemini: 안녕하세요! 영화 취향을 파악해서 딱 맞는 영화를 추천해 드릴게요. 😊

혹시 평소에 **좋아하시는 영화 장르**가 있으신가요? (예: 액션, 로맨스, 스릴러, 코미디, SF 등)

You: 코미디
Gemini: 코미디 장르를 좋아하시는군요! 재미있고 유쾌한 영화를 찾으시는 것 같네요.

그렇다면, 영화를 보면서 **어떤 분위기**를 느끼고 싶으신가요? 예를 들어, **가볍고 아무 생각 없이 웃고 싶은지**, 아니면 **약간의 감동이나 풍자가 섞인 분위기**를 원하시는지 알려주시면 좋아요!
You: 무거운 분위기
Gemini: 음, 흥미롭네요! 코미디 장르를 선호하시지만, **무거운 분위기**를 원하신다고 하셨어요.

보통 코미디는 가벼운 분위기가 많은데, 혹시 **블랙 코미디**처럼 웃기면서도 사회 비판적인 메시지가 담겨 있거나, **약간의 풍자나 어두운 유머**가 섞인 영화를 찾으시는 걸까요?

제가 이해한 것이 맞는지 확인 부탁드립니다! 선호 장르는 **코미디**, 원하는 분위기는 **무거운 분위기**가 맞으신가요?
You: 맞다.
Gemini: 네, 장르와 분위기가 모두 확인되었습니다!

선호 장르: **코미디**
원하는 분위기: **무거운 분위기 (블랙 코미디/풍자적 유머로 해석)**

이 두 가지 요소를 고려했을 때, 추천해 드릴 만한 영화는 **《조커 (Joker)》** 입니다. 이 영화는 코미디 장르의 요소(광대)를 사용하지만, 전반적으로 사회적 메시지와 어두운 분위기가 강한 걸작입니다.

혹시 이 영화를 이미 보셨거나, 다른 영화를 추천받고 싶으시면 말씀해 주세요! (만약 이 추천이 마음에 드신다면, 이대로 추천을 확정하겠습니다.)
You: 마음에 들어
Gemini: 좋습니다! 고객님의 취향에 맞춰 영화를 추천해 드렸으니, 이제 대화를 마무리하겠습니다.

# Output
대화 종료
```json
{
    "genre": "코미디",
    "mood": "무거운 분위기",
    "recommended_movie": "조커 (Joker)"
}
```

=== 파싱된 JSON 데이터 ===
{
  "genre": "코미디",
  "mood": "무거운 분위기",
  "recommended_movie": "조커 (Joker)"
}

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/12   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함