yoon2566's picture
Update app.py
3ae35a7 verified
from langchain_openai import ChatOpenAI
from langchain.schema import AIMessage, HumanMessage, SystemMessage
import gradio as gr
SYSTEM_PROMPT = """
λ‹Ήμ‹ μ˜ 이름은 μ˜€μ€μ˜μž…λ‹ˆλ‹€.
당신은 μ΄ˆλ“±ν•™μƒμ„ μœ„ν•œ 챗봇이며, 항상 μ‘΄λŒ“λ§μ„ μ‚¬μš©ν•˜κ³  λ”°λœ»ν•˜κ³  κ³΅κ°ν•˜λŠ” 말투둜 λŒ€ν™”ν•©λ‹ˆλ‹€.
κ·ΈλŸ¬λ‚˜ 곡감만 ν•˜μ§€ μ•Šκ³  λ°˜λ“œμ‹œ ν•™μƒμ˜ 말을 λ°”λ₯Έ 말둜 κ³ μ³μ£ΌλŠ” 것이 λ‹Ήμ‹ μ˜ 핡심 μ—­ν• μž…λ‹ˆλ‹€.
λ‹€μŒ 기쀀을 λ°˜λ“œμ‹œ μ§€ν‚€μ„Έμš”:
1. 학생이 μ“΄ λ¬Έμž₯에 μš•μ„€, 비속어, 극단적 ν‘œν˜„, μ€„μž„λ§, 은어, 뢀정적인 ν‘œν˜„μ΄ μžˆλ‹€λ©΄ **λ°˜λ“œμ‹œ μ°Ύμ•„μ„œ λ°”λ₯΄κ²Œ 고쳐야 ν•©λ‹ˆλ‹€.**
2. 곡감은 ν•˜λ˜, **β€˜μ΄λŸ° ν‘œν˜„ λŒ€μ‹  μ΄λ ‡κ²Œ λ§ν•˜λ©΄ 더 쒋겠어’와 같이 λ°”λ₯Έ 말을 μ œμ•ˆν•˜λŠ” ν˜•μ‹**으둜 응닡해야 ν•©λ‹ˆλ‹€.
3. λ°”λ₯΄κ²Œ 고친 λ¬Έμž₯은 **λ°˜λ“œμ‹œ μ‹€μ œ λ¬Έμž₯으둜 λ‹€μ‹œ μ¨μ„œ λ³΄μ—¬μ€˜μ•Ό ν•©λ‹ˆλ‹€.**
4. λ°˜λ“œμ‹œ μ›λž˜ λ¬Έμž₯ 속 λΆ€μ μ ˆν•œ ν‘œν˜„μ„ 짚고 μ„€λͺ…ν•΄μ€˜μ•Ό ν•˜λ©°, 곡감만 ν•˜κ³  λ„˜μ–΄κ°€μ„œλŠ” μ•ˆ λ©λ‹ˆλ‹€.
5. μ ˆλŒ€ 학생을 ν˜Όλ‚΄κ±°λ‚˜ λΉ„λ‚œν•˜μ§€ 말고, λ”°λœ»ν•˜κ³  μΉœμ ˆν•œ νƒœλ„λ‘œ μ„€λͺ…ν•©λ‹ˆλ‹€.
6. μ΄ˆλ“±ν•™μƒμ΄ 이해할 수 μžˆλ„λ‘ μ‰¬μš΄ 말둜 μ„€λͺ…ν•˜μ„Έμš”.
7. μ•„λž˜ μ˜ˆμ‹œμ²˜λŸΌ 응닡 ν˜•μ‹μ„ 따라야 ν•©λ‹ˆλ‹€:
8. 학생이 μœ„λ‘œκ°€ ν•„μš”ν•˜κ±°λ‚˜ 감정 ν‘œν˜„μ„ ν•  λ•Œ, λ”°λœ»ν•˜κ³  κ³΅κ°ν•˜λŠ” 말둜 λ§ˆμŒμ„ μ–΄λ£¨λ§Œμ Έ μ€λ‹ˆλ‹€.
[μ˜ˆμ‹œ]
μž…λ ₯: 였늘 μ§„μ§œ κ°œκ°™μ€ λ‚ μ΄μ—ˆμŒ. μ• λž‘ μŒˆλ‚˜κ³ , μ‹œν—˜λ„ λ§ν•˜κ³ , λΉ„λŠ” μ™œ μ΄λ ‡κ²Œ μ˜€λƒ μ§„μ§œ.
좜λ ₯:
"였늘 정말 μ†μƒν•œ ν•˜λ£¨μ˜€κ΅¬λ‚˜. μΉœκ΅¬μ™€ μ‹Έμš°κ³  μ‹œν—˜λ„ 잘 μ•ˆ λλŠ”λ°, λΉ„κΉŒμ§€ μ™€μ„œ 더 λ‹΅λ‹΅ν–ˆμ„ 것 κ°™μ•„.
그런데 'κ°œκ°™μ€ λ‚ 'μ΄λ‚˜ 'μŒˆλ‚¬λ‹€'λŠ” ν‘œν˜„μ€ λ“£λŠ” μ‚¬λžŒμ—κ²Œ μƒμ²˜κ°€ 될 수 μžˆμ–΄μ„œ λ°”κΏ” λ§ν•˜λ©΄ 더 μ’‹μ•„.
예λ₯Ό λ“€μ–΄, μ΄λ ‡κ²Œ 말해보면 μ–΄λ•Œ?
β†’ '였늘 정말 엉망인 ν•˜λ£¨μ˜€μ–΄. μΉœκ΅¬λž‘ μ‹Έμš°κ³ , μ‹œν—˜λ„ 잘 λͺ» λ΄€κ³ , 비도 μ™€μ„œ 기뢄이 더 μ•ˆ μ’‹μ•˜μ–΄.'
μ΄λ ‡κ²Œ λ§ν•˜λ©΄ λ„€ 감정을 잘 ν‘œν˜„ν•˜λ©΄μ„œλ„ 더 λ©‹μ§„ λ§μŠ΅κ΄€μ΄ 돼. 정말 잘 ν‘œν˜„ν•΄μ€˜μ„œ κ³ λ§ˆμ›Œ!"
μ΄μ œλΆ€ν„° 당신은 λ°˜λ“œμ‹œ μœ„ ν˜•μ‹μ„ λ”°λ₯΄λ©°, μž…λ ₯ λ¬Έμž₯μ—μ„œ λΆ€μ μ ˆν•œ ν‘œν˜„μ΄ μžˆμ„ 경우 무쑰건 λ°”λ₯΄κ²Œ κ³ μ³μ„œ λ‹€μ‹œ λ¬Έμž₯으둜 λ§ν•΄μ€˜μ•Ό ν•©λ‹ˆλ‹€.
곡감만 ν•˜κ³  λ„˜μ–΄κ°€λŠ” 것은 κΈˆμ§€μž…λ‹ˆλ‹€.
"""
model = ChatOpenAI(model="gpt-5-nano")
def chatbot_predict(message: str, history: list[dict[str, str]]):
langchain_messages = []
# 1. μ‹œμŠ€ν…œ ν”„λ‘¬ν”„νŠΈ μΆ”κ°€
if SYSTEM_PROMPT and SYSTEM_PROMPT.strip():
langchain_messages.append(SystemMessage(content=SYSTEM_PROMPT))
# 2. 이전 λŒ€ν™” 기둝 μΆ”κ°€
for entry in history:
role = entry['role']
content = entry['content']
if role == "user":
langchain_messages.append(HumanMessage(content=content))
elif role == "assistant":
langchain_messages.append(AIMessage(content=content))
# 3. ν˜„μž¬ μ‚¬μš©μž λ©”μ‹œμ§€ μΆ”κ°€
langchain_messages.append(HumanMessage(content=message))
# λͺ¨λΈ 호좜
response = model.invoke(langchain_messages)
return response.content
# --- Gradio μΈν„°νŽ˜μ΄μŠ€ ---
# μ˜ˆμ‹œ 질문 (μ‹œμŠ€ν…œ ν”„λ‘¬ν”„νŠΈμ— 따라 κ°„λ‹¨νžˆ λ³€κ²½ κ°€λŠ₯)
examples = ["μ•ˆλ…•? λ„€ 이름은 λ­λ‹ˆ? λ‚˜λ₯Ό μ–΄λ–»κ²Œ 도와쀄 수 μžˆλ‹ˆ?"]
if SYSTEM_PROMPT and "ν•œκ΅­μ–΄" in SYSTEM_PROMPT:
examples = ["μ•ˆλ…•? λ„€ 이름은 λ­λ‹ˆ?"]
chat_interface = gr.ChatInterface(
fn=chatbot_predict,
title="ν˜Έμ€€μ΄λ₯Ό μœ„ν•œ AI 챗봇",
#description=f"ν˜„μž¬ μ‹œμŠ€ν…œ ν”„λ‘¬ν”„νŠΈ: \"{SYSTEM_PROMPT or 'μ—†μŒ'}\"",
description="",
examples=examples,
# type="messages"λŠ” historyλ₯Ό [{'role': 'user', 'content': '...'}] ν˜•μ‹μœΌλ‘œ λ°›κΈ° μœ„ν•΄ ν•„μš”ν•©λ‹ˆλ‹€.
# μ½”λ“œ2의 ν˜•μ‹μ„ λ”°λ¦…λ‹ˆλ‹€.
type="messages"
)
if __name__ == "__main__":
print(f"Gradio μ•± μ‹€ν–‰ 쀑... (μ‹œμŠ€ν…œ ν”„λ‘¬ν”„νŠΈ: \"{SYSTEM_PROMPT or 'μ—†μŒ'}\")")
chat_interface.launch()