Spaces:
Running
Running
File size: 3,745 Bytes
be0f59e | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 | from typing import Any
from collections import Counter
def validate_chunks(chunks: list[dict[str, Any]]) -> list[dict[str, Any]]:
"""Kiểm tra tính hợp lệ của một danh sách các "chunk" dữ liệu.
Hàm này duyệt qua từng "chunk" trong danh sách và kiểm tra các điều kiện
quan trọng để đảm bảo dữ liệu được định dạng đúng. Nó sẽ phát hiện các vấn đề
như thiếu ID, ID bị trùng lặp, nội dung trống, thiếu loại chunk,
chế độ index không hợp lệ, hoặc thiếu thông tin trang nguồn.
Args:
chunks: Một danh sách các dictionary, mỗi dictionary đại diện cho một "chunk"
dữ liệu. Mỗi chunk dự kiến có các khóa như "chunk_id", "content",
"chunk_type", "index_mode", và "metadata" (chứa "source_pages").
Returns:
Một danh sách các dictionary. Mỗi dictionary mô tả một vấn đề được tìm thấy
trong các chunk. Mỗi vấn đề sẽ có các khóa như "issue" (tên vấn đề),
"severity" (mức độ nghiêm trọng: "high" hoặc "medium"), và thông tin
liên quan đến chunk gây ra vấn đề (ví dụ: "chunk" hoặc "chunk_id").
Nếu không có vấn đề nào được tìm thấy, danh sách sẽ trống.
"""
issues = []
chunk_ids = [chunk.get("chunk_id") for chunk in chunks]
id_counts = Counter(chunk_ids)
for chunk in chunks:
chunk_id = chunk.get("chunk_id")
if not chunk_id:
issues.append(
{"issue": "missing_chunk_id", "severity": "high", "chunk": chunk}
)
if id_counts[chunk_id] > 1:
issues.append(
{
"issue": "duplicate_chunk_id",
"severity": "high",
"chunk_id": chunk_id,
}
)
if not chunk.get("content"):
issues.append(
{"issue": "empty_content", "severity": "high", "chunk_id": chunk_id}
)
if not chunk.get("chunk_type"):
issues.append(
{
"issue": "missing_chunk_type",
"severity": "high",
"chunk_id": chunk_id,
}
)
if chunk.get("index_mode") not in {"semantic", "structured", "tool"}:
issues.append(
{
"issue": "invalid_index_mode",
"severity": "high",
"chunk_id": chunk_id,
}
)
metadata = chunk.get("metadata", {})
if not metadata.get("source_pages"):
issues.append(
{
"issue": "missing_source_pages",
"severity": "medium",
"chunk_id": chunk_id,
}
)
return issues
def validate_parent_links(
chunks: list[dict[str, Any]],
docstore_items: list[dict[str, Any]],
) -> list[dict[str, Any]]:
"""Kiểm tra child chunks có trỏ được về parent doc trong docstore hay không."""
issues = []
parent_ids = {item.get("_id") for item in docstore_items if item.get("_id")}
for chunk in chunks:
parent_id = chunk.get("metadata", {}).get("parent_section_id")
if parent_id and parent_id not in parent_ids:
issues.append(
{
"issue": "missing_parent_doc",
"severity": "high",
"chunk_id": chunk.get("chunk_id"),
"parent_section_id": parent_id,
}
)
return issues
|