Deploy Semantic Search as an API with FastAPI
Let's build a Semantic Search API using FastAPI + FAISS + Sentence Transformers.
Install Required Libraries
pip install fastapi uvicorn sentence-transformers faiss-cpu
1. Folder Structure
semantic_search_api/
│
├─ main.py # FastAPI app
├─ model.py # Embedding + FAISS setup
└─ requirements.txt # Dependencies
2. Model Setup (model.py)
Initialize Sentence Transformers and FAISS index.
from sentence_transformers import SentenceTransformer
import faiss
import numpy as np
# Load Sentence Transformer Model
model = SentenceTransformer('sentence-transformers/all-MiniLM-L6-v2')
# Sample Documents
documents = [
"I love playing football.",
"Artificial Intelligence is the future.",
"Machine learning powers AI.",
"The weather is sunny today.",
"Deep learning improves neural networks.",
"It's raining outside."
]
# Generate Embeddings
document_embeddings = model.encode(documents)
# Normalize embeddings for cosine similarity
faiss.normalize_L2(document_embeddings)
# Create FAISS Index
embedding_dimension = document_embeddings.shape[1]
index = faiss.IndexFlatIP(embedding_dimension) # Inner Product (Cosine Similarity)
index.add(document_embeddings)
3. API Setup (main.py)
Create the FastAPI app.
from fastapi import FastAPI
from pydantic import BaseModel
from model import model, index, documents
import faiss
import numpy as np
app = FastAPI()
class Query(BaseModel):
text: str
top_k: int = 3
@app.get("/")
def read_root():
return {"message": "Semantic Search API is running 🚀"}
@app.post("/search")
def search(query: Query):
# Generate Query Embedding
query_embedding = model.encode([query.text])
# Normalize for Cosine Similarity
faiss.normalize_L2(query_embedding)
# Search FAISS Index
distances, indices = index.search(query_embedding, query.top_k)
results = []
for i in range(query.top_k):
results.append({
"document": documents[indices[0][i]],
"distance": float(distances[0][i])
})
return {"query": query.text, "results": results}
4. Run the API
uvicorn main:app --reload
API Endpoints
| Method | Endpoint | Description |
|---|---|---|
| GET | / |
Health check |
| POST | /search |
Perform Semantic Search |
5. Test with Postman or Curl
Request:
POST /search
Content-Type: application/json
{
"text": "Future of AI technology",
"top_k": 3
}
Response:
{
"query": "Future of AI technology",
"results": [
{
"document": "Artificial Intelligence is the future.",
"distance": 0.9823
},
{
"document": "Machine learning powers AI.",
"distance": 0.9745
},
{
"document": "Deep learning improves neural networks.",
"distance": 0.9634
}
]
}
Bonus Tip:
If you need vector persistence between restarts, you can save and load FAISS indexes:
faiss.write_index(index, "faiss_index.bin")
index = faiss.read_index("faiss_index.bin")
Conclusion 🎯
FastAPI + FAISS + Sentence Transformers gives you a blazing-fast Semantic Search API.
Comments
Post a Comment