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:  네, 주류 페어링 마스터는 사용자 피드백과 최신 트렌드를 반영하여 **지속적으로 업데이트**될 예정입니다.
        새로운 안주, 주류, 페어링 조합이 계속 추가될 것이며, 더욱 정확하고 만족스러운 추천을 제공하기 위해 노력하겠습니다.

    ---

    **주류 페어링 마스터와 함께 최고의 미식 경험을 즐겨보세요!** 🥂
    """,
)