scipious commited on
Commit
52eae6a
·
verified ·
1 Parent(s): 1cbc57f

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +82 -79
app.py CHANGED
@@ -131,7 +131,7 @@ def load_rag_objects():
131
  # --- 웹 ---
132
  @app.route('/')
133
  def index():
134
- return render_template('chat_v02.html')
135
 
136
  # 전역 변수에 기본값 추가
137
  Search_each_all_mode = True # 기본값을 클라이언트에서 제어 가능
@@ -159,12 +159,9 @@ def handle_search_query(data):
159
 
160
  emit('search_status', {'status': 'processing', 'message': '검색 요청을 처리하는 중입니다...'})
161
 
162
- logger.info(f"선택된 지역 : {regions}")
163
- logger.info(f"선택된 법규 : {selected_regulations}")
164
- if Search_each_all_mode:
165
- logger.info(f"검색 모드 : 각각 검색")
166
- else:
167
- logger.info(f"검색 모드 : 통합 검색")
168
 
169
  # 법규 타입별로 필터 구분
170
  filters = {
@@ -175,7 +172,7 @@ def handle_search_query(data):
175
  }
176
 
177
  # 번역 진행 상황 알림
178
- emit('search_status', {'status': 'translating', 'message': '질문을 번역하는 중입니다...'})
179
 
180
  if session_id not in active_sessions:
181
  emit('search_cancelled', {'message': '검색이 취소되었습니다.'})
@@ -197,79 +194,83 @@ def handle_search_query(data):
197
  if os.path.exists(output_path):
198
  os.remove(output_path)
199
  print(f"기존 파일 삭제 완료: {output_path}")
 
 
 
 
 
 
 
 
 
 
200
 
201
  if Search_each_all_mode:
202
  # 각각 검색 모드
203
- emit('search_status', {'status': 'searching', 'message': f'선택된 {len(selected_regulations)}개 법규를 각각 검색 중...'})
204
-
205
- for i, regulation in enumerate(selected_regulations):
206
- if session_id not in active_sessions:
207
- emit('search_cancelled', {'message': '검색이 취소되었습니다.'})
208
- emit('search_status', {'status': 'processing', 'message': 'Ready to search'})
209
- return
210
-
211
- regulation_title = regulation.get('title', '')
212
- regulation_id = regulation.get('id', '')
213
- regulation_type = regulation.get('type', 'part') # 타입 정보 추출
214
-
215
- emit('search_status', {
216
- 'status': 'searching_regulation',
217
- 'message': f'법규 {i+1}/{len(selected_regulations)}: [{regulation_type.upper()}] {regulation_title} 검색 중...',
218
- 'progress': (i / len(selected_regulations)) * 100
219
- })
220
-
221
- # 법규 타입별 필터 생성
222
- current_filters = create_filter_by_type(regulation_type, regulation_title)
223
- print(f"[{regulation_type}] 필터에 추가: {regulation_title}")
224
- print(f"생성된 필터: {current_filters}")
225
-
226
- Rag_Results = search_DB_from_multiple_regions(Translated_query, regions, region_rag_objects, current_filters)
227
-
228
- if session_id not in active_sessions:
229
- emit('search_cancelled', {'message': '검색이 취소되었습니다.'})
230
- emit('search_status', {'status': 'processing', 'message': 'Ready to search'})
231
- return
232
-
233
- emit('search_status', {
234
- 'status': 'ai_processing',
235
- 'message': f'AI가 [{regulation_type.upper()}] {regulation_title}에 대한 답변을 생성 중...'
236
- })
237
-
238
- AImessage = RegAI(query, Rag_Results, ResultFile_FolderAddress)
239
- logger.info(f"Answer: {AImessage}")
240
-
241
- if session_id not in active_sessions:
242
- emit('search_cancelled', {'message': '검색이 취소되었습니다.'})
243
- return
244
-
245
- # 법규별 결과를 실시간으로 전송 (타입 정보 포함)
246
- emit('regulation_result', {
247
- 'regulation_title': f"[{regulation_type.upper()}] {regulation_title}",
248
- 'regulation_index': i + 1,
249
- 'total_regulations': len(selected_regulations),
250
- 'regulation_type': regulation_type,
251
- 'result': AImessage
252
- })
253
-
254
- # 파일에 저장
255
- if isinstance(AImessage, str) and AImessage.strip():
256
- with open(output_path, "a", encoding="utf-8") as f:
257
- cont_selected_num += 1
258
- from datetime import datetime
259
- stamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
260
- f.write(f"\n--- [{stamp}] message #{cont_selected_num} --- Regulation Type: {regulation_type} --- Regulation Name : {regulation_title} ---\n {AImessage}")
 
 
261
 
262
  emit('search_complete', {'status': 'completed', 'message': '모든 법규 검색이 완료되었습니다.'})
263
  else:
264
- # 통합 검색 모드 - 타입별로 그룹화
265
- grouped_regulations = group_regulations_by_type(selected_regulations)
266
- emit('search_status', {'status': 'searching', 'message': f'선택된 {len(selected_regulations)}개 법규를 타입별로 통합하여 검색 중...'})
267
-
268
- # 타입별로 필터 생성
269
- combined_filters = create_combined_filters(grouped_regulations)
270
- logger.info(f"통합 필터: {combined_filters}")
271
-
272
- Rag_Results = search_DB_from_multiple_regions(Translated_query, regions, region_rag_objects, combined_filters)
273
 
274
  if session_id in active_sessions:
275
  emit('search_status', {'status': 'ai_processing', 'message': 'AI가 통합 답변을 생성 중...'})
@@ -285,7 +286,7 @@ def handle_search_query(data):
285
  emit('search_status', {'status': 'searching_all', 'message': '전체 법규에서 검색 중...'})
286
 
287
  # 필터 없이 검색
288
- Rag_Results = search_DB_from_multiple_regions(Translated_query, regions, region_rag_objects, None)
289
 
290
  if session_id in active_sessions:
291
  emit('search_status', {'status': 'ai_processing', 'message': 'AI가 답변을 생성 중...'})
@@ -490,7 +491,7 @@ def Gemma3_AI_Translate(query_txt):
490
 
491
  # --- 검색 ---
492
  # 검색 함수 수정
493
- def search_DB_from_multiple_regions(query, selected_regions, region_rag_objects, custom_filters=None):
494
  global Filtered_search
495
  global filters
496
 
@@ -527,7 +528,8 @@ def search_DB_from_multiple_regions(query, selected_regions, region_rag_objects,
527
  query=query,
528
  k=search_document_number,
529
  metadata_filter=search_filters,
530
- sqlite_conn=sqlite_conn
 
531
  )
532
  else:
533
  results = reg_embedding_system.smart_search_vectorstore(
@@ -536,7 +538,8 @@ def search_DB_from_multiple_regions(query, selected_regions, region_rag_objects,
536
  k=search_document_number,
537
  vectorstore=vectorstore,
538
  sqlite_conn=sqlite_conn,
539
- enable_detailed_search=True
 
540
  )
541
 
542
  print(f"[{region}] 검색 완료: {len(results)}건")
 
131
  # --- 웹 ---
132
  @app.route('/')
133
  def index():
134
+ return render_template('chat_v03.html')
135
 
136
  # 전역 변수에 기본값 추가
137
  Search_each_all_mode = True # 기본값을 클라이언트에서 제어 가능
 
159
 
160
  emit('search_status', {'status': 'processing', 'message': '검색 요청을 처리하는 중입니다...'})
161
 
162
+ logger.info("선택된 지역:", regions)
163
+ logger.info("선택된 법규:", selected_regulations)
164
+ logger.info("검색 모드:", "각각 검색" if Search_each_all_mode else "통합 검색")
 
 
 
165
 
166
  # 법규 타입별로 필터 구분
167
  filters = {
 
172
  }
173
 
174
  # 번역 진행 상황 알림
175
+ emit('search_status', {'status': 'translating', 'message': '질문에 대해 생각 중입니다...'})
176
 
177
  if session_id not in active_sessions:
178
  emit('search_cancelled', {'message': '검색이 취소되었습니다.'})
 
194
  if os.path.exists(output_path):
195
  os.remove(output_path)
196
  print(f"기존 파일 삭제 완료: {output_path}")
197
+
198
+ # 통합 검색 모드 - 타입별로 그룹화
199
+ grouped_regulations = group_regulations_by_type(selected_regulations)
200
+ emit('search_status', {'status': 'searching', 'message': f'선택된 {len(selected_regulations)}개 법규를 타입별로 통합하여 검색 중...'})
201
+
202
+ # 타입별로 필터 생성
203
+ combined_filters = create_combined_filters(grouped_regulations)
204
+ print(f"통합 필터: {combined_filters}")
205
+
206
+ combined_cleaned_filter = {k: v for k, v in combined_filters.items() if v}
207
 
208
  if Search_each_all_mode:
209
  # 각각 검색 모드
210
+ emit('search_status', {'status': 'searching', 'message': f'선택된 {len(combined_cleaned_filter)}개 법규를 각각 검색 중...'})
211
+
212
+ total_search_num = sum(len(v) for v in combined_cleaned_filter.values())
213
+ i = 0
214
+ for RegType, RegNames in combined_cleaned_filter.items():
215
+ if RegNames: # 값이 비어있지 않은 경우만 처리
216
+ for RegName in RegNames:
217
+ i = i + 1
218
+ #RegType는 법규 유형, RegName은 법규 명칭
219
+
220
+ if session_id not in active_sessions:
221
+ emit('search_cancelled', {'message': '검색이 취소되었습니다.'})
222
+ emit('search_status', {'status': 'processing', 'message': 'Ready to search'})
223
+ return
224
+
225
+ emit('search_status', {
226
+ 'status': 'searching_regulation',
227
+ 'message': f'법규 {i}/{len(combined_cleaned_filter)}: {RegName} 검색 중...',
228
+ 'progress': (i / len(combined_cleaned_filter)) * 100
229
+ })
230
+
231
+ # 법규 타입별 필터 생성
232
+ current_filters = create_filter_by_type(RegType, RegName)
233
+ print(f"생성된 필터: {current_filters}")
234
+
235
+ Rag_Results = search_DB_from_multiple_regions(Translated_query, regions, region_rag_objects, current_filters, False) #마지막 False값은 유사한 값에 대한 검색을 하지 않겠다는 의미
236
+
237
+ if Rag_Results:
238
+ if session_id not in active_sessions:
239
+ emit('search_cancelled', {'message': '검색이 취소되었습니다.'})
240
+ emit('search_status', {'status': 'processing', 'message': 'Ready to search'})
241
+ return
242
+
243
+ emit('search_status', {
244
+ 'status': 'ai_processing',
245
+ 'message': f'AI가 {RegName}에 대한 답변을 생성 중...'
246
+ })
247
+
248
+ AImessage = RegAI(query, Rag_Results, ResultFile_FolderAddress)
249
+ logger.info(f"Answer: {AImessage}")
250
+
251
+ if session_id not in active_sessions:
252
+ emit('search_cancelled', {'message': '검색이 취소되었습니다.'})
253
+ return
254
+
255
+ # 법규별 결과를 실시간으로 전송 (타입 정보 포함)
256
+ emit('regulation_result', {
257
+ 'regulation_title': f"[{RegName}]",
258
+ 'regulation_index': i,
259
+ 'total_regulations': total_search_num,
260
+ 'result': AImessage
261
+ })
262
+
263
+ # 파일에 저장
264
+ if isinstance(AImessage, str) and AImessage.strip():
265
+ with open(output_path, "a", encoding="utf-8") as f:
266
+ cont_selected_num += 1
267
+ from datetime import datetime
268
+ stamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
269
+ f.write(f"\n--- [{stamp}] message #{cont_selected_num} --- Regulation Type: {RegType} --- Regulation Name : {RegName} ---\n {AImessage}")
270
 
271
  emit('search_complete', {'status': 'completed', 'message': '모든 법규 검색이 완료되었습니다.'})
272
  else:
273
+ Rag_Results = search_DB_from_multiple_regions(Translated_query, regions, region_rag_objects, combined_filters, True)
 
 
 
 
 
 
 
 
274
 
275
  if session_id in active_sessions:
276
  emit('search_status', {'status': 'ai_processing', 'message': 'AI가 통합 답변을 생성 중...'})
 
286
  emit('search_status', {'status': 'searching_all', 'message': '전체 법규에서 검색 중...'})
287
 
288
  # 필터 없이 검색
289
+ Rag_Results = search_DB_from_multiple_regions(Translated_query, regions, region_rag_objects, None, True)
290
 
291
  if session_id in active_sessions:
292
  emit('search_status', {'status': 'ai_processing', 'message': 'AI가 답변을 생성 중...'})
 
491
 
492
  # --- 검색 ---
493
  # 검색 함수 수정
494
+ def search_DB_from_multiple_regions(query, selected_regions, region_rag_objects, custom_filters=None, failsafe_mode=True):
495
  global Filtered_search
496
  global filters
497
 
 
528
  query=query,
529
  k=search_document_number,
530
  metadata_filter=search_filters,
531
+ sqlite_conn=sqlite_conn,
532
+ failsafe_search=failsafe_mode
533
  )
534
  else:
535
  results = reg_embedding_system.smart_search_vectorstore(
 
538
  k=search_document_number,
539
  vectorstore=vectorstore,
540
  sqlite_conn=sqlite_conn,
541
+ enable_detailed_search=True,
542
+ failsafe_search=failsafe_mode
543
  )
544
 
545
  print(f"[{region}] 검색 완료: {len(results)}건")