|
import os |
|
import gradio as gr |
|
from langchain_core.prompts import PromptTemplate |
|
from langchain_community.document_loaders import PyPDFLoader |
|
from langchain_google_genai import ChatGoogleGenerativeAI |
|
import google.generativeai as genai |
|
from langchain.chains.question_answering import load_qa_chain |
|
import torch |
|
from transformers import AutoTokenizer, AutoModelForCausalLM |
|
|
|
|
|
|
|
genai.configure(api_key=os.getenv("GOOGLE_API_KEY")) |
|
|
|
|
|
model_path = "nvidia/Mistral-NeMo-Minitron-8B-Base" |
|
mistral_tokenizer = AutoTokenizer.from_pretrained(model_path) |
|
device = 'cuda' if torch.cuda.is_available() else 'cpu' |
|
dtype = torch.bfloat16 |
|
mistral_model = AutoModelForCausalLM.from_pretrained(model_path, torch_dtype=dtype, device_map=device) |
|
|
|
|
|
|
|
|
|
def initialize(file_path, question): |
|
try: |
|
model = ChatGoogleGenerativeAI(model="gemini-pro", temperature=0.3) |
|
prompt_template = """Answer the question as precise as possible using the provided context. If the answer is |
|
not contained in the context, say "answer not available in context" \n\n |
|
Context: \n {context}?\n |
|
Question: \n {question} \n |
|
Answer: |
|
""" |
|
prompt = PromptTemplate(template=prompt_template, input_variables=["context", "question"]) |
|
|
|
if os.path.exists(file_path): |
|
pdf_loader = PyPDFLoader(file_path) |
|
pages = pdf_loader.load_and_split() |
|
context = "\n".join(str(page.page_content) for page in pages[:10]) |
|
stuff_chain = load_qa_chain(model, chain_type="stuff", prompt=prompt) |
|
stuff_answer = stuff_chain({"input_documents": pages, "question": question, "context": context}, return_only_outputs=True) |
|
gemini_answer = stuff_answer['output_text'] |
|
|
|
|
|
mistral_prompt = f"Based on this answer: {gemini_answer}\nGenerate a follow-up question:" |
|
mistral_inputs = mistral_tokenizer.encode(mistral_prompt, return_tensors='pt').to(device) |
|
with torch.no_grad(): |
|
mistral_outputs = mistral_model.generate(mistral_inputs, max_length=100) |
|
mistral_output = mistral_tokenizer.decode(mistral_outputs[0], skip_special_tokens=True) |
|
|
|
combined_output = f"Gemini Answer: {gemini_answer}\n\nMistral Follow-up: {mistral_output}" |
|
|
|
|
|
|
|
|
|
return combined_output |
|
else: |
|
return "Error: Unable to process the document. Please ensure the PDF file is valid." |
|
except Exception as e: |
|
return f"An error occurred: {str(e)}" |
|
|
|
|
|
input_file = gr.File(label="Upload PDF File") |
|
input_question = gr.Textbox(label="Ask about the document") |
|
output_text = gr.Textbox(label="Answer - Combined Gemini and Mistral") |
|
|
|
def pdf_qa(file, question): |
|
if file is None: |
|
return "Please upload a PDF file first." |
|
return initialize(file.name, question) |
|
|
|
|
|
gr.Interface( |
|
fn=pdf_qa, |
|
inputs=[input_file, input_question], |
|
outputs=output_text, |
|
title="RAG Knowledge Retrieval using Gemini API and Mistral Model", |
|
description="Upload a PDF file and ask questions about the content." |
|
).launch() |
|
|
|
|