The harness handles dataset loading, LLM calls, and scoring — you implement
one method.
The interface
1 2 3 4 5 6 7 8 91011121314151617181920212223
fromabcimportABC,abstractmethodfrompathlibimportPathclassRetriever(ABC):@abstractmethoddefretrieve(self,domain:str,query_text:str,meta:dict)->str:""" Return the context string your system would prepend to the query. The harness calls Claude with: system_prompt + context + query. domain : e.g. "calculus" query_text : benchmark query string meta : full query record — type, concept_id, hop_depth, ground_truth """defsetup(self,domain:str,graph_path:Path):"""Called once per domain before queries run. Pre-load indexes here."""passdefgenerate(self,context,query_text,client,model):"""Override to use a different LLM. Default: Claude Haiku."""...
frompathlibimportPathfromevaluation.krb_evalimportRetriever,run_evalclassSimpleRAGRetriever(Retriever):"""FAISS + sentence-transformers RAG over the domain CSV."""def__init__(self):self._retrievers={}defsetup(self,domain:str,graph_path:Path):importcsvfromlangchain_community.vectorstoresimportFAISSfromlangchain_huggingfaceimportHuggingFaceEmbeddingsdocs=[]withopen(graph_path)asf:forrowincsv.DictReader(f):deps=row.get("Dependencies","").replace("|",", ")docs.append(f"[{row['TaxonomyID']}] {row['ConceptLabel']} | prerequisites: {deps}")emb=HuggingFaceEmbeddings(model_name="all-MiniLM-L6-v2")vs=FAISS.from_texts(docs,emb)self._retrievers[domain]=vs.as_retriever(search_kwargs={"k":5})defretrieve(self,domain:str,query_text:str,meta:dict)->str:r=self._retrievers.get(domain)ifnotr:return""chunks=r.invoke(query_text)return"RETRIEVED CONTEXT:\n"+"\n".join(c.page_contentforcinchunks)if__name__=="__main__":results=run_eval(retriever=SimpleRAGRetriever(),system_name="simple-rag-minilm",domains=["calculus","biology"],# or None for all domainsdry_run=False,)print(f"Macro F1: {results['macro_f1']}")# → writes krb_submission_simple-rag-minilm_<timestamp>.json
RAGAS example (runnable — see evaluation/ragas_retriever.py)
ChromaDB + sentence-transformers retrieval with optional RAGAS v0.2 scoring
(Faithfulness, ResponseRelevancy, LLMContextRecall) after the KRB eval.
1 2 3 4 5 6 7 8 91011121314
pipinstallchromadbsentence-transformerslangchain-anthropiclangchain-huggingface
pipinstallragas# only for --ragas-eval# Test pipeline — no API calls
pythonevaluation/ragas_retriever.py--domaincalculus--dry-run
# KRB eval — 2 domains (~$0.30 Haiku)ANTHROPIC_API_KEY=sk-ant-...pythonevaluation/ragas_retriever.py--domaincalculusbiology
# KRB + RAGAS metrics (Faithfulness / Relevancy / Context Recall)ANTHROPIC_API_KEY=sk-ant-...pythonevaluation/ragas_retriever.py--domaincalculus--ragas-eval
# Full benchmark — all domains (~$5)ANTHROPIC_API_KEY=sk-ant-...pythonevaluation/ragas_retriever.py--all
# Test your retrieval pipeline without spending API credits
pythonyour_retriever.py--dry-run
# Full eval, two domainsANTHROPIC_API_KEY=sk-ant-...pythonyour_retriever.py
# Full eval, all domains (~$5 with Haiku)
pythonevaluation/krb_eval.py--systemckg--all