Skip to main content

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​

MethodBest ForTrade-off
SimilarityGeneral useMay have redundant results
ThresholdQuality filteringMay return few results
MMRDiverse resultsSlightly lower relevance

Next Steps​

Continue to Chapter 2: Hybrid Search.