| """ |
| Configuration dataclass for the passage-entity KG pipeline in QAFD-RAG. |
| |
| Combines passage-entity BaseConfig fields with QAFD algorithm parameters. |
| """ |
|
|
| from dataclasses import dataclass, field |
| from typing import Optional, Literal |
|
|
|
|
| @dataclass |
| class PassageEntityConfig: |
| """Unified configuration for indexing, retrieval, and QAFD.""" |
|
|
| |
| llm_model: str = "gpt-4o-mini" |
| llm_base_url: str = "https://api.openai.com/v1" |
| llm_api_key: str = "" |
| max_new_tokens: Optional[int] = 2048 |
| temperature: float = 0.0 |
|
|
| |
| embedding_model_key: str = "nvidia-nv-embed-v2" |
| embedding_batch_size: int = 16 |
|
|
| |
| dataset: Optional[str] = None |
| save_dir: str = "outputs" |
| force_index_from_scratch: bool = False |
| force_openie_from_scratch: bool = False |
| save_openie: bool = True |
|
|
| |
| is_directed_graph: bool = False |
| synonymy_edge_topk: int = 2047 |
| synonymy_edge_query_batch_size: int = 1000 |
| synonymy_edge_key_batch_size: int = 10000 |
| synonymy_edge_sim_threshold: float = 0.8 |
|
|
| |
| linking_top_k: int = 10 |
| retrieval_top_k: int = 200 |
| passage_node_weight: float = 0.05 |
| damping: float = 0.5 |
|
|
| |
| qa_top_k: int = 5 |
|
|
| |
| use_qafd: bool = True |
| qafd_alpha: float = 1.5 |
| qafd_epsilon: float = 0.01 |
| qafd_max_iterations: int = 500 |
| qafd_weight_scheme: str = "multiply" |
| qafd_use_node_degree: bool = True |
| qafd_step_size: float = 0.2 |
| qafd_random_seed: int = 42 |
|
|
| |
| sim_mode: str = "normalized" |
| qa_sink_gamma: float = 0.0 |
| qa_warm_delta: float = 0.0 |
| qa_warm_walk: bool = False |
| qa_warm_steps: int = 2 |
| qa_accum_gamma: float = 0.0 |
| qa_post_lambda: float = 0.0 |
| batch_push: bool = False |
|
|
| |
| rerank_dspy_file_path: Optional[str] = None |
|
|
| def __post_init__(self): |
| if self.save_dir == "outputs" and self.dataset: |
| self.save_dir = f"outputs/{self.dataset}" |
|
|
| @property |
| def working_dir(self) -> str: |
| """Model-specific sub-directory under save_dir. |
| |
| Also checks kg/multihop/ for pre-downloaded KGs from HuggingFace. |
| If found there, uses that path instead of outputs/. |
| """ |
| import os |
| llm_label = self.llm_model.replace("/", "_") |
| emb_label = self.embedding_model_key.replace("/", "_") |
|
|
| |
| if self.dataset: |
| for task_dir in ["multihop", "ultradomain"]: |
| hf_path = os.path.join("kg", task_dir, f"{llm_label}_{emb_label}_{self.dataset}") |
| if os.path.isdir(hf_path) and os.path.exists(os.path.join(hf_path, "graph.pickle")): |
| return hf_path |
|
|
| return f"{self.save_dir}/{llm_label}_{emb_label}" |
|
|