File size: 7,021 Bytes
2a01803
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
73cb1c2
2a01803
73cb1c2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2a01803
 
 
73cb1c2
2a01803
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import gradio as gr
import openai
import os

def respond_chatgpt_qna(
    question: str,
    system_message: str,
    max_tokens: int,
    temperature: float,
    top_p: float
):
    """
    OpenAI์˜ gpt-4o-mini ๋ชจ๋ธ์„ ์ด์šฉํ•ด ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต๋ณ€์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜.
    """
    openai_token = os.getenv("OPENAI_TOKEN")
    if not openai_token:
        return "OpenAI API ํ† ํฐ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค."
    openai.api_key = openai_token
    messages = [
        {"role": "system", "content": system_message},
        {"role": "user", "content": question}
    ]
    try:
        response = openai.ChatCompletion.create(
            model="gpt-4o-mini",
            messages=messages,
            max_tokens=max_tokens,
            temperature=temperature,
            top_p=top_p,
        )
        assistant_message = response.choices[0].message['content']
        return assistant_message
    except Exception as e:
        return f"์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค: {str(e)}"

def merge_and_call(tone: str, ref1: str, ref2: str, ref3: str):
    """
    ์‚ฌ์šฉ์ž๊ฐ€ ์„ ํƒํ•œ ๋งํˆฌ์™€ ์ฐธ์กฐ๊ธ€๋“ค์„ ํ•˜๋‚˜์˜ ํ”„๋กฌํ”„ํŠธ๋กœ ํ•ฉ์ณ gpt-4o-mini ๋ชจ๋ธ์— ์ „๋‹ฌํ•˜๋Š” ํ•จ์ˆ˜.
    ๊ฐ ๋งํˆฌ์— ๋”ฐ๋ผ ๊ณ ์œ ์˜ system_message(ํ”„๋กฌํ”„ํŠธ)๊ฐ€ ์ ์šฉ๋˜๋ฉฐ, ์•„๋ž˜์˜ ๊ธฐ๋ณธ ํ”„๋กฌํ”„ํŠธ ๊ทœ์น™์„ ๋ฐ˜๋“œ์‹œ ์ค€์ˆ˜ํ•œ๋‹ค.
    """
    # ๊ธฐ๋ณธ ํ”„๋กฌํ”„ํŠธ ๊ทœ์น™ (๋ชจ๋“  ๋งํˆฌ์— ๊ณตํ†ต ์ ์šฉ)
    base_prompt = (
        "๋„ˆ๋Š” ๊ฐ€์žฅ ์ฃผ๋ชฉ๋ฐ›๋Š” ๋งˆ์ผ€ํ„ฐ์ด๋ฉฐ ๋ธ”๋กœ๊ทธ ๋งˆ์ผ€ํŒ… ์ „๋ฌธ๊ฐ€์ด๋‹ค. "
        "ํŠนํžˆ ๋„ˆ๋Š” '์ •๋ณด์„ฑ(Informative)' ์ „๋ฌธ ๋ธ”๋กœ๊ทธ ๋งˆ์ผ€ํŒ… ์ „๋ฌธ๊ฐ€๋กœ์„œ, ์ •๋ณด ์ œ๊ณต์— ์ดˆ์ ์„ ๋งž์ถ”์–ด ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค.\n"
        "๋‹ค์Œ ํ…์ŠคํŠธ ์ž‘์„ฑ ๊ทœ์น™์„ ๋ฐ˜๋“œ์‹œ ์ค€์ˆ˜ํ•˜๋ผ:\n"
        "1. ์†Œ์ฃผ์ œ๋ฅผ 5๊ฐœ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ 2000์ž ์ด์ƒ ์ž‘์„ฑํ•˜๋ผ.\n"
        "2. ์ „์ฒด ๋งฅ๋ฝ์„ ์ดํ•ดํ•˜๊ณ  ๋ฌธ์žฅ์˜ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๋ผ.\n"
        "3. ์ ˆ๋Œ€๋กœ ์ฐธ๊ณ ๊ธ€์„ ํ•œ ๋ฌธ์žฅ ์ด์ƒ ๊ทธ๋Œ€๋กœ ์ถœ๋ ฅํ•˜์ง€ ๋ง๋ผ.\n"
        "4. ์ฃผ์ œ์™€ ์ƒํ™ฉ์— ๋งž๋Š” ์ ์ ˆํ•œ ์–ดํœ˜๋ฅผ ์„ ํƒํ•˜๋ผ.\n"
        "5. ํ•œ๊ธ€ ์–ดํœ˜์˜ ๋‚œ์ด๋„๋Š” ์‰ฝ๊ฒŒ ์ž‘์„ฑํ•˜๋ผ.\n"
        "6. ์ ˆ๋Œ€ ๋ฌธ์žฅ์˜ ๋์— '๋‹ต๋‹ˆ๋‹ค'๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋ง๋ผ.\n"
        "์ •๋ณด์„ฑ ๋ธ”๋กœ๊ทธ ์ž‘์„ฑ ๊ทœ์น™:\n"
        "1. ๋…์ž๊ฐ€ ์–ป๊ณ ์ž ํ•˜๋Š” ์œ ์šฉํ•˜๊ณ  ํฅ๋ฏธ๋กœ์šด ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋ผ.\n"
        "2. ๋…์ž์˜ ๊ณต๊ฐ์„ ์ด๋Œ์–ด๋‚ด๊ณ  ๊ถ๊ธˆ์ฆ์„ ํ•ด๊ฒฐํ•˜๋ผ.\n"
        "3. ๋…์ž์˜ ๊ด€์‹ฌ์‚ฌ๋ฅผ ์ถฉ์กฑ์‹œํ‚ค๋ผ.\n"
        "4. ๋…์ž์—๊ฒŒ ์ด๋“์ด ๋˜๋Š” ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋ผ.\n"
        "์ œ์™ธ ๊ทœ์น™:\n"
        "1. ๋ฐ˜๋“œ์‹œ ๋น„์†์–ด ๋ฐ ์š•์„ค์€ ์ œ์™ธํ•˜๋ผ.\n"
        "2. ๋ฐ˜๋“œ์‹œ ์ฐธ๊ณ ๊ธ€์˜ ๋งํฌ(URL)๋Š” ์ œ์™ธํ•˜๋ผ.\n"
        "3. '๋งํฌ๋ฅผ ํ™•์ธํ•ด์ฃผ์„ธ์š”' ๋“ฑ์˜ ๋ฌธ๊ตฌ๋Š” ์ œ์™ธํ•˜๋ผ.\n"
        "4. ์ฐธ๊ณ ๊ธ€์— ์žˆ๋Š” ์ž‘์„ฑ์ž, ํ™”์ž, ์œ ํŠœ๋ฒ„, ๊ธฐ์ž์˜ ์ด๋ฆ„, ์• ์นญ, ๋‹‰๋„ค์ž„์€ ๋ฐ˜๋“œ์‹œ ์ œ์™ธํ•˜๋ผ.\n"
        "5. ๋ฌธ์žฅ์˜ ๋๋ถ€๋ถ„์— ์–ด์ƒ‰ํ•œ ํ‘œํ˜„(์˜ˆ: '์˜ˆ์š”', '๋‹ต๋‹ˆ๋‹ค', 'ํ•ด์š”', 'ํ•ด์ฃผ์ฃ ', '๋์ฃ ', '๋์–ด์š”', '๊ณ ์š”' ๋“ฑ)์€ ์‚ฌ์šฉํ•˜์ง€ ๋ง๋ผ."
    )

    # ๋งํˆฌ๋ณ„ ์ถ”๊ฐ€ ํ”„๋กฌํ”„ํŠธ ์„ค์ •
    if tone == "์นœ๊ทผํ•˜๊ฒŒ":
        tone_prompt = (
            "์นœ๊ทผํ•˜๊ฒŒ:\n"
            "1. ํ†ค๊ณผ ์–ด์กฐ: ๋Œ€ํ™”ํ•˜๋“ฏ ํŽธ์•ˆํ•˜๊ณ  ์นœ๊ทผํ•œ ๋งํˆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ผ.\n"
            "2. ๋ฌธ์žฅ ๋ฐ ์–ดํˆฌ: ๋ฐ˜๋“œ์‹œ 'ํ•ด์š”์ฒด'๋กœ ์ž‘์„ฑํ•˜๋ฉฐ, '์Šต๋‹ˆ๋‹ค'์ฒด๋‚˜ '~๋‹ค'๋กœ ๋๋‚˜์ง€ ์•Š๋„๋ก ํ•˜๋ผ. ๊ตฌ์–ด์ฒด ํ‘œํ˜„(์˜ˆ: '~ํ–ˆ์–ด์š”', '~์ธ ๊ฒƒ ๊ฐ™์•„์š”')์„ ์‚ฌ์šฉํ•˜๋ผ.\n"
            "3. ์šฉ์–ด ๋ฐ ์„ค๋ช…: ์ „๋ฌธ ์šฉ์–ด ๋Œ€์‹  ์‰ฌ์šด ๋‹จ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ๋น„์œ ๋‚˜ ์€์œ ๋ฅผ ํ†ตํ•ด ๋ณต์žกํ•œ ๊ฐœ๋…์„ ์„ค๋ช…ํ•˜๋ผ.\n"
            "4. ๋…์ž์™€์˜ ์ƒํ˜ธ์ž‘์šฉ: ๋…์ž์˜ ์˜๊ฒฌ์„ ๋ฌป๋Š” ์งˆ๋ฌธ๊ณผ ๋Œ“๊ธ€์„ ์œ ๋„ํ•˜๋Š” ๋ฌธ๊ตฌ๋ฅผ ํฌํ•จํ•˜๋ผ.\n"
            "์ฃผ์˜: ๋„ˆ๋ฌด ๊ฐ€๋ฒผ์šด ํ†ค์€ ํ”ผํ•˜๋˜ ์ฃผ์ œ์˜ ์ค‘์š”์„ฑ์„ ํ•ด์น˜์ง€ ๋ง๋ผ."
        )
    elif tone == "์ผ๋ฐ˜์ ์ธ":
        tone_prompt = (
            "์ผ๋ฐ˜์ ์ธ:\n"
            "1. ํ†ค๊ณผ ์–ด์กฐ: ์ค‘๋ฆฝ์ ์ด๊ณ  ๊ฐ๊ด€์ ์ธ ํ†ค์„ ์œ ์ง€ํ•˜๋ฉฐ, ์ ์ ˆํ•œ ์กด๋Œ“๋ง(์˜ˆ: '~ํ•ฉ๋‹ˆ๋‹ค', '~์ž…๋‹ˆ๋‹ค')์„ ์‚ฌ์šฉํ•˜๋ผ.\n"
            "2. ๋‚ด์šฉ ๊ตฌ์กฐ: ๋ช…ํ™•ํ•œ ์ฃผ์ œ ์ œ์‹œ์™€ ๋…ผ๋ฆฌ์ ์ธ ์ „๊ฐœ, ์†Œ์ œ๋ชฉ ๋ฐ ๋‹จ๋ฝ ๊ตฌ๋ถ„์„ ํ™œ์šฉํ•˜๋ผ.\n"
            "3. ์šฉ์–ด ๋ฐ ์„ค๋ช…: ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด ์šฉ์–ด์™€ ๊ฐ„๋‹จํ•œ ์„ค๋ช…์„ ์‚ฌ์šฉํ•˜๊ณ , ๊ฐ๊ด€์ ์ธ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋ผ.\n"
            "4. ๋…์ž ์ƒํ˜ธ์ž‘์šฉ: ๋…์ž์˜ ์ƒ๊ฐ์„ ๋ฌป๋Š” ์งˆ๋ฌธ๊ณผ ์ถ”๊ฐ€ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ํ‚ค์›Œ๋“œ๋ฅผ ํฌํ•จํ•˜๋ผ.\n"
            "5. ๋งˆ๋ฌด๋ฆฌ: ์ฃผ์š” ๋‚ด์šฉ์„ ๊ฐ„๋žตํžˆ ์š”์•ฝํ•˜๊ณ  ์ถ”๊ฐ€ ์ •๋ณด๋ฅผ ์•ˆ๋‚ดํ•˜๋ผ."
        )
    elif tone == "์ „๋ฌธ์ ์ธ":
        tone_prompt = (
            "์ „๋ฌธ์ ์ธ:\n"
            "1. ํ†ค๊ณผ ๊ตฌ์กฐ: ๊ณต์‹์ ์ด๊ณ  ํ•™์ˆ ์ ์ธ ํ†ค์„ ์‚ฌ์šฉํ•˜๋ฉฐ, ๋ช…ํ™•ํ•œ ์„œ๋ก , ๋ณธ๋ก , ๊ฒฐ๋ก  ๊ตฌ์กฐ๋กœ ์ฒด๊ณ„์ ์œผ๋กœ ์ „๊ฐœํ•˜๋ผ.\n"
            "2. ๋‚ด์šฉ ๊ตฌ์„ฑ: ๋ณต์žกํ•œ ๊ฐœ๋…์„ ์ •ํ™•ํ•˜๊ฒŒ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋„๋ก ์ „๋ฌธ ์šฉ์–ด์™€ ์‹ฌ์ธต ๋ถ„์„์„ ํ™œ์šฉํ•˜๋ผ.\n"
            "3. ๋ฐ์ดํ„ฐ ํ™œ์šฉ: ํ†ต๊ณ„, ์—ฐ๊ตฌ ๊ฒฐ๊ณผ, ์ „๋ฌธ๊ฐ€ ์˜๊ฒฌ ๋“ฑ์„ ์ธ์šฉํ•˜์—ฌ ์‹ ๋ขฐ์„ฑ์„ ๋†’์ด๋ผ.\n"
            "4. ํ…์ŠคํŠธ ๊ตฌ์กฐํ™”: ๋ฒˆํ˜ธ ๋งค๊ธฐ๊ธฐ, ๊ธฐ์šธ์ž„๊ผด, ๋“ค์—ฌ์“ฐ๊ธฐ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋…ผ๋ฆฌ์  ๊ตฌ์กฐ๋ฅผ ๊ฐ•์กฐํ•˜๋ผ.\n"
            "5. ๋งˆ๋ฌด๋ฆฌ: ํ•ต์‹ฌ ๋…ผ์ ์„ ์žฌ๊ฐ•์กฐํ•˜๊ณ  ํ–ฅํ›„ ์—ฐ๊ตฌ๋‚˜ ์‹ค๋ฌด์  ํ•จ์˜๋ฅผ ์ œ์‹œํ•˜๋ผ."
        )
    else:
        tone_prompt = "์•„๋ž˜์˜ ์ฐธ์กฐ๊ธ€๋“ค์„ ์ฐธ๊ณ ํ•˜์—ฌ ๋ธ”๋กœ๊ทธ ๊ธ€์„ ์ƒ์„ฑํ•˜๋ผ."

    # ์ตœ์ข… system_message๋Š” tone_prompt์™€ base_prompt๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ ๊ตฌ์„ฑ
    system_message = tone_prompt + "\n" + base_prompt

    # ํ”„๋กฌํ”„ํŠธ์— ์ฐธ์กฐ๊ธ€ ๋‚ด์šฉ์„ ๋ฐ˜์˜ (์ฐธ๊ณ ๊ธ€์€ ์ง์ ‘ ์ถœ๋ ฅํ•˜์ง€ ์•Š๋„๋ก ์ฃผ์˜)
    question = f"์ฐธ์กฐ๊ธ€ 1: {ref1}\n์ฐธ์กฐ๊ธ€ 2: {ref2}\n์ฐธ์กฐ๊ธ€ 3: {ref3}\n์œ„ ๋‚ด์šฉ์„ ์ฐธ๊ณ ํ•˜์—ฌ ์ฃผ์ œ์™€ ์ƒํ™ฉ์— ๋งž๋Š” ๋ธ”๋กœ๊ทธ ๊ธ€์„ ์ž‘์„ฑํ•˜๋ผ. ๋‹จ, ์ฐธ๊ณ ๊ธ€์˜ ๋‚ด์šฉ์„ ๊ทธ๋Œ€๋กœ ์ธ์šฉํ•˜์ง€ ๋ง๋ผ."
    
    # ๊ณ ๊ธ‰ ์„ค์ •์€ ์ฝ”๋“œ ๋‚ด๋ถ€ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์ง€์ •
    max_tokens = 2000
    temperature = 0.7
    top_p = 0.95

    return respond_chatgpt_qna(
        question=question,
        system_message=system_message,
        max_tokens=max_tokens,
        temperature=temperature,
        top_p=top_p
    )

with gr.Blocks() as demo:
    gr.Markdown("# ๋ธ”๋กœ๊ทธ ์ƒ์„ฑ๊ธฐ")
    
    tone_radio = gr.Radio(
        choices=["์นœ๊ทผํ•˜๊ฒŒ", "์ผ๋ฐ˜์ ์ธ", "์ „๋ฌธ์ ์ธ"],
        label="๋งํˆฌ๋ฐ”๊พธ๊ธฐ",
        value="์ผ๋ฐ˜์ ์ธ"
    )
    ref1_text = gr.Textbox(label="์ฐธ์กฐ๊ธ€ 1", lines=5)
    ref2_text = gr.Textbox(label="์ฐธ์กฐ๊ธ€ 2", lines=5)
    ref3_text = gr.Textbox(label="์ฐธ์กฐ๊ธ€ 3", lines=5)
    answer_output = gr.Textbox(label="๊ฒฐ๊ณผ", lines=10, interactive=False)
    
    submit_button = gr.Button("์ „์†ก")
    
    submit_button.click(
        fn=merge_and_call,
        inputs=[tone_radio, ref1_text, ref2_text, ref3_text],
        outputs=answer_output
    )
    
if __name__ == "__main__":
    demo.launch()