MANIT_Chat / server /classes /RAGRetriever.py
WizardCoder2007's picture
first commit
2e9afea
Raw
History Blame Contribute Delete
2.48 kB
from typing import List,Dict,Any,Tuple
from .EmbeddingManager import EmbeddingManager
from .VectorStore import VectorStore
import numpy as np
class RAGRetriever:
def __init__(self,vector_store: VectorStore, embedding_manager:EmbeddingManager):
self.vector_store= vector_store
self.embedding_manager= embedding_manager
def retrieve(self,query: str, top_k: int=10, score_threshold: float= 0.5) -> List[Dict[str,Any]]:
print(f"retrieving documents for query: {query}")
print(f"Top_k: {top_k} score_threshold: {score_threshold}")
query_embedding= self.embedding_manager.generate_embeddings([query])[0]
# 1D array representing just 1 query
# search in vector store
try:
results= self.vector_store.collection.query(
query_embeddings= [query_embedding.tolist()],
# this expects batch of queries
n_results= top_k
)
retrieved_docs= []
if results['documents'] and results['documents'][0]:
documents= results['documents'][0]
metadatas= results['metadatas'][0]
distances= results['distances'][0]
ids= results['ids'][0]
metadatas= results['metadatas'][0]
for i, (doc_id,document,metadata,distance) in enumerate(zip(ids,documents,metadatas,distances)):
# convert distance to similarity score (chromadb uses cosine distance)
print(distance)
similarity_score= float(1.0-distance)
source_file = metadata.get('source', metadata.get('source_file', 'Unknown Source'))
print(source_file)
if similarity_score>=score_threshold:
retrieved_docs.append({
'id': doc_id,
'content': document,
'metadata': metadata,
'similarity_score': similarity_score,
'distance': distance,
'rank': i+1
})
print(f"Retrieved {len(retrieved_docs)} document after filtering")
else:
print("No documents found")
return retrieved_docs
except Exception as e:
print(f"erorr in retrieving documents for query: {query}")
return []