CurryMindFree's picture
Update app.py
7635d6b verified
Raw History Blame Contribute Delete
2.73 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("""
- **Dataset: 500 News from AG_News Data + 3 custom News start with Custom News by Curry MindFree**
- **Chunking size: 25 words. Overlap: 2 words**
- **Vectorize model: BAAI/bge-small-en-v1.5**
- **Vectors similarity search: FAISS Indexing**
- **Rerank model: cross-encoder/ms-marco-MiniLM-L2-v2**
""")
demo.launch()