Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| import google.generativeai as genai | |
| from transformers import pipeline | |
| import os | |
| from typing import IO # ํ์ผ ํ์ ํํธ๋ฅผ ์ํด ์ถ๊ฐ | |
| # Hugging Face Spaces์ ๋ฉ๋ชจ๋ฆฌ ์ ํ์ ๊ณ ๋ คํ์ฌ ๊ฒฝ๋ ๋ชจ๋ธ์ ์ฌ์ฉํฉ๋๋ค. | |
| # ํ๊ตญ์ด ์์ฝ์ ํนํ๋ ๋ชจ๋ธ์ ๋ก๋ํฉ๋๋ค. | |
| try: | |
| summarizer = pipeline("summarization", model="gogamza/kobart-summarization") | |
| except Exception as e: | |
| print(f"๋ชจ๋ธ ๋ก๋ฉ ์ค ์ค๋ฅ ๋ฐ์: {e}") | |
| summarizer = None | |
| # Gradio 4.x์ ๋ง์ถฐ ํจ์ ์๊ทธ๋์ฒ๋ฅผ ์์ ํฉ๋๋ค. | |
| # progress ์ธ์๋ฅผ ํ์ ํํธ๋ก ๋ฐ์ต๋๋ค. | |
| def generate_blog_post(api_key: str, file1: IO, file2: IO, file3: IO, progress: gr.Progress): | |
| """ | |
| 3๊ฐ์ ํ ์คํธ ํ์ผ์ ์ ๋ ฅ๋ฐ์ ์์ฝํ๊ณ , Gemini API๋ฅผ ํตํด ๋ธ๋ก๊ทธ ๊ธ์ ์์ฑํ๋ ํจ์ | |
| """ | |
| # 1. ์ ๋ ฅ ๊ฐ ์ ํจ์ฑ ๊ฒ์ฌ | |
| if not api_key: | |
| raise gr.Error("Google API ํค๋ฅผ ์ ๋ ฅํด ์ฃผ์ธ์.") | |
| if not (file1 and file2 and file3): | |
| raise gr.Error("3๊ฐ์ ํ ์คํธ ํ์ผ์ ๋ชจ๋ ์ ๋ก๋ํด ์ฃผ์ธ์.") | |
| if not summarizer: | |
| raise gr.Error("์์ฝ ๋ชจ๋ธ์ ๋ก๋ํ๋ ๋ฐ ์คํจํ์ต๋๋ค. ์ฑ ๋ก๊ทธ๋ฅผ ํ์ธํด ์ฃผ์ธ์.") | |
| try: | |
| # 2. Google Gemini API ์ค์ | |
| progress(0.1, desc="Google API ํค ์ค์ ์ค...") | |
| genai.configure(api_key=api_key) | |
| # 3. ํ ์คํธ ํ์ผ ์ฝ๊ธฐ | |
| progress(0.2, desc="ํ ์คํธ ํ์ผ ์ฝ๋ ์ค...") | |
| texts = [] | |
| # Gradio 4.x์์ File ๊ฐ์ฒด๋ ์์ ํ์ผ ๊ฒฝ๋ก๋ฅผ name ์์ฑ์ผ๋ก ๊ฐ์ง๋๋ค. | |
| files = [file1, file2, file3] | |
| for f in files: | |
| with open(f.name, 'r', encoding='utf-8') as file: | |
| texts.append(file.read()) | |
| # 4. ํ๊น ํ์ด์ค ๋ชจ๋ธ๋ก ๊ฐ ํ ์คํธ ์์ฝ | |
| summaries = [] | |
| for i, text in enumerate(texts): | |
| progress(0.3 + i * 0.1, desc=f"๋ฌธ์ {i+1} ์์ฝ ์ค...") | |
| summary = summarizer(text, max_length=200, min_length=50, do_sample=False) | |
| summaries.append(summary[0]['summary_text']) | |
| # 5. Gemini API๋ก ์๋ก์ด ๊ธ ์์ฑ | |
| progress(0.6, desc="Gemini API๋ก ๋ธ๋ก๊ทธ ์์๋ผ์ธ ์์ฑ ์ค...") | |
| model = genai.GenerativeModel('gemini-1.5-flash-latest') | |
| summaries_str = "\n".join([f"- ์์ฝ {i+1}: {s}" for i, s in enumerate(summaries)]) | |
| prompt = f""" | |
| ๋น์ ์ IT ์ ๋ฌธ ๋ค์ด๋ฒ ๋ธ๋ก๊ฑฐ์ ๋๋ค. ์๋ 3๊ฐ์ ์์ฝ๋ฌธ์ ์ฐธ๊ณ ํ์ฌ, ๋ ์๋ค์ ํฅ๋ฏธ๋ฅผ ๋ ์ ์๋ ๋ธ๋ก๊ทธ ๊ธ์ ์์ฑํด ์ฃผ์ธ์. | |
| **์์ฑ ์กฐ๊ฑด:** | |
| 1. ๋จผ์ ๊ธ์ ์ ์ฒด์ ์ธ '์์๋ผ์ธ'์ ์๋ก , ๋ณธ๋ก , ๊ฒฐ๋ก ํ์์ผ๋ก ๋ช ํํ๊ฒ ์ ์ํด ์ฃผ์ธ์. | |
| 2. ๊ทธ ๋ค์, ์์์ ์ ์ํ ์์๋ผ์ธ์ ๋ง์ถฐ์ ์ ์ฒด ๊ธ์ ์์ฑํด ์ฃผ์ธ์. | |
| 3. ๋ค์ด๋ฒ ๋ธ๋ก๊ทธ ์คํ์ผ์ ๋ง๊ฒ ์น๊ทผํ๊ณ ์ดํดํ๊ธฐ ์ฌ์ด ์ดํฌ๋ฅผ ์ฌ์ฉํ๊ณ , ์ ์ ํ ์ด๋ชจ์ง๋ฅผ ์ฌ์ฉํด ์ฃผ์ธ์. | |
| 4. SEO๋ฅผ ๊ณ ๋ คํ์ฌ '์ธ๊ณต์ง๋ฅ', 'AI ๊ธฐ์ ', '๋ฏธ๋ ์ฌํ', 'ํ๊น ํ์ด์ค', 'Gemini API'์ ๊ฐ์ ํค์๋๋ฅผ ๋ณธ๋ฌธ์ ์์ฐ์ค๋ฝ๊ฒ ํฌํจ์์ผ ์ฃผ์ธ์. | |
| 5. ์ ์ฒด ๊ธ์ ์๋ ๊ณต๋ฐฑ ํฌํจ 3,000์ ๋ด์ธ๋ก ๋ง์ถฐ์ฃผ์ธ์. | |
| 6. ๊ฒฐ๊ณผ๋ ๋งํฌ๋ค์ด ํ์์ผ๋ก ๊น๋ํ๊ฒ ์ ๋ฆฌํด์ ๋ณด์ฌ์ฃผ์ธ์. | |
| **[์ฐธ๊ณ ํ ์์ฝ๋ฌธ]** | |
| {summaries_str} | |
| **[๊ฒฐ๊ณผ ์ถ๋ ฅ ํ์]** | |
| # [๋ธ๋ก๊ทธ ์ ๋ชฉ] | |
| ## ๐ ์์๋ผ์ธ | |
| - **์๋ก **: ... | |
| - **๋ณธ๋ก **: ... | |
| - **๊ฒฐ๋ก **: ... | |
| --- | |
| ## โ๏ธ ์์ฑ๋ ๋ธ๋ก๊ทธ ๊ธ | |
| (์ฌ๊ธฐ์ ์์ฑ๋ ๊ธ์ ์ถ๋ ฅ) | |
| """ | |
| progress(0.8, desc="Gemini API๋ก ์ต์ข ๋ธ๋ก๊ทธ ๊ธ ์์ฑ ์ค...") | |
| response = model.generate_content(prompt) | |
| progress(1.0, desc="์๋ฃ!") | |
| return response.text | |
| except Exception as e: | |
| raise gr.Error(f"์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค: {e}") | |
| # Gradio ์ธํฐํ์ด์ค ๊ตฌ์ฑ | |
| with gr.Blocks(theme=gr.themes.Soft()) as demo: | |
| gr.Markdown( | |
| """ | |
| # ๐ค AI ๊ธฐ๋ฐ ๋ค์ด๋ฒ ๋ธ๋ก๊ทธ ํฌ์คํ ์๋ ์์ฑ | |
| 3๊ฐ์ ํ ์คํธ ํ์ผ์ ์ ๋ก๋ํ๊ณ Google API ํค๋ฅผ ์ ๋ ฅํ๋ฉด, AI๊ฐ ํ์ผ ๋ด์ฉ์ ๋ถ์ํ๊ณ ์์ฝํ์ฌ ๋ค์ด๋ฒ ๋ธ๋ก๊ทธ ํ์์ ์๋ก์ด ๊ธ์ ๋ง๋ค์ด ๋๋ฆฝ๋๋ค. | |
| """ | |
| ) | |
| with gr.Row(): | |
| with gr.Column(scale=1): | |
| api_key = gr.Textbox( | |
| label="Google API ํค", | |
| placeholder="์ฌ๊ธฐ์ Google API ํค๋ฅผ ์ ๋ ฅํ์ธ์.", | |
| type="password", | |
| lines=1 | |
| ) | |
| file1 = gr.File(label="ํ ์คํธ ํ์ผ 1") | |
| file2 = gr.File(label="ํ ์คํธ ํ์ผ 2") | |
| file3 = gr.File(label="ํ ์คํธ ํ์ผ 3") | |
| generate_btn = gr.Button("๐ ๋ธ๋ก๊ทธ ๊ธ ์์ฑํ๊ธฐ", variant="primary") | |
| with gr.Column(scale=2): | |
| output_text = gr.Markdown(label="โจ ์์ฑ๋ ๋ธ๋ก๊ทธ ๊ธ") | |
| generate_btn.click( | |
| fn=generate_blog_post, | |
| inputs=[api_key, file1, file2, file3], | |
| outputs=output_text | |
| ) | |
| gr.Markdown( | |
| """ | |
| --- | |
| **์ฌ์ฉ ๋ฐฉ๋ฒ:** | |
| 1. [Google AI Studio](https://aistudio.google.com/app/apikey)์์ API ํค๋ฅผ ๋ฐ๊ธ๋ฐ์ ์ ๋ ฅํฉ๋๋ค. | |
| 2. ์ฃผ์ ๊ฐ ์ ์ฌํ 3๊ฐ์ ํ ์คํธ ํ์ผ(.txt)์ ๊ฐ๊ฐ ์ ๋ก๋ํฉ๋๋ค. | |
| 3. '๋ธ๋ก๊ทธ ๊ธ ์์ฑํ๊ธฐ' ๋ฒํผ์ ํด๋ฆญํ๊ณ ์ ์ ๊ธฐ๋ค๋ฆฝ๋๋ค. | |
| 4. ์ค๋ฅธ์ชฝ ์ฐฝ์ ์์ฑ๋ ๊ธ์ ์์๋ผ์ธ๊ณผ ์ต์ข ๊ฒฐ๊ณผ๋ฌผ์ด ๋ํ๋ฉ๋๋ค. | |
| """ | |
| ) | |
| if __name__ == "__main__": | |
| demo.launch() | |