kimrang commited on
Commit
bce6ac5
·
verified ·
1 Parent(s): c025823

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +108 -24
app.py CHANGED
@@ -38,6 +38,15 @@ def debug_file_system():
38
  try:
39
  sub_items = os.listdir(item_path)
40
  print(f" └── 내용: {sub_items}")
 
 
 
 
 
 
 
 
 
41
  except Exception as e:
42
  print(f" └── 접근 불가: {e}")
43
  else:
@@ -48,7 +57,6 @@ def debug_file_system():
48
 
49
  # 환경 변수 확인
50
  print(f"🔑 GROQ_API_KEY 설정됨: {'GROQ_API_KEY' in os.environ}")
51
-
52
  print("=" * 50)
53
 
54
  # 앱 시작 시 디버깅 실행
@@ -60,8 +68,12 @@ def find_vectorstore_folders():
60
  print(f"현재 디렉토리: {current_dir}")
61
 
62
  # 모든 파일과 폴더 확인
63
- all_items = os.listdir(current_dir)
64
- print(f"현재 디렉토리 내 모든 항목들: {all_items}")
 
 
 
 
65
 
66
  # 예상되는 벡터스토어 폴더들
67
  expected_folders = ['vectorstore1', 'vectorstore2', 'vectorstore3']
@@ -79,8 +91,18 @@ def find_vectorstore_folders():
79
  has_all_files = all(file in folder_contents for file in required_files)
80
 
81
  if has_all_files:
82
- vectorstore_folders.append(folder_name)
83
- print(f"✅ {folder_name} - 모든 필수 파일 존재")
 
 
 
 
 
 
 
 
 
 
84
  else:
85
  missing_files = [f for f in required_files if f not in folder_contents]
86
  print(f"❌ {folder_name} - 누락된 파일: {missing_files}")
@@ -92,6 +114,7 @@ def find_vectorstore_folders():
92
 
93
  if not vectorstore_folders:
94
  print("❌ 사용 가능한 벡터스토어 폴더를 찾을 수 없습니다")
 
95
  else:
96
  print(f"✅ 총 {len(vectorstore_folders)}개의 벡터스토어 폴더를 찾았습니다: {vectorstore_folders}")
97
 
@@ -101,18 +124,29 @@ def load_all_vectorstores():
101
  """모든 벡터스토어를 로드하고 통합하는 함수"""
102
  global vectorstores, embeddings, combined_vectorstore
103
 
104
- if not embeddings:
105
- embeddings = HuggingFaceEmbeddings(
106
- model_name="sentence-transformers/all-MiniLM-L6-v2"
107
- )
 
 
 
 
 
 
108
 
109
  # 벡터스토어 폴더들 찾기
110
  folders = find_vectorstore_folders()
111
 
 
 
 
 
112
  loaded_vectorstores = []
113
 
114
  for folder_name in folders:
115
  try:
 
116
  vectorstore = FAISS.load_local(
117
  f"./{folder_name}",
118
  embeddings,
@@ -120,24 +154,41 @@ def load_all_vectorstores():
120
  )
121
  vectorstores[folder_name] = vectorstore
122
  loaded_vectorstores.append(vectorstore)
123
- print(f"✅ {folder_name} 로드 완료")
 
 
 
 
124
  except Exception as e:
125
  print(f"❌ {folder_name} 로드 실패: {e}")
 
 
126
 
127
- # 벡터스토어들을 통합 (첫 번째를 기본으로 하고 나머지를 merge)
128
  if loaded_vectorstores:
129
- combined_vectorstore = loaded_vectorstores[0]
130
- for vs in loaded_vectorstores[1:]:
131
- try:
 
 
 
132
  combined_vectorstore.merge_from(vs)
133
- print(f"✅ 벡터스토어 통합 완료")
134
- except Exception as e:
135
- print(f"❌ 벡터스토어 통합 실패: {e}")
136
- print(f"🎉 총 {len(loaded_vectorstores)}개의 벡터스토어가 통합되었습니다")
137
-
138
- return len(loaded_vectorstores) > 0
 
 
 
 
 
 
 
 
139
 
140
- # 질문 리스트 (기존과 동일)
141
  suggested_questions = [
142
  '교원 신규 임용은 어떻게 하나요?',
143
  '교원 연구년 기간은 어떻게 되나요?',
@@ -161,19 +212,23 @@ suggested_questions = [
161
  '안전사고예방계획은 어디에 제출해야 하나요?'
162
  ]
163
 
164
- # 프롬프트 템플릿 (기존과 동일)
165
  prompt_template = """당신은 한남대학교 규정집 도우미입니다.
166
  반드시 한국어로만 답변해주세요. 영어나 다른 언어는 절대 사용하지 마세요.
167
  주어진 문서 내용을 바탕으로 질문에 대해 정확하고 친절하게 한국어로 답변해주세요.
 
168
  참고 문서:
169
  {context}
 
170
  질문: {question}
 
171
  답변 지침:
172
  - 이용자를 반기는 인사로 시작하세요
173
  - 반드시 한국어로만 답변하세요
174
  - 정중하고 친근한 말투를 사용하세요
175
  - 구체적이고 도움이 되는 정보를 제공하세요
176
  - 문서에서 답을 찾을 수 없으면 "죄송하지만 해당 정보를 규정집에서 찾을 수 없습니다"라고 답변하세요
 
177
  한국어 답변:"""
178
 
179
  prompt = PromptTemplate(
@@ -196,10 +251,10 @@ def respond_with_groq(question, selected_q, model):
196
 
197
  # 통합된 벡터스토어가 로드되지 않은 경우
198
  if not combined_vectorstore:
199
- return "❌ 사용 가능한 벡터스토어가 없습니다. 관리자에게 문의하세요."
200
 
201
  try:
202
- print(f"✅ 통합된 벡터스토어를 사용하여 검색 중...")
203
 
204
  # LLM 설정
205
  llm = ChatGroq(
@@ -220,6 +275,7 @@ def respond_with_groq(question, selected_q, model):
220
 
221
  # 답변 생성
222
  result = qa_chain({"query": question})
 
223
  return result['result']
224
 
225
  except Exception as e:
@@ -234,9 +290,28 @@ def update_question(selected):
234
  return selected
235
  return ""
236
 
 
 
 
 
 
 
 
 
 
 
 
 
 
237
  # 앱 시작시 벡터스토어들 로드
 
238
  vectorstores_loaded = load_all_vectorstores()
239
 
 
 
 
 
 
240
  # Gradio 인터페이스 생성
241
  with gr.Blocks(title="한남대학교 Q&A") as interface:
242
  gr.HTML("""
@@ -245,6 +320,15 @@ with gr.Blocks(title="한남대학교 Q&A") as interface:
245
  <p>한남대학교 규정집에 대한 질문에 답변해드립니다.</p>
246
  </div>
247
  """)
 
 
 
 
 
 
 
 
 
248
 
249
  with gr.Row():
250
  with gr.Column(scale=1):
 
38
  try:
39
  sub_items = os.listdir(item_path)
40
  print(f" └── 내용: {sub_items}")
41
+
42
+ # 벡터스토어 관련 파일 크기 확인
43
+ if item.startswith('vectorstore'):
44
+ for sub_item in sub_items:
45
+ sub_path = os.path.join(item_path, sub_item)
46
+ if os.path.isfile(sub_path):
47
+ size = os.path.getsize(sub_path)
48
+ print(f" └── {sub_item}: {size:,} bytes")
49
+
50
  except Exception as e:
51
  print(f" └── 접근 불가: {e}")
52
  else:
 
57
 
58
  # 환경 변수 확인
59
  print(f"🔑 GROQ_API_KEY 설정됨: {'GROQ_API_KEY' in os.environ}")
 
60
  print("=" * 50)
61
 
62
  # 앱 시작 시 디버깅 실행
 
68
  print(f"현재 디렉토리: {current_dir}")
69
 
70
  # 모든 파일과 폴더 확인
71
+ try:
72
+ all_items = os.listdir(current_dir)
73
+ print(f"현재 디렉토리 내 모든 항목들: {all_items}")
74
+ except Exception as e:
75
+ print(f"디렉토리 읽기 오류: {e}")
76
+ return []
77
 
78
  # 예상되는 벡터스토어 폴더들
79
  expected_folders = ['vectorstore1', 'vectorstore2', 'vectorstore3']
 
91
  has_all_files = all(file in folder_contents for file in required_files)
92
 
93
  if has_all_files:
94
+ # 파일 크기도 확인
95
+ faiss_path = os.path.join(folder_path, 'index.faiss')
96
+ pkl_path = os.path.join(folder_path, 'index.pkl')
97
+
98
+ faiss_size = os.path.getsize(faiss_path) if os.path.exists(faiss_path) else 0
99
+ pkl_size = os.path.getsize(pkl_path) if os.path.exists(pkl_path) else 0
100
+
101
+ if faiss_size > 0 and pkl_size > 0:
102
+ vectorstore_folders.append(folder_name)
103
+ print(f"✅ {folder_name} - 모든 필수 파일 존재 (FAISS: {faiss_size:,}bytes, PKL: {pkl_size:,}bytes)")
104
+ else:
105
+ print(f"❌ {folder_name} - 파일이 비어있음 (FAISS: {faiss_size}bytes, PKL: {pkl_size}bytes)")
106
  else:
107
  missing_files = [f for f in required_files if f not in folder_contents]
108
  print(f"❌ {folder_name} - 누락된 파일: {missing_files}")
 
114
 
115
  if not vectorstore_folders:
116
  print("❌ 사용 가능한 벡터스토어 폴더를 찾을 수 없습니다")
117
+ print("💡 허깅페이스 스페이스에 벡터스토어 폴더들이 제대로 업로드되었는지 확인하세요")
118
  else:
119
  print(f"✅ 총 {len(vectorstore_folders)}개의 벡터스토어 폴더를 찾았습니다: {vectorstore_folders}")
120
 
 
124
  """모든 벡터스토어를 로드하고 통합하는 함수"""
125
  global vectorstores, embeddings, combined_vectorstore
126
 
127
+ print("🔄 임베딩 모델 로딩 중...")
128
+ try:
129
+ if not embeddings:
130
+ embeddings = HuggingFaceEmbeddings(
131
+ model_name="sentence-transformers/all-MiniLM-L6-v2"
132
+ )
133
+ print("✅ 임베딩 모델 로드 완료")
134
+ except Exception as e:
135
+ print(f"❌ 임베딩 모델 로드 실패: {e}")
136
+ return False
137
 
138
  # 벡터스토어 폴더들 찾기
139
  folders = find_vectorstore_folders()
140
 
141
+ if not folders:
142
+ print("❌ 로드할 벡터스토어 폴더가 없습니다")
143
+ return False
144
+
145
  loaded_vectorstores = []
146
 
147
  for folder_name in folders:
148
  try:
149
+ print(f"🔄 {folder_name} 로딩 중...")
150
  vectorstore = FAISS.load_local(
151
  f"./{folder_name}",
152
  embeddings,
 
154
  )
155
  vectorstores[folder_name] = vectorstore
156
  loaded_vectorstores.append(vectorstore)
157
+
158
+ # 벡터스토어 정보 출력
159
+ doc_count = vectorstore.index.ntotal
160
+ print(f"✅ {folder_name} 로드 완료 (문서 수: {doc_count})")
161
+
162
  except Exception as e:
163
  print(f"❌ {folder_name} 로드 실패: {e}")
164
+ import traceback
165
+ traceback.print_exc()
166
 
167
+ # 벡터스토어들을 통합
168
  if loaded_vectorstores:
169
+ print("🔄 벡터스토어 통합 중...")
170
+ try:
171
+ combined_vectorstore = loaded_vectorstores[0]
172
+ total_docs = combined_vectorstore.index.ntotal
173
+
174
+ for i, vs in enumerate(loaded_vectorstores[1:], 1):
175
  combined_vectorstore.merge_from(vs)
176
+ total_docs += vs.index.ntotal
177
+ print(f"✅ 벡터스토어 {i+1} 통합 완료")
178
+
179
+ print(f"🎉 총 {len(loaded_vectorstores)}개의 벡터스토어가 통합되었습니다 (총 문서 수: {total_docs})")
180
+ return True
181
+
182
+ except Exception as e:
183
+ print(f"❌ 벡터스토어 통합 실패: {e}")
184
+ import traceback
185
+ traceback.print_exc()
186
+ return False
187
+ else:
188
+ print("❌ 로드된 벡터스토어가 없습니다")
189
+ return False
190
 
191
+ # 질문 리스트
192
  suggested_questions = [
193
  '교원 신규 임용은 어떻게 하나요?',
194
  '교원 연구년 기간은 어떻게 되나요?',
 
212
  '안전사고예방계획은 어디에 제출해야 하나요?'
213
  ]
214
 
215
+ # 프롬프트 템플릿
216
  prompt_template = """당신은 한남대학교 규정집 도우미입니다.
217
  반드시 한국어로만 답변해주세요. 영어나 다른 언어는 절대 사용하지 마세요.
218
  주어진 문서 내용을 바탕으로 질문에 대해 정확하고 친절하게 한국어로 답변해주세요.
219
+
220
  참고 문서:
221
  {context}
222
+
223
  질문: {question}
224
+
225
  답변 지침:
226
  - 이용자를 반기는 인사로 시작하세요
227
  - 반드시 한국어로만 답변하세요
228
  - 정중하고 친근한 말투를 사용하세요
229
  - 구체적이고 도움이 되는 정보를 제공하세요
230
  - 문서에서 답을 찾을 수 없으면 "죄송하지만 해당 정보를 규정집에서 찾을 수 없습니다"라고 답변하세요
231
+
232
  한국어 답변:"""
233
 
234
  prompt = PromptTemplate(
 
251
 
252
  # 통합된 벡터스토어가 로드되지 않은 경우
253
  if not combined_vectorstore:
254
+ return "❌ 사용 가능한 벡터스토어가 없습니다. 벡터스토어 파일들이 제대로 업로드되었는지 확인하세요."
255
 
256
  try:
257
+ print(f"✅ 통합된 벡터스토어를 사용하여 검색 중... (질문: {question})")
258
 
259
  # LLM 설정
260
  llm = ChatGroq(
 
275
 
276
  # 답변 생성
277
  result = qa_chain({"query": question})
278
+ print(f"✅ 답변 생성 완료")
279
  return result['result']
280
 
281
  except Exception as e:
 
290
  return selected
291
  return ""
292
 
293
+ def get_system_status():
294
+ """시스템 상태를 반환하는 함수"""
295
+ status = []
296
+ status.append(f"🔑 API 키: {'✅ 설정됨' if GROQ_API_KEY else '❌ 없음'}")
297
+ status.append(f"🤖 임베딩: {'✅ 로드됨' if embeddings else '❌ 없음'}")
298
+ status.append(f"📚 벡터스토어: {'✅ 로드됨' if combined_vectorstore else '❌ 없음'}")
299
+
300
+ if combined_vectorstore:
301
+ doc_count = combined_vectorstore.index.ntotal
302
+ status.append(f"📄 총 문서 수: {doc_count:,}개")
303
+
304
+ return "\n".join(status)
305
+
306
  # 앱 시작시 벡터스토어들 로드
307
+ print("🚀 애플리케이션 시작 - 벡터스토어 로딩 중...")
308
  vectorstores_loaded = load_all_vectorstores()
309
 
310
+ if vectorstores_loaded:
311
+ print("🎉 모든 벡터스토어가 성공적으로 로드되었습니다!")
312
+ else:
313
+ print("❌ 벡터스토어 로드에 실패했습니다. 파일 업로드를 확인하세요.")
314
+
315
  # Gradio 인터페이스 생성
316
  with gr.Blocks(title="한남대학교 Q&A") as interface:
317
  gr.HTML("""
 
320
  <p>한남대학교 규정집에 대한 질문에 답변해드립니다.</p>
321
  </div>
322
  """)
323
+
324
+ # 시스템 상태 표시
325
+ with gr.Row():
326
+ system_status = gr.Textbox(
327
+ label="🔧 시스템 상태",
328
+ value=get_system_status(),
329
+ lines=4,
330
+ interactive=False
331
+ )
332
 
333
  with gr.Row():
334
  with gr.Column(scale=1):