Angshul/SparseGeometricRAG
SparseGeometricRAG CPU-first sparse geometric retrieval for practical top-10 RAG No transformer inference at retrieval time. No retrieval GPU requirement. No dense document-vector dot products. No external API. SparseGeometricRAG is a retrieval system built around one systems objective: make the retrieval layer cheap enough to run on ordinary multicore CPU hardware without turning the corpus into a dense embedding database. It uses sparse TF-IDF geometry, fuzzy… See the full description on the dataset page: https://huggingface.co/datasets/Angshul/SparseGeometricRAG.
0331
1import sys,time,numpy as np,pandas as pd,json2sys.path.insert(0,'/mnt/data')3import msmarco_full_search_fastp as m4from msmarco_full_search_fastp import FullIndex,load_query_texts,qrels_from_tsv,eval_run,ROOT,WORK,zscore5P=8000; NS=10006LAM=[0,0.25,0.5,1,2.5,5,10,25]7idx=FullIndex(); print('loaded',flush=True)8tr=pd.read_csv(ROOT/'train.tsv',sep='\t',usecols=['query-id']); uq=np.unique(tr['query-id'].to_numpy()); rng=np.random.default_rng(20260815); ids=[str(x) for x in rng.choice(uq,size=NS,replace=False)]; del tr9texts=load_query_texts(ids); qrels=qrels_from_tsv(ROOT/'train.tsv',ids,positive_only=True)10w=idx.prepare(texts[ids[0]],hmax=1,pool_max=P); del w11runs={x:{} for x in LAM}; purelex={}; puretail={}; times=[]12for z,qid in enumerate(ids):13 t=time.perf_counter(); pp=idx.prepare(texts[qid],hmax=1,pool_max=P); times.append((time.perf_counter()-t)*1000)14 if pp is None:15 for lam in LAM: runs[lam][qid]=[]16 purelex[qid]=[]; puretail[qid]=[]17 else:18 docs=pp['cand_docs'][:P]; zt=zscore(pp['cand_tail'][:P]); zl=zscore(pp['lex'][:P]); zs=zscore(pp['sem'][:P])19 for lam in LAM:20 score=zt+lam*zl+0.05*zs; oo=np.argsort(score)[::-1][:100]; runs[lam][qid]=[int(x) for x in docs[oo]]21 purelex[qid]=[int(x) for x in docs[np.argsort(zl)[::-1][:100]]]22 puretail[qid]=[int(x) for x in docs[np.argsort(zt)[::-1][:100]]]23 if (z+1)%100==0: print('q',z+1,'med',np.median(times),flush=True)24res={}25for lam in LAM:26 res[str(lam)]=eval_run(runs[lam],qrels); print('LAM',lam,res[str(lam)],flush=True)27res['purelex']=eval_run(purelex,qrels); res['puretail']=eval_run(puretail,qrels); print('PURELEX',res['purelex'],flush=True); print('PURETAIL',res['puretail'],flush=True)28json.dump({'P':P,'results':res,'timing':{'median':float(np.median(times)),'p95':float(np.percentile(times,95))}},open(WORK/'lambda_diag.json','w'),indent=2)29 