juribot-backend / db /weaviateDB.py
entidi2608's picture
new update
df0cb26
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