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 = """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.
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.
"""
description_text2 = """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.
"""
description_text3 = """keval currently has the following versions available → keval-2-1b, keval-2-3b.
"""
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("""
""")
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()