HCMUE RAG Deploy
Deploy FastAPI RAG backend
0c48820
Raw
History Blame Contribute Delete
5.08 kB
import os
from pathlib import Path
from src.common.content_modes import apply_record_defaults
from .directory_parser import (
extract_faculty_program_directory,
extract_office_directory,
extract_reference_directory,
)
from .audit_builder import build_content_audit
from .formula_rules import extract_formula_rules
from .io_utils import load_json, load_yaml, save_json
from .procedure_parser import extract_procedures
from .program_faculty_enricher import enrich_program_faculty_names
from .program_parser import extract_program_directory
from .report_builder import build_report
from .scoring_tables import build_scoring_tables
from .threshold_rules import extract_threshold_rules
CONFIG_PATH = Path("configs/extraction.yaml")
NON_EMBEDDED_CONTENT_TYPES = {
"scoring_table",
"formula_rule",
"threshold_rule",
"office_directory",
"faculty_directory",
"program_directory",
"reference_directory",
"procedure",
}
def main() -> None:
config = load_yaml(CONFIG_PATH)
pages = load_json(Path(config["input"]["pages"]))
sections = load_json(Path(config["input"]["structured_sections"]))
document_id = pages[0].get("document_id") if pages else None
cohort = os.environ.get("COHORT")
scoring_tables = build_scoring_tables()
formula_rules = extract_formula_rules(sections)
threshold_rules = extract_threshold_rules(sections)
office_directory = extract_office_directory(pages)
faculty_directory = extract_faculty_program_directory(pages)
program_directory = extract_program_directory(pages)
program_directory = enrich_program_faculty_names(
program_directory,
faculty_directory,
)
reference_directory = extract_reference_directory(pages)
procedures = extract_procedures(pages)
content_audit_report = build_content_audit(pages, sections)
record_groups = [
(scoring_tables, "scoring_table"),
(formula_rules, "formula_rule"),
(threshold_rules, "threshold_rule"),
(office_directory, "office_directory"),
(faculty_directory, "faculty_directory"),
(program_directory, "program_directory"),
(reference_directory, "reference_directory"),
(procedures, "procedure"),
]
for group, content_type in record_groups:
for record in group:
record.setdefault("content_type", content_type)
if content_type in NON_EMBEDDED_CONTENT_TYPES:
record.setdefault("embedding_enabled", False)
if content_type == "procedure":
record.setdefault("retrieval_mode", "structured_lookup")
else:
record.setdefault("retrieval_mode", "deterministic")
else:
record.setdefault("embedding_enabled", True)
record.setdefault("retrieval_mode", "semantic")
apply_record_defaults(
record,
document_id=document_id,
cohort=cohort,
source_section=(
record.get("source_section")
or record.get("article")
or record.get("section_title")
or record.get("title")
or content_type
),
)
report = build_report(
scoring_tables=scoring_tables,
formula_rules=formula_rules,
threshold_rules=threshold_rules,
office_directory=office_directory,
faculty_directory=faculty_directory,
program_directory=program_directory,
reference_directory=reference_directory,
procedures=procedures,
)
save_json(scoring_tables, Path(config["output"]["scoring_tables"]))
save_json(formula_rules, Path(config["output"]["formula_rules"]))
save_json(threshold_rules, Path(config["output"]["threshold_rules"]))
save_json(office_directory, Path(config["output"]["office_directory"]))
save_json(faculty_directory, Path(config["output"]["faculty_directory"]))
save_json(program_directory, Path(config["output"]["program_directory"]))
# Backward-compatible alias while retrieval/chunking migrates off the old name.
save_json(faculty_directory, Path(config["output"]["faculty_program_directory"]))
save_json(reference_directory, Path(config["output"]["reference_directory"]))
save_json(procedures, Path(config["output"]["procedures"]))
save_json(report, Path(config["output"]["report"]))
save_json(content_audit_report, Path(config["output"]["content_audit_report"]))
print("Structured extraction completed.")
print(f"Scoring tables: {len(scoring_tables)}")
print(f"Formula rules: {len(formula_rules)}")
print(f"Threshold rules: {len(threshold_rules)}")
print(f"Office records: {len(office_directory)}")
print(f"Faculty records: {len(faculty_directory)}")
print(f"Program records: {len(program_directory)}")
print(f"Reference records: {len(reference_directory)}")
print(f"Procedures: {len(procedures)}")
if __name__ == "__main__":
main()