3-3_NBlog / app.py
Kims12's picture
Update app.py
73cb1c2 verified
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()