|
from fastapi import FastAPI |
|
from txtai.embeddings import Embeddings |
|
from txtai.pipeline import Extractor |
|
import os |
|
from langchain import HuggingFaceHub |
|
from langchain.prompts import PromptTemplate |
|
from langchain.chains import LLMChain |
|
|
|
|
|
|
|
|
|
|
|
app = FastAPI(docs_url="/") |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def _check_if_db_exists(db_path: str) -> bool: |
|
return os.path.exists(db_path) |
|
|
|
|
|
def _load_embeddings_from_db( |
|
db_present: bool, |
|
domain: str, |
|
path: str = "sentence-transformers/all-MiniLM-L6-v2", |
|
): |
|
|
|
embeddings = Embeddings({"path": path, "content": True}) |
|
|
|
if not db_present: |
|
return embeddings |
|
else: |
|
if domain == "": |
|
embeddings.load("index") |
|
else: |
|
print(3) |
|
embeddings.load(f"index/{domain}") |
|
return embeddings |
|
|
|
|
|
def _prompt(question): |
|
return f"""Answer the following question using only the context below. Say 'no answer' when the question can't be answered. |
|
Question: {question} |
|
Context: """ |
|
|
|
|
|
def _search(query, extractor, question=None): |
|
|
|
if not question: |
|
question = query |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return extractor([("answer", query, _prompt(question), False)])[0][1] |
|
|
|
|
|
@app.get("/rag") |
|
def rag(domain: str, question: str): |
|
db_exists = _check_if_db_exists(db_path=f"{os.getcwd()}\index\{domain}\documents") |
|
print(db_exists) |
|
|
|
embeddings = _load_embeddings_from_db(db_exists, domain) |
|
|
|
extractor = Extractor(embeddings, "google/flan-t5-base") |
|
|
|
|
|
|
|
|
|
|
|
answer = _search(question, extractor) |
|
return {"question": question, "answer": answer} |
|
|