티스토리 뷰
회사에서 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)"
}
'Deep Learning' 카테고리의 다른 글
| INT v.s. FP: A Comprehensive Study of Fine-GrainedLow-bit Quantization Formats 논문 Gemini 3.0 Pro Preview 요약 (0) | 2025.11.19 |
|---|---|
| Renesas RZ 칩 시리즈(V2L/V2M/V2MA/V2H)별 지원 모델 및 처리 속도 정보 (0) | 2025.11.14 |
| yolov3 tiny pretrained weights 다운로드 (0) | 2025.10.29 |
| 여러 AI 서비스 개발사의 시스템 프롬프트 파악할 수 있는 깃헙 repo (0) | 2025.10.22 |
| 챗지피티 데스크탑 앱 설치 추천 (3) | 2025.08.30 |
- Total
- Today
- Yesterday
- ㅂ
- 백준 11053
- 자료구조
- 위상 정렬 알고리즘
- 백트래킹
- 조합
- 이분탐색
- 인공지능을 위한 선형대수
- 단축키
- MOT
- FairMOT
- 문제집
- 파이참
- 백준 11437
- 백준 1766
- 가장 긴 증가하는 부분 수열
- cosine
- Lowest Common Ancestor
- LCA
- 백준
- 순열
- PyCharm
- C++ Deploy
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
