constitutional_bot / chatbot.py
sankalp2606's picture
Upload 3 files
d07fe0d verified
import os
from dotenv import load_dotenv
from langchain_google_genai import GoogleGenerativeAI, GoogleGenerativeAIEmbeddings
from langchain_community.vectorstores import FAISS
from langchain.chains import RetrievalQA
from langchain.prompts import PromptTemplate
# Load API key
load_dotenv()
api_key = os.getenv("GOOGLE_API_KEY")
if not api_key:
raise ValueError("Google API Key not found. Please set it in your .env file.")
# Path to FAISS index - Updated to match build_faiss.py
faiss_path = "vector_store/faiss_index_constitution"
if not os.path.exists(f"{faiss_path}/index.faiss"):
raise FileNotFoundError(f"FAISS index not found at {faiss_path}. Please build the index first.")
# Load vector store
embeddings = GoogleGenerativeAIEmbeddings(model="models/embedding-001")
db = FAISS.load_local(faiss_path, embeddings, allow_dangerous_deserialization=True)
retriever = db.as_retriever(search_type="similarity", search_kwargs={"k": 5})
# LLM model
llm = GoogleGenerativeAI(model="gemini-1.5-flash", api_key=api_key)
# Prompt for constitutional expertise
prompt_template = """
You are a constitutional expert specializing in the Constitution of India.
Provide accurate, clear, and unbiased legal explanations.
User Question:
{question}
Relevant Context from the Constitution:
{context}
Instructions:
- Base your answer strictly on the given context and your knowledge of the Constitution.
- Cite Article numbers and headings when possible.
- Stay neutral, factual, and avoid personal opinions.
- If the context is insufficient, say so and provide general constitutional principles.
Now provide the answer:
"""
PROMPT = PromptTemplate(template=prompt_template, input_variables=["context", "question"])
# Retrieval-based QA chain
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
retriever=retriever,
return_source_documents=True,
chain_type_kwargs={"prompt": PROMPT},
chain_type="stuff"
)
def ask_samvidhan(question: str) -> str:
"""Answer queries about the Constitution of India with sources."""
result = qa_chain({"query": question})
answer = result.get("result", "Sorry, I couldn't find an answer.")
sources = result.get("source_documents", [])
if sources:
answer += "\n\n**Sources:**"
seen = set()
for doc in sources:
src = doc.metadata.get("source", "Unknown")
page = doc.metadata.get("page", "")
src_info = f"{src} (Page {page})" if page else src
if src_info not in seen:
seen.add(src_info)
answer += f"\n- {src_info}"
return answer
# Add alias for backward compatibility if needed
ask_samvidhan_chatbot = ask_samvidhan
if __name__ == "__main__":
while True:
query = input("Ask me about the Constitution of India: ")
if query.lower() == "exit":
break
print("πŸ“œ:", ask_samvidhan(query))