ll7098ll commited on
Commit
07fea93
·
verified ·
1 Parent(s): b50bc04

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +199 -77
app.py CHANGED
@@ -1,19 +1,35 @@
1
  import os
2
  import time
3
  import streamlit as st
4
- from PIL import Image # 이미지 관련 라이브러리는 필요 없을 수 있지만, 일단 포함
5
  import google.generativeai as genai
6
  from streamlit_extras.colored_header import colored_header
7
  import markdown
8
  import pyperclip
9
- import PyPDF2 # PDF 처리 라이브러리 추가
 
 
 
 
 
10
 
11
- # Google Gemini API 키 설정 (기존 코드와 동일)
12
- genai.configure(api_key=os.environ["GEMINI_API_KEY"])
 
13
 
14
- # 모델 설정 (기존 코드와 동일)
 
 
 
 
 
 
 
 
 
 
15
  generation_config = {
16
- "temperature": 0.7, # temperature 값 조정 (보고서/계획서는 창의성보다 정확성이 중요할 수 있음)
17
  "top_p": 0.95,
18
  "top_k": 40,
19
  "max_output_tokens": 4096,
@@ -21,112 +37,218 @@ generation_config = {
21
  }
22
 
23
  model = genai.GenerativeModel(
24
- model_name="gemini-2.0-flash-exp", # 필요에 따라 모델 변경 가능 (pro, flash 등)
25
  generation_config=generation_config,
26
  )
27
 
28
- # PDF 텍스트 추출 함수
29
  def extract_text_from_pdf(uploaded_pdf_file):
30
- """PDF 파일에서 텍스트를 추출합니다."""
31
  text = ""
32
  try:
33
- pdf_reader = PyPDF2.PdfReader(uploaded_pdf_file)
34
- for page_num in range(len(pdf_reader.pages)):
35
- page = pdf_reader.pages[page_num]
36
- text += page.extract_text()
37
  except Exception as e:
38
- st.error(f"PDF 파일 처리 오류: {e}")
39
  return None
40
  return text
41
 
42
- def generate_report_or_plan(pdf_text, user_instructions):
43
- """
44
- PDF 텍스트와 사용자 지시사항을 기반으로 보고서 또는 계획서를 생성합니다.
45
- Args:
46
- pdf_text: 추출된 PDF 텍스트
47
- user_instructions: 사용자 지시사항
48
- Returns:
49
- str: 생성된 보고서 또는 계획서 텍스트
50
- """
51
  full_text = ""
52
  try:
53
- prompt_text = f"""
54
- # PDF 문서 분석 보고서/계획서 작성
55
 
56
- ## PDF 문서 내용:
57
  ```
58
- {pdf_text}
59
  ```
60
 
61
  ## 사용자 지시사항:
62
- {user_instructions}
63
 
64
  ---
65
 
66
- **지시사항에 따라 PDF 문서 내용을 분석하고, 보고서 또는 계획서를 작성하세요.**
67
- **한국어로 작성하며, 명확하고 논리적인 구조로 작성해주세요.**
68
- **필요하다면, PDF 문서 내용을 참고하여 추가적인 정보를 생성하거나 확장해도 좋습니다.**
69
- **만약 PDF 내용이 부족하거나 지시사항을 수행하기 어렵다면, 솔직하게 답변해주세요.**
70
-
71
- """ # 프롬프트 개선: 명확하고 구체적인 지시 포함
 
 
 
 
72
 
73
- response = model.generate_content([prompt_text]) # 이미지 대신 텍스트 프롬프트만 사용
74
- for chunk in response.text:
75
- full_text += chunk
76
- time.sleep(0.01)
77
- st.session_state.generated_result += chunk
78
- output_area.markdown(st.session_state.generated_result, unsafe_allow_html=True)
79
- except Exception as e:
80
- st.error(f"보고서/계획서 생성 중 오류 발생: {str(e)}")
81
- return full_text
82
 
83
- # Streamlit 인터페이스 설정 (기존 코드와 유사)
84
- colored_header(
85
- label="PDF 보고서/계획서 자동 작성 AI",
86
- description="PDF 서식 파일을 업로드하고 지시사항을 입력하면 보고서/계획서를 작성해줍니다.",
87
- color_name="blue-70", # 색상 변경
88
- )
89
 
90
- # 파일 업로드 버튼 (PDF 파일만 허용)
91
- uploaded_pdf_file = st.file_uploader("PDF 서식 파일 업로드", type=["pdf"])
92
 
93
- # 지시사항 입력 텍스트 영역 추가
94
- user_instructions = st.text_area("작성 지시사항 입력 (예: '이 PDF를 바탕으로 2024년 마케팅 계획 보고서를 작성해주세요.', '핵심 내용을 요약하고, 개선 방안을 3가지 제시해주세요.')",
95
- placeholder="자세하고 명확하게 지시사항을 입력하세요.") # placeholder 추가
96
 
97
- generate_button = st.button("보고서/계획서 생성")
 
 
 
 
 
 
 
 
 
 
98
 
99
- output_area = st.empty() # 출력 영역 (기존 코드와 동일)
 
 
 
 
100
 
101
- if generate_button and uploaded_pdf_file and user_instructions: # 지시사항도 입력되었는지 확인
102
  try:
103
- pdf_text = extract_text_from_pdf(uploaded_pdf_file) # PDF 텍스트 추출
104
- if pdf_text: # 텍스트 추출 성공 시
105
- st.session_state.generated_result = "" # 결과 초기화
106
- result = generate_report_or_plan(pdf_text, user_instructions) # 보고서/계획서 생성
107
-
108
- html_text = markdown.markdown(result, extensions=['tables']) # Markdown 형식으로 변환 (필요에 따라 조정)
109
- output_area.markdown(html_text, unsafe_allow_html=True)
110
 
111
- if st.button("출력 내용 복사", key="copy_button_1"): # 복사 버튼 (기존 코드와 동일)
112
- pyperclip.copy(result)
113
- st.success("복사되었습니다!")
114
- else:
115
- st.warning("PDF 파일에서 텍스트를 추출하는데 실패했습니다. 파일 형식을 확인해주세요.")
 
116
 
117
- except Exception as e:
118
- st.error(f"보고서/계획서 생성 중 오류 발생: {str(e)}")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
119
 
120
  elif generate_button and not uploaded_pdf_file:
121
- st.warning("PDF 서식 파일을 업로드하세요.")
122
  elif generate_button and not user_instructions:
123
- st.warning("작성 지시사항을 입력하세요.")
124
 
125
- # 이미 생성된 결과가 있을 경우 출력 (기존 코드와 동일)
126
- if "generated_result" in st.session_state and st.session_state.generated_result:
127
  html_text = markdown.markdown(st.session_state.generated_result, extensions=['tables'])
128
  output_area.markdown(html_text, unsafe_allow_html=True)
129
 
130
- if st.button("출력 내용 복사", key="copy_button_2"):
 
131
  pyperclip.copy(st.session_state.generated_result)
132
- st.success("복사되었습니다!")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  import os
2
  import time
3
  import streamlit as st
4
+ from PIL import Image
5
  import google.generativeai as genai
6
  from streamlit_extras.colored_header import colored_header
7
  import markdown
8
  import pyperclip
9
+ import pdfminer.high_level
10
+ from io import StringIO
11
+ from docx import Document
12
+ from docx.shared import Inches
13
+ from streamlit_lottie import st_lottie
14
+ import json
15
 
16
+ # --- 설정 ---
17
+ PAGE_CONFIG = {"page_title":"교육 계획 및 보고서 작성 AI", "page_icon":":pencil2:"}
18
+ st.set_page_config(**PAGE_CONFIG)
19
 
20
+ # --- 로딩 애니메이션 ---
21
+ def load_lottiefile(filepath):
22
+ with open(filepath, "r") as f:
23
+ return json.load(f)
24
+
25
+ lottie_loading = load_lottiefile("lottie/loading.json")
26
+
27
+ # Google Gemini API 키 설정
28
+ genai.configure(api_key=st.secrets["GEMINI_API_KEY"])
29
+
30
+ # 모델 설정
31
  generation_config = {
32
+ "temperature": 0.7,
33
  "top_p": 0.95,
34
  "top_k": 40,
35
  "max_output_tokens": 4096,
 
37
  }
38
 
39
  model = genai.GenerativeModel(
40
+ model_name="gemini-pro",
41
  generation_config=generation_config,
42
  )
43
 
44
+ # --- PDF 텍스트 추출 함수 ---
45
  def extract_text_from_pdf(uploaded_pdf_file):
 
46
  text = ""
47
  try:
48
+ output_string = StringIO()
49
+ pdfminer.high_level.extract_text_to_fp(uploaded_pdf_file, output_string)
50
+ text = output_string.getvalue()
 
51
  except Exception as e:
52
+ st.error(f"PDF 파일 처리 오류 (pdfminer.six): {e}")
53
  return None
54
  return text
55
 
56
+ # --- 보고서/계획서 생성 함수 (교육 계획 및 보고서에 맞춘 프롬프트) ---
57
+ def generate_report_or_plan(pdf_text, user_instructions, report_type="계획서"):
 
 
 
 
 
 
 
58
  full_text = ""
59
  try:
60
+ prompt_template = f"""
61
+ # 교육 {report_type} 자동 작성 도구
62
 
63
+ ## PDF 서식 파일 내용:
64
  ```
65
+ {{pdf_text}}
66
  ```
67
 
68
  ## 사용자 지시사항:
69
+ {{user_instructions}}
70
 
71
  ---
72
 
73
+ **[교육 {report_type} 작성 지시사항]**
74
+ 1. PDF 서식 파일의 내용을 **정확하게 분석**하고, {report_type} 작성에 필요한 정보를 추출합니다.
75
+ 2. 사용자 지시사항을 **최대한 반영**하여 교육 {report_type} 초안을 작성합니다.
76
+ 3. 작성하는 {report_type}는 **학교 교육기관에서 사용하는 공식적인 문서 형식**을 따릅니다.
77
+ 4. 내용은 **한국어로 작성**하며, **명확하고 논리적인 구조**로 구성합니다.
78
+ 5. 교육 {report_type}의 목적, 목표, 주요 내용, 실행 방법, 기대 효과, 평가 방법 등을 **필수적으로 포함**합니다.
79
+ 6. 필요한 경우, PDF 내용 외에 **교육 관련 일반적인 정보나 창의적인 아이디어**를 추가하여 내용을 풍부하게 만듭니다.
80
+ 7. **목차, 제목, 소제목, 번호 매기기, 목록** 등을 활용하여 문서의 가독성을 높입니다. (예시: 1. 제목, 1.1 소제목, (1) 내용, - 목록)
81
+ 8. {report_type} 유형 (사업 계획서, 교육활동 계획서, 프로젝트 학습 계획서 등) 에 맞춰 **적절한 형식과 필수 항목**을 포함합니다.
82
+ 9. 만약 PDF 내용이 불충분하거나 지시사항을 명확히 이해하기 어렵다면, 솔직하게 "**PDF 서식 파일 내용이 부족하거나, 지시사항이 명확하지 않아 교육 {report_type} 초안 작성이 어렵습니다.**" 라고 답변해주세요.
83
 
84
+ ---
 
 
 
 
 
 
 
 
85
 
86
+ # 작성된 교육 {report_type} 초안:
 
 
 
 
 
87
 
88
+ """
 
89
 
90
+ prompt_text = prompt_template.format(pdf_text=pdf_text, user_instructions=user_instructions, report_type=report_type)
 
 
91
 
92
+ response = model.generate_content([prompt_text], stream=True)
93
+ for chunk in response.parts:
94
+ if hasattr(chunk, "text"):
95
+ chunk_text = chunk.text
96
+ full_text += chunk_text
97
+ time.sleep(0.01)
98
+ st.session_state.generated_result += chunk_text
99
+ output_area.markdown(st.session_state.generated_result, unsafe_allow_html=True)
100
+ except Exception as e:
101
+ st.error(f"교육 {report_type} 생성 중 오류 발생: {str(e)}")
102
+ return full_text
103
 
104
+ # --- DOCX 파일 생성 함수 ---
105
+ def create_docx_file(text, filename="report.docx"):
106
+ document = Document()
107
+ for line in text.splitlines():
108
+ document.add_paragraph(line)
109
 
 
110
  try:
111
+ document.save(filename)
112
+ return filename
113
+ except Exception as e:
114
+ st.error(f"DOCX 파일 생성 오류: {e}")
115
+ return None
 
 
116
 
117
+ # --- Streamlit UI ---
118
+ colored_header(
119
+ label="교육 계획 및 보고서 작성 AI",
120
+ description="PDF 서식 파일을 업로드하고 지시사항을 입력하면, 교육 계획서 또는 보고서 초안을 작성해줍니다.",
121
+ color_name="blue-70",
122
+ )
123
 
124
+ # --- UI 요소 배치 ---
125
+ col1, col2 = st.columns([1, 1])
126
+
127
+ with col1:
128
+ uploaded_pdf_file = st.file_uploader("PDF 서식 파일 업로드", type=["pdf"])
129
+
130
+ with col2:
131
+ report_type = st.selectbox("문서 유형 선택", ["계획서", "보고서", "제안서", "기타"])
132
+
133
+ user_instructions = st.text_area("작성 지시사항",
134
+ placeholder="""# 계획서 작성 지시사항 예시:
135
+ - 2025학년도 SW 교육 운영 계획서를 작성해주세요.
136
+ - PDF 서식 파일을 참고하여, 계획의 개요, 운영 방침, 세부 프로그램, 예산 계획, 기대 효과를 포함해주세요.
137
+ - 학교 특성 및 학생 요구 분석 내용을 반영하여 구체적으로 작성해주세요.
138
+
139
+ # 보고서 작성 지시사항 예시:
140
+ - 2025학년도 학생생성성교육과정 운영 결과 보고서를 작성해주세요.
141
+ - PDF 서식 파일을 참고하여, 운영 개요, 운영 결과 분석, 주요 성과, 문제점 및 개선 방안, 향후 계획을 포함해주세요.
142
+ - 객관적인 데이터와 구체적인 사례를 바탕으로 보고서를 작성해주세요.""",
143
+ height=300)
144
+
145
+ generate_button = st.button("계획서/보고서 초안 생성", use_container_width=True)
146
+
147
+ output_area = st.empty()
148
+
149
+ if "generated_result" not in st.session_state:
150
+ st.session_state.generated_result = ""
151
+
152
+ # --- 생성 및 결과 출력 ---
153
+ if generate_button and uploaded_pdf_file and user_instructions:
154
+ with st.spinner(text=f"교육 {report_type} 초안 생성 중..."):
155
+ try:
156
+ # 1. PDF 텍스트 추출
157
+ pdf_text = extract_text_from_pdf(uploaded_pdf_file)
158
+ if pdf_text:
159
+ # 2. 보고서/계획서 생성 (Gemini Pro)
160
+ st.session_state.generated_result = ""
161
+ result_text = generate_report_or_plan(pdf_text, user_instructions, report_type)
162
+
163
+ if result_text:
164
+ # 3. Markdown to HTML 변환 및 출력
165
+ html_text = markdown.markdown(result_text, extensions=['tables'])
166
+ output_area.markdown(html_text, unsafe_allow_html=True)
167
+
168
+ # 4. 다운로드 버튼 (다양한 형식)
169
+ st.download_button(
170
+ label="📝 텍스트 파일 (.txt) 다운로드",
171
+ data=result_text.encode("utf-8"),
172
+ file_name=f"{report_type}_초안.txt",
173
+ mime="text/plain",
174
+ key="download_txt"
175
+ )
176
+ st.download_button(
177
+ label="📄 Markdown 파일 (.md) 다운로드",
178
+ data=result_text.encode("utf-8"),
179
+ file_name=f"{report_type}_초안.md",
180
+ mime="text/markdown",
181
+ key="download_md"
182
+ )
183
+ docx_filename = create_docx_file(result_text, filename=f"{report_type}_초안.docx")
184
+ if docx_filename:
185
+ with open(docx_filename, "rb") as f:
186
+ st.download_button(
187
+ label="🗂️ Word 파일 (.docx) 다운로드",
188
+ data=f,
189
+ file_name=docx_filename,
190
+ mime="application/vnd.openxmlformats-officedocument.wordprocessingml.document",
191
+ key="download_docx"
192
+ )
193
+ else:
194
+ st.warning(f"교육 {report_type} 초안 생성에 실패했습니다. 지시사항 및 PDF 내용을 확인해주세요.")
195
+
196
+ else:
197
+ st.warning("PDF 파일에서 텍스트 추출에 실패했습니다.")
198
+
199
+ except Exception as e:
200
+ st.error(f"오류 발생: {e}")
201
 
202
  elif generate_button and not uploaded_pdf_file:
203
+ st.warning("PDF 서식 파일을 업로드해주세요.")
204
  elif generate_button and not user_instructions:
205
+ st.warning("작성 지시사항을 입력해주세요.")
206
 
207
+ # --- 기존 생성 결과 출력 ---
208
+ if st.session_state.generated_result:
209
  html_text = markdown.markdown(st.session_state.generated_result, extensions=['tables'])
210
  output_area.markdown(html_text, unsafe_allow_html=True)
211
 
212
+ # 복사 버튼
213
+ if st.button("📝 출력 내용 복사", key="copy_button_result", use_container_width=True):
214
  pyperclip.copy(st.session_state.generated_result)
215
+ st.success("클립보드에 복사되었습니다!", icon="✅")
216
+
217
+ # --- FAQ 섹션 (최하단으로 이동) ---
218
+ with st.expander("❓ 교육 계획 및 보고서 작성 AI FAQ"):
219
+ st.write("""
220
+ **Q1. 교육 계획 및 보고서 작성 AI는 어떤 기능을 제공하나요?**
221
+
222
+ A. 이 앱은 선생님들의 **각종 교육 계획서 및 보고서 작성**을 돕기 위해 개발된 AI 도구입니다. PDF 서식 파일을 업로드하고 작성 지시사항을 입력하면, **사업 계획서, 교육활동 계획서, 프로젝트 학습 계획서, 결과 보고서** 등 다양한 교육 관련 문서 초안을 빠르게 생성할 수 있습니다. AI는 서식 파일 내용과 지시사항을 분석하여 문서의 구조와 내용을 자동으로 구성하며, 사용자 정의에 따라 수정 및 추가 작업이 가능합니다.
223
+
224
+ **Q2. 어떤 종류의 교육 문��� 작성을 지원하나요?**
225
+
226
+ A. 본 AI는 학교 및 교육기관에서 일반적으로 사용하는 다양한 교육 문서 작성을 지원합니다. 주요 지원 문서는 다음과 같습니다:
227
+ * **계획서:** 사업 계획서, 교육활동 계획서, 프로젝트 학습 계획서, 연간 운영 계획서, 예산 계획서, 행사 계획서 등
228
+ * **보고서:** 결과 보고서, 운영 보고서, 평가 보고서, 사업 결과 보고서, 행사 결과 보고서, 분석 보고서 등
229
+ * **제안서:** 프로그램 제안서, 사업 제안서, 개선 제안서 등
230
+ * **기타 교육 관련 문서:** 학습 자료, 안내 자료, 홍보 자료 등 (지시사항에 따라 다양하게 활용 가능)
231
+
232
+ **Q3. PDF 서식 파일은 왜 필요한가요?**
233
+
234
+ A. PDF 서식 파일은 AI가 **문서의 기본적인 구조와 형식**을 파악하고, **필수 포함 항목**을 인식하는 데 중요한 역할을 합니다. 서식 파일을 통해 AI는 사용자가 작성하려는 문서의 유형을 더 정확하게 이해하고, 그에 맞춰 **더욱 적합한 초안**을 생성할 수 있습니다. 만약 서식 파일이 없다면, AI는 일반적인 문서 형식에 따라 초안을 생성하지만, 특정 서식에 최적화된 결과를 얻기 어려울 수 있습니다.
235
+
236
+ **Q4. 작성 지시사항을 효과적으로 작성하는 방법은 무엇인가요?**
237
+
238
+ A. AI가 사용자의 의도를 정확하게 파악하고, 만족스러운 결과물을 생성하기 위해서는 **구체적이고 명확한 지시사항**을 입력하는 것이 중요합니다. 다음과 같은 내용을 포함하여 지시사항을 작성해보세요:
239
+ * **문서의 유형:** (예: 2025학년도 SW 교육 운영 계획서, 2024학년도 교육과정 운영 결과 보고서)
240
+ * **문서의 목적:** (예: SW 교육 운영 계획 수립, 교육과정 운영 결과 보고)
241
+ * **PDF 서식 파일에서 참고할 내용:** (예: 서식 파일의 '세부 프로그램' 섹션 참고, 서식 파일의 양식에 맞춰 작성)
242
+ * **필수 포함 내용:** (예: SWOT 분석 결과 포함, 예산 계획 상세하게 작성, 데이터 시각화 자료 포함)
243
+ * **문서의 특정 스타일 또는 강조점:** (예: 표 형식으로 깔끔하게 작성, 핵심 내용을 요약하여 작성, 실현 가능성을 강조)
244
+
245
+ **Q5. 생성된 초안은 어떻게 활용해야 하나요?**
246
+
247
+ A. AI가 생성한 초안은 **완벽한 최종 문서가 아닌, 초안**입니다. 초안을 바탕으로 다음과 같은 단계를 거쳐 문서를 완성하는 것을 권장합니다:
248
+ 1. **초안 검토:** 생성된 초안을 꼼꼼히 읽고, 내용의 정확성, 논리성, 형식의 적절성을 검토합니다.
249
+ 2. **내용 수정 및 보완:** 필요에 따라 내용을 수정, 추가, 삭제하고, 문장을 다듬습니다. 특히, AI가 놓칠 수 있는 세부 사항이나 맥락을 보완합니다.
250
+ 3. **서식 조정:** 학교 또는 기관의 공식 문서 서식에 맞게 최종적으로 서식을 조정합니다.
251
+ 4. **최종 검토 및 승인:** 완성된 문서를 최종적으로 검토하고, 필요한 경우 상급자에게 보고하여 승인을 받습니다.
252
+
253
+ AI는 문서 작성 시간을 단축하고 초안 작성의 부담을 줄여주는 유용한 도구이지만, 최종 문서의 완성도는 사용자의 검토 및 수정 작업에 달려 있습니다. AI를 효율적으로 활용하여 교육 문서 작성 업무를 스마트하게 처리해보세요!
254
+ """)