Convert text to vectors for semantic search and similarity
Embeddings transform text into numerical vectors that capture semantic meaning. Similar texts produce similar vectors, enabling semantic search, clustering, and recommendations.
Embeddings are dense vector representations of text. They map text to points in a high-dimensional space where semantically similar content is located close together.
from langchain_openai import OpenAIEmbeddingsembeddings = OpenAIEmbeddings(model="text-embedding-3-small")# Embed a single queryquery_vector = embeddings.embed_query("What is LangChain?")print(len(query_vector)) # 1536 dimensionsprint(query_vector[:5]) # [0.123, -0.456, 0.789, ...]
# Embed a single query or search termquery = "machine learning frameworks"vector = embeddings.embed_query(query)# Returns a single vector (list of floats)print(len(vector)) # e.g., 1536
Use embed_query() for search queries and embed_documents() for the content being searched. Some models optimize these differently.
from langchain_openai import OpenAIEmbeddingsembeddings = OpenAIEmbeddings( model="text-embedding-3-large", # or text-embedding-3-small api_key="your-openai-key")# OpenAI models:# - text-embedding-3-small: Fast, cost-effective (1536 dims)# - text-embedding-3-large: Higher quality (3072 dims)# - text-embedding-ada-002: Legacy model
from langchain_huggingface import HuggingFaceEmbeddingsembeddings = HuggingFaceEmbeddings( model_name="sentence-transformers/all-mpnet-base-v2")# Popular models:# - all-mpnet-base-v2: Good general purpose# - all-MiniLM-L6-v2: Fast and lightweight# - multi-qa-mpnet-base-dot-v1: Optimized for QA
from langchain_ollama import OllamaEmbeddingsembeddings = OllamaEmbeddings( model="nomic-embed-text", base_url="http://localhost:11434")# Run locally with Ollama# No API key required, fully private
from langchain_cohere import CohereEmbeddingsembeddings = CohereEmbeddings( model="embed-english-v3.0", api_key="your-cohere-key")# Cohere models support different input types# - search_document: For documents to be searched# - search_query: For search queries
import numpy as npfrom langchain_openai import OpenAIEmbeddingsembeddings = OpenAIEmbeddings()# Embed documentsdocs = [ "Python is a programming language", "Java is a programming language", "The sky is blue"]vectors = embeddings.embed_documents(docs)# Embed queryquery = "coding languages"query_vector = embeddings.embed_query(query)def cosine_similarity(vec1, vec2): """Calculate cosine similarity between two vectors.""" dot_product = np.dot(vec1, vec2) norm1 = np.linalg.norm(vec1) norm2 = np.linalg.norm(vec2) return dot_product / (norm1 * norm2)# Find most similar documentfor i, doc_vector in enumerate(vectors): similarity = cosine_similarity(query_vector, doc_vector) print(f"Doc {i}: {similarity:.4f} - {docs[i]}")# Output:# Doc 0: 0.8756 - Python is a programming language# Doc 1: 0.8543 - Java is a programming language # Doc 2: 0.3421 - The sky is blue
from langchain_openai import OpenAIEmbeddingsembeddings = OpenAIEmbeddings()def batch_embed(texts: list[str], batch_size: int = 100): """Embed documents in batches to avoid rate limits.""" all_vectors = [] for i in range(0, len(texts), batch_size): batch = texts[i:i + batch_size] vectors = embeddings.embed_documents(batch) all_vectors.extend(vectors) print(f"Processed {min(i + batch_size, len(texts))}/{len(texts)}") return all_vectors# Process 1000 documents in batcheslarge_dataset = [f"Document {i}" for i in range(1000)]vectors = batch_embed(large_dataset, batch_size=50)