Spaces:
Runtime error
Runtime error
import weaviate | |
from weaviate import WeaviateClient | |
from weaviate.connect import ConnectionParams | |
from weaviate.classes.init import Auth | |
import logging | |
import config | |
import weaviate.classes.query as wvc_query | |
logger = logging.getLogger(__name__) | |
def run_diagnostic_checks(client: WeaviateClient): | |
""" | |
Thực hiện một loạt các kiểm tra chẩn đoán trên collection chính | |
để xác minh tình trạng dữ liệu. | |
""" | |
collection_name = config.WEAVIATE_COLLECTION_NAME | |
if not client.collections.exists(collection_name): | |
logger.error(f"‼️ Collection '{collection_name}' không tồn tại. Không thể chạy chẩn đoán.") | |
return | |
collection = client.collections.get(collection_name) | |
logger.info("\n" + "="*50) | |
logger.info(" RUNNING DATABASE DIAGNOSTIC CHECKS") | |
logger.info("="*50) | |
# --- 1. Thống kê tổng quan --- | |
try: | |
total = collection.aggregate.over_all(total_count=True) | |
logger.info(f"[STATS] Tổng số chunk: {total.total_count}") | |
fields_to_check = ["giao_thong", "hinh_su", "lao_dong", "dat_dai", "y_te", "hon_nhan_gia_dinh", "doanh_nghiep", "khac"] | |
for field in fields_to_check: | |
try: | |
field_filter = wvc_query.Filter.by_property("field").equal(field) | |
response = collection.aggregate.over_all(filters=field_filter, total_count=True) | |
# Chỉ in ra nếu có kết quả | |
if response.total_count > 0: | |
logger.info(f"[STATS] Lĩnh vực '{field}': {response.total_count} chunks") | |
except Exception: | |
pass # Bỏ qua nếu có lỗi khi kiểm tra field không tồn tại | |
except Exception as e: | |
logger.error(f"[STATS] Lỗi khi lấy thống kê tổng quan: {e}") | |
# --- 2. Kiểm tra sự tồn tại của dữ liệu Nghị định Giao thông --- | |
# Thay tên file này cho đúng với file bạn đã ingest | |
target_source_file = "Nghị định-168-2024-NĐ-CP.txt" | |
try: | |
source_filter = wvc_query.Filter.by_property("source").equal(target_source_file) | |
response = collection.query.fetch_objects(limit=1, filters=source_filter) | |
if response.objects: | |
logger.info(f"✅ [DATA CHECK] Tìm thấy dữ liệu từ nguồn '{target_source_file}'.") | |
else: | |
logger.error(f"‼️ [DATA CHECK] KHÔNG tìm thấy dữ liệu từ nguồn '{target_source_file}'. " | |
f"Đây có thể là nguyên nhân chính gây lỗi.") | |
except Exception as e: | |
logger.error(f"‼️ [DATA CHECK] Lỗi khi kiểm tra source '{target_source_file}': {e}") | |
# --- 3. Kiểm tra tìm kiếm từ khóa pháp lý cốt lõi --- | |
target_keyword = "không chấp hành hiệu lệnh của đèn tín hiệu giao thông" | |
try: | |
bm25_response = collection.query.bm25( | |
query=target_keyword, | |
query_properties=["text"], | |
limit=1 | |
) | |
if bm25_response.objects: | |
logger.info(f"✅ [KEYWORD CHECK] Tìm thấy chunk chứa từ khóa '{target_keyword[:30]}...'.") | |
# Log ra chi tiết chunk đầu tiên tìm được | |
first_match = bm25_response.objects[0] | |
logger.info(f" -> Chunk Source: {first_match.properties.get('source')}") | |
logger.info(f" -> Chunk Title: {first_match.properties.get('title')}") | |
else: | |
logger.error(f"‼️ [KEYWORD CHECK] KHÔNG tìm thấy chunk nào chứa từ khóa '{target_keyword}'. " | |
f"Vấn đề có thể nằm ở quá trình chunking hoặc cleaning.") | |
except Exception as e: | |
logger.error(f"‼️ [KEYWORD CHECK] Lỗi khi tìm kiếm từ khóa: {e}") | |
logger.info("="*50) | |
logger.info(" DIAGNOSTIC CHECKS COMPLETE") | |
logger.info("="*50 + "\n") | |
def connect_to_weaviate(run_diagnostics: bool = True) -> WeaviateClient: | |
""" | |
Connect to Weaviate instance. | |
""" | |
try: | |
if config.WEAVIATE_URL and config.WEAVIATE_API_KEY: | |
logger.info(f"Connecting to Weaviate Cloud Services at {config.WEAVIATE_URL}") | |
client = weaviate.connect_to_weaviate_cloud( | |
cluster_url=config.WEAVIATE_URL, | |
auth_credentials=Auth.api_key(config.WEAVIATE_API_KEY), | |
) | |
else: | |
client = WeaviateClient( | |
connection_params=ConnectionParams.from_url( | |
url="http://weaviate:8080", # Trong Docker | |
grpc_port=50051 # Cổng gRPC mặc định của Weaviate | |
) | |
) | |
client.connect() | |
# Kiểm tra kết nối | |
if not client.is_connected(): | |
raise Exception("Không thể kết nối tới Weaviate.") | |
logger.info(f"✅ Kết nối tới Weaviate tại thành công.") | |
# Chạy kiểm tra chẩn đoán nếu được yêu cầu | |
if run_diagnostics: | |
run_diagnostic_checks(client) | |
return client | |
except Exception as e: | |
logger.error(f"🔸Lỗi kết nối tới Weaviate: {e}") | |
client.close() | |
return None | |