CurryMindFree's picture
Update app.py
4d69305 verified
Raw History Blame Contribute Delete
2.85 kB
import gradio as gr
import faiss
import numpy as np
from transformers import AutoTokenizer, AutoModel
import pickle
import torch
from sentence_transformers import CrossEncoder
index = faiss.read_index("index503.faiss")
with open("texts503.pkl", "rb") as f:
texts = pickle.load(f)
print(texts[500])
# chunking
chunks = []
chunk_size = 25
overlap_int = 2
for text in texts:
text_words = text.split()
for i in range(0, len(text_words), chunk_size):
chunk_words = text_words[max(i - overlap_int, 0): i + chunk_size]
chunk = " ".join(chunk_words)
chunks.append(chunk)
print(len(chunks))
# emb model
model_name = "BAAI/bge-small-en-v1.5"
tokenizer = AutoTokenizer.from_pretrained(model_name)
emb_model = AutoModel.from_pretrained(model_name)
#rerank model
reranker = CrossEncoder(
"cross-encoder/ms-marco-MiniLM-L2-v2",
max_length=512,
device="cpu"
)
def embed(query):
inputs = tokenizer(
query,
padding=True,
truncation=True,
return_tensors="pt"
)
with torch.no_grad():
outputs = emb_model(**inputs)
# Mean pooling: match your PC's implementation
embeddings = outputs.last_hidden_state.mean(dim=1)
return embeddings.cpu().numpy().astype("float32")
def retrieve(query, k=5):
q = embed([query])
scores, ids = index.search(q, k)
retrieved_chunks = [chunks[i] for i in ids[0]]
first_ret = "\n".join("Chunk ID"+str(i) +": " + chunks[i] for i in ids[0])
pairs = [
(query, chunk)
for chunk in retrieved_chunks
]
rerank_scores = reranker.predict(
pairs,
batch_size=4
)
ranked_chunks = sorted(
zip(retrieved_chunks, rerank_scores),
key=lambda x: x[1],
reverse=True
)
# 3. Format reranked results
reranked_ret = "\n".join(
f"{i}: {chunk} (score: {score:.4f})"
for i, (chunk, score) in enumerate(ranked_chunks, 1)
)
result = first_ret + "\n\nAfter reranking:\n" + reranked_ret
return result
with gr.Blocks() as demo:
gr.Markdown("""# Enter anything and press Enter""")
topic_input = gr.Textbox(
label="Enter here"
)
output = gr.Textbox(
label="Top5 most relevant news:"
)
topic_input.submit(
retrieve,
inputs=topic_input,
outputs=output
)
gr.Markdown("""
**To test and have some fun, I made 3 news.:**
- **ID500: Basketball player LeBron James jioned 76er with a 5m/year contract.**
- **ID501: Spain won 2026 Football World Cup, defeating Argentina at final.**
- **ID502: Baseball player Shohei Ohtani plays as a hitter and as a pitcher, a rare two-way player.**
- **These news will show up when you enter: Basketball, LeBron James, World Cup, Baseball, Shohei Ohtani**
""")
demo.launch()