Spaces:
Runtime error
Runtime error
Commit
·
f12197e
1
Parent(s):
792130a
썸네일/링크 및 공감 프롬프트 문구 개선
Browse files
app.py
CHANGED
@@ -218,14 +218,41 @@ def generate_khan_answer(query: str, search_results: List[Dict], client: OpenAI)
|
|
218 |
|
219 |
# Updated system prompt to instruct Markdown link usage
|
220 |
system_prompt = """너는 현실적인 조언을 잘하는 PM 멘토 Khan이다.
|
221 |
-
|
222 |
-
-
|
223 |
-
-
|
224 |
-
-
|
225 |
-
-
|
226 |
-
-
|
227 |
-
-
|
228 |
-
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
229 |
|
230 |
# Use triple quotes for the multi-line f-string
|
231 |
user_message = f"""사용자 질문: {query}
|
@@ -255,8 +282,8 @@ def generate_khan_answer(query: str, search_results: List[Dict], client: OpenAI)
|
|
255 |
st.set_page_config(page_title="Khan 멘토 (PM 영상 기반)", layout="wide")
|
256 |
st.markdown(
|
257 |
"""
|
258 |
-
<a href="https://
|
259 |
-
<img src="https://morethanair.com/wp-content/uploads/2025/04/
|
260 |
</a>
|
261 |
""",
|
262 |
unsafe_allow_html=True
|
@@ -304,6 +331,7 @@ if st.session_state['step'] == 2:
|
|
304 |
empathy_prompt = f"""
|
305 |
너는 따뜻하고 공감 능력이 뛰어난 상담가야.
|
306 |
아래 사용자의 상황을 듣고, 충분히 감정적으로 공감해주고, 용기를 북돋아주는 말을 해줘.
|
|
|
307 |
상황: "{st.session_state['user_state']}"
|
308 |
"""
|
309 |
try:
|
@@ -408,6 +436,20 @@ if st.session_state['step'] == 4:
|
|
408 |
except Exception as e:
|
409 |
logger.warning(f"st.video failed for non-YouTube URL {url}: {e}")
|
410 |
st.markdown("---")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
411 |
st.caption("Powered by Pinecone, Sentence Transformers, and OpenAI")
|
412 |
# 다시 처음으로 돌아가기 버튼
|
413 |
if st.button("다시 질문 흐름 시작하기"):
|
|
|
218 |
|
219 |
# Updated system prompt to instruct Markdown link usage
|
220 |
system_prompt = """너는 현실적인 조언을 잘하는 PM 멘토 Khan이다.
|
221 |
+
|
222 |
+
- 말투는 단호하지만 공감력이 있다. "~입니다." 또는 "~죠."와 같이 명확하게 끝맺는다. 존댓말을 사용한다.
|
223 |
+
- 완곡한 표현을 활용하며, 상대방의 감정을 함부로 단정 짓지 않는다. 예: "그럴 수 있습니다", "음, 그렇게 느낄 수 있죠" 등.
|
224 |
+
- 단순한 위로보다는 구조적이고 실용적인 제안을 우선한다. 질문자가 놓친 맥락이나 구조를 짚어주고, 다음 단계 또는 전략적 선택지를 제시한다.
|
225 |
+
- 질문이 막연하거나 추상적이면, 핵심을 좁혀 다시 되물어본다. 예: "그 상황에서 가장 답답했던 순간은 언제였나요?"와 같이 질문을 구체화한다.
|
226 |
+
- 긴 설명보다는 핵심을 빠르게 전달한다. 다만, 필요한 경우 짧은 비유나 예시로 직관적인 이해를 돕는다.
|
227 |
+
- 답변 중 관련 정보를 참조할 때는, 반드시 '타임스탬프 적용 URL'을 사용하여 다음과 같은 Markdown 링크 형식으로 제시해야 한다: `[영상 제목](타임스탬프_적용_URL)`. 예: "자세한 내용은 [비개발자가 연봉 2억을 받는 현실적인 방법](https://www.youtube.com/watch?v=VIDEO_ID&t=178s) 영상을 참고하시면 도움이 될 겁니다."
|
228 |
+
- 이전 대화 기록은 없으므로, 반복 질문이 들어올 경우에는 "이전에 유사한 내용을 찾아봤었죠. 다시 한번 살펴보면..."처럼 자연스럽게 이어간다.
|
229 |
+
- 답변은 반드시 한국어로 한다.
|
230 |
+
|
231 |
+
Khan은 전략적으로 사고하며, 본질과 방향을 중시한다.
|
232 |
+
단정적으로 단언하기보다는 "~일 수도 있습니다", "그렇게도 볼 수 있죠"와 같이 여지를 남긴다.
|
233 |
+
상대방이 스스로 선택지를 판단할 수 있도록 돕는 방향으로 조언한다.
|
234 |
+
|
235 |
+
예시처럼 말투와 사고 흐름을 유지해야 한다:
|
236 |
+
|
237 |
+
---
|
238 |
+
|
239 |
+
Q: 요즘 팀원과의 관계가 어려운데, 제가 뭘 놓치고 있는 걸까요?
|
240 |
+
|
241 |
+
A: 음, 그럴 수 있습니다. 관계가 어려울 때는 감정보다는 기대가 엇갈렸던 순간을 먼저 봐야 하죠.
|
242 |
+
그 팀원이 무언가를 기대했는데, 내가 그걸 놓쳤을 가능성이 있습니다.
|
243 |
+
혹시 최근에 서로 오해가 생긴 순간이 있었는지, 먼저 짚어보는 게 좋겠습니다.
|
244 |
+
|
245 |
+
---
|
246 |
+
|
247 |
+
Q: 회사를 옮기고 싶은데, 성과 없이 퇴사하면 안 좋을까요?
|
248 |
+
|
249 |
+
A: 단기적으로는 맞습니다. 성과 없이 퇴사하면 이력서에 남죠.
|
250 |
+
하지만 지금 상황에서 배울 게 없다면, 그 자체가 리스크이기도 합니다.
|
251 |
+
'내가 남아서 얻을 수 있는 게 무엇인가'와 '지금 나가서 시작할 수 있는 게 무엇인가'를 나란히 두고 비교해 보시죠.
|
252 |
+
|
253 |
+
---
|
254 |
+
|
255 |
+
이런 식의 말투와 흐름을 바탕으로 질문에 답변하세요."""
|
256 |
|
257 |
# Use triple quotes for the multi-line f-string
|
258 |
user_message = f"""사용자 질문: {query}
|
|
|
282 |
st.set_page_config(page_title="Khan 멘토 (PM 영상 기반)", layout="wide")
|
283 |
st.markdown(
|
284 |
"""
|
285 |
+
<a href="https://vo.la/eAKBGo" target="_blank">
|
286 |
+
<img src="https://morethanair.com/wp-content/uploads/2025/04/KakaoTalk_Photo_2025-04-20-23-47-37.png" style="width:70%; border-radius: 10px;" />
|
287 |
</a>
|
288 |
""",
|
289 |
unsafe_allow_html=True
|
|
|
331 |
empathy_prompt = f"""
|
332 |
너는 따뜻하고 공감 능력이 뛰어난 상담가야.
|
333 |
아래 사용자의 상황을 듣고, 충분히 감정적으로 공감해주고, 용기를 북돋아주는 말을 해줘.
|
334 |
+
부를 때는 '당신은', '당신이'처럼 친근한 말투로 부르고, 물음표는 사용하지 않아.
|
335 |
상황: "{st.session_state['user_state']}"
|
336 |
"""
|
337 |
try:
|
|
|
436 |
except Exception as e:
|
437 |
logger.warning(f"st.video failed for non-YouTube URL {url}: {e}")
|
438 |
st.markdown("---")
|
439 |
+
# --- 예시 질문 버튼/직접입력 다시 노출 (후속 질문) ---
|
440 |
+
st.markdown("#### 추가로 궁금한 점이 있으신가요? 아래 예시 질문을 클릭하거나 직접 입력해보세요!")
|
441 |
+
cols = st.columns(len(st.session_state['example_questions']))
|
442 |
+
for i, q in enumerate(st.session_state['example_questions']):
|
443 |
+
if cols[i].button(q, key=f"followup_{i}"):
|
444 |
+
st.session_state['selected_question'] = q
|
445 |
+
st.session_state['step'] = 4
|
446 |
+
st.rerun()
|
447 |
+
user_q = st.text_input("직접 궁금한 점을 입력해도 좋아요! (후속 질문)", value="", key="followup_input")
|
448 |
+
if st.button("Khan 멘토에게 추가 질문하기", key="followup_btn"):
|
449 |
+
st.session_state['selected_question'] = user_q
|
450 |
+
st.session_state['step'] = 4
|
451 |
+
st.rerun()
|
452 |
+
st.markdown("---")
|
453 |
st.caption("Powered by Pinecone, Sentence Transformers, and OpenAI")
|
454 |
# 다시 처음으로 돌아가기 버튼
|
455 |
if st.button("다시 질문 흐름 시작하기"):
|