Rafa1986's picture
Update app.py
65881ce verified
raw
history blame
3.1 kB
import gradio as gr
import os
import PyPDF2
import pandas as pd
import openai
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import FAISS
from langchain.llms import OpenAI
def detect_language(text):
"""Detects the language of the input text using OpenAI."""
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[
{"role": "system", "content": "Detect the language of this text."},
{"role": "user", "content": text}
]
)
return response["choices"][0]["message"]["content"].strip()
# Set up OpenAI API key (replace with your key)
openai.api_key = "YOUR_OPENAI_API_KEY"
def get_text_from_pdf(pdf_files):
text = ""
for pdf in pdf_files:
reader = PyPDF2.PdfReader(pdf)
for page in reader.pages:
text += page.extract_text() + "\n"
return text
def get_text_from_txt(txt_files):
text = ""
for txt in txt_files:
text += txt.read().decode("utf-8") + "\n"
return text
def get_text_from_csv(csv_files):
text = ""
for csv in csv_files:
df = pd.read_csv(csv)
text += df.to_string() + "\n"
return text
def create_vector_database(text):
splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=100)
texts = splitter.split_text(text)
embeddings = OpenAIEmbeddings()
vector_db = FAISS.from_texts(texts, embeddings)
return vector_db
def get_answer(question, vector_db):
retriever = vector_db.as_retriever()
docs = retriever.get_relevant_documents(question)
if not docs:
return "I could not find the answer in the documents. Do you want me to search external sources?"
context = "\n".join([doc.page_content for doc in docs])
language = detect_language(question)
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[
{"role": "system", "content": f"You are a Data Analytics assistant. Answer in {language}. Use the documents to answer questions."},
{"role": "user", "content": question + "\n\nBased on the following context:\n" + context}
]
)
return response["choices"][0]["message"]["content"]
def chatbot_interface(pdf_files, txt_files, csv_files, question):
text = ""
text += get_text_from_pdf(pdf_files) if pdf_files else ""
text += get_text_from_txt(txt_files) if txt_files else ""
text += get_text_from_csv(csv_files) if csv_files else ""
if not text:
return "Please upload files before asking questions."
vector_db = create_vector_database(text)
return get_answer(question, vector_db)
# Gradio interface
demo = gr.Interface(
fn=chatbot_interface,
inputs=[gr.File(file_types=[".pdf"], multiple=True),
gr.File(file_types=[".txt"], multiple=True),
gr.File(file_types=[".csv"], multiple=True),
gr.Textbox(placeholder="Type your question here...")],
outputs=gr.Textbox()
)
demo.launch()