kimrang commited on
Commit
c428f9f
·
verified ·
1 Parent(s): 1fc4c42

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +24 -95
app.py CHANGED
@@ -38,15 +38,6 @@ def debug_file_system():
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,6 +48,7 @@ def debug_file_system():
57
 
58
  # 환경 변수 확인
59
  print(f"🔑 GROQ_API_KEY 설정됨: {'GROQ_API_KEY' in os.environ}")
 
60
  print("=" * 50)
61
 
62
  # 앱 시작 시 디버깅 실행
@@ -68,12 +60,8 @@ def find_vectorstore_folders():
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,18 +79,8 @@ def find_vectorstore_folders():
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,7 +92,6 @@ def find_vectorstore_folders():
114
 
115
  if not vectorstore_folders:
116
  print("❌ 사용 가능한 벡터스토어 폴더를 찾을 수 없습니다")
117
- print("💡 허깅페이스 스페이스에 벡터스토어 폴더들이 제대로 업로드되었는지 확인하세요")
118
  else:
119
  print(f"✅ 총 {len(vectorstore_folders)}개의 벡터스토어 폴더를 찾았습니다: {vectorstore_folders}")
120
 
@@ -124,29 +101,18 @@ def load_all_vectorstores():
124
  """모든 벡터스토어를 로드하고 통합하는 함수"""
125
  global vectorstores, embeddings, combined_vectorstore
126
 
127
- print("🔄 임베딩 모델 로딩 중...")
128
- try:
129
- if not embeddings:
130
- embeddings = HuggingFaceEmbeddings(
131
- model_name="jhgan/ko-sbert-nli"
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,41 +120,24 @@ def load_all_vectorstores():
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,23 +161,19 @@ suggested_questions = [
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,10 +196,10 @@ def respond_with_groq(question, selected_q, model):
251
 
252
  # 통합된 벡터스토어가 로드되지 않은 경우
253
  if not combined_vectorstore:
254
- return "❌ 사용 가능한 벡터스토어가 없습니다. 벡터스토어 파일들이 제대로 업로드되었는지 확인하세요."
255
 
256
  try:
257
- print(f"✅ 통합된 벡터스토어를 사용하여 검색 중... (질문: {question})")
258
 
259
  # LLM 설정
260
  llm = ChatGroq(
@@ -275,7 +220,6 @@ def respond_with_groq(question, selected_q, model):
275
 
276
  # 답변 생성
277
  result = qa_chain({"query": question})
278
- print(f"✅ 답변 생성 완료")
279
  return result['result']
280
 
281
  except Exception as e:
@@ -291,14 +235,8 @@ def update_question(selected):
291
  return ""
292
 
293
  # 앱 시작시 벡터스토어들 로드
294
- print("🚀 애플리케이션 시작 - 벡터스토어 로딩 중...")
295
  vectorstores_loaded = load_all_vectorstores()
296
 
297
- if vectorstores_loaded:
298
- print("🎉 모든 벡터스토어가 성공적으로 로드되었습니다!")
299
- else:
300
- print("❌ 벡터스토어 로드에 실패했습니다. 파일 업로드를 확인하세요.")
301
-
302
  # Gradio 인터페이스 생성
303
  with gr.Blocks(title="한남대학교 Q&A") as interface:
304
  gr.HTML("""
@@ -307,15 +245,6 @@ with gr.Blocks(title="한남대학교 Q&A") as interface:
307
  <p>한남대학교 규정집에 대한 질문에 답변해드립니다.</p>
308
  </div>
309
  """)
310
-
311
- # 시스템 상태 표시
312
- with gr.Row():
313
- system_status = gr.Textbox(
314
- label="🔧 시스템 상태",
315
- value=get_system_status(),
316
- lines=4,
317
- interactive=False
318
- )
319
 
320
  with gr.Row():
321
  with gr.Column(scale=1):
 
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
 
49
  # 환경 변수 확인
50
  print(f"🔑 GROQ_API_KEY 설정됨: {'GROQ_API_KEY' in os.environ}")
51
+
52
  print("=" * 50)
53
 
54
  # 앱 시작 시 디버깅 실행
 
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
  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
 
93
  if not vectorstore_folders:
94
  print("❌ 사용 가능한 벡터스토어 폴더를 찾을 수 없습니다")
 
95
  else:
96
  print(f"✅ 총 {len(vectorstore_folders)}개의 벡터스토어 폴더를 찾았습니다: {vectorstore_folders}")
97
 
 
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
  )
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
  '안전사고예방계획은 어디에 제출해야 하나요?'
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
 
197
  # 통합된 벡터스토어가 로드되지 않은 경우
198
  if not combined_vectorstore:
199
+ return "❌ 사용 가능한 벡터스토어가 없습니다. 관리자에게 문의하세요."
200
 
201
  try:
202
+ print(f"✅ 통합된 벡터스토어를 사용하여 검색 중...")
203
 
204
  # LLM 설정
205
  llm = ChatGroq(
 
220
 
221
  # 답변 생성
222
  result = qa_chain({"query": question})
 
223
  return result['result']
224
 
225
  except Exception as e:
 
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
  <p>한남대학교 규정집에 대한 질문에 답변해드립니다.</p>
246
  </div>
247
  """)
 
 
 
 
 
 
 
 
 
248
 
249
  with gr.Row():
250
  with gr.Column(scale=1):