|
from fastapi import FastAPI, Request, Query |
|
from fastapi.templating import Jinja2Templates |
|
from pydantic import BaseModel |
|
from sentence_transformers import SentenceTransformer |
|
import faiss |
|
import numpy as np |
|
|
|
app = FastAPI() |
|
model = SentenceTransformer('paraphrase-MiniLM-L6-v2') |
|
index = faiss.IndexFlatL2(384) |
|
|
|
templates = Jinja2Templates(directory=".") |
|
|
|
class EmbedRequest(BaseModel): |
|
texts: list[str] |
|
|
|
class SearchRequest(BaseModel): |
|
text: str |
|
n: int = 5 |
|
|
|
@app.get("/") |
|
def read_root(request: Request): |
|
return templates.TemplateResponse("index.html", {"request": request}) |
|
|
|
@app.post("/embed") |
|
def embed_strings(request: EmbedRequest): |
|
embeddings = model.encode(request.texts) |
|
index.add(np.array(embeddings)) |
|
return {"message": "Strings embedded and added to FAISS database"} |
|
|
|
@app.post("/search") |
|
def search_string(request: SearchRequest): |
|
embedding = model.encode([request.text]) |
|
distances, indices = index.search(np.array(embedding), request.n) |
|
return {"distances": distances[0].tolist(), "indices": indices[0].tolist()} |
|
|