Better-PDF-Reader / utils /rag_chain.py
SakshamSna's picture
updated
8a050e2
# utils/rag_chain.py
import os
from dotenv import load_dotenv
from typing import List
from langchain.chat_models import ChatGoogleGenerativeAI
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.vectorstores import FAISS
from langchain.memory import ConversationBufferMemory
from langchain.chains import RetrievalQA
# Load environment variables (ensure GEMINI_API_KEY is set)
load_dotenv()
class RAGChatbot:
def __init__(self, model_name: str = os.getenv("GEMINI_MODEL", "gemini-pro")):
# Initialize conversational memory
self.memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True)
# Initialize Google Gemini chat model via LangChain
self.llm = ChatGoogleGenerativeAI(
model=model_name,
google_api_key=os.getenv("GEMINI_API_KEY"),
)
self.retriever = None
self.qa_chain = None
def load_document(self, text: str):
splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
chunks = splitter.split_text(text)
embed_model = HuggingFaceEmbeddings()
vect = FAISS.from_texts(chunks, embed_model)
self.retriever = vect.as_retriever(search_kwargs={"k": 3})
self.qa_chain = RetrievalQA.from_chain_type(
llm=self.llm,
chain_type="stuff",
retriever=self.retriever,
return_source_documents=False
)
def query(self, question: str) -> str:
if not self.qa_chain:
return "Please upload and process a document first."
return self.qa_chain.run(question)