File size: 6,216 Bytes
744eef2
 
43c5458
744eef2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
43c5458
 
744eef2
 
 
 
 
 
 
43c5458
 
 
744eef2
43c5458
 
 
744eef2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
43c5458
 
 
 
 
 
 
 
 
 
 
 
 
744eef2
43c5458
 
 
 
 
 
744eef2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5bbdbf4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
744eef2
 
 
 
5bbdbf4
744eef2
5bbdbf4
744eef2
 
5bbdbf4
 
 
 
 
 
 
 
 
 
 
 
 
 
744eef2
 
 
 
 
 
5bbdbf4
 
 
 
 
 
 
 
 
 
 
 
 
744eef2
43c5458
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
import gradio as gr
from huggingface_hub import InferenceClient
import openai  # OpenAI API를 사용하기 위해 추가
import os
import random
import logging

# 로깅 설정
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"  # 새로운 모델 추가
}

# 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, reference_text, 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(content, system_message, max_tokens, temperature, top_p):
    response = openai.ChatCompletion.create(
        model="gpt-4o-mini",  # 모델 ID
        messages=[
            {"role": "system", "content": system_message},
            {"role": "user", "content": content},
        ],
        max_tokens=max_tokens,
        temperature=temperature,
        top_p=top_p,
    )
    return response.choices[0].message['content']

def generate_response(prompt, reference_text, max_tokens, temperature, top_p, model):
    if model == "GPT-4o Mini":
        system_message = "이것은 사용자 요청에 대한 참고 텍스트를 활용하여 응답을 생성하는 작업입니다."
        response = call_openai_api(prompt, reference_text, max_tokens, temperature, top_p)
    else:
        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

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

        # 입력창 3개 추가
        input1 = gr.Textbox(label="입력창 1")
        input2 = gr.Textbox(label="입력창 2")
        input3 = gr.Textbox(label="입력창 3")

        # 파일 업로드 메뉴 (이미지 파일 업로드)
        image_upload = gr.File(label="파일 업로드", file_types=["image"])

        # 폰트 파일 업로드 메뉴
        font_upload = gr.File(label="폰트 파일 업로드", file_types=["font"])

        # 업로드한 폰트를 선택할 수 있는 드롭다운 메뉴
        font_dropdown = gr.Dropdown(label="폰트 선택", choices=[])

        # 출력창 2개 추가
        output1 = gr.Textbox(label="출력창 1")
        output2 = gr.Textbox(label="출력창 2")

        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("응답 생성")
        run_button = gr.Button("실행")  # 실행 버튼 생성
        response_output = gr.HTML(label="생성된 응답")

    # 폰트 파일 업로드 시 드롭다운 메뉴 업데이트 함수
    def update_font_list(font_file):
        if font_file is not None:
            font_name = os.path.basename(font_file.name)
            current_fonts = font_dropdown.choices or []
            if font_name not in current_fonts:
                updated_fonts = current_fonts + [font_name]
                return gr.Dropdown.update(choices=updated_fonts)
        return gr.Dropdown.update()

    # 폰트 파일 업로드 이벤트에 함수 연결
    font_upload.upload(update_font_list, inputs=font_upload, outputs=font_dropdown)

    # 응답 생성 버튼 클릭 시 함수 실행
    generate_button.click(
        generate_response,
        inputs=[prompt_input, reference_text_input, max_tokens_slider, temperature_slider, top_p_slider, model_radio],
        outputs=response_output
    )

    # 실행 버튼 클릭 시 동작할 함수 정의
    def run_action(input1_value, input2_value, input3_value):
        output_text1 = f"입력창 1의 내용: {input1_value}"
        output_text2 = f"입력창 2의 내용: {input2_value}"
        return output_text1, output_text2

    # 실행 버튼 클릭 시 함수 연결
    run_button.click(
        run_action,
        inputs=[input1, input2, input3],
        outputs=[output1, output2]
    )

# 인터페이스 실행
demo.launch(share=True)