Spaces:
Running
Running
Update reg_embedding_system.py
Browse files- reg_embedding_system.py +17 -17
reg_embedding_system.py
CHANGED
|
@@ -276,8 +276,8 @@ def search_with_metadata_filter(
|
|
| 276 |
params = []
|
| 277 |
|
| 278 |
for key, value in metadata_filter.items():
|
| 279 |
-
logger.info(f"[key] {key}")
|
| 280 |
-
logger.info(f"[value] {value}")
|
| 281 |
if isinstance(value, list):
|
| 282 |
if not value:
|
| 283 |
continue
|
|
@@ -295,14 +295,14 @@ def search_with_metadata_filter(
|
|
| 295 |
try:
|
| 296 |
cursor.execute(sql_query, params)
|
| 297 |
filtered_ids = {row[0] for row in cursor.fetchall()}
|
| 298 |
-
logger.info(f"[사전 필터링] {len(filtered_ids)}개 ID 획득 → FAISS 검색 제한")
|
| 299 |
except Exception as e:
|
| 300 |
-
logger.info(f"[경고] SQLite 필터링 실패: {e}")
|
| 301 |
filtered_ids = None
|
| 302 |
else:
|
| 303 |
-
logger.info("[안내] 필터 조건 없음 → 전체 검색")
|
| 304 |
else:
|
| 305 |
-
logger.info("[안내] 필터 또는 DB 없음 → 전체 검색")
|
| 306 |
|
| 307 |
# === 2. FAISS 벡터 검색 ===
|
| 308 |
if filtered_ids and len(filtered_ids) > 0:
|
|
@@ -331,11 +331,11 @@ def search_with_metadata_filter(
|
|
| 331 |
if isinstance(doc, Document):
|
| 332 |
vector_docs.append(doc)
|
| 333 |
|
| 334 |
-
logger.info(f"[벡터 검색] {len(valid_indices)}개 후보 → {len(vector_docs)}개 유효")
|
| 335 |
else:
|
| 336 |
search_k = k * 5
|
| 337 |
vector_docs = vector_ret.invoke(query, config={"search_kwargs": {"k": search_k}})
|
| 338 |
-
logger.info(f"[벡터 검색] 전체 검색 → {len(vector_docs)}개 후보")
|
| 339 |
|
| 340 |
# === 3. BM25 검색 ===
|
| 341 |
bm25_docs = []
|
|
@@ -346,13 +346,13 @@ def search_with_metadata_filter(
|
|
| 346 |
bm25_docs = [d for d in candidates if d.metadata.get('faiss_id') in filtered_ids]
|
| 347 |
else:
|
| 348 |
bm25_docs = candidates[:k]
|
| 349 |
-
logger.info(f"[BM25 검색] {len(candidates)}개 후보 → {len(bm25_docs)}개 필터링 후")
|
| 350 |
|
| 351 |
# === 4. 병합 및 최종 k개 반환 ===
|
| 352 |
combined = {id(d): d for d in (vector_docs + bm25_docs)}.values()
|
| 353 |
final_results = list(combined)[:k]
|
| 354 |
|
| 355 |
-
logger.info(f"[최종 결과] {len(final_results)}개 문서 반환")
|
| 356 |
return final_results
|
| 357 |
|
| 358 |
def get_unique_metadata_values(
|
|
@@ -396,7 +396,7 @@ def smart_search_vectorstore(
|
|
| 396 |
# 1. 기본 검색
|
| 397 |
basic_results = retriever.invoke(query)
|
| 398 |
basic_results = basic_results[:k]
|
| 399 |
-
logger.info(f"[기본 검색] {len(basic_results)}개 문서 검색 완료")
|
| 400 |
|
| 401 |
if not enable_detailed_search or not vectorstore or not sqlite_conn:
|
| 402 |
logger.info("[안내] 상세 검색 비활성화 또는 컴포넌트 부족 → 기본 검색 결과만 반환")
|
|
@@ -421,13 +421,13 @@ def smart_search_vectorstore(
|
|
| 421 |
|
| 422 |
counter = Counter(regulation_parts)
|
| 423 |
most_extracted_category = counter.most_common(2)
|
| 424 |
-
logger.info(f"[빈도 분석] regulation_part 빈도: {dict(counter)}")
|
| 425 |
-
logger.info(f"[상위 카테고리] {most_extracted_category}")
|
| 426 |
|
| 427 |
# 3. 상세 검색
|
| 428 |
detailed_results = []
|
| 429 |
for rank, (category, count) in enumerate(most_extracted_category, 1):
|
| 430 |
-
logger.info(f"[상세 검색 {rank}순위] '{category}' 카테고리 검색 시작 (빈도: {count})")
|
| 431 |
metadata_filter = {'regulation_part': category}
|
| 432 |
|
| 433 |
try:
|
|
@@ -440,9 +440,9 @@ def smart_search_vectorstore(
|
|
| 440 |
sqlite_conn=sqlite_conn
|
| 441 |
)
|
| 442 |
detailed_results.extend(category_results)
|
| 443 |
-
logger.info(f"[상세 검색 {rank}순위] {len(category_results)}개 추가 문서 검색 완료")
|
| 444 |
except Exception as e:
|
| 445 |
-
logger.info(f"[경고] 상세 검색 {rank}순위 실패 ({category}): {e}")
|
| 446 |
continue
|
| 447 |
|
| 448 |
# 4. 결과 병합
|
|
@@ -462,7 +462,7 @@ def smart_search_vectorstore(
|
|
| 462 |
final_results.append(doc)
|
| 463 |
|
| 464 |
final_results = final_results[:k]
|
| 465 |
-
logger.info(f"[최종 결과] 기본 {len(basic_results)}개 + 상세 {len(detailed_results)}개 → 중복 제거 후 {len(final_results)}개 반환")
|
| 466 |
|
| 467 |
return final_results
|
| 468 |
|
|
|
|
| 276 |
params = []
|
| 277 |
|
| 278 |
for key, value in metadata_filter.items():
|
| 279 |
+
#logger.info(f"[key] {key}")
|
| 280 |
+
#logger.info(f"[value] {value}")
|
| 281 |
if isinstance(value, list):
|
| 282 |
if not value:
|
| 283 |
continue
|
|
|
|
| 295 |
try:
|
| 296 |
cursor.execute(sql_query, params)
|
| 297 |
filtered_ids = {row[0] for row in cursor.fetchall()}
|
| 298 |
+
#logger.info(f"[사전 필터링] {len(filtered_ids)}개 ID 획득 → FAISS 검색 제한")
|
| 299 |
except Exception as e:
|
| 300 |
+
#logger.info(f"[경고] SQLite 필터링 실패: {e}")
|
| 301 |
filtered_ids = None
|
| 302 |
else:
|
| 303 |
+
#logger.info("[안내] 필터 조건 없음 → 전체 검색")
|
| 304 |
else:
|
| 305 |
+
#logger.info("[안내] 필터 또는 DB 없음 → 전체 검색")
|
| 306 |
|
| 307 |
# === 2. FAISS 벡터 검색 ===
|
| 308 |
if filtered_ids and len(filtered_ids) > 0:
|
|
|
|
| 331 |
if isinstance(doc, Document):
|
| 332 |
vector_docs.append(doc)
|
| 333 |
|
| 334 |
+
#logger.info(f"[벡터 검색] {len(valid_indices)}개 후보 → {len(vector_docs)}개 유효")
|
| 335 |
else:
|
| 336 |
search_k = k * 5
|
| 337 |
vector_docs = vector_ret.invoke(query, config={"search_kwargs": {"k": search_k}})
|
| 338 |
+
#logger.info(f"[벡터 검색] 전체 검색 → {len(vector_docs)}개 후보")
|
| 339 |
|
| 340 |
# === 3. BM25 검색 ===
|
| 341 |
bm25_docs = []
|
|
|
|
| 346 |
bm25_docs = [d for d in candidates if d.metadata.get('faiss_id') in filtered_ids]
|
| 347 |
else:
|
| 348 |
bm25_docs = candidates[:k]
|
| 349 |
+
#logger.info(f"[BM25 검색] {len(candidates)}개 후보 → {len(bm25_docs)}개 필터링 후")
|
| 350 |
|
| 351 |
# === 4. 병합 및 최종 k개 반환 ===
|
| 352 |
combined = {id(d): d for d in (vector_docs + bm25_docs)}.values()
|
| 353 |
final_results = list(combined)[:k]
|
| 354 |
|
| 355 |
+
#logger.info(f"[최종 결과] {len(final_results)}개 문서 반환")
|
| 356 |
return final_results
|
| 357 |
|
| 358 |
def get_unique_metadata_values(
|
|
|
|
| 396 |
# 1. 기본 검색
|
| 397 |
basic_results = retriever.invoke(query)
|
| 398 |
basic_results = basic_results[:k]
|
| 399 |
+
#logger.info(f"[기본 검색] {len(basic_results)}개 문서 검색 완료")
|
| 400 |
|
| 401 |
if not enable_detailed_search or not vectorstore or not sqlite_conn:
|
| 402 |
logger.info("[안내] 상세 검색 비활성화 또는 컴포넌트 부족 → 기본 검색 결과만 반환")
|
|
|
|
| 421 |
|
| 422 |
counter = Counter(regulation_parts)
|
| 423 |
most_extracted_category = counter.most_common(2)
|
| 424 |
+
#logger.info(f"[빈도 분석] regulation_part 빈도: {dict(counter)}")
|
| 425 |
+
#logger.info(f"[상위 카테고리] {most_extracted_category}")
|
| 426 |
|
| 427 |
# 3. 상세 검색
|
| 428 |
detailed_results = []
|
| 429 |
for rank, (category, count) in enumerate(most_extracted_category, 1):
|
| 430 |
+
#logger.info(f"[상세 검색 {rank}순위] '{category}' 카테고리 검색 시작 (빈도: {count})")
|
| 431 |
metadata_filter = {'regulation_part': category}
|
| 432 |
|
| 433 |
try:
|
|
|
|
| 440 |
sqlite_conn=sqlite_conn
|
| 441 |
)
|
| 442 |
detailed_results.extend(category_results)
|
| 443 |
+
#logger.info(f"[상세 검색 {rank}순위] {len(category_results)}개 추가 문서 검색 완료")
|
| 444 |
except Exception as e:
|
| 445 |
+
#logger.info(f"[경고] 상세 검색 {rank}순위 실패 ({category}): {e}")
|
| 446 |
continue
|
| 447 |
|
| 448 |
# 4. 결과 병합
|
|
|
|
| 462 |
final_results.append(doc)
|
| 463 |
|
| 464 |
final_results = final_results[:k]
|
| 465 |
+
#logger.info(f"[최종 결과] 기본 {len(basic_results)}개 + 상세 {len(detailed_results)}개 → 중복 제거 후 {len(final_results)}개 반환")
|
| 466 |
|
| 467 |
return final_results
|
| 468 |
|