Chapter 1: Similarity Search
Introduction
Similarity search is the foundation of retrieval in RAG systems. It finds documents whose vector representations are closest to the query vector.
Distance Metrics
Cosine Similarity
import numpy as np
def cosine_similarity(a, b):
return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))
# Range: -1 to 1 (1 = identical)
Euclidean Distance
def euclidean_distance(a, b):
return np.linalg.norm(a - b)
# Range: 0 to infinity (0 = identical)
Inner Product (Dot Product)
def inner_product(a, b):
return np.dot(a, b)
# For normalized vectors, equivalent to cosine
Top-K Retrieval
from langchain.vectorstores import Chroma
# Create retriever
retriever = vectorstore.as_retriever(
search_type="similarity",
search_kwargs={"k": 5} # Return top 5 results
)
# Retrieve
docs = retriever.get_relevant_documents("What is RAG?")
Score Thresholds
Filter by minimum similarity:
retriever = vectorstore.as_retriever(
search_type="similarity_score_threshold",
search_kwargs={
"score_threshold": 0.7, # Minimum similarity
"k": 10
}
)
Maximum Marginal Relevance (MMR)
Balance relevance with diversity:
retriever = vectorstore.as_retriever(
search_type="mmr",
search_kwargs={
"k": 5,
"fetch_k": 20, # Fetch more candidates
"lambda_mult": 0.7 # 1=relevance, 0=diversity
}
)
Comparison
| Method | Best For | Trade-off |
|---|---|---|
| Similarity | General use | May have redundant results |
| Threshold | Quality filtering | May return few results |
| MMR | Diverse results | Slightly lower relevance |
Next Steps
Continue to Chapter 2: Hybrid Search.