Spaces:
Sleeping
Sleeping
| import logging | |
| try: | |
| import faiss | |
| _HAS_FAISS = True | |
| except ImportError: | |
| logging.warning("FAISS not installed — retrieval will be disabled. Install faiss-cpu or faiss-gpu for full functionality.") | |
| _HAS_FAISS = False | |
| from sentence_transformers import SentenceTransformer | |
| # load embedding model (still works even if FAISS missing) | |
| _model = SentenceTransformer("all-MiniLM-L6-v2") | |
| _index = None | |
| _docs = [] | |
| def init_retriever(docs=None): | |
| """ | |
| Initialize FAISS index if FAISS is available. | |
| docs: list[str] to index | |
| """ | |
| global _index, _docs | |
| if not _HAS_FAISS: | |
| _docs = docs or [] | |
| return | |
| if docs: | |
| _docs = docs | |
| embeddings = _model.encode(docs, convert_to_numpy=True) | |
| d = embeddings.shape[1] | |
| _index = faiss.IndexFlatL2(d) | |
| _index.add(embeddings) | |
| def retrieve_context(query: str, k: int = 5): | |
| """ | |
| Retrieve top-k docs matching query. | |
| Falls back to empty list if FAISS unavailable. | |
| """ | |
| if not _HAS_FAISS or _index is None or not _docs: | |
| return [] | |
| q_emb = _model.encode([query], convert_to_numpy=True) | |
| D, I = _index.search(q_emb, k) | |
| return [_docs[i] for i in I[0] if i < len(_docs)] | |