Substack-Search / app.py
DTanzillo's picture
Upload 5 files
2dd29df verified
import os
import pickle
import faiss
import gradio as gr
from sentence_transformers import SentenceTransformer
## App Originally Created for Chroma, However Apple Silicon Errors provided too tough to resolve. Accordingly ChatGPT 5.1 was consulted at 12:50pm on 11/25/25 for assistance in understanding FAISS as suitable alterantive.
ROOT = os.path.dirname(os.path.abspath(__file__))
INDEX_PATH = os.path.join(ROOT, "faiss_index.bin")
META_PATH = os.path.join(ROOT, "faiss_meta.pkl")
# Load FAISS index
index = faiss.read_index(INDEX_PATH)
# Load metadata
texts, ids, meta = pickle.load(open(META_PATH, "rb"))
# Load embedding model
model = SentenceTransformer("sentence-transformers/all-MiniLM-L6-v2")
def semantic_search(query, k=3):
if not query.strip():
return "Enter a search query."
q_emb = model.encode([query]).astype("float32")
D, I = index.search(q_emb, k)
out = "# Search Results\n\n"
for rank, idx in enumerate(I[0], start=1):
src = meta[idx]["source"]
chunk = meta[idx]["chunk"]
text = texts[idx]
out += f"### Result {rank}\n"
out += f"**Source:** {src} | **Chunk:** {chunk}\n\n"
out += f"{text}\n\n---\n\n"
return out
demo = gr.Interface(
fn=semantic_search,
inputs=[
gr.Textbox(label="Query", lines=2),
gr.Slider(1, 10, value=3, step=1, label="Results")
],
outputs=gr.Markdown(label="Results"),
title="FAISS Semantic Search Engine",
description="Search Substack posts using semantic similarity."
)
if __name__ == "__main__":
demo.launch()