5a558eb09e
TypeScript SDK Compatibility V1.x E2E Tests / Select Node version matrix (push) Has been cancelled
TypeScript SDK Compatibility V1.x E2E Tests / TypeScript SDK Compatibility V1.x E2E Tests Node ${{matrix.node_version}} (push) Has been cancelled
TypeScript SDK E2E Tests / TypeScript SDK E2E Tests Node ${{matrix.node_version}} (push) Has been cancelled
Opik Optimizer - E2E Tests / build-opik (push) Has been cancelled
TypeScript SDK Compatibility V1.x E2E Tests / build-opik (push) Has been cancelled
Python SDK E2E Tests / Select Python version matrix (push) Has been cancelled
Python SDK E2E Tests / Python SDK E2E Tests ${{matrix.python_version}} (push) Has been cancelled
Python SDK E2E Tests / build-opik (push) Has been cancelled
Python SDK Compatibility V1.x E2E Tests / Select Python version matrix (push) Has been cancelled
Python SDK Compatibility V1.x E2E Tests / Python SDK Compatibility V1.x E2E Tests ${{matrix.python_version}} (push) Has been cancelled
Python SDK Compatibility V1.x E2E Tests / build-opik (push) Has been cancelled
TypeScript SDK E2E Tests / Select Node version matrix (push) Has been cancelled
TypeScript SDK E2E Tests / build-opik (push) Has been cancelled
Opik Optimizer - E2E Tests / Opik Optimizer E2E Tests Python ${{matrix.python_version}} (push) Has been cancelled
Opik Optimizer - E2E Tests / Opik Optimizer Integration Smoke Tests (push) Has been cancelled
🐙 Code Quality / detect (push) Has been cancelled
🐙 Code Quality / lint (${{ matrix.leg.name }}) (push) Has been cancelled
🐙 Code Quality / summary (push) Has been cancelled
TypeScript SDK Library Integration Tests / Check Secrets (push) Has been cancelled
TypeScript SDK Library Integration Tests / opik-vercel (Vercel AI SDK / eve) (push) Has been cancelled
SDK Library Integration Tests Runner / Check Secrets (push) Has been cancelled
SDK Library Integration Tests Runner / Missed OpenAI API Key Warning (push) Has been cancelled
SDK Library Integration Tests Runner / Build (push) Has been cancelled
SDK Library Integration Tests Runner / openai_tests (push) Has been cancelled
SDK Library Integration Tests Runner / langchain_tests (push) Has been cancelled
SDK Library Integration Tests Runner / langchain_legacy_tests (push) Has been cancelled
SDK Library Integration Tests Runner / llama_index_tests (push) Has been cancelled
SDK Library Integration Tests Runner / anthropic_tests (push) Has been cancelled
SDK Library Integration Tests Runner / mistral_tests (push) Has been cancelled
SDK Library Integration Tests Runner / groq_tests (push) Has been cancelled
SDK Library Integration Tests Runner / aisuite_tests (push) Has been cancelled
SDK Library Integration Tests Runner / haystack_tests (push) Has been cancelled
SDK Library Integration Tests Runner / dspy_tests (push) Has been cancelled
SDK Library Integration Tests Runner / crewai_v0_tests (push) Has been cancelled
SDK Library Integration Tests Runner / crewai_v1_tests (push) Has been cancelled
SDK Library Integration Tests Runner / genai_tests (push) Has been cancelled
SDK Library Integration Tests Runner / adk_tests (push) Has been cancelled
SDK Library Integration Tests Runner / adk_legacy_1_3_0_tests (push) Has been cancelled
SDK Library Integration Tests Runner / evaluation_metrics_tests (push) Has been cancelled
SDK Library Integration Tests Runner / bedrock_tests (push) Has been cancelled
SDK Library Integration Tests Runner / litellm_tests (push) Has been cancelled
SDK Library Integration Tests Runner / harbor_tests (push) Has been cancelled
SDK Library Integration Tests Runner / Slack Notification (push) Has been cancelled
Lint Opik Helm Chart / render-equality (push) Has been cancelled
Opik Optimizer - Unit Tests / Opik Optimizer Unit Tests Python ${{matrix.python_version}} (push) Has been cancelled
Python BE E2E Tests / Python BE E2E (push) Has been cancelled
Python Backend Tests / run-python-backend-tests (push) Has been cancelled
Python SDK Unit Tests / Python SDK Unit Tests ${{matrix.python_version}} (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
SDK E2E Libraries Integration Tests / Check Secrets (push) Has been cancelled
SDK E2E Libraries Integration Tests / Missed OpenAI API Key Warning (push) Has been cancelled
SDK E2E Libraries Integration Tests / build-opik (push) Has been cancelled
SDK E2E Libraries Integration Tests / E2E Lib Integration Python ${{matrix.python_version}} (push) Has been cancelled
TypeScript SDK Integration Build & Publish / build-and-publish (opik-gemini) (push) Has been cancelled
TypeScript SDK Integration Build & Publish / build-and-publish (opik-langchain) (push) Has been cancelled
TypeScript SDK Integration Build & Publish / build-and-publish (opik-openai) (push) Has been cancelled
TypeScript SDK Integration Build & Publish / build-and-publish (opik-otel) (push) Has been cancelled
TypeScript SDK Integration Build & Publish / build-and-publish (opik-vercel) (push) Has been cancelled
TypeScript SDK Build & Publish / build-and-publish (push) Has been cancelled
TypeScript SDK Unit Tests / Test on Node ${{ matrix.node-version }} (push) Has been cancelled
Backend Tests / discover-tests (push) Has been cancelled
Backend Tests / ${{ matrix.name }} (push) Has been cancelled
Build and Publish SDK / build-and-publish (push) Has been cancelled
Build Opik Docker Images / set-version (push) Has been cancelled
Build Opik Docker Images / build-backend (push) Has been cancelled
Build Opik Docker Images / build-sandbox-executor-python (push) Has been cancelled
Build Opik Docker Images / build-python-backend (push) Has been cancelled
Build Opik Docker Images / build-frontend (push) Has been cancelled
Build Opik Docker Images / create-git-tag (push) Has been cancelled
ClickHouse Migration Cluster Check / validate-clickhouse-migrations (push) Has been cancelled
Docs - Publish / run (push) Has been cancelled
E2E Tests - Post Merge (v2) / 🧪 E2E v2 Tests (${{ github.event.inputs.tier || 't1' }}) (push) Has been cancelled
E2E Tests - Post Merge (v2) / 📢 Slack Notification (push) Has been cancelled
Frontend Unit Tests / Test on Node 20 (push) Has been cancelled
Guardrails E2E Tests / Select Python version matrix (push) Has been cancelled
Guardrails E2E Tests / Guardrails E2E Tests ${{matrix.python_version}} (push) Has been cancelled
Guardrails E2E Tests / 📢 Slack Notification (push) Has been cancelled
Guardrails Backend Unit Tests / Guardrails Backend Unit Tests (push) Has been cancelled
Guardrails Backend Unit Tests / 📢 Slack Notification (push) Has been cancelled
Lint Opik Helm Chart / lint-helm-chart (Helm v3.21.0) (push) Has been cancelled
Lint Opik Helm Chart / lint-helm-chart (Helm v4.2.0) (push) Has been cancelled
Lint Opik Helm Chart / unittest-helm-chart (push) Has been cancelled
151 lines
4.3 KiB
Python
151 lines
4.3 KiB
Python
"""HotpotQA multi-hop benchmark using shared benchmark agent components.
|
|
|
|
This script is a thin runnable example that reuses the centralized benchmark
|
|
agent implementation from `benchmarks/packages/hotpot/agent.py`.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import logging
|
|
import os
|
|
import random
|
|
from typing import Any
|
|
|
|
from benchmarks.packages.hotpot.metrics import hotpot_f1
|
|
from opik_optimizer import HierarchicalReflectiveOptimizer
|
|
from opik_optimizer.datasets import hotpot
|
|
from opik_optimizer.utils.logging import setup_logging
|
|
from benchmarks.packages.hotpot.agent import build_hotpot_agent
|
|
from benchmarks.packages.hotpot.prompts import build_hotpot_prompts
|
|
from benchmarks.packages.hotpot.agent import bm25_wikipedia_search
|
|
|
|
PROJECT_HEADER = "Hotpot QA Multihop Optimization"
|
|
SEED = 42
|
|
MODEL_NAME = "openai/gpt-4.1-mini"
|
|
MODEL_PARAMS = {"temperature": 1.0}
|
|
NUM_PASSAGES = 5
|
|
TRAIN_COUNT = 150
|
|
VALIDATION_COUNT = 300
|
|
TEST_COUNT = 300
|
|
|
|
# Disable tqdm progress bars (used by bm25s)
|
|
os.environ["TQDM_DISABLE"] = "1"
|
|
|
|
setup_logging()
|
|
logger = logging.getLogger(__name__)
|
|
random.seed(SEED)
|
|
|
|
|
|
def print_header() -> None:
|
|
print("=" * 80)
|
|
print(PROJECT_HEADER)
|
|
print("=" * 80)
|
|
print()
|
|
print("This benchmark uses the centralized Hotpot multi-hop benchmark agent.")
|
|
print("- Multi-hop retrieval pipeline")
|
|
print("- Multiple optimizable prompts")
|
|
print("- Wikipedia search integration")
|
|
print()
|
|
|
|
|
|
def load_datasets() -> tuple[Any, Any, Any]:
|
|
print("Loading datasets...")
|
|
train = hotpot(count=TRAIN_COUNT, split="train", dataset_name="hotpot_train")
|
|
val = hotpot(
|
|
count=VALIDATION_COUNT,
|
|
split="validation",
|
|
dataset_name="hotpot_validation",
|
|
)
|
|
test = hotpot(count=TEST_COUNT, split="test", dataset_name="hotpot_test")
|
|
print(f" - Train: {len(train.get_items())} samples")
|
|
print(f" - Validation: {len(val.get_items())} samples")
|
|
print(f" - Test: {len(test.get_items())} samples")
|
|
print()
|
|
return train, val, test
|
|
|
|
|
|
def run_optimization(
|
|
*,
|
|
agent: Any,
|
|
initial_prompts: dict[str, Any],
|
|
train_dataset: Any,
|
|
validation_dataset: Any,
|
|
) -> Any:
|
|
optimizer = HierarchicalReflectiveOptimizer(
|
|
model=MODEL_NAME,
|
|
model_parameters=MODEL_PARAMS,
|
|
seed=SEED,
|
|
)
|
|
print(f"Running multi-prompt optimization ({optimizer.__class__.__name__})...")
|
|
return optimizer.optimize_prompt(
|
|
prompt=initial_prompts,
|
|
dataset=train_dataset,
|
|
validation_dataset=validation_dataset,
|
|
metric=hotpot_f1,
|
|
agent=agent,
|
|
max_trials=50,
|
|
)
|
|
|
|
|
|
def main() -> None:
|
|
print_header()
|
|
train_dataset, validation_dataset, test_dataset = load_datasets()
|
|
|
|
print(f"Search function: {bm25_wikipedia_search.__name__}")
|
|
print()
|
|
try:
|
|
bm25_wikipedia_search("warmup", 1)
|
|
except Exception:
|
|
logger.exception("Wikipedia warmup failed")
|
|
raise
|
|
|
|
agent = build_hotpot_agent(
|
|
model_name=MODEL_NAME,
|
|
model_parameters=MODEL_PARAMS,
|
|
)
|
|
# Keep passage count configurable in script context.
|
|
agent.num_passages = NUM_PASSAGES
|
|
initial_prompts = build_hotpot_prompts()
|
|
|
|
print("=" * 80)
|
|
print("OPTIMIZATION")
|
|
print("=" * 80)
|
|
print("This will optimize ALL prompts in the multi-hop pipeline:")
|
|
for name in initial_prompts:
|
|
print(f" - {name}")
|
|
print()
|
|
print(f"Training on hotpot_train ({TRAIN_COUNT} samples)...")
|
|
print(f"Validation on hotpot_validation ({VALIDATION_COUNT} samples)...")
|
|
print()
|
|
|
|
opt_result = run_optimization(
|
|
agent=agent,
|
|
initial_prompts=initial_prompts,
|
|
train_dataset=train_dataset,
|
|
validation_dataset=validation_dataset,
|
|
)
|
|
print(f"Optimization best score: {opt_result.score:.4f}")
|
|
print(f"Optimization rounds: {len(getattr(opt_result, 'history', []) or [])}")
|
|
|
|
print("=" * 80)
|
|
print("TESTING")
|
|
print("=" * 80)
|
|
print("Evaluating optimized prompts on test set...")
|
|
|
|
score = HierarchicalReflectiveOptimizer(
|
|
model=MODEL_NAME,
|
|
model_parameters=MODEL_PARAMS,
|
|
seed=SEED,
|
|
).evaluate_prompt(
|
|
prompt=opt_result.prompt,
|
|
dataset=test_dataset,
|
|
metric=hotpot_f1,
|
|
n_threads=4,
|
|
agent=agent,
|
|
)
|
|
print(f"Test score (hotpot_f1): {score:.4f}")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|