pairing / app.py
ll7098ll's picture
Update app.py
da5dcb4 verified
import os
import time
import streamlit as st
import google.generativeai as genai
from streamlit_extras.colored_header import colored_header
from streamlit_extras.add_vertical_space import add_vertical_space
from streamlit_extras.stoggle import stoggle
# Google Gemini API Key
genai.configure(api_key=os.environ["GEMINI_API_KEY"])
# Model Configuration
generation_config = {
"temperature": 0.8, # 창의성 증가
"top_p": 0.95,
"top_k": 64,
"max_output_tokens": 8192,
"response_mime_type": "text/plain",
}
model = genai.GenerativeModel(
model_name="gemini-2.0-flash",
generation_config=generation_config,
)
def generate_pairing_recommendation(input_text, input_type, situation):
"""
입력받은 안주 또는 주류에 어울리는 페어링 정보를 생성합니다.
상황/분위기를 고려하여 한국인의 취향에 맞는 주류나 안주를 추천합니다.
주류 페어링 전문가와 요리 전문가의 관점을 통합하여 추천합니다.
Args:
input_text (str): 안주 또는 주류 정보
input_type (str): 입력 종류 ('안주' 또는 '주류')
situation (str): 상황 또는 분위기 정보
Returns:
str: 생성된 페어링 정보
"""
SYSTEM_PROMPT = f"""
**주류 페어링 마스터입니다!** 🍇🎉
입력하신 {input_type} '{input_text}'에 어울리는 최고의 페어링을 찾아드리겠습니다.
'{situation}' 상황에 딱 맞는, 최상의 미식 경험을 위한 맞춤 추천을 제공합니다.
다음과 같은 요소들을 종합적으로 고려하여 최적의 페어링을 제안합니다.
* **상황 및 분위기:** '{situation}'에 맞춰 로맨틱한 분위기, 활기찬 분위기, 편안한 분위기 등을 고려합니다.
* **미식적 조화:** 안주와 주류의 맛, 향, 질감, 온도의 조화를 분석하여 서로의 풍미를 상승시키는 조합을 찾습니다.
* **창의적인 페어링:** 뻔한 조합 대신 예상치 못한 조합을 제안하여 새로운 미식 경험을 선사합니다.
* **한국인의 취향:** 한국인의 입맛과 선호도를 고려한 맞춤 추천을 제공합니다.
* **전문가의 팁:** 안주 조리 방법, 주류 서빙 온도, 페어링을 더욱 즐겁게 만드는 팁 등 전문가의 팁을 제공합니다.
* **다양한 선택지:** 최소 4가지 이상의 다양한 페어링을 추천합니다.
* **상세한 설명:** 각 페어링에 대한 추천 이유와 함께 안주와 주류에 대한 자세한 정보 (종류, 재료, 맛, 향, 질감, 온도, 원산지, 제조법, 추천 점수 등) 를 제공합니다.
**페어링 구성 요소:**
1. 추천 주류/안주 소개 (요리/주류 정보 포함)
2. 맛과 향, 질감, 온도 설명
3. 추천 이유 (상황/분위기, 미식적 조화, 창의성, 한국인 취향 고려)
4. 추가 페어링 제안 (대체 가능한 안주/주류, 곁들임 메뉴 등)
5. 추천 점수 (10점 만점)
**입력 종류:** {input_type}
**입력 내용:** {input_text}
**추천 페어링:**
"""
response = model.generate_content(SYSTEM_PROMPT, stream=True)
collected_text = ""
for token in response:
chunk = token.text
collected_text += chunk
yield collected_text
time.sleep(0.03)
# Streamlit Interface
st.set_page_config(
page_title="주류 페어링 마스터",
page_icon="🍇",
layout="centered",
initial_sidebar_state="expanded",
)
colored_header(
label="🍇 주류 페어링 마스터",
description="🍻 안주 또는 주류를 입력하시면 최고의 페어링을 찾아드립니다. 상황과 분위기에 맞는 완벽한 조합을 경험해보세요!",
color_name="red-70",
)
add_vertical_space(1)
# 사이드바 입력 영역
st.sidebar.markdown("## 📝 입력 정보")
# 사용자 입력 영역 (사이드바 탭으로 분리)
tabs = st.sidebar.tabs(["🍝 안주 입력", "🍇 주류 입력"])
with tabs[0]:
st.markdown("#### 안주를 입력해 주세요:")
input_text_anjoo = st.text_input("예: 한우 스테이크, 모듬 사시미, 팟타이 등", key="input_text_anjoo")
with tabs[1]:
st.markdown("#### 주류를 입력해 주세요:")
input_text_liquor = st.text_input("예: 싱글 몰트 위스키, 드라이 로제 와인, 수제 맥주 등", key="input_text_liquor")
# 상황 또는 분위기 입력 (사이드바)
st.sidebar.markdown("#### 상황이나 분위기를 입력해 주세요:")
situation = st.sidebar.text_area("예: 기념일 저녁 식사, 퇴근 후 혼술, 캠핑 바베큐 파티 등", height=100, key="situation")
# 페어링 추천 받기 버튼
generate_button = st.sidebar.button("✨ 페어링 추천 받기")
# 출력 영역 정의
output_area = st.empty()
# 추천 결과 생성 및 출력
if generate_button:
input_type = "안주" if st.session_state.input_text_anjoo else "주류"
input_text = st.session_state.input_text_anjoo if st.session_state.input_text_anjoo else st.session_state.input_text_liquor
situation = st.session_state.situation
if input_text: # 입력값이 있을 때만 추천 시작
output_text = ""
output_area.markdown(output_text)
try:
with st.spinner("페어링 정보를 생성 중입니다... 잠시만 기다려 주세요!"):
for partial_output in generate_pairing_recommendation(input_text, input_type, situation):
output_text = partial_output
output_area.markdown(output_text)
except Exception as e:
st.error(f"오류가 발생했습니다: {str(e)}")
else:
st.warning("안주 또는 주류를 입력해주세요.")
# 추가 정보 및 FAQ
add_vertical_space(2)
with st.expander("📜 주류 페어링 마스터 FAQ"): # FAQ 내용 접기/펼치기 기능 추가
st.markdown(
"""
**주류 페어링 마스터에 오신 것을 환영합니다!** 🎉
이 앱은 단순히 안주와 주류를 매칭하는 것을 넘어, **미식의 즐거움을 극대화**하는 것을 목표로 합니다.
주류 페어링 전문가와 요리 전문가의 노하우를 담아, **상황과 분위기에 맞는 완벽한 페어링**을 제안합니다.
특별한 날, 소중한 사람들과의 만남, 혹은 혼자만의 여유로운 시간을 더욱 풍요롭게 만들어보세요!
---
**Q1: 어떤 상황에 페어링 추천을 받을 수 있나요?**
A: **모든 상황**에 맞춰 페어링을 추천해 드립니다! 예를 들어:
* **로맨틱한 데이트:** 와인, 샴페인과 어울리는 고급 안주
* **친구들과의 활기찬 모임:** 맥주, 소주와 잘 어울리는 캐주얼한 안주
* **가족과의 저녁 식사:** 전통주, 막걸리와 함께 즐기는 푸짐한 한식 요리
* **혼술:** 위스키, 사케와 함께 깊은 풍미를 즐길 수 있는 안주
* **캠핑/바비큐:** 야외에서 즐기기 좋은 간편한 안주와 주류
* **기념일/파티:** 특별한 날을 위한 화려하고 고급스러운 페어링
* **비오는 날:** 따뜻한 국물 요리와 어울리는 전통주, 막걸리
* **더운 여름날:** 시원한 맥주, 칵테일과 상큼한 안주
**Q2: 페어링 추천은 어떻게 이루어지나요?**
A: 페어링 추천은 다음 요소들을 종합적으로 고려하여 이루어집니다.
* **주류 및 안주 정보:** 맛, 향, 질감, 온도, 요리 방법, 재료 등
* **상황 및 분위기:** 로맨틱, 캐주얼, 격식, 파티 등
* **한국인의 취향:** 보편적인 선호도 및 개인의 취향
* **전문가의 창의성:** 독창적이고 새로운 페어링 제안
* **미식적 조화:** 서로의 풍미를 증폭시키는 최적의 조합
**Q3: 추천 점수는 어떻게 매겨지나요?**
A: 추천 점수는 10점 만점으로, 다음과 같은 기준에 따라 평가됩니다.
* **맛의 조화:** 주류와 안주의 맛이 얼마나 잘 어울리는지
* **향의 조화:** 주류와 안주의 향이 서로를 보완하는지
* **질감의 조화:** 주류와 안주의 질감이 얼마나 잘 어울리는지
* **상황 적합성:** 해당 상황과 분위기에 얼마나 적합한지
* **창의성:** 얼마나 독창적이고 새로운 페어링인지
* **한국인 취향 부합도:** 한국인의 일반적인 입맛에 얼마나 잘 맞는지
**Q4: 추천 결과 외에 다른 정보도 얻을 수 있나요?**
A: 추천 결과와 함께 다음과 같은 추가 정보를 제공합니다.
* **요리/주류 상세 정보:** 안주의 요리 방법, 주재료, 소스, 주류의 종류, 제조법, 알코올 도수 등
* **추천 이유:** 상황/분위기, 맛, 향, 질감 등을 고려한 상세한 설명
* **추가 페어링 제안:** 대체 가능한 안주/주류, 곁들임 메뉴 등
**Q5: 지속적으로 업데이트되나요?**
A: 네, 주류 페어링 마스터는 사용자 피드백과 최신 트렌드를 반영하여 **지속적으로 업데이트**될 예정입니다.
새로운 안주, 주류, 페어링 조합이 계속 추가될 것이며, 더욱 정확하고 만족스러운 추천을 제공하기 위해 노력하겠습니다.
---
**주류 페어링 마스터와 함께 최고의 미식 경험을 즐겨보세요!** 🥂
""",
)