| 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} |
|
|