LS / app.py
RoAr777's picture
Update app.py
855dce1 verified
import PyPDF2
import re
import pandas as pd
from sentence_transformers import SentenceTransformer
import faiss
from langchain.agents import initialize_agent, AgentType,Tool
from langchain.schema import HumanMessage
from langchain_google_genai import ChatGoogleGenerativeAI
from langchain_openai import ChatOpenAI
from langchain.prompts import PromptTemplate
import gradio as gr
import os
import pytesseract
from PIL import Image
import pickle
from langchain.agents import AgentType, initialize_agent
from langchain.memory import ConversationBufferMemory
from langchain_community.llms import HuggingFaceHub
from langchain_huggingface import ChatHuggingFace, HuggingFaceEndpoint
from langchain.tools import Tool
# Load the CSV data as a DataFrame
df = pd.read_csv("hf://datasets/kshitij230/Indian-Law/Indian-Law.csv")
df.dropna(inplace=True)
model = SentenceTransformer('sentence-transformers/all-MiniLM-L6-v2')
index = faiss.read_index('IPC_index.faiss')
index2 = faiss.read_index('CrpC_index.faiss')
with open('IPC_N.pkl', 'rb') as f:
flattened_data = pickle.load(f)
with open('IPC_F.pkl', 'rb') as f:
pdf_filenames = pickle.load(f)
with open('IPC_C.pkl', 'rb') as f:
chunk_indices = pickle.load(f)
with open('CrPC_N.pkl', 'rb') as f:
flattened_data2 = pickle.load(f)
with open('CrPC_F.pkl', 'rb') as f:
pdf_filenames2 = pickle.load(f)
with open('CrPC_C.pkl', 'rb') as f:
chunk_indices2 = pickle.load(f)
# Step 3: Retrieval with Citations using PDF filename
def retrieve_faq(query):
relevant_rows = df[df['Instruction'].str.contains(query, case=False)]
if not relevant_rows.empty:
response = relevant_rows.iloc[0]['Response']
return response
else:
return "Sorry, I couldn't find relevant FAQs for your query."
def retrieve_info_with_citation(query, top_k=5):
query_embedding = model.encode([query])
D, I = index.search(query_embedding, k=top_k)
results = []
for i in range(min(top_k, len(I[0]))):
if D[0][i] < 1.0: # Relevance threshold
chunk_index = I[0][i]
pdf_filename = pdf_filenames[chunk_index]
chunk_number = chunk_indices[chunk_index] + 1
match = flattened_data[chunk_index]
citation = f"Source: {pdf_filename}, Chunk: {chunk_number}"
results.append((match, citation))
else:
break
if results:
return results
else:
return [("I'm sorry, I couldn't find relevant information.", "Source: N/A")]
def retrieve_info_with_citation2(query, top_k=5):
query_embedding = model.encode([query])
D, I = index2.search(query_embedding, k=top_k)
results = []
for i in range(min(top_k, len(I[0]))):
if D[0][i] < 1.0: # Relevance threshold
chunk_index = I[0][i]
pdf_filename = pdf_filenames2[chunk_index]
chunk_number = chunk_indices2[chunk_index] + 1
match = flattened_data2[chunk_index]
citation = f"Source: {pdf_filename}, Chunk: {chunk_number}"
results.append((match, citation))
else:
break
if results:
return results
else:
return [("I'm sorry, I couldn't find relevant information.", "Source: N/A")]
def retrieve_info(query):
results = retrieve_info_with_citation(query)
formatted_results = "\n\n".join([f"{i+1}. {match}\n{citation}" for i, (match, citation) in enumerate(results)])
return formatted_results
def retrieve_info2(query):
results = retrieve_info_with_citation2(query)
formatted_results = "\n\n".join([f"{i+1}. {match}\n{citation}" for i, (match, citation) in enumerate(results)])
return formatted_results
def doj_info(q):
return """
MINISTRY OF LAW AND JUSTICE
DEPARTMENT OF JUSTICE
----
Ministry of Law and Justice is the oldest limb of the Government of India. The Ministry functions through three integral departments -
Department of Legal Affairs, Legislative Department and the Department of Justice.
VISION OF THE DEPARTMENT OF JUSTICE
Facilitating administration of Justice that ensures easy access and
timely delivery of Justice to all
FUNCTIONS OF THE DEPARTMENT OF JUSTICE
Department of Justice performs the Administrative functions in
respect of setting up of higher courts, appointment of Judges in
higher Judiciary, maintenance and revision of the conditions and
rules of service of the Judges and issues relating to legal reforms.
The Department of Justice is also responsible jointly with the
judiciary for reduction of pendency of cases in courts. It provides
funding assistance to State Governments for modernization of
infrastructure and for projects such as computerization of
subordinate courts. Detailed functions of Department of Justice are
at Annexe.
SCHEMES UNDER THE DEPARTMENT OF JUSTICE:
2
Apart from above functions, the Department of Justice administers
various schemes to improve justice delivery.
1. Centrally sponsored scheme for development of
infrastructure for the judiciary
A Centrally Sponsored Scheme for the development of infrastructure
facilities for the judiciary is being implemented by the Department of
Justice. The scheme provides funding for construction of courtbuildings and residential accommodation for judicial officers/judges
covering both the High Courts and districts/subordinate Courts. One
of the main conditions of the scheme is that the State Government
must provide 25%of the amount against 75% released by the
Centre.
2. Gram Nayayalayas (People’s Court)
The Gram Nyayalayas Act 2008 has been enacted to provide for the
establishment of Gram Nyayalayas at the grass-root level for the
purpose of providing access to justice to the citizens at their door
steps and to ensure that opportunities for securing justice are not
denied to any citizen by reason of social, economic or other
disabilities.
The Central Government has committed to fund the initial cost in
terms of the non- recurring expenses for setting up these courts.
3. e-Courts
The Government is implementing an e-Courts Mission Mode Project
for computerization of District & Subordinate Courts in the country
and for up gradation of ICT infrastructure of the Supreme Court and
the High Courts. By virtue of this, case filing, allocation, registration,
case workflow, orders and judgements will all be ICT enabled in the
3
long run. The project was built a national judicial data grid which
enables lawyers and litigants to access case information and the
judiciary to improve case and court management.
4. National Mission for Justice Delivery and Legal Reform
The National Mission for Justice Delivery and Legal Reforms was set
up in August, 2011 to achieve the twin goals of (i) increasing access
by reducing delays and arrears; and (ii) enhancing accountability
through structural changes and by setting performance standards
and capacities.
5. Legal Aid to Poor
Assistance is provided to poor people throughout the country for
enabling them to access free legal services. The activities and free
legal services are provided through National Legal Services
Authority (NALSA) established vide National Legal Services
Authority Act, 1987.
6. Access to Justice for the marginalized
The Department of Justice is implementing two projects on ‘Access
to Justice for Marginalised People’ one of them with UNDP support.
The focus of the projects has been on empowering the poor and
marginalized, make them aware of their rights to demand legal
services, while at the same time supporting national and local justice
delivery institutions to bring justice to the poor.
7. Fast Track Courts
The Eleventh Finance Commission had recommended a scheme for
creation of Fast Track Courts (FTCs) in the country for disposal of
long pending Sessions and other cases. Fast Track Courts are set
4
up by the State Governments in consultation with the respective
High Court. Central Government provided financial assistance to
states for Fast Track Courts for eleven years from 2000-2001 to
2010-2011. In its judgment in Brij Mohan Lal vs Union of India &
Others on 19.04.2012, the Supreme Court has directed the States
that they shall not take a decision to continue the Fast Track Courts
scheme on an adhoc and temporary basis. They (States) will need to
decide either to bring the Fast Track Courts scheme to an end or to
continue the same as a permanent feature in the State. A number of
States are now continuing Fast Track Courts from their own
resources.
In the Conference of Chief Ministers and Chief Justices held in New
Delhi on 7th April, 2013, it has been resolved that the State
Governments shall, in consultation with the Chief Justices of the
respective High Courts, take necessary steps to establish suitable
number of FTCs relating to offences against women, children,
differently abled persons, senior citizens and marginalized sections
of the society, and provide adequate funds for the purpose of
creating and continuing them. Government has requested the State
Governments and the Chief Justices of the High Courts to implement
this decision.
The 14th Finance Commission has endorsed the proposal to
strengthen the judicial system in States which includes, inter-alia,
establishing 1800 FTCs for a period of five years for cases of
heinous crimes; cases involving senior citizens, women, children,
disabled and litigants affected with HIV AIDS and other terminal
ailments; and civil disputes involving land acquisition and
5
property/rent disputes pending for more than five years. The 14th
Finance Commission has urged State Governments to use
additional fiscal space provided by the Commission in the tax
devolution to meet such requirements.
JUDICIAL STRUCTURE
India has a three tier judicial structure. At the lowest level are the
District and Subordinate Courts, in over 600 administrative districts.
At the next level are the High Courts in the States. By and large,
each State has a High Court. But some states have a common High
Court. (There are a total of 24 High Courts in the country). At the
apex level is the Supreme Court of India situated at New Delhi.
1. Supreme Court of India
The Supreme Court of India comprises the Chief Justice and 30
other Judges appointed by the President of India. The Judges of the
Supreme Court are appointed by the President under Article 124 (2)
of the Constitution while the Judges of the High Courts are
appointed under Article 217 (1) of the Constitution. The President is
required to hold consultation with such of the Judges of the Supreme
Court and of the High Courts in the State as he / she may deem
necessary for the purpose. However, consultation with the Chief
Justice of India is mandatory and constitutionally a must, for
appointment of Judges other than the Chief Justice in the Supreme
Court. Supreme Court Judges retire upon attaining the age of 65
years. In order to be appointed as a Judge of the Supreme Court, a
person must be a citizen of India and must have been, for at least
6
five years, a Judge of a High Court or of two or more such Courts in
succession, or an Advocate of a High Court or of two or more such
Courts in succession for at least 10 years or he must be, in the
opinion of the President, a distinguished jurist. Provisions exist for
the appointment of a Judge of a High Court as an Ad-hoc Judge of
the Supreme Court and for retired Judges of the Supreme Court or
High Courts to sit and act as Judges of that Court.
2. High Courts
The High Court is the apex court of the State’s judicial
administration. The Judges of the High Courts are appointed by the
President under Article 217 (1) of the Constitution. There are 24
High Courts in the country, three having jurisdiction over more than
one State. Among the Union Territories Delhi alone has a High Court
of its own. Other six Union Territories come under the jurisdiction of
different State High Courts. Each High Court comprises a Chief
Justice and such other Judges as the President may, from time to
time, appoint. The Chief Justice of a High Court is appointed by the
President in consultation with the Chief Justice of India and the
Governor of the State. The procedure for appointing puisne Judges
is the same except that the Chief Justice of the High Court
concerned is also consulted. They hold office until the age of 62
years and are removable in the same manner as a Judge of the
Supreme Court. To be eligible for appointment as a Judge one must
be a citizen of India and have held a judicial office in India for ten
years or must have practised as an Advocate of a High Court or two
or more such Courts in succession for a similar period.
The transfer of Judges from one High Court to another High Court is
made by the President after consultation with the Chief Justice of
India under Article 222 (1) of the Constitution.
7
3. Subordinate Courts
Different State laws provide for different kinds of jurisdiction of
courts. Each State is divided into judicial districts presided over by a
District and Sessions Judge, which is the principal civil court of
original jurisdiction and can try all offences including those
punishable with death. The Sessions Judge is the highest judicial
authority in a district. Below him, there are Courts of civil jurisdiction,
known in different States as Munsifs, Sub-Judges, Civil Judges and
the like. Similarly, the criminal judiciary comprises the Chief Judicial
Magistrates and Judicial Magistrates of First and Second Class.
In exercise of powers conferred under proviso to Article 309 read
with Articles 233 and 234 of the Constitution, the State Government
frames rules and regulations in consultation with the High Court for
appointments, posting and promotion of District Judges. As per
Article 235, the control over subordinate courts in a State vests in
the High Court. The members of the State Judicial Service are
governed by these rules and regulations. Therefore, the service
conditions, including appointment, promotion, and reservations etc.
of judicial officers of the District/Subordinate Courts are governed by
the respective State Governments.
NATIONAL JUDICIAL APPOINTMENTS COMMISSION
The Government of India has decided to set up a National judicial
Appointments Commission (NJAC) for appointment of Judges of
Supreme Court and High Courts. The NJAC would replace the
present Collegium system of the Supreme Court for recommending
appointment of Judges in higher judiciary.
8
The Constitution Amendment Act, 2014 published on 31st December,
2014 provides for the composition and the functions of the National
Judicial Appointments Commission (NJAC). The NJAC would be
chaired by the Chief Justice of India. Its membership would include
two senior most Judges of the Supreme Court, the Union Minister of
Law & Justice, two eminent persons to be nominated by a committee
of the Prime Minister of India, the Chief Justice of India, and the
Leader of the Opposition in the House of the People, or if there is no
Leader of the Opposition, then the Leader of the single largest Opposition Party in the House of the People. Secretary (Justice) will
be the Convenor of the Commission.
GRIEVANCES AGAINST JUDICIARY
Department of Justice receives online/off line grievances from public
against judgments of the Courts, delay in their cases and against
Judges/Judicial Officers. These grievances are forwarded to the
Secretary General of Supreme Court/Registrar Generals of the
concerned High Courts for disposal at their end.
PREVIOUS VISIT OF CHINESE DELEGATION
A Chinese Delegation lead by Shri Zhang Sujun, Hon’ble Vice
Minister for Justice of People’s Republic of China, visited
Department of Justice on 26th Nov, 2012 and held discussions with
Secretary (Justice) and other senior officers of Department of
Justice. A copy of the Record of Discussion of this meeting is at
Annexe-I.
MOU BETWEEN INDIA & CHINA
A Memorandum of Understanding between the Ministry of law &
Justice of the Government of Republic of India and the Supreme
9
Peoples’ Prosecution Service of the People’s Republic of China
relating to promotion of cooperation in Legal/Judicial matters was
signed on 23rd June, 2003.
--------
""".replace('/n',' ')
ipc_tool = Tool(
name="IPC Information Retrieval",
func=retrieve_info,
description="Retrieve information from the Indian Penal Code Related to query keyword(s)."
)
crpc_tool=Tool(
name="CrPC Information Retrieval",
func=retrieve_info2,
description="Retrieve information from the Code of Criminal Procedure(CrPC) Related to query keyword(s)."
)
doj_tool=Tool(
name="Department of Justice Info",
func=doj_info,
description="Provides Summarized Information about Department of Justice."
)
faq_tool=Tool(
name="Commonly Asked Questions",
func=retrieve_faq,
description="Provides Answers to commonly asked questions related to query keyword(s)"
)
# Language model setup using Google Gemini
llm = ChatOpenAI(
model="gpt-4o",
temperature=1,
max_tokens=None,
timeout=None,
max_retries=5
)
template="""
You are a highly specialized legal assistant with deep knowledge of the Indian Penal Code (IPC).
Your primary task is to retrieve and summarize legal information accurately from the IPC.pdf document provided to you.
Your responses should be highly specific, fact-based, and free from any speculation or hallucinations.
Always cite the exact section from the IPC when providing an answer.
If the information is not available in the document, clearly state that and do not make any assumptions.
History: {}
User: {}
Response:
"""
agent_tools = [ipc_tool, crpc_tool, doj_tool, faq_tool]
agent = initialize_agent(
tools=agent_tools,
llm=llm,
agent=AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION,
verbose=True,
return_intermediate_steps=True,
handle_parsing_errors=True
)
def encode_image_to_base64(image_path):
return pytesseract.image_to_string(Image.open(image_path))
def parse(history):
p='\n'
if history==[]:
return "No Chat till now"
for i in history:
try:
p+=i['role']+': '+i['content']+'\n'
except:
print(i)
return p
def chatbot_response(history,query):
l=parse(history)
if query.get('files'):
# Encode image to base64
image_data=""
for x in range(len(query["files"])):
image_data += f"{x}. "+encode_image_to_base64(query["files"][x]) +"\n"
# Create a multimodal message with both text and image data
message = HumanMessage(
content=[
{"type": "text", "text": template.format(l,query['text'] +" System :Image(s) was added to this prompt by this user. Text Extracted from this image (Some words may be misspelled ,Use your understanding ):"+image_data)}, # Add text input
]
)
#k+=" System :Image(s) was added to this prompt by this user. Text Extracted from this image (Some words may be misspelled ,Use your understanding ):"+image_data
else:
# If no image, only pass the text
message = HumanMessage(content=[{"type": "text", "text": template.format(l,query)}])
# Invoke the model with the multimodal message
result = agent.invoke([message],handle_parsing_errors=True)
response = result['output']
intermediate_steps = result.get('intermediate_steps', [])
thought_process = ""
for action, observation in intermediate_steps:
thought_process += f"Thought: {action.log}\n"
thought_process += f"Action: {str(action.tool).replace('`','')}\n"
thought_process += f"Observation: {observation}\n\n"
return response, thought_process.strip()
# Step 5: Gradio Interface
from gradio import ChatMessage
def chatbot_interface(messages,prompt):
response, thought_process = chatbot_response(messages,prompt)
#messages.append(ChatMessage(role="user", content=prompt))
for x in prompt["files"]:
messages.append(ChatMessage(role="user", content={"path": x, "mime_type": "image/png"}))
if prompt["text"] is not None:
messages.append(ChatMessage(role="user", content=prompt['text']))
if thought_process:
messages.append(ChatMessage(role="assistant", content=thought_process,metadata={"title": "🧠 Thought Process"}))
messages.append(ChatMessage(role="assistant", content=response))
return messages, gr.MultimodalTextbox(value=None, interactive=True)
def vote(data: gr.LikeData):
if data.liked:
print("You upvoted this response: " + data.value)
else:
print("You downvoted this response: " + data.value)
with gr.Blocks(theme=gr.themes.Soft(),css="footer {visibility: hidden}") as iface:
chatbot = gr.Chatbot(type="messages",avatar_images=("user.jpeg", "logo.jpeg"), bubble_full_width=True) # Chatbot component to display conversation history
query_input = gr.MultimodalTextbox(interactive=True,
placeholder="Enter message or upload file...", show_label=False)
query_input.submit(chatbot_interface, [chatbot, query_input], [chatbot,query_input])
chatbot.like(vote, None, None) # Adding like/dislike functionality to the chatbot
iface.launch(
show_error=True
)