from huggingface_hub import hf_hub_download, InferenceClient from FlagEmbedding import FlagICLModel import pandas as pd import faiss import numpy as np import os import json # Define HF tokens HF_TOKEN_read = os.environ.get("HF_TOKEN_read") HF_TOKEN_inference = os.environ.get("HF_TOKEN_inf") # Setup InferenceClient for embeddings client = InferenceClient(provider="nebius", api_key=HF_TOKEN_inference) # Dataset repo (private) DATASET_REPO = "luciagomez/MrPhil_vector" # ------------------------------------------------------------------- # 1. Download files from Hugging Face dataset # ------------------------------------------------------------------- parquet_path = hf_hub_download( repo_id=DATASET_REPO, filename="foundations.parquet", repo_type="dataset", token=HF_TOKEN_read ) faiss_path = hf_hub_download( repo_id=DATASET_REPO, filename="faiss.index", repo_type="dataset", token=HF_TOKEN_read ) meta_path = hf_hub_download( repo_id=DATASET_REPO, filename="meta.json", repo_type="dataset", token=HF_TOKEN_read ) # ------------------------------------------------------------------- # 2. Load data # ------------------------------------------------------------------- df = pd.read_parquet(parquet_path) index = faiss.read_index(faiss_path) with open(meta_path, "r") as f: meta = json.load(f) dim = meta.get("embedding_dim", None) n = meta.get("num_vectors", len(df)) print(f"Loaded FAISS index with {n} vectors of dimension {dim}") # ------------------------------------------------------------------- # 3. Initialize BGE-ICL model for queries # ------------------------------------------------------------------- examples = [ { "instruct": "Retrieve foundations whose mission aligns with the given perspective.", "query": "Protect marine life while educating children about ocean conservation", "response": "Foundations working on marine conservation and youth education." }, { "instruct": "Retrieve foundations whose mission aligns with the given perspective.", "query": "Promote renewable energy education and community awareness", "response": "Foundations focused on clean energy advocacy and public education." } ] #model = FlagICLModel( # "BAAI/bge-en-icl", # query_instruction_for_retrieval="Given a mission statement, retrieve foundations with aligned purposes.", # examples_for_task=examples, # use_fp16=False #) def encode_query(perspective): payload = {"model": "BAAI/bge-en-icl", "inputs": perspective, "parameters": {"instruction": "Retrieve foundations aligned with perspective.", "examples": examples}} response = client.feature_extraction(**payload) return np.array(response) # ------------------------------------------------------------------- # 4. Retrieval function # ------------------------------------------------------------------- def find_similar_foundations(perspective, top_k=5): q_emb = encode_query(perspective).astype("float32") faiss.normalize_L2(q_emb) scores, idxs = index.search(q_emb, top_k) return [ {"title": df.iloc[i]["Title"], "purpose": df.iloc[i]["Purpose"], "similarity": float(scores[0][j])} for j, i in enumerate(idxs[0]) ]