Spaces:
Sleeping
Sleeping
import gradio as gr | |
from fastapi import FastAPI | |
from langchain.chat_models import ChatOpenAI | |
from langchain.embeddings import OpenAIEmbeddings | |
from langchain.chains import LLMChain | |
from langchain.prompts import PromptTemplate | |
from langchain.vectorstores import FAISS | |
from dotenv import load_dotenv | |
import os | |
load_dotenv() | |
app = FastAPI() | |
openai_api_key = os.getenv("OPENAI_API_KEY") | |
embeddings = OpenAIEmbeddings(openai_api_key=openai_api_key) | |
db = FAISS.load_local("faiss_index", embeddings, allow_dangerous_deserialization=True) | |
prompt_template = """ | |
You are an expert in skin cancer, etc. | |
Answer the question based only on the following context, which can include text, images, and tables: | |
{context} | |
Question: {question} | |
Don't answer if you are not sure and decline to answer and say "Sorry, I don't have much information about it." | |
Just return the helpful answer in as much detail as possible. | |
Answer: | |
""" | |
qa_chain = LLMChain(llm=ChatOpenAI(model="gpt-4", openai_api_key=openai_api_key, max_tokens=1024), | |
prompt=PromptTemplate.from_template(prompt_template)) | |
def get_answer(question: str): | |
relevant_docs = db.similarity_search(question) | |
context = "" | |
relevant_images = [] | |
for d in relevant_docs: | |
if d.metadata['type'] == 'text': | |
context += '[text]' + d.metadata['original_content'] | |
elif d.metadata['type'] == 'table': | |
context += '[table]' + d.metadata['original_content'] | |
elif d.metadata['type'] == 'image': | |
context += '[image]' + d.page_content | |
relevant_images.append(d.metadata['original_content']) | |
result = qa_chain.run({'context': context, 'question': question}) | |
return {"relevant_images": relevant_images[0], "result": result} | |
iface = gr.Interface(fn=get_answer, inputs="text", outputs="json") | |
# Run the Gradio interface inside FastAPI | |
if __name__ == "__main__": | |
iface.launch() | |