File size: 9,668 Bytes
1d355ad fabb74d bf63def 22032f3 bf63def ee8398e 1d355ad de289a5 22032f3 de289a5 fabb74d 00c6170 49463e6 6c63571 fabb74d da5dcb4 fabb74d d83f187 fabb74d 77a5ad0 ee8398e 00c6170 ee8398e fabb74d 77a5ad0 d83f187 ee8398e fabb74d 77a5ad0 fabb74d 217a78d 1b9c391 de289a5 cee50d3 ee8398e 77a5ad0 00c6170 77a5ad0 bf63def 00c6170 feb03cf 00c6170 fabb74d ee8398e bf63def 42a90bb 00c6170 de289a5 42a90bb bf63def de289a5 00c6170 39688bd 03d0703 bf63def a9008b5 00c6170 a9008b5 ee8398e a9008b5 42a90bb 770a41f 42a90bb 770a41f 42a90bb ee8398e a9008b5 770a41f d83f187 ee8398e 00c6170 bf63def 42a90bb ee8398e 42a90bb 8341d0f 770a41f 78cab87 | 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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 | 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: 네, 주류 페어링 마스터는 사용자 피드백과 최신 트렌드를 반영하여 **지속적으로 업데이트**될 예정입니다.
새로운 안주, 주류, 페어링 조합이 계속 추가될 것이며, 더욱 정확하고 만족스러운 추천을 제공하기 위해 노력하겠습니다.
---
**주류 페어링 마스터와 함께 최고의 미식 경험을 즐겨보세요!** 🥂
""",
) |