Spaces:
Sleeping
Sleeping
import gradio as gr | |
from huggingface_hub import InferenceClient | |
# Function to create an Inference Client based on selected model | |
def create_inference_client(model_name): | |
return InferenceClient(model_name) | |
# Function to generate a response | |
def respond( | |
question, | |
answer, | |
system_message, | |
model, | |
max_tokens, | |
temperature, | |
top_p, | |
): | |
# Create InferenceClient based on model selection | |
client = create_inference_client(model) | |
prompt = f"{system_message}[Question]\n{question}\n\n[μ΄μμ€ν΄νΈ λ΅λ³μ μμ]\n{answer}\n[μ΄μμ€ν΄νΈ λ΅λ³μ λ]" | |
messages = [{"role": "system", "content": ""}] | |
messages.append({"role": "user", "content": prompt}) | |
response = "" | |
for message in client.chat_completion( | |
messages, | |
max_tokens=max_tokens, | |
stream=True, | |
temperature=temperature, | |
top_p=top_p, | |
): | |
token = message.choices[0].delta.content | |
response += token | |
print(response) | |
yield response | |
def main(): | |
description_text1 = """<span style="font-size: 23px;">The keval model is an advanced evaluation model specifically designed to assess Korean language models using the LLM-as-a-judge approach. Unlike traditional evaluation methods that relied on ChatGPT, keval provides an independent and specialized alternative for evaluating Korean LLMs.</span></br> | |
<span style="font-size: 23px;">keval is based on the Gemma2-9B architecture and has been further optimized using Supervised Fine-Tuning (SFT) and Direct Policy Optimization (DPO). The model is trained on the newly developed Ko-Bench dataset, which is inspired by MT-Bench but adapted to capture Korean linguistic nuances more effectively.</span> </br></br> | |
""" | |
description_text2 = """<span style="font-size: 23px;">keval is trained and evaluated using the Ko-Bench dataset, a custom-built benchmark inspired by MT-Bench but specifically tailored for assessing Korean language models. The dataset includes diverse tasks covering a wide range of user scenarios, allowing for a thorough evaluation of: Multi-turn conversation ability, Instruction adherence, Contextual understanding.</span></br></br> | |
""" | |
description_text3 = """<span style="font-size: 23px;">keval currently has the following versions available β keval-2-1b, keval-2-3b.</span></br></br> | |
""" | |
examples_list = [["μ΅κ·Ό μ μ£Όλ μ¬νμ λ€λ μ€λ©΄μ κΌ κ°λ΄μΌ ν λͺ μλ₯Ό κ°μ‘°νλ μ¬λ―Έμλ μ¬ν λΈλ‘κ·Έ κΈμ μμ±νμμ€.","## μ μ£Όλ? μ€λλΆν° \"μ μ£Όλ ννκ°\"λ‘ μ°νλ λ²! ποΈπ₯\n\nμ μ£Όλ, κ·Έ μ체λ‘λ λ©μ§ μ΄λ¦μ΄μ£ ? λ°λ€κ° κ·Έλ €λΈ μ¬, νλμ΄ λΉμ΄λΈ μμ°, κ·Έλ¦¬κ³ μΈκ°μ μκΈΈμ΄ λ§λ 맀λ ₯κΉμ§! μ μ£Ό ννκ°κ° λκΈ° μν΄ κΌ κ°λ΄μΌ ν λͺ μλ€, λκ° μμκΉμ? μ¬κΈ° λ±ν μ‘μ±μ²λΌ κΈ°λλλ μκ°μ΄ μμ§ μλμ? κ·Έ μκ°μ λ§λλ κ³³λ€μ΄ λ°λ‘ μ΄κ³³μ΄λΌλ©΄, λκ° λ€μλ 보μΈμ!\n\n**1. μ λͺ ν κ³³λ, μ¨κ²¨μ§ 보μλ ννν΄λ΄μΌμ§!**\n\nμ μ£Όλμμ λΉ μ§ μ μλ λͺ μμ£ . νλΌμ°μ μ λΉν μμ° μμ μ¨κ²¨μ§ μ²κΈΈμ κ±ΈμΌλ©°, λ°λ€ λλ¨Έμ νΈλ₯Έ λμ μΏλ³Ό μ μλ νλΌμ° λ±λ°μ μμ§ λͺ»ν κ²½νμ μ μ¬ν κ±°μμ. νμ§λ§ μ΄κ³³μ 맀λ ₯μ κ·Έ μμ²΄λ‘ λλμ§ μμμ. μ¨κ²¨μ§ 보μ κ°μ κ³³λ€μ μ°Ύμλ΄λ κ²μ΄ μ μ£Ό ννκ°μ μ¬λ―Έμ£ ! μλ₯Ό λ€μ΄, μ€λ¦ μ€μ¬λΆμ μ리 μ‘μ μ²μΉμμ λ°λ€κ° λΉμ΄λΈ μμ μνμ²λΌ μ λΉλ‘κ³ , μ§λ¦¬μ° μ£Όλ³μ μ λ―Όμλ§μμ μκ°μ΄ λ©μΆ λ―ν μκ°μ μ μ¬ν κ±°μμ.\n\n**2. λ§μλ μμλ ννμ μΌνμ΄μ§!**\n\nμ μ£Όλμ λ§μ ννκ°μ νμ λΆλμμ£Όμ£ ! μ±μ±ν ν΄μ°λ¬Όλ‘ λ§λ νμ λ©κ², κ·Έλ¦¬κ³ λ§μλ νμκ³Ό ν¨κ», μ μ£Όλμ νΉμμ λ΄μ μμλ€μ λ§λ³΄μΈμ. νΉν, νλΌμ° κ·Όμ²μ μ¨κ²¨μ§ νμλΉμμλ λ§μ§λ€μ΄ λͺ¨μ¬ μμ΄μ. μ΄κ³³μμ μ»λ λ§μ μ¦κ±°μμ ννμ νΌλ‘λ₯Ό μ»μ΄λ΄λ μ΅κ³ μ 보μμ΄ λ κ±°μμ.\n\n**3. μμ°κ³Ό ν¨κ»νλ μ‘ν°λΉν°λ νμ!**\n\nμ μ£Όλμ μμ°μ ννκ°λ₯Ό μν 무νν λμ΄ν°μ£ ! μν, μ€λ Έν΄λ§, νμ΄νΉ λ± λ€μν μ‘ν°λΉν°λ₯Ό ν΅ν΄ μμ°κ³Όμ κ΅κ°μ κ²½νν΄λ³΄μΈμ. μλ₯Ό λ€μ΄, μ μ£Ό ν΄μμ μ λ°λΌ λ¬λ¦¬λ λ°λ€ μ μμ κ±° νκΈ°λ, μ¨κ²¨μ§ ν΄λ³μμμ μΊ νμ μμ§ λͺ»ν μΆμ΅μ μ μ¬ν κ±°μμ.\n\n**4. μ μ£Όλ§μ λ¬Ένμ μμ λ ννν΄λ³΄μΈμ!**\n\nμ μ£Όλλ λ¨μν μμ°μ μλ¦λ€μλ§μ΄ μλ, λ νΉν λ¬Ένμ μμ λ‘λ μ λͺ ν΄μ. μλ₯Ό λ€μ΄, μ μ£Ό λ―Όμμ΄μ΄λ μ€λ¦ λ°λ¬Όκ΄μ μ μ£Όμ μμ¬μ λ¬Ένλ₯Ό μΏλ³Ό μ μλ κ³³μ΄λ©°, μ μ£Ό νΉμ μ 곡μνμ ꡬ경νλ©° μ¦κ±°μ΄ μκ°μ λ³΄λΌ μ μμ΄μ.\n\nμ΄μ μ μ£Όλ ννκ°κ° λλ μ€λΉκ° λλ¬μΌλ, λ λ 보μΈμ! μ μ£Όλμ 맀λ ₯μ λλΌλ©°, μμ λ§μ νΉλ³ν μ¬ν μ΄μΌκΈ°λ₯Ό λ§λ€μ΄λ³΄μΈμ. κ·Έλ¦¬κ³ μμ§ λ§μΈμ, μ μ£Όλ λΉμ μ΄ λ€μ νλ² λμμ¬ λ§ν κ³³μ΄λΌλ μ¬μ€μ! π",None, None, None, None, None], | |
["μ§λ―Όμ λ§€μ° κ±΄κ°νμ§λ§ λ§€μΌ λ³μμ κ°μΌ ν©λλ€. μ΄μ λ 무μμ λκΉ?","μ§λ―Όμ΄ λ§€μΌ λ³μμ κ°μΌ νλ μ΄μ λ 무μμΈμ§ μ νν μ μ μμ΅λλ€. κ±΄κ° μνμ λν μμΈν μ λ³΄κ° νμν©λλ€. μΌλ°μ μΌλ‘ λ§€μΌ λ³μμ κ°μΌ νλ κ²½μ°λ λ€μκ³Ό κ°μ΅λλ€.\n\n1. μ¬κ°ν μ§λ³μ΄λ λΆμμ μ μ κ²½μ°: μ€νμμ€μ΄λ μ§μ€ μΉλ£κ° νμν κ²½μ° λ§€μΌ μλ£μ§μ κ΄μ°°κ³Ό μΉλ£κ° νμν μ μμ΅λλ€.\n\n2. λ§μ± μ§νμ μκ³ μλ κ²½μ°: λΉλ¨λ³, κ³ νμ, μ¬μ₯ μ§ν λ± μ§μμ μΈ κ΄λ¦¬κ° νμν λ§μ± μ§νμ μκ³ μλ€λ©΄ μ κΈ°μ μΈ κ²μ§κ³Ό μΉλ£λ₯Ό μν΄ λ§€μΌ λ³μμ κ° μ μμ΅λλ€.\n\n3. μ¬ν μΉλ£κ° νμν κ²½μ°: μ¬κ³ λ μμ ν μ¬ν μΉλ£κ° νμν κ²½μ°, 물리 μΉλ£λ μμ μΉλ£λ₯Ό μν΄ λ§€μΌ λ³μμ λ°©λ¬Έν μ μμ΅λλ€.\n\n4. μμ°λΆμ κ²½μ°: μμ μ€κΈ°λ νκΈ°μλ νμμ μ°λͺ¨μ κ±΄κ° μνλ₯Ό νμΈνκΈ° μν΄ μ κΈ°μ μΌλ‘ λ³μμ λ°©λ¬Ένλ κ²μ΄ μΌλ°μ μ λλ€.\n\n5. μ μ κ³Όμ μΉλ£κ° νμν κ²½μ°: μ°μΈμ¦, λΆμ μ₯μ , μΈμ ν μ€νΈλ μ€ μ₯μ λ± μ μ κ±΄κ° λ¬Έμ λ‘ μΈν΄ λ§€μΌ λ³μμ λ°©λ¬Ένμ¬ μλ΄μ΄λ μΉλ£λ₯Ό λ°μ μ μμ΅λλ€.\n\nμ§λ―Όμ κ²½μ°, κ±΄κ° μνμ λν μΆκ°μ μΈ μ λ³΄κ° νμν©λλ€. λ§€μΌ λ³μμ κ°μΌ νλ μ΄μ λ₯Ό μ νν νμ νκΈ° μν΄, λ΄λΉ μμ¬λ μλ£μ§κ³Ό μμνλ κ²μ΄ μ’μ΅λλ€.",None, None, None, None, None], | |
["λ€μμ λ μ λ ₯ λ¬Έμμ΄μ κ°μ₯ κΈ΄ κ³΅ν΅ λΆλΆ μμ΄μ κΈΈμ΄λ₯Ό μ°Ύλ Python ν¨μμ λλ€. μ΄ ν¨μμμ λ²κ·Έλ₯Ό μλ³ν μ μλμ?\n\n```\ndef longest_common_subsequence_length(str1, str2):\n m = len(str1)\n n = len(str2)\n\n dp = [[0] * (n + 1) for _ in range(m + 1)]\n\n for i in range(1, m + 1):\n for j in range(1, n + 1):\n if str1[i - 1] == str2[j - 1]:\n dp[i][j] = dp[i - 1][j - 1] + 1\n else:\n dp[i][j] = max(dp[i - 1][j], dp[i][j - 1])\n\n return dp[m][n]\n```", "μ 곡λ μ½λμλ λͺ λ°±ν λ²κ·Έλ μμ΄ λ³΄μ λλ€. μ΄ ν¨μλ λ λ¬Έμμ΄μ κ°μ₯ κΈ΄ κ³΅ν΅ λΆλΆ μμ΄(LCS)μ κΈΈμ΄λ₯Ό μ¬λ°λ₯΄κ² κ³μ°ν©λλ€. λ€μκ³Ό κ°μ μ£Όμ λ¨κ³λ₯Ό λ°λ¦ λλ€:\n\n1. λ λ¬Έμμ΄μ κΈΈμ΄μ κΈ°λ°νμ¬ 2D DP ν μ΄λΈμ μ΄κΈ°νν©λλ€.\n2. λ λ¬Έμμ΄μ μννλ©΄μ DP ν μ΄λΈμ μ±μλλ€.\n3. λ¬Έμκ° μΌμΉνλ©΄ λκ°μ μΌμͺ½ μ κ°μ 1μ λν©λλ€.\n4. λ¬Έμκ° μΌμΉνμ§ μμΌλ©΄ μΌμͺ½κ³Ό μμͺ½ κ° μ€ μ΅λκ°μ μ νν©λλ€.\n5. λ§μ§λ§μΌλ‘ DP ν μ΄λΈμ μ€λ₯Έμͺ½ νλ¨ κ°μ λ°νν©λλ€.\n\nμ΄ μκ³ λ¦¬μ¦μ μ ννκ³ ν¨μ¨μ μ λλ€. μκ° λ³΅μ‘λλ O(m*n)μ΄κ³ κ³΅κ° λ³΅μ‘λλ O(m*n)μ λλ€.\n\nλ€λ§, μ½λμ κ°λ μ±κ³Ό ν¨μ¨μ±μ λμ΄κΈ° μν΄ λ€μκ³Ό κ°μ κ°μ μ¬νμ μ μν μ μμ΅λλ€:\n\n1. λ³μλͺ μ λ λͺ ννκ² μ§μ ν μ μμ΅λλ€ (μ: `m`μ `len_str1`λ‘, `n`μ `len_str2`λ‘).\n2. μ£Όμμ μΆκ°νμ¬ μκ³ λ¦¬μ¦μ κ° λ¨κ³λ₯Ό μ€λͺ ν μ μμ΅λλ€.\n3. κ³΅κ° ν¨μ¨μ±μ μν΄ 2D λ°°μ΄ λμ 1D λ°°μ΄μ μ¬μ©ν μ μμ΅λλ€ (μ΄λ λ 볡μ‘ν ꡬνμ΄ νμν©λλ€).\n\nνμ§λ§ νμ¬ μ½λλ λ¬Έμ μμ΄ μλνλ©° LCSμ κΈΈμ΄λ₯Ό μ νν κ³μ°ν©λλ€.", None, None, None, None, None] | |
] | |
with gr.Blocks() as app: | |
gr.Markdown("# π€ Evaluating LLM Responses with keval") | |
gr.Markdown("") | |
gr.Markdown("## | [Model](https://huggingface.co/collections/davidkim205/keval-2-67ac5400f5eef4984cc5dbbb) | [Paper](https://davidkim205.github.io/keval.html) | [Code](https://github.com/davidkim205/simple-keval) |") | |
gr.Markdown("") | |
gr.Markdown("## What Is keval?") | |
gr.Markdown(description_text1) | |
gr.Markdown("## Benchmark and Dataset for keval") | |
gr.Markdown(description_text2) | |
gr.Markdown("## Available keval Models") | |
gr.Markdown(description_text3) | |
gr.HTML("""<style> | |
#submit-btn { | |
background-color: #FF7F00; | |
color: white; | |
border: none; | |
padding: 10px 20px; | |
font-size: 16px; | |
cursor: pointer; | |
} | |
#submit-btn:hover { | |
background-color: #DA8A67; | |
} | |
</style> | |
""") | |
gr.Markdown("## π±οΈ Try it out!") | |
with gr.Row(): | |
with gr.Column(scale=1): | |
text1 = gr.Textbox(label="Question", value="μ΄ λν μ λ°μ κ±Έμ³ μμ΄μΈλ§¨μ ν λ μ€νν¬ νλ₯΄μλλ₯Ό ꡬνν΄ λ³΄μΈμ. \"μμ΄μΈλ§¨μΌλ‘μ\"μ κ°μ λ¬Έκ΅¬λ‘ μμνμ§ λ§μΈμ. 첫 λ²μ§Έ μ§λ¬Έμ λ€μκ³Ό κ°μ΅λλ€. μμ΄μΈλ§¨μ΄ λμ΄ κ°μ₯ μ’μ λΆλΆμ 무μμ λκΉ?") | |
text2 = gr.Textbox(label="Answer", value="μλ νμΈμ, μμ΄μΈλ§¨μ΄ λμ΄ κ°μ₯ μ’μ λΆλΆμ λ¬Όμ΄λ³΄μ ¨λ€μ. μ μκ°μλ μ΅μ²¨λ¨ κΈ°μ λ‘ λ¬΄μ₯ν μνΈλ₯Ό μ κ³ νλμ λ μλ€λλ©° μΈμμ ꡬνλ κ²μ΄ κ°μ₯ μ§λ¦Ώνκ³ λ³΄λμ°¬ μΌμΈ κ² κ°μμ. μ μ¬λ₯κ³Ό λ₯λ ₯μ μλΆ λ°νν΄ μ λΉλ€κ³Ό μΈμ°κ³ μ μλ₯Ό μ€ννλ κ²λ§νΌ λ©μ§ μΌλ μμ£ .\n\nλ¬Όλ‘ μνΈ μμ΄λ μ²μ¬μ μΈ λλμ 카리μ€λ§λ‘ μΈμμ κΈμ μ μΈ μν₯λ ₯μ λ―ΈμΉλ κ²λ ν° μ₯μ μ΄μμ. μ€νν¬ μΈλμ€νΈλ¦¬λ₯Ό μ΄λλ©° νμ μ μΈ κΈ°μ μ κ°λ°νκ³ , μ΄λ²€μ Έμ€μ 리λλ‘μ νμ μ μ΄λλ κ²λ μλΆμ¬μ λλΌλ λΆλΆμ΄μ£ .\n\nλ, λͺ μ±, μΈκΈ°λ μμ§λ§ 무μλ³΄λ€ μ λ₯λ ₯μΌλ‘ μ¬λλ€μ λκ³ μΈμμ λ λμ κ³³μΌλ‘ λ§λλ κ²μ΄ κ°μ₯ ν° λ³΄λμ΄μμ. μμ΄μΈλ§¨μΌλ‘μ λλΌλ μλΆμ¬κ³Ό μΆμ μλ―Έλ₯Ό ν¨κ» λλ μ μμ΄ κΈ°μλ€μ.") | |
text3 = gr.Textbox(label="System message", value="[μ§μ]\n 곡μ ν μ¬νμΌλ‘μ μλμ νμλ μ¬μ©μ μ§λ¬Έμ λν AI μ΄μμ€ν΄νΈμ μλ΅ νμ§μ νκ°ν΄μ£ΌμΈμ. μ§λ¬Έκ³Ό λλ΅μ μΈμ΄κ° λμΌνμ§ μμΌλ©΄ 무쑰건 0μ μ λλ€. νκ°μμλ μλ΅μ μ μ©μ±, κ΄λ ¨μ±, μ νμ±, κΉμ΄, μ°½μμ±, μμΈν¨ λ±μ μμλ₯Ό κ³ λ €ν΄μΌ ν©λλ€. νκ°λ₯Ό μμνκΈ° μ μ 짧μ μ€λͺ μ μ 곡νμΈμ. κ°λ₯ν ν κ°κ΄μ μΌλ‘ νκ°νμΈμ. μ€λͺ μ μ 곡ν ν λ€μ νμμ μ격ν λ°λΌ 1μμ 10μ μ¬μ΄λ‘ νκ°ν΄μΌ ν©λλ€: \"[[rating]]\", μλ₯Ό λ€μ΄: \"Rating: [[5]]\".\n\n") | |
dropdown = gr.Dropdown(choices=["davidkim205/keval-2-1b", "davidkim205/keval-2-3b"], value="davidkim205/keval-2-1b", label="Model Selection") | |
slider1 = gr.Slider(label="Max new tokens", minimum=1, maximum=2048, value=1024, step=1) | |
slider2 = gr.Slider(label="Temperature", minimum=0.1, maximum=4.0, value=1.0, step=0.1) | |
slider3 = gr.Slider(label="Top-p (nucleus sampling)", minimum=0.1, maximum=1.0, value=0.95, step=0.05) | |
submit = gr.Button("Submit", elem_id="submit-btn") | |
with gr.Column(scale=1): | |
output = gr.Textbox(label="Output") | |
gr.Markdown("") | |
gr.Markdown("## Examples") | |
gr.Examples(label="Input Example", | |
examples=examples_list, | |
inputs=[text1, text2, text3, dropdown, slider1, slider2, slider3]) | |
submit.click( | |
fn=respond, | |
inputs=[text1, text2, text3, dropdown, slider1, slider2, slider3], | |
outputs=output | |
) | |
app.launch() | |
if __name__ == "__main__": | |
main() | |