| 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 + "\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() |
|
|