Update experiments: rename imports
Browse files- experiments/edge_weight_ablation.py +13 -13
- experiments/query_aware_ablation.py +13 -13
- experiments/run_all_ablations.sh +1 -1
- experiments/run_alpha_qa_sweep.sh +2 -2
- experiments/run_batch_push_ablation.sh +2 -2
- experiments/run_batch_push_nvidia.sh +2 -2
- experiments/run_decoupled_ablation.sh +2 -2
- experiments/run_nvidia_qa_ablation.sh +2 -2
- experiments/run_overnight_qa_awareness.sh +3 -3
- experiments/run_qa_awareness_v2.sh +2 -2
- experiments/run_sim_mode_ablation.sh +2 -2
experiments/edge_weight_ablation.py
CHANGED
|
@@ -27,7 +27,7 @@ _project_root = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
|
|
| 27 |
sys.path.insert(0, _project_root)
|
| 28 |
|
| 29 |
import types as _types
|
| 30 |
-
for _pkg_path in ["src", "src.retrievers", "src.
|
| 31 |
if _pkg_path not in sys.modules:
|
| 32 |
_m = _types.ModuleType(_pkg_path)
|
| 33 |
_m.__path__ = [os.path.join(_project_root, *_pkg_path.split("."))]
|
|
@@ -46,14 +46,14 @@ _src = os.path.join(_project_root, "src")
|
|
| 46 |
_load_mod("src.retrievers.base", os.path.join(_src, "retrievers", "base.py"))
|
| 47 |
_load_mod("src.retrievers.flow_diffusion", os.path.join(_src, "retrievers", "flow_diffusion.py"))
|
| 48 |
|
| 49 |
-
from src.
|
| 50 |
-
from src.
|
| 51 |
-
from src.
|
| 52 |
-
from src.
|
| 53 |
-
from src.
|
| 54 |
-
from src.
|
| 55 |
-
from src.
|
| 56 |
-
from src.
|
| 57 |
get_gold_docs, get_gold_answers, recall_at_k,
|
| 58 |
exact_match, f1_score, run_qa, _openai_embed, _openai_complete,
|
| 59 |
)
|
|
@@ -69,7 +69,7 @@ def load_everything(dataset="musique", num_queries=10):
|
|
| 69 |
"""Load KG, embeddings, data — once for all experiments."""
|
| 70 |
api_key = os.environ.get("OPENAI_API_KEY", "")
|
| 71 |
|
| 72 |
-
config =
|
| 73 |
llm_model="gpt-4o-mini",
|
| 74 |
embedding_model_key="openai-small",
|
| 75 |
dataset=dataset,
|
|
@@ -110,7 +110,7 @@ def load_everything(dataset="musique", num_queries=10):
|
|
| 110 |
|
| 111 |
# Build retriever
|
| 112 |
reranker = FactReranker(llm_func)
|
| 113 |
-
retriever =
|
| 114 |
config=config,
|
| 115 |
embedding_model=embedding_model,
|
| 116 |
reranker=reranker,
|
|
@@ -126,7 +126,7 @@ def load_everything(dataset="musique", num_queries=10):
|
|
| 126 |
|
| 127 |
|
| 128 |
def run_retrieval_with_params(
|
| 129 |
-
retriever:
|
| 130 |
queries: List[str],
|
| 131 |
gold_docs: List[List[str]],
|
| 132 |
gold_answers,
|
|
@@ -136,7 +136,7 @@ def run_retrieval_with_params(
|
|
| 136 |
query_aware: bool = True,
|
| 137 |
) -> Dict:
|
| 138 |
"""Run retrieval with specific edge weight params. Returns metrics dict."""
|
| 139 |
-
from src.
|
| 140 |
|
| 141 |
retriever._encode_queries(queries)
|
| 142 |
k_list = [1, 2, 5, 10, 20, 50, 100, 200]
|
|
|
|
| 27 |
sys.path.insert(0, _project_root)
|
| 28 |
|
| 29 |
import types as _types
|
| 30 |
+
for _pkg_path in ["src", "src.retrievers", "src.passage_entity"]:
|
| 31 |
if _pkg_path not in sys.modules:
|
| 32 |
_m = _types.ModuleType(_pkg_path)
|
| 33 |
_m.__path__ = [os.path.join(_project_root, *_pkg_path.split("."))]
|
|
|
|
| 46 |
_load_mod("src.retrievers.base", os.path.join(_src, "retrievers", "base.py"))
|
| 47 |
_load_mod("src.retrievers.flow_diffusion", os.path.join(_src, "retrievers", "flow_diffusion.py"))
|
| 48 |
|
| 49 |
+
from src.passage_entity.config import PassageEntityConfig
|
| 50 |
+
from src.passage_entity.embedding_store import EmbeddingModelWrapper
|
| 51 |
+
from src.passage_entity.kg_builder import KGBuilder
|
| 52 |
+
from src.passage_entity.openie import OpenIE
|
| 53 |
+
from src.passage_entity.reranker import FactReranker
|
| 54 |
+
from src.passage_entity.retriever import PassageEntityRetriever
|
| 55 |
+
from src.passage_entity.graph_adapter import run_igraph_qafd
|
| 56 |
+
from src.passage_entity.benchmark_runner import (
|
| 57 |
get_gold_docs, get_gold_answers, recall_at_k,
|
| 58 |
exact_match, f1_score, run_qa, _openai_embed, _openai_complete,
|
| 59 |
)
|
|
|
|
| 69 |
"""Load KG, embeddings, data — once for all experiments."""
|
| 70 |
api_key = os.environ.get("OPENAI_API_KEY", "")
|
| 71 |
|
| 72 |
+
config = PassageEntityConfig(
|
| 73 |
llm_model="gpt-4o-mini",
|
| 74 |
embedding_model_key="openai-small",
|
| 75 |
dataset=dataset,
|
|
|
|
| 110 |
|
| 111 |
# Build retriever
|
| 112 |
reranker = FactReranker(llm_func)
|
| 113 |
+
retriever = PassageEntityRetriever(
|
| 114 |
config=config,
|
| 115 |
embedding_model=embedding_model,
|
| 116 |
reranker=reranker,
|
|
|
|
| 126 |
|
| 127 |
|
| 128 |
def run_retrieval_with_params(
|
| 129 |
+
retriever: PassageEntityRetriever,
|
| 130 |
queries: List[str],
|
| 131 |
gold_docs: List[List[str]],
|
| 132 |
gold_answers,
|
|
|
|
| 136 |
query_aware: bool = True,
|
| 137 |
) -> Dict:
|
| 138 |
"""Run retrieval with specific edge weight params. Returns metrics dict."""
|
| 139 |
+
from src.passage_entity.utils import compute_mdhash_id, min_max_normalize
|
| 140 |
|
| 141 |
retriever._encode_queries(queries)
|
| 142 |
k_list = [1, 2, 5, 10, 20, 50, 100, 200]
|
experiments/query_aware_ablation.py
CHANGED
|
@@ -28,7 +28,7 @@ _project_root = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
|
|
| 28 |
sys.path.insert(0, _project_root)
|
| 29 |
|
| 30 |
import types as _types
|
| 31 |
-
for _pkg_path in ["src", "src.retrievers", "src.
|
| 32 |
if _pkg_path not in sys.modules:
|
| 33 |
_m = _types.ModuleType(_pkg_path)
|
| 34 |
_m.__path__ = [os.path.join(_project_root, *_pkg_path.split("."))]
|
|
@@ -47,18 +47,18 @@ _src = os.path.join(_project_root, "src")
|
|
| 47 |
_load_mod("src.retrievers.base", os.path.join(_src, "retrievers", "base.py"))
|
| 48 |
_load_mod("src.retrievers.flow_diffusion", os.path.join(_src, "retrievers", "flow_diffusion.py"))
|
| 49 |
|
| 50 |
-
from src.
|
| 51 |
-
from src.
|
| 52 |
-
from src.
|
| 53 |
-
from src.
|
| 54 |
-
from src.
|
| 55 |
-
from src.
|
| 56 |
-
from src.
|
| 57 |
-
from src.
|
| 58 |
get_gold_docs, get_gold_answers, recall_at_k,
|
| 59 |
exact_match, f1_score, run_qa, _openai_embed, _openai_complete,
|
| 60 |
)
|
| 61 |
-
from src.
|
| 62 |
|
| 63 |
logging.basicConfig(level=logging.WARNING)
|
| 64 |
|
|
@@ -69,7 +69,7 @@ logging.basicConfig(level=logging.WARNING)
|
|
| 69 |
|
| 70 |
def load_dataset_and_kg(dataset="musique", num_queries=10):
|
| 71 |
api_key = os.environ.get("OPENAI_API_KEY", "")
|
| 72 |
-
config =
|
| 73 |
llm_model="gpt-4o-mini",
|
| 74 |
embedding_model_key="openai-small",
|
| 75 |
dataset=dataset,
|
|
@@ -106,7 +106,7 @@ def load_dataset_and_kg(dataset="musique", num_queries=10):
|
|
| 106 |
builder.index(docs)
|
| 107 |
|
| 108 |
reranker = FactReranker(llm_func)
|
| 109 |
-
retriever =
|
| 110 |
config=config, embedding_model=embedding_model, reranker=reranker,
|
| 111 |
graph=builder.graph,
|
| 112 |
chunk_embedding_store=builder.chunk_embedding_store,
|
|
@@ -133,7 +133,7 @@ def load_dataset_and_kg(dataset="musique", num_queries=10):
|
|
| 133 |
# ===========================================================================
|
| 134 |
|
| 135 |
def run_qafd_detailed(
|
| 136 |
-
retriever:
|
| 137 |
query: str,
|
| 138 |
gold_doc_set: set,
|
| 139 |
alpha: float,
|
|
|
|
| 28 |
sys.path.insert(0, _project_root)
|
| 29 |
|
| 30 |
import types as _types
|
| 31 |
+
for _pkg_path in ["src", "src.retrievers", "src.passage_entity"]:
|
| 32 |
if _pkg_path not in sys.modules:
|
| 33 |
_m = _types.ModuleType(_pkg_path)
|
| 34 |
_m.__path__ = [os.path.join(_project_root, *_pkg_path.split("."))]
|
|
|
|
| 47 |
_load_mod("src.retrievers.base", os.path.join(_src, "retrievers", "base.py"))
|
| 48 |
_load_mod("src.retrievers.flow_diffusion", os.path.join(_src, "retrievers", "flow_diffusion.py"))
|
| 49 |
|
| 50 |
+
from src.passage_entity.config import PassageEntityConfig
|
| 51 |
+
from src.passage_entity.embedding_store import EmbeddingModelWrapper
|
| 52 |
+
from src.passage_entity.kg_builder import KGBuilder
|
| 53 |
+
from src.passage_entity.openie import OpenIE
|
| 54 |
+
from src.passage_entity.reranker import FactReranker
|
| 55 |
+
from src.passage_entity.retriever import PassageEntityRetriever
|
| 56 |
+
from src.passage_entity.graph_adapter import IGraphQAFD
|
| 57 |
+
from src.passage_entity.benchmark_runner import (
|
| 58 |
get_gold_docs, get_gold_answers, recall_at_k,
|
| 59 |
exact_match, f1_score, run_qa, _openai_embed, _openai_complete,
|
| 60 |
)
|
| 61 |
+
from src.passage_entity.utils import compute_mdhash_id, min_max_normalize
|
| 62 |
|
| 63 |
logging.basicConfig(level=logging.WARNING)
|
| 64 |
|
|
|
|
| 69 |
|
| 70 |
def load_dataset_and_kg(dataset="musique", num_queries=10):
|
| 71 |
api_key = os.environ.get("OPENAI_API_KEY", "")
|
| 72 |
+
config = PassageEntityConfig(
|
| 73 |
llm_model="gpt-4o-mini",
|
| 74 |
embedding_model_key="openai-small",
|
| 75 |
dataset=dataset,
|
|
|
|
| 106 |
builder.index(docs)
|
| 107 |
|
| 108 |
reranker = FactReranker(llm_func)
|
| 109 |
+
retriever = PassageEntityRetriever(
|
| 110 |
config=config, embedding_model=embedding_model, reranker=reranker,
|
| 111 |
graph=builder.graph,
|
| 112 |
chunk_embedding_store=builder.chunk_embedding_store,
|
|
|
|
| 133 |
# ===========================================================================
|
| 134 |
|
| 135 |
def run_qafd_detailed(
|
| 136 |
+
retriever: PassageEntityRetriever,
|
| 137 |
query: str,
|
| 138 |
gold_doc_set: set,
|
| 139 |
alpha: float,
|
experiments/run_all_ablations.sh
CHANGED
|
@@ -4,7 +4,7 @@
|
|
| 4 |
|
| 5 |
DATASET="musique"
|
| 6 |
N=100
|
| 7 |
-
BASE="python src/
|
| 8 |
|
| 9 |
echo "======================================================================"
|
| 10 |
echo " QAFD-RAG Query-Awareness Ablation (${DATASET}, ${N} queries)"
|
|
|
|
| 4 |
|
| 5 |
DATASET="musique"
|
| 6 |
N=100
|
| 7 |
+
BASE="python src/passage_entity/benchmark_runner.py --task multihop --dataset $DATASET --num_queries $N --embedding_model openai-small --skip_qa"
|
| 8 |
|
| 9 |
echo "======================================================================"
|
| 10 |
echo " QAFD-RAG Query-Awareness Ablation (${DATASET}, ${N} queries)"
|
experiments/run_alpha_qa_sweep.sh
CHANGED
|
@@ -1,8 +1,8 @@
|
|
| 1 |
#!/bin/bash
|
| 2 |
# Alpha × QA sweep: find the sweet spot where decoupled QA edge weights help
|
| 3 |
-
cd /
|
| 4 |
N=100
|
| 5 |
-
BASE="python src/
|
| 6 |
|
| 7 |
echo "======================================================================"
|
| 8 |
echo " Alpha x Query-Awareness Sweep (decoupled push, $N queries)"
|
|
|
|
| 1 |
#!/bin/bash
|
| 2 |
# Alpha × QA sweep: find the sweet spot where decoupled QA edge weights help
|
| 3 |
+
cd "$(dirname "$0")/.."
|
| 4 |
N=100
|
| 5 |
+
BASE="python src/passage_entity/benchmark_runner.py --task multihop --num_queries $N --embedding_model openai-small --skip_qa"
|
| 6 |
|
| 7 |
echo "======================================================================"
|
| 8 |
echo " Alpha x Query-Awareness Sweep (decoupled push, $N queries)"
|
experiments/run_batch_push_ablation.sh
CHANGED
|
@@ -1,9 +1,9 @@
|
|
| 1 |
#!/bin/bash
|
| 2 |
# Batch push ablation: does batch push make edge weights matter?
|
| 3 |
# Compare: single vs batch, agnostic vs aware
|
| 4 |
-
cd /
|
| 5 |
N=100
|
| 6 |
-
BASE="python src/
|
| 7 |
|
| 8 |
echo "======================================================================"
|
| 9 |
echo " Batch Push Ablation ($N queries per dataset)"
|
|
|
|
| 1 |
#!/bin/bash
|
| 2 |
# Batch push ablation: does batch push make edge weights matter?
|
| 3 |
# Compare: single vs batch, agnostic vs aware
|
| 4 |
+
cd "$(dirname "$0")/.."
|
| 5 |
N=100
|
| 6 |
+
BASE="python src/passage_entity/benchmark_runner.py --task multihop --num_queries $N --embedding_model openai-small --skip_qa"
|
| 7 |
|
| 8 |
echo "======================================================================"
|
| 9 |
echo " Batch Push Ablation ($N queries per dataset)"
|
experiments/run_batch_push_nvidia.sh
CHANGED
|
@@ -1,9 +1,9 @@
|
|
| 1 |
#!/bin/bash
|
| 2 |
# Batch push sweep on nvidia KG (dense, 1.6M edges)
|
| 3 |
# Goal: find config where QA-aware beats agnostic AND recall is high
|
| 4 |
-
cd /
|
| 5 |
N=100
|
| 6 |
-
BASE="python src/
|
| 7 |
LOG=experiments/results/batch_push_nvidia.log
|
| 8 |
mkdir -p experiments/results
|
| 9 |
exec > >(tee -a $LOG) 2>&1
|
|
|
|
| 1 |
#!/bin/bash
|
| 2 |
# Batch push sweep on nvidia KG (dense, 1.6M edges)
|
| 3 |
# Goal: find config where QA-aware beats agnostic AND recall is high
|
| 4 |
+
cd "$(dirname "$0")/.."
|
| 5 |
N=100
|
| 6 |
+
BASE="python src/passage_entity/benchmark_runner.py --task multihop --num_queries $N --embedding_model nvidia-nv-embed-v2 --skip_qa"
|
| 7 |
LOG=experiments/results/batch_push_nvidia.log
|
| 8 |
mkdir -p experiments/results
|
| 9 |
exec > >(tee -a $LOG) 2>&1
|
experiments/run_decoupled_ablation.sh
CHANGED
|
@@ -1,9 +1,9 @@
|
|
| 1 |
#!/bin/bash
|
| 2 |
# Decoupled push ablation: does separating accumulation from routing
|
| 3 |
# make query-aware edge weights effective?
|
| 4 |
-
cd /
|
| 5 |
N=100
|
| 6 |
-
BASE="python src/
|
| 7 |
|
| 8 |
echo "======================================================================"
|
| 9 |
echo " Decoupled Push Ablation ($N queries per dataset)"
|
|
|
|
| 1 |
#!/bin/bash
|
| 2 |
# Decoupled push ablation: does separating accumulation from routing
|
| 3 |
# make query-aware edge weights effective?
|
| 4 |
+
cd "$(dirname "$0")/.."
|
| 5 |
N=100
|
| 6 |
+
BASE="python src/passage_entity/benchmark_runner.py --task multihop --num_queries $N --embedding_model openai-small --skip_qa"
|
| 7 |
|
| 8 |
echo "======================================================================"
|
| 9 |
echo " Decoupled Push Ablation ($N queries per dataset)"
|
experiments/run_nvidia_qa_ablation.sh
CHANGED
|
@@ -1,9 +1,9 @@
|
|
| 1 |
#!/bin/bash
|
| 2 |
# Query-awareness ablation on nvidia-nv-embed-v2 KGs (dense, 1.6M edges)
|
| 3 |
# Tests: QA-aware vs agnostic, different alpha/epsilon settings
|
| 4 |
-
cd /
|
| 5 |
N=100
|
| 6 |
-
BASE="python src/
|
| 7 |
|
| 8 |
echo "======================================================================"
|
| 9 |
echo " Query-Awareness on nvidia KG (dense graph, $N queries)"
|
|
|
|
| 1 |
#!/bin/bash
|
| 2 |
# Query-awareness ablation on nvidia-nv-embed-v2 KGs (dense, 1.6M edges)
|
| 3 |
# Tests: QA-aware vs agnostic, different alpha/epsilon settings
|
| 4 |
+
cd "$(dirname "$0")/.."
|
| 5 |
N=100
|
| 6 |
+
BASE="python src/passage_entity/benchmark_runner.py --task multihop --num_queries $N --embedding_model nvidia-nv-embed-v2 --skip_qa"
|
| 7 |
|
| 8 |
echo "======================================================================"
|
| 9 |
echo " Query-Awareness on nvidia KG (dense graph, $N queries)"
|
experiments/run_overnight_qa_awareness.sh
CHANGED
|
@@ -2,8 +2,8 @@
|
|
| 2 |
# Overnight query-awareness experiments
|
| 3 |
# Tests decoupled push with alpha=3: QA-aware vs agnostic
|
| 4 |
# Across tasks, graph types, and embedding models
|
| 5 |
-
cd /
|
| 6 |
-
LOG=/
|
| 7 |
mkdir -p experiments/results
|
| 8 |
exec > >(tee -a $LOG) 2>&1
|
| 9 |
echo "======================================================================"
|
|
@@ -11,7 +11,7 @@ echo " Overnight Query-Awareness Experiments"
|
|
| 11 |
echo " Started: $(date)"
|
| 12 |
echo "======================================================================"
|
| 13 |
|
| 14 |
-
BASE_PE="python src/
|
| 15 |
|
| 16 |
# =====================================================================
|
| 17 |
# 1. PASSAGE-ENTITY: Multihop with OpenAI embedding (100q, alpha=3)
|
|
|
|
| 2 |
# Overnight query-awareness experiments
|
| 3 |
# Tests decoupled push with alpha=3: QA-aware vs agnostic
|
| 4 |
# Across tasks, graph types, and embedding models
|
| 5 |
+
cd "$(dirname "$0")/.."
|
| 6 |
+
LOG=./experiments/results/overnight_qa_awareness.log
|
| 7 |
mkdir -p experiments/results
|
| 8 |
exec > >(tee -a $LOG) 2>&1
|
| 9 |
echo "======================================================================"
|
|
|
|
| 11 |
echo " Started: $(date)"
|
| 12 |
echo "======================================================================"
|
| 13 |
|
| 14 |
+
BASE_PE="python src/passage_entity/benchmark_runner.py"
|
| 15 |
|
| 16 |
# =====================================================================
|
| 17 |
# 1. PASSAGE-ENTITY: Multihop with OpenAI embedding (100q, alpha=3)
|
experiments/run_qa_awareness_v2.sh
CHANGED
|
@@ -1,8 +1,8 @@
|
|
| 1 |
#!/bin/bash
|
| 2 |
# Query-Awareness Ablation V2: warm walk, accumulation, more steps
|
| 3 |
-
cd /
|
| 4 |
N=100
|
| 5 |
-
BASE="python src/
|
| 6 |
|
| 7 |
echo "======================================================================"
|
| 8 |
echo " Query-Awareness V2 Ablation ($N queries per dataset)"
|
|
|
|
| 1 |
#!/bin/bash
|
| 2 |
# Query-Awareness Ablation V2: warm walk, accumulation, more steps
|
| 3 |
+
cd "$(dirname "$0")/.."
|
| 4 |
N=100
|
| 5 |
+
BASE="python src/passage_entity/benchmark_runner.py --task multihop --num_queries $N --embedding_model openai-small --skip_qa"
|
| 6 |
|
| 7 |
echo "======================================================================"
|
| 8 |
echo " Query-Awareness V2 Ablation ($N queries per dataset)"
|
experiments/run_sim_mode_ablation.sh
CHANGED
|
@@ -2,9 +2,9 @@
|
|
| 2 |
# Edge weight ablation: similarity contrast functions across 3 datasets
|
| 3 |
# Tests whether sharper similarity contrast makes query-aware edge weights effective
|
| 4 |
|
| 5 |
-
cd /
|
| 6 |
N=100
|
| 7 |
-
BASE="python src/
|
| 8 |
|
| 9 |
echo "======================================================================"
|
| 10 |
echo " Similarity Mode Ablation ($N queries per dataset)"
|
|
|
|
| 2 |
# Edge weight ablation: similarity contrast functions across 3 datasets
|
| 3 |
# Tests whether sharper similarity contrast makes query-aware edge weights effective
|
| 4 |
|
| 5 |
+
cd "$(dirname "$0")/.."
|
| 6 |
N=100
|
| 7 |
+
BASE="python src/passage_entity/benchmark_runner.py --task multihop --num_queries $N --embedding_model openai-small --skip_qa"
|
| 8 |
|
| 9 |
echo "======================================================================"
|
| 10 |
echo " Similarity Mode Ablation ($N queries per dataset)"
|