-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.py
More file actions
63 lines (51 loc) · 1.58 KB
/
main.py
File metadata and controls
63 lines (51 loc) · 1.58 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
from fastapi import FastAPI, Request
from pydantic import BaseModel
from fastapi.middleware.cors import CORSMiddleware
import faiss
import numpy as np
import pickle
from gemini_utils import embed_text, setup_gemini
# Initialize Gemini + FAISS
gemini = setup_gemini()
index = faiss.read_index("faiss_index.index")
with open("faiss_metadata.pkl", "rb") as f:
metadata = pickle.load(f)
texts = metadata["texts"]
metadatas = metadata["metadatas"]
app = FastAPI()
# Optional: allow all CORS origins for dev
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
class QueryRequest(BaseModel):
query: str
def search_chunks(query, top_k=5):
query_emb = np.array(embed_text(query), dtype="float32").reshape(1, -1)
D, I = index.search(query_emb, top_k)
return [{"text": texts[i], "page": metadatas[i]["page"]} for i in I[0]]
def generate_answer(query, chunks):
context = "\n\n".join([f"(Page {c['page']}) {c['text']}" for c in chunks])
prompt = f"""
You are a helpful AI tutor helping a student understand history.
Use the following textbook excerpts to answer the question.
Textbook Context:
{context}
Question:
{query}
Answer:"""
response = gemini.generate_content(prompt)
return response.text.strip()
@app.post("/ask")
async def ask_bot(request: QueryRequest):
query = request.query
chunks = search_chunks(query)
answer = generate_answer(query, chunks)
pages = list(set([c["page"] for c in chunks]))
return {
"answer": answer,
"pages": pages
}