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()