Shopify_AI / app /rag /retriever.py
Prerna43's picture
shopify_ai
80ef840
Raw
History Blame Contribute Delete
1.76 kB
from app.rag.embeddings import embed_queries, rerank
from app.rag.ingest import ingest_policies
from app.rag.vector_store import get_policy_collection
def ensure_vector_store_ready() -> None:
collection = get_policy_collection()
if collection.count() == 0:
ingest_policies(reset=False)
def retrieve_policies(query: str, k: int = 4, fetch_k: int = 12, use_reranker: bool = True) -> list[dict]:
ensure_vector_store_ready()
collection = get_policy_collection()
query_embedding = embed_queries([query])[0]
results = collection.query(
query_embeddings=[query_embedding],
n_results=fetch_k,
include=["documents", "metadatas", "distances"],
)
documents = results.get("documents", [[]])[0]
metadatas = results.get("metadatas", [[]])[0]
distances = results.get("distances", [[]])[0]
ids = results.get("ids", [[]])[0]
candidates = []
for chunk_id, content, metadata, distance in zip(ids, documents, metadatas, distances):
candidates.append(
{
"id": chunk_id,
"source": metadata.get("source"),
"content": content,
"metadata": metadata,
"distance": round(float(distance), 4),
"score": round(1 / (1 + float(distance)), 4),
}
)
if use_reranker and candidates:
scores = rerank(query, [candidate["content"] for candidate in candidates])
for candidate, score in zip(candidates, scores):
candidate["rerank_score"] = round(score, 4)
candidates.sort(key=lambda item: item["rerank_score"], reverse=True)
else:
candidates.sort(key=lambda item: item["score"], reverse=True)
return candidates[:k]