|
import gradio as gr |
|
import pandas as pd |
|
import random |
|
import re |
|
from langchain.chat_models import ChatOpenAI |
|
from langchain.schema import AIMessage, HumanMessage, SystemMessage |
|
import os |
|
|
|
korean_word_data = pd.read_csv("korean_word_data.csv") |
|
llm = ChatOpenAI(temperature=1.0, model="gpt-3.5-turbo") |
|
|
|
|
|
def response(message, history): |
|
levels = ["์ด๊ธ", "์ค๊ธ", "์๊ธ"] |
|
print(history) |
|
|
|
|
|
if message in levels: |
|
level_int = levels.index(message) + 1 |
|
this_level_word = korean_word_data[korean_word_data["level"] == level_int] |
|
word_info = this_level_word.iloc[random.randint(0, len(this_level_word))] |
|
description = word_info["description"] |
|
word_type = word_info["type"] |
|
return f"""๐น๏ธ {message} ๋์ด๋๋ก ๊ฒ์์ ์์ํ ๊ฒ์ ๐น๏ธ |
|
|
|
์ค๋ช
ํ๋ ์ด ๋จ์ด๋ฅผ ๋ง์ถฐ๋ณด์ธ์. |
|
<{word_type}>[{description}]""" |
|
|
|
|
|
for user, bot in reversed(history): |
|
if "๋์ด๋๋ก ๊ฒ์์ ์์ํ ๊ฒ์ ๐น๏ธ" in bot: |
|
description_pattern = r"\[([^\]]*)\]" |
|
word_info = korean_word_data[ |
|
korean_word_data["description"] |
|
== re.search(description_pattern, bot).group(1) |
|
].iloc[0] |
|
level, word_type, word, description, example, word_len, choseong = ( |
|
word_info["level"], |
|
word_info["type"], |
|
word_info["word"], |
|
word_info["description"], |
|
word_info["example"], |
|
word_info["word_len"], |
|
word_info["choseong"], |
|
) |
|
prompt = f"""You are a chatbot conducting a Korean vocabulary matching game. The current word's information is as follows: |
|
Correct Word: {word}, Difficulty: {levels[level-1]}, Part of Speech: {word_type}, Meaning: [{description}], Example Sentence: [{example}], Word Length: {word_len}, Consonant: {choseong} |
|
The user's input message is [{message}]. If the user is playing the Korean vocabulary matching game, compare the correct word with the message. If they are similar, respond with an expression of near-miss. If not similar, send words of encouragement. |
|
If you think the content of the message is not related to the vocabulary matching game, respond appropriately to the situation. |
|
If the user seems to be struggling, inform them that there are hints available. |
|
Provide hints in this order: Example Sentence -> Word Length -> Consonant, and give only one hint at a time. |
|
|
|
What you must follow: |
|
1. Never say the correct word during a conversation. |
|
2. Do not give hints unless there is a direct request for them from the user. |
|
3. If the user answers correctly, ask them to enter the new difficulty level. |
|
4. Give all answers in Korean.""" |
|
|
|
history_langchain_format = [] |
|
history_langchain_format.append(SystemMessage(content=prompt)) |
|
for human, ai in history: |
|
history_langchain_format.append(HumanMessage(content=human)) |
|
history_langchain_format.append(AIMessage(content=ai)) |
|
history_langchain_format.append(HumanMessage(content=message)) |
|
|
|
gpt_response = llm(history_langchain_format) |
|
return gpt_response.content |
|
|
|
|
|
return "์ด๊ธ, ์ค๊ธ, ์๊ธ ์ค ๋ง์ถ ๋จ์ด์ ๋์ด๋๋ฅผ ๊ณจ๋ผ์ฃผ์ธ์. ๐" |
|
|
|
|
|
gr.ChatInterface( |
|
fn=response, |
|
textbox=gr.Textbox(container=False, scale=10), |
|
title="๐ฎ ํ๊ตญ์ด ์ดํ ๋ง์ถ๊ธฐ ๊ฒ์: Korean Learning Game ๐ฎ", |
|
description="์๋
ํ์ธ์! ์ด ๊ฒ์์ ๋์ด๋๋ ์ด๊ธ, ์ค๊ธ, ์๊ธ์ผ๋ก ์ฌ์ฉ์๊ฐ ์์ ๋กญ๊ฒ ๋์ด๋๋ฅผ ์ ํํ ์ ์์ต๋๋ค. ์์๋ฅผ ์ฐธ๊ณ ํ์ฌ ๋์ด๋๋ฅผ ์ ํํ๊ฒ ์
๋ ฅํด์ฃผ์ธ์. ๋์ด๋๋ฅผ ์
๋ ฅํ๋ฉด ๊ฒ์์ด ์์๋ฉ๋๋ค.", |
|
theme="soft", |
|
examples=[["์ด๊ธ"], ["์ค๊ธ"], ["์๊ธ"]], |
|
retry_btn="๋ค์๋ณด๋ด๊ธฐ โฉ", |
|
undo_btn="์ด์ ๋ํ ์ง์ฐ๊ธฐ", |
|
clear_btn="์ ์ฒด ๋ํ ์ง์ฐ๊ธฐ", |
|
).launch() |
|
|