LEEDONGGEUN commited on
Commit
647040c
ยท
verified ยท
1 Parent(s): 047c5ed

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +137 -0
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()