hcmue-handbook-rag-api / src /chunking /report_builder.py
HCMUE RAG Deploy
Deploy FastAPI RAG backend
75dea23
Raw
History Blame Contribute Delete
8.17 kB
from typing import Any
from collections import Counter
def get_max_token_limits() -> dict[str, int]:
"""Lấy giới hạn token tối đa cho các loại chunk khác nhau.
Hàm này trả về một từ điển (dictionary) chứa các giới hạn về số lượng token
(đơn vị nhỏ nhất của văn bản, như từ hoặc ký hiệu) cho từng loại nội dung
(gọi là "chunk"). Ví dụ, một "regulation" (quy định) có thể có giới hạn
token khác với một "table" (bảng).
Returns:
dict[str, int]: Một từ điển nơi khóa là tên của loại chunk (ví dụ: "regulation")
và giá trị là số lượng token tối đa cho phép cho loại chunk đó.
"""
return {
"regulation": 850,
"form": 250,
"table": 250,
"formula": 180,
"office_directory": 350,
"faculty_directory": 350,
"program_directory": 350,
"faculty_program_directory": 350,
"reference_directory": 350,
"procedure": 500,
}
def detect_overlong_chunks(
chunks: list[dict[str, Any]],
) -> list[dict[str, Any]]:
"""Phát hiện các chunk (đoạn văn bản) bị quá dài so với giới hạn token cho phép.
Hàm này duyệt qua một danh sách các chunk và so sánh số lượng token của mỗi chunk
với giới hạn token đã được định nghĩa cho loại chunk đó. Nếu một chunk có số
lượng token vượt quá giới hạn, nó sẽ được đánh dấu là "quá dài".
Args:
chunks (list[dict[str, Any]]): Một danh sách các từ điển, mỗi từ điển đại diện
cho một chunk. Mỗi từ điển chunk cần có ít nhất các khóa sau:
- "chunk_type" (str): Loại của chunk (ví dụ: "regulation", "table").
- "token_count_approx" (int): Số lượng token ước tính của chunk.
- "chunk_id" (Any): Mã định danh duy nhất của chunk.
- "metadata" (dict, tùy chọn): Một từ điển chứa thông tin bổ sung,
có thể bao gồm "source_pages" (danh sách các trang nguồn).
Returns:
list[dict[str, Any]]: Một danh sách các từ điển. Mỗi từ điển trong danh sách
mô tả một chunk bị quá dài và chứa các thông tin chi tiết như:
- "chunk_id" (Any): Mã định danh của chunk bị quá dài.
- "chunk_type" (str): Loại của chunk đó.
- "token_count_approx" (int): Số lượng token thực tế của chunk.
- "limit" (int): Giới hạn token cho loại chunk này.
- "excess" (int): Số lượng token vượt quá giới hạn (token_count_approx - limit).
- "source_pages" (list[str], tùy chọn): Các trang nguồn mà chunk này xuất phát.
"""
limits = get_max_token_limits()
overlong = []
for chunk in chunks:
chunk_type = chunk.get("chunk_type")
token_count = chunk.get("token_count_approx", 0)
limit = limits.get(chunk_type)
if limit is None:
# Nếu không tìm thấy giới hạn cho loại chunk này, bỏ qua.
continue
if token_count > limit:
overlong.append(
{
"chunk_id": chunk.get("chunk_id"),
"chunk_type": chunk_type,
"token_count_approx": token_count,
"limit": limit,
"excess": token_count - limit,
"source_pages": chunk.get("metadata", {}).get("source_pages"),
}
)
return overlong
def build_chunk_report(
regulation_chunks: list[dict[str, Any]],
table_chunks: list[dict[str, Any]],
formula_chunks: list[dict[str, Any]],
form_chunks: list[dict[str, Any]],
directory_chunks: list[dict[str, Any]],
procedure_chunks: list[dict[str, Any]],
all_chunks: list[dict[str, Any]],
validation_issues: list[dict[str, Any]],
) -> dict[str, Any]:
"""Xây dựng một báo cáo tổng hợp về các chunk (đoạn văn bản).
Hàm này tổng hợp thông tin từ nhiều danh sách chunk khác nhau để tạo ra
một báo cáo chi tiết. Báo cáo bao gồm số lượng chunk theo loại, số lượng
token trung bình và tối đa, danh sách các chunk bị quá dài, và các vấn đề
xác thực đã được tìm thấy.
Args:
regulation_chunks (list[dict[str, Any]]): Danh sách các chunk thuộc loại "regulation".
table_chunks (list[dict[str, Any]]): Danh sách các chunk thuộc loại "table".
formula_chunks (list[dict[str, Any]]): Danh sách các chunk thuộc loại "formula".
form_chunks (list[dict[str, Any]]): Danh sách các chunk thuộc loại "form".
directory_chunks (list[dict[str, Any]]): Danh sách các chunk thuộc loại thư mục
(ví dụ: "office_directory", "faculty_program_directory", "reference_directory").
procedure_chunks (list[dict[str, Any]]): Danh sách các chunk thuộc loại "procedure".
all_chunks (list[dict[str, Any]]): Một danh sách chứa TẤT CẢ các chunk đã được xử lý.
Mỗi chunk cần có ít nhất các khóa "chunk_type", "index_mode", và "token_count_approx".
validation_issues (list[dict[str, Any]]): Một danh sách các từ điển, mỗi từ điển
mô tả một vấn đề xác thực được tìm thấy trong quá trình xử lý chunk.
Returns:
dict[str, Any]: Một từ điển chứa báo cáo tổng hợp với các thông tin sau:
- "total_chunks" (int): Tổng số lượng tất cả các chunk.
- "regulation_chunks" (int): Số lượng chunk loại "regulation".
- "table_chunks" (int): Số lượng chunk loại "table".
- "formula_chunks" (int): Số lượng chunk loại "formula".
- "form_chunks" (int): Số lượng chunk loại "form".
- "directory_chunks" (int): Số lượng chunk loại thư mục.
- "procedure_chunks" (int): Số lượng chunk loại "procedure".
- "chunk_type_count" (dict[str, int]): Số lượng chunk cho mỗi loại chunk.
- "index_mode_count" (dict[str, int]): Số lượng chunk cho mỗi chế độ index.
- "avg_token_count_approx" (float): Số lượng token trung bình của tất cả các chunk.
- "max_token_count_approx" (int): Số lượng token tối đa của một chunk bất kỳ.
- "overlong_chunks_count" (int): Tổng số lượng chunk bị quá dài.
- "overlong_chunks" (list[dict[str, Any]]): Danh sách chi tiết các chunk bị quá dài.
- "validation_issues" (list[dict[str, Any]]): Danh sách các vấn đề xác thực.
"""
overlong_chunks = detect_overlong_chunks(all_chunks)
return {
"total_chunks": len(all_chunks),
"regulation_chunks": len(regulation_chunks),
"table_chunks": len(table_chunks),
"formula_chunks": len(formula_chunks),
"form_chunks": len(form_chunks),
"directory_chunks": len(directory_chunks),
"procedure_chunks": len(procedure_chunks),
"chunk_type_count": dict(Counter(chunk["chunk_type"] for chunk in all_chunks)),
"index_mode_count": dict(Counter(chunk["index_mode"] for chunk in all_chunks)),
"avg_token_count_approx": round(
sum(chunk["token_count_approx"] for chunk in all_chunks)
/ max(len(all_chunks), 1), # Tránh chia cho 0 nếu không có chunk nào
2,
),
"max_token_count_approx": max(
[chunk["token_count_approx"] for chunk in all_chunks],
default=0, # Mặc định là 0 nếu không có chunk nào
),
"overlong_chunks_count": len(overlong_chunks),
"overlong_chunks": overlong_chunks,
"validation_issues": validation_issues,
}