Spaces:
Sleeping
Sleeping
Create app.py
Browse files
app.py
ADDED
@@ -0,0 +1,137 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import gradio as gr
|
2 |
+
import google.generativeai as genai
|
3 |
+
from transformers import pipeline
|
4 |
+
import os
|
5 |
+
from typing import IO # ํ์ผ ํ์
ํํธ๋ฅผ ์ํด ์ถ๊ฐ
|
6 |
+
|
7 |
+
# Hugging Face Spaces์ ๋ฉ๋ชจ๋ฆฌ ์ ํ์ ๊ณ ๋ คํ์ฌ ๊ฒฝ๋ ๋ชจ๋ธ์ ์ฌ์ฉํฉ๋๋ค.
|
8 |
+
# ํ๊ตญ์ด ์์ฝ์ ํนํ๋ ๋ชจ๋ธ์ ๋ก๋ํฉ๋๋ค.
|
9 |
+
try:
|
10 |
+
summarizer = pipeline("summarization", model="gogamza/kobart-summarization")
|
11 |
+
except Exception as e:
|
12 |
+
print(f"๋ชจ๋ธ ๋ก๋ฉ ์ค ์ค๋ฅ ๋ฐ์: {e}")
|
13 |
+
summarizer = None
|
14 |
+
|
15 |
+
# Gradio 4.x์ ๋ง์ถฐ ํจ์ ์๊ทธ๋์ฒ๋ฅผ ์์ ํฉ๋๋ค.
|
16 |
+
# progress ์ธ์๋ฅผ ํ์
ํํธ๋ก ๋ฐ์ต๋๋ค.
|
17 |
+
def generate_blog_post(api_key: str, file1: IO, file2: IO, file3: IO, progress: gr.Progress):
|
18 |
+
"""
|
19 |
+
3๊ฐ์ ํ
์คํธ ํ์ผ์ ์
๋ ฅ๋ฐ์ ์์ฝํ๊ณ , Gemini API๋ฅผ ํตํด ๋ธ๋ก๊ทธ ๊ธ์ ์์ฑํ๋ ํจ์
|
20 |
+
"""
|
21 |
+
# 1. ์
๋ ฅ ๊ฐ ์ ํจ์ฑ ๊ฒ์ฌ
|
22 |
+
if not api_key:
|
23 |
+
raise gr.Error("Google API ํค๋ฅผ ์
๋ ฅํด ์ฃผ์ธ์.")
|
24 |
+
if not (file1 and file2 and file3):
|
25 |
+
raise gr.Error("3๊ฐ์ ํ
์คํธ ํ์ผ์ ๋ชจ๋ ์
๋ก๋ํด ์ฃผ์ธ์.")
|
26 |
+
if not summarizer:
|
27 |
+
raise gr.Error("์์ฝ ๋ชจ๋ธ์ ๋ก๋ํ๋ ๋ฐ ์คํจํ์ต๋๋ค. ์ฑ ๋ก๊ทธ๋ฅผ ํ์ธํด ์ฃผ์ธ์.")
|
28 |
+
|
29 |
+
try:
|
30 |
+
# 2. Google Gemini API ์ค์
|
31 |
+
progress(0.1, desc="Google API ํค ์ค์ ์ค...")
|
32 |
+
genai.configure(api_key=api_key)
|
33 |
+
|
34 |
+
# 3. ํ
์คํธ ํ์ผ ์ฝ๊ธฐ
|
35 |
+
progress(0.2, desc="ํ
์คํธ ํ์ผ ์ฝ๋ ์ค...")
|
36 |
+
texts = []
|
37 |
+
# Gradio 4.x์์ File ๊ฐ์ฒด๋ ์์ ํ์ผ ๊ฒฝ๋ก๋ฅผ name ์์ฑ์ผ๋ก ๊ฐ์ง๋๋ค.
|
38 |
+
files = [file1, file2, file3]
|
39 |
+
for f in files:
|
40 |
+
with open(f.name, 'r', encoding='utf-8') as file:
|
41 |
+
texts.append(file.read())
|
42 |
+
|
43 |
+
# 4. ํ๊น
ํ์ด์ค ๋ชจ๋ธ๋ก ๊ฐ ํ
์คํธ ์์ฝ
|
44 |
+
summaries = []
|
45 |
+
for i, text in enumerate(texts):
|
46 |
+
progress(0.3 + i * 0.1, desc=f"๋ฌธ์ {i+1} ์์ฝ ์ค...")
|
47 |
+
summary = summarizer(text, max_length=200, min_length=50, do_sample=False)
|
48 |
+
summaries.append(summary[0]['summary_text'])
|
49 |
+
|
50 |
+
# 5. Gemini API๋ก ์๋ก์ด ๊ธ ์์ฑ
|
51 |
+
progress(0.6, desc="Gemini API๋ก ๋ธ๋ก๊ทธ ์์๋ผ์ธ ์์ฑ ์ค...")
|
52 |
+
model = genai.GenerativeModel('gemini-1.5-flash-latest')
|
53 |
+
|
54 |
+
summaries_str = "\n".join([f"- ์์ฝ {i+1}: {s}" for i, s in enumerate(summaries)])
|
55 |
+
|
56 |
+
prompt = f"""
|
57 |
+
๋น์ ์ IT ์ ๋ฌธ ๋ค์ด๋ฒ ๋ธ๋ก๊ฑฐ์
๋๋ค. ์๋ 3๊ฐ์ ์์ฝ๋ฌธ์ ์ฐธ๊ณ ํ์ฌ, ๋
์๋ค์ ํฅ๋ฏธ๋ฅผ ๋ ์ ์๋ ๋ธ๋ก๊ทธ ๊ธ์ ์์ฑํด ์ฃผ์ธ์.
|
58 |
+
|
59 |
+
**์์ฑ ์กฐ๊ฑด:**
|
60 |
+
1. ๋จผ์ ๊ธ์ ์ ์ฒด์ ์ธ '์์๋ผ์ธ'์ ์๋ก , ๋ณธ๋ก , ๊ฒฐ๋ก ํ์์ผ๋ก ๋ช
ํํ๊ฒ ์ ์ํด ์ฃผ์ธ์.
|
61 |
+
2. ๊ทธ ๋ค์, ์์์ ์ ์ํ ์์๋ผ์ธ์ ๋ง์ถฐ์ ์ ์ฒด ๊ธ์ ์์ฑํด ์ฃผ์ธ์.
|
62 |
+
3. ๋ค์ด๋ฒ ๋ธ๋ก๊ทธ ์คํ์ผ์ ๋ง๊ฒ ์น๊ทผํ๊ณ ์ดํดํ๊ธฐ ์ฌ์ด ์ดํฌ๋ฅผ ์ฌ์ฉํ๊ณ , ์ ์ ํ ์ด๋ชจ์ง๋ฅผ ์ฌ์ฉํด ์ฃผ์ธ์.
|
63 |
+
4. SEO๋ฅผ ๊ณ ๋ คํ์ฌ '์ธ๊ณต์ง๋ฅ', 'AI ๊ธฐ์ ', '๋ฏธ๋ ์ฌํ', 'ํ๊น
ํ์ด์ค', 'Gemini API'์ ๊ฐ์ ํค์๋๋ฅผ ๋ณธ๋ฌธ์ ์์ฐ์ค๋ฝ๊ฒ ํฌํจ์์ผ ์ฃผ์ธ์.
|
64 |
+
5. ์ ์ฒด ๊ธ์ ์๋ ๊ณต๋ฐฑ ํฌํจ 3,000์ ๋ด์ธ๋ก ๋ง์ถฐ์ฃผ์ธ์.
|
65 |
+
6. ๊ฒฐ๊ณผ๋ ๋งํฌ๋ค์ด ํ์์ผ๋ก ๊น๋ํ๊ฒ ์ ๋ฆฌํด์ ๋ณด์ฌ์ฃผ์ธ์.
|
66 |
+
|
67 |
+
**[์ฐธ๊ณ ํ ์์ฝ๋ฌธ]**
|
68 |
+
{summaries_str}
|
69 |
+
|
70 |
+
**[๊ฒฐ๊ณผ ์ถ๋ ฅ ํ์]**
|
71 |
+
# [๋ธ๋ก๊ทธ ์ ๋ชฉ]
|
72 |
+
|
73 |
+
## ๐ ์์๋ผ์ธ
|
74 |
+
- **์๋ก **: ...
|
75 |
+
- **๋ณธ๋ก **: ...
|
76 |
+
- **๊ฒฐ๋ก **: ...
|
77 |
+
|
78 |
+
---
|
79 |
+
|
80 |
+
## โ๏ธ ์์ฑ๋ ๋ธ๋ก๊ทธ ๊ธ
|
81 |
+
(์ฌ๊ธฐ์ ์์ฑ๋ ๊ธ์ ์ถ๋ ฅ)
|
82 |
+
"""
|
83 |
+
|
84 |
+
progress(0.8, desc="Gemini API๋ก ์ต์ข
๋ธ๋ก๊ทธ ๊ธ ์์ฑ ์ค...")
|
85 |
+
response = model.generate_content(prompt)
|
86 |
+
|
87 |
+
progress(1.0, desc="์๋ฃ!")
|
88 |
+
return response.text
|
89 |
+
|
90 |
+
except Exception as e:
|
91 |
+
raise gr.Error(f"์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค: {e}")
|
92 |
+
|
93 |
+
|
94 |
+
# Gradio ์ธํฐํ์ด์ค ๊ตฌ์ฑ
|
95 |
+
with gr.Blocks(theme=gr.themes.Soft()) as demo:
|
96 |
+
gr.Markdown(
|
97 |
+
"""
|
98 |
+
# ๐ค AI ๊ธฐ๋ฐ ๋ค์ด๋ฒ ๋ธ๋ก๊ทธ ํฌ์คํ
์๋ ์์ฑ
|
99 |
+
3๊ฐ์ ํ
์คํธ ํ์ผ์ ์
๋ก๋ํ๊ณ Google API ํค๋ฅผ ์
๋ ฅํ๋ฉด, AI๊ฐ ํ์ผ ๋ด์ฉ์ ๋ถ์ํ๊ณ ์์ฝํ์ฌ ๋ค์ด๋ฒ ๋ธ๋ก๊ทธ ํ์์ ์๋ก์ด ๊ธ์ ๋ง๋ค์ด ๋๋ฆฝ๋๋ค.
|
100 |
+
"""
|
101 |
+
)
|
102 |
+
|
103 |
+
with gr.Row():
|
104 |
+
with gr.Column(scale=1):
|
105 |
+
api_key = gr.Textbox(
|
106 |
+
label="Google API ํค",
|
107 |
+
placeholder="์ฌ๊ธฐ์ Google API ํค๋ฅผ ์
๋ ฅํ์ธ์.",
|
108 |
+
type="password",
|
109 |
+
lines=1
|
110 |
+
)
|
111 |
+
file1 = gr.File(label="ํ
์คํธ ํ์ผ 1")
|
112 |
+
file2 = gr.File(label="ํ
์คํธ ํ์ผ 2")
|
113 |
+
file3 = gr.File(label="ํ
์คํธ ํ์ผ 3")
|
114 |
+
generate_btn = gr.Button("๐ ๋ธ๋ก๊ทธ ๊ธ ์์ฑํ๊ธฐ", variant="primary")
|
115 |
+
|
116 |
+
with gr.Column(scale=2):
|
117 |
+
output_text = gr.Markdown(label="โจ ์์ฑ๋ ๋ธ๋ก๊ทธ ๊ธ")
|
118 |
+
|
119 |
+
generate_btn.click(
|
120 |
+
fn=generate_blog_post,
|
121 |
+
inputs=[api_key, file1, file2, file3],
|
122 |
+
outputs=output_text
|
123 |
+
)
|
124 |
+
|
125 |
+
gr.Markdown(
|
126 |
+
"""
|
127 |
+
---
|
128 |
+
**์ฌ์ฉ ๋ฐฉ๋ฒ:**
|
129 |
+
1. [Google AI Studio](https://aistudio.google.com/app/apikey)์์ API ํค๋ฅผ ๋ฐ๊ธ๋ฐ์ ์
๋ ฅํฉ๋๋ค.
|
130 |
+
2. ์ฃผ์ ๊ฐ ์ ์ฌํ 3๊ฐ์ ํ
์คํธ ํ์ผ(.txt)์ ๊ฐ๊ฐ ์
๋ก๋ํฉ๋๋ค.
|
131 |
+
3. '๋ธ๋ก๊ทธ ๊ธ ์์ฑํ๊ธฐ' ๋ฒํผ์ ํด๋ฆญํ๊ณ ์ ์ ๊ธฐ๋ค๋ฆฝ๋๋ค.
|
132 |
+
4. ์ค๋ฅธ์ชฝ ์ฐฝ์ ์์ฑ๋ ๊ธ์ ์์๋ผ์ธ๊ณผ ์ต์ข
๊ฒฐ๊ณผ๋ฌผ์ด ๋ํ๋ฉ๋๋ค.
|
133 |
+
"""
|
134 |
+
)
|
135 |
+
|
136 |
+
if __name__ == "__main__":
|
137 |
+
demo.launch()
|