LLMpromt-test / app.py
SUHHHH's picture
Update app.py
0fc9dd5 verified
import gradio as gr
import pandas as pd
from transformers import pipeline
from huggingface_hub import InferenceClient
import os
import random
import logging
import openai # OpenAI API๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€
# ๋กœ๊น… ์„ค์ •
logging.basicConfig(filename='language_model_playground.log', level=logging.DEBUG,
format='%(asctime)s - %(levelname)s - %(message)s')
# ๋ชจ๋ธ ๋ชฉ๋ก
MODELS = {
"Zephyr 7B Beta": "HuggingFaceH4/zephyr-7b-beta",
"DeepSeek Coder V2": "deepseek-ai/DeepSeek-Coder-V2-Instruct",
"Meta Llama 3.1 8B": "meta-llama/Meta-Llama-3.1-8B-Instruct",
"Meta-Llama 3.1 70B-Instruct": "meta-llama/Meta-Llama-3.1-70B-Instruct",
"Microsoft": "microsoft/Phi-3-mini-4k-instruct",
"Mixtral 8x7B": "mistralai/Mistral-7B-Instruct-v0.3",
"Mixtral Nous-Hermes": "NousResearch/Nous-Hermes-2-Mixtral-8x7B-DPO",
"Cohere Command R+": "CohereForAI/c4ai-command-r-plus",
"Aya-23-35B": "CohereForAI/aya-23-35B",
"GPT-4o Mini": "gpt-4o-mini" # GPT-4o Mini ๋ชจ๋ธ ์ถ”๊ฐ€
}
# HuggingFace ํ† ํฐ ์„ค์ •
hf_token = os.getenv("HF_TOKEN")
if not hf_token:
raise ValueError("HF_TOKEN ํ™˜๊ฒฝ ๋ณ€์ˆ˜๊ฐ€ ์„ค์ •๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.")
# OpenAI API ํด๋ผ์ด์–ธํŠธ ์„ค์ •
openai.api_key = os.getenv("OPENAI_API_KEY")
def call_hf_api(prompt, reference_text, max_tokens, temperature, top_p, model):
if model == "gpt-4o-mini":
return call_openai_api(prompt, max_tokens, temperature, top_p)
client = InferenceClient(model=model, token=hf_token)
combined_prompt = f"{prompt}\n\n์ฐธ๊ณ  ํ…์ŠคํŠธ:\n{reference_text}"
random_seed = random.randint(0, 1000000)
try:
response = client.text_generation(
combined_prompt,
max_new_tokens=max_tokens,
temperature=temperature,
top_p=top_p,
seed=random_seed
)
return response
except Exception as e:
logging.error(f"HuggingFace API ํ˜ธ์ถœ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}")
return f"์‘๋‹ต ์ƒ์„ฑ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}. ๋‚˜์ค‘์— ๋‹ค์‹œ ์‹œ๋„ํ•ด ์ฃผ์„ธ์š”."
def call_openai_api(prompt, max_tokens, temperature, top_p):
try:
response = openai.ChatCompletion.create(
model="gpt-4o-mini",
messages=[
{"role": "user", "content": prompt},
],
max_tokens=max_tokens,
temperature=temperature,
top_p=top_p,
)
return response.choices[0].message['content']
except Exception as e:
logging.error(f"OpenAI API ํ˜ธ์ถœ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}")
return f"OpenAI ์‘๋‹ต ์ƒ์„ฑ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}. ๋‚˜์ค‘์— ๋‹ค์‹œ ์‹œ๋„ํ•ด ์ฃผ์„ธ์š”."
def generate_response(prompt, reference_text, max_tokens, temperature, top_p, model):
response = call_hf_api(prompt, reference_text, max_tokens, temperature, top_p, MODELS[model])
response_html = f"""
<h3>์ƒ์„ฑ๋œ ์‘๋‹ต:</h3>
<div style='max-height: 500px; overflow-y: auto; white-space: pre-wrap; word-wrap: break-word;'>
{response}
</div>
"""
return response_html
# ๋ฆฌ๋ทฐ ํŒŒ์ผ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜
def process_reviews(file):
df = pd.read_excel(file.name)
if 'review' not in df.columns:
return "๋ฆฌ๋ทฐ ํŒŒ์ผ์— 'review' ์—ด์ด ์—†์Šต๋‹ˆ๋‹ค. ์˜ฌ๋ฐ”๋ฅธ ํŒŒ์ผ์„ ์—…๋กœ๋“œํ•˜์„ธ์š”."
sentiment_analyzer = pipeline("sentiment-analysis")
reviews = df['review'].tolist()
# ๊ฐ์„ฑ ๋ถ„์„ ์ˆ˜ํ–‰
sentiments = sentiment_analyzer(reviews)
# ๊ธ์ • ๋ฐ ๋ถ€์ • ๋ฆฌ๋ทฐ ํ•„ํ„ฐ๋ง
positive_reviews = [r['review'] for r, s in zip(reviews, sentiments) if s['label'] == 'POSITIVE'][:10]
negative_reviews = [r['review'] for r, s in zip(reviews, sentiments) if s['label'] == 'NEGATIVE'][:10]
# ๋ถ„์„ ๊ฒฐ๊ณผ ์š”์•ฝ
total_reviews = len(reviews)
positive_count = len([s for s in sentiments if s['label'] == 'POSITIVE'])
negative_count = len([s for s in sentiments if s['label'] == 'NEGATIVE'])
analysis_summary = f"์ด ๋ฆฌ๋ทฐ ์ˆ˜: {total_reviews}, ๊ธ์ • ๋ฆฌ๋ทฐ ์ˆ˜: {positive_count}, ๋ถ€์ • ๋ฆฌ๋ทฐ ์ˆ˜: {negative_count}"
return "\n".join(positive_reviews), "\n".join(negative_reviews), analysis_summary
# Gradio ์ธํ„ฐํŽ˜์ด์Šค ์„ค์ •
with gr.Blocks() as demo:
gr.Markdown("## ์–ธ์–ด ๋ชจ๋ธ ํ”„๋กฌํ”„ํŠธ ํ”Œ๋ ˆ์ด๊ทธ๋ผ์šด๋“œ")
with gr.Column():
model_radio = gr.Radio(choices=list(MODELS.keys()), value="Zephyr 7B Beta", label="์–ธ์–ด ๋ชจ๋ธ ์„ ํƒ")
prompt_input = gr.Textbox(label="ํ”„๋กฌํ”„ํŠธ ์ž…๋ ฅ", lines=5)
reference_text_input = gr.Textbox(label="์ฐธ๊ณ  ํ…์ŠคํŠธ ์ž…๋ ฅ", lines=5)
with gr.Row():
max_tokens_slider = gr.Slider(minimum=0, maximum=5000, value=2000, step=100, label="์ตœ๋Œ€ ํ† ํฐ ์ˆ˜")
temperature_slider = gr.Slider(minimum=0, maximum=1, value=0.75, step=0.05, label="์˜จ๋„")
top_p_slider = gr.Slider(minimum=0, maximum=1, value=0.95, step=0.05, label="Top P")
generate_button = gr.Button("์‘๋‹ต ์ƒ์„ฑ")
response_output = gr.HTML(label="์ƒ์„ฑ๋œ ์‘๋‹ต")
# ๋ฆฌ๋ทฐ ํŒŒ์ผ ์—…๋กœ๋“œ ๋ฉ”๋‰ด ์ถ”๊ฐ€
file_input = gr.File(label="๋ฆฌ๋ทฐ ์—‘์…€ ํŒŒ์ผ ์—…๋กœ๋“œ")
positive_reviews_output = gr.Textbox(label="๋Œ€ํ‘œ ๊ธ์ • ๋ฆฌ๋ทฐ 10๊ฐœ", lines=10, interactive=False)
negative_reviews_output = gr.Textbox(label="๋Œ€ํ‘œ ๋ถ€์ • ๋ฆฌ๋ทฐ 10๊ฐœ", lines=10, interactive=False)
analysis_output = gr.Textbox(label="๋ถ„์„ ๊ฒฐ๊ณผ", interactive=False)
# ๋ฆฌ๋ทฐ ํŒŒ์ผ ์ฒ˜๋ฆฌ ๋ฒ„ํŠผ
file_input.change(
process_reviews,
inputs=file_input,
outputs=[positive_reviews_output, negative_reviews_output, analysis_output]
)
# ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ์‘๋‹ต ์ƒ์„ฑ
generate_button.click(
generate_response,
inputs=[prompt_input, reference_text_input, max_tokens_slider, temperature_slider, top_p_slider, model_radio],
outputs=response_output
)
# ์ธํ„ฐํŽ˜์ด์Šค ์‹คํ–‰
demo.launch(share=True)