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()