Repository navigation
Expand file tree
/
Copy pathquery.py
More file actions
60 lines (49 loc) · 1.57 KB
/
Copy pathquery.py
File metadata and controls
60 lines (49 loc) · 1.57 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
import chromadb
from config import (
CHROMA_DB_DIR,
COLLECTION_NAME,
EMBEDDING_MODEL,
TOP_K_RESULTS,
)
from utils.embedding import EmbeddingModel
class QueryEngine:
"""
Search the vector database for relevant document chunks.
"""
def __init__(self) -> None:
self.embedding_model = EmbeddingModel(EMBEDDING_MODEL)
client = chromadb.PersistentClient(path=str(CHROMA_DB_DIR))
self.collection = client.get_collection(name=COLLECTION_NAME)
def search(self, question: str) -> list[dict]:
"""
Search the collection for the most relevant chunks.
Args:
question: User question.
Returns:
List of retrieved chunks with metadata.
"""
question_embedding = self.embedding_model.encode([question])[0]
results = self.collection.query(
query_embeddings=[question_embedding],
n_results=TOP_K_RESULTS,
)
retrieved_chunks = []
documents = results["documents"][0]
metadatas = results["metadatas"][0]
distances = results["distances"][0]
ids = results["ids"][0]
for document, metadata, distance, chunk_id in zip(
documents,
metadatas,
distances,
ids,
):
retrieved_chunks.append(
{
"id": chunk_id,
"content": document,
"source": metadata["source"],
"distance": distance,
}
)
return retrieved_chunks