TechKick's picture
Initial deployment
959c484
Raw
History Blame Contribute Delete
1.51 kB
import faiss
import numpy as np
from embeddings import get_embeddings
class RAG:
def __init__(self):
self.index = None
self.chunks = []
def chunk_text(self, text, chunk_size=500):
words = text.split()
chunks = []
for i in range(0, len(words), chunk_size):
chunks.append(" ".join(words[i:i + chunk_size]))
return chunks
def create_index(self, text):
self.chunks = self.chunk_text(text)
if not self.chunks:
return
embeddings = get_embeddings(self.chunks)
embeddings = np.atleast_2d(np.array(embeddings)).astype("float32")
dimension = embeddings.shape[1]
self.index = faiss.IndexFlatL2(dimension)
self.index.add(embeddings)
def search(self, query, top_k=3):
if self.index is None or not self.chunks:
return []
query_embedding = get_embeddings([query])
query_embedding = np.atleast_2d(np.array(query_embedding)).astype("float32")
top_k = min(top_k, len(self.chunks))
distances, indices = self.index.search(query_embedding, top_k)
results = []
for score, idx in zip(distances[0], indices[0]):
if idx == -1:
continue
results.append(
{
"chunk": self.chunks[idx],
"score": float(score),
"chunk_id": int(idx)
}
)
return results