From 6c3401e9d4f658f67e129f26c21c81a5e4cfbd1d Mon Sep 17 00:00:00 2001 From: Prajna Date: Wed, 6 Dec 2023 16:47:57 +0530 Subject: [PATCH 1/5] Add files via upload --- meraki/Datasets/case-123.txt | 36 ++++++++++++++++++ meraki/README.md | 69 +++++++++++++++++++++++++++++++++++ meraki/bot.py | 45 +++++++++++++++++++++++ meraki/diagram.png | Bin 0 -> 58470 bytes meraki/my_pipeline.py | 62 +++++++++++++++++++++++++++++++ 5 files changed, 212 insertions(+) create mode 100644 meraki/Datasets/case-123.txt create mode 100644 meraki/README.md create mode 100644 meraki/bot.py create mode 100644 meraki/diagram.png create mode 100644 meraki/my_pipeline.py diff --git a/meraki/Datasets/case-123.txt b/meraki/Datasets/case-123.txt new file mode 100644 index 00000000..62a67afc --- /dev/null +++ b/meraki/Datasets/case-123.txt @@ -0,0 +1,36 @@ + +Case Title: The Enigmatic Inheritance + +Case Number: 45654 + +Parties: +Plaintiff - Olivia Thompson +Defendant - Robert Harrington + +Facts: +Olivia Thompson, a diligent legal practitioner, filed a lawsuit against Robert Harrington, alleging that she was wrongfully excluded from inheriting a substantial estate left by her late grandfather, Victor Thompson. The estate, valued at over $10 million, included real estate, investments, and valuable art collections. + +Background: +Victor Thompson, a wealthy businessman, passed away under mysterious circumstances. Olivia Thompson, his only living relative, was surprised to learn that she had been omitted from her grandfather's will entirely. Instead, the entire estate was bequeathed to Robert Harrington, a distant cousin with whom Victor had limited contact. + +Allegations: +Olivia Thompson claimed that the will was executed under suspicious circumstances, arguing that her grandfather was coerced or unduly influenced to disinherit her. She contended that Robert Harrington, aware of the estate's value, manipulated Victor into altering the will in his favor. + +Legal Arguments: +Olivia's legal team argued that the sudden exclusion of the only direct heir raised significant questions about the testamentary capacity of Victor Thompson at the time of drafting the will. They presented evidence suggesting that Victor was in poor health and susceptible to external pressures during the period leading up to the execution of the contested will. + +Furthermore, Olivia's legal team sought to demonstrate a pattern of manipulation and undue influence by highlighting Robert Harrington's financial troubles at the time and his potential motive to secure the inheritance. + +In response, Robert Harrington's defense team maintained that Victor Thompson was of sound mind when he executed the will, and the decision to exclude Olivia was deliberate and well-considered. They argued that there was no evidence of coercion or undue influence and that Olivia's absence from the will was Victor's independent choice. + +Discovery: +During the discovery phase, both parties presented financial records, medical reports, and witness statements. Olivia's team unveiled a series of letters and emails suggesting a strained relationship between Robert and Victor, indicating potential motives for manipulation. + +The defense team countered with testimonials from individuals close to Victor, asserting that he had expressed dissatisfaction with Olivia's lifestyle choices and considered Robert a more responsible heir. + +Outcome: +As the trial unfolded, the court grappled with the complexities of testamentary capacity and the burden of proof regarding undue influence. The case attracted media attention due to the high-stakes nature of the estate and the mysterious circumstances surrounding Victor's death. + +Ultimately, the court decided in favor of Olivia Thompson, ruling that the evidence presented by her legal team established a reasonable doubt about the validity of the contested will. The court ordered a reassessment of the estate distribution, taking into account Olivia's rightful share. + +The case highlighted the importance of safeguarding the integrity of wills and demonstrated the necessity of thorough legal scrutiny in matters of inheritance, particularly when familial relationships are strained and significant assets are at stake. \ No newline at end of file diff --git a/meraki/README.md b/meraki/README.md new file mode 100644 index 00000000..e0995b75 --- /dev/null +++ b/meraki/README.md @@ -0,0 +1,69 @@ +#### Team Name - Meraki +#### Problem Statement - Generative AI Large Language Models Fine Tuned For Legal Practice Platform +#### Team Leader Email - prajnac20@gmail.com + +## A Brief of the Prototype: + +![Project Diagram](./diagram.png) +Our Chatbot is a cutting-edge tool designed to empower legal practitioners by providing in-depth analysis and comprehensive insights into legal cases. Tailored specifically for the legal profession, this chatbot offers a seamless and efficient way for legal professionals to navigate through complex cases, aiding them in making informed decisions and formulating effective strategies. + +### Key Features: + +#### Case Summarization: +Chatbot excels in summarizing extensive case materials, extracting key details, and presenting a concise overview. This feature enables legal practitioners to quickly grasp the essential elements of a case, saving valuable time in the research process. +#### Legal Research Assistance: +The chatbot integrates advanced legal research capabilities, allowing practitioners to access relevant statutes, case law, and legal precedents. By leveraging natural language processing, Chatbot simplifies the research process, making it more accessible for legal professionals. +#### Analysis of Legal Documents: +Legal documents can be overwhelming, but the chatbot excels in analyzing and interpreting legal language. It identifies critical clauses, potential risks, and noteworthy arguments within documents, enabling practitioners to delve into the nuances of each case effortlessly. +#### Customized Case Strategy Recommendations: +Based on the information provided and the intricacies of a case, the chatbot generates personalized recommendations for legal strategies. It takes into account relevant legal precedents, current regulations, and the unique aspects of each case, assisting practitioners in developing robust and tailored legal approaches. +#### Interactive Q&A Sessions: +This Chatbot engages in interactive question-and-answer sessions, allowing practitioners to seek clarification on specific legal points, precedents, or procedural matters. This interactive feature promotes a dynamic exchange of information and enhances the depth of understanding. + +#### Collaborative Case Management: +The chatbot seamlessly integrates with case management systems, facilitating collaboration among legal teams. It streamlines communication, document sharing, and task allocation, fostering an efficient and organized approach to case handling. + +#### Tech Stack: + +Python frameworks - Langchain and Haystack. +In the current version the usage of langchain is done do the candidate document retrieval from the document set using FAISS, that is to be replaced Intel OneAPI AI Analytics. + +### Step-by-Step Code Execution Instructions: +Step 1: Open my_pipeline.py +Step 2: In PromptNode provide path for the llm or provide the API Key. +Step 3: run the command streamlit run bot.py + +### Future Scope: + +The future scope of your bot can be broad and depends on your specific goals, the domain it operates in, and the evolving needs of users. Here are some potential directions for expanding the capabilities and enhancing the functionality of the bot: + +#### Natural Language Processing (NLP) Enhancements: +Invest in improving the bot's NLP capabilities to enhance its understanding of complex legal language, user queries, and context. This could involve integrating more advanced NLP models or fine-tuning existing ones. + +#### Case Prediction and Analytics: +Integrate machine learning algorithms to enable the bot to predict case outcomes based on historical data and legal precedents. Provide analytics and insights into potential legal strategies based on the analysis of similar cases. + +#### Dynamic Legal Research: +Expand the bot's legal research capabilities by integrating with legal databases, academic journals, and real-time legislative updates. Enable the bot to provide up-to-date information on changes in laws and regulations. + +#### Multilingual Support: +Extend the bot's language capabilities to support multiple languages, making it accessible to a broader audience. This could involve language translation features and cross-cultural legal insights. + +#### Voice and Chat Interface: +Implement voice recognition and interaction capabilities, allowing users to communicate with the bot through voice commands. Enhance the chat interface to support more interactive and dynamic conversations. + +#### Integration with Legal Systems: +Integrate the bot with legal case management systems, document repositories, and other tools commonly used by legal practitioners. This ensures a seamless workflow and improves collaboration within legal teams. + +#### Legal Compliance Checker: +Develop a feature that checks legal documents for compliance with specific laws and regulations. Provide suggestions for modifications to ensure compliance and reduce legal risks. + +#### User Authentication and Authorization: +Implement secure user authentication and authorization mechanisms, especially if dealing with sensitive legal information. Ensure that the bot complies with data protection and privacy regulations. + +#### Continuous Learning and Feedback Mechanism: +Incorporate a feedback loop to allow users to provide input on the bot's responses. Use this feedback to continuously improve the bot's accuracy and relevance. + +#### Expand to Other Legal Domains: +Consider expanding the bot's capabilities to cover a broader range of legal domains (e.g., family law, intellectual property, corporate law) to cater to a diverse user base. + diff --git a/meraki/bot.py b/meraki/bot.py new file mode 100644 index 00000000..8782e186 --- /dev/null +++ b/meraki/bot.py @@ -0,0 +1,45 @@ +import streamlit as st +import random +import time + +st.title("Legal Assistant Bot") + + +from my_pipeline import MyHaystackPipeline # Import your Haystack pipeline + +# Create an instance of your Haystack pipeline +# pipeline = MyHaystackPipeline() + +# Initialize chat history +if "messages" not in st.session_state: + st.session_state.messages = [] + +# Display chat messages from history on app rerun +for message in st.session_state.messages: + with st.chat_message(message["role"]): + st.markdown(message["content"]) + +# Accept user input +if prompt := st.chat_input("Tell me about a particular case"): + # Add user message to chat history + st.session_state.messages.append({"role": "user", "content": prompt}) + # Display user message in chat message container + with st.chat_message("user"): + st.markdown(prompt) + + # Display assistant response in chat message container + with st.chat_message("assistant"): + message_placeholder = st.empty() + full_response = "" + # ans = pipeline.run(query = prompt) + assistant_response = MyHaystackPipeline(query=prompt) + + # Simulate stream of response with milliseconds delay + for chunk in assistant_response.split(): + full_response += chunk + " " + time.sleep(0.05) + # Add a blinking cursor to simulate typing + message_placeholder.markdown(full_response + "▌") + message_placeholder.markdown(full_response) + # Add assistant response to chat history + st.session_state.messages.append({"role": "assistant", "content": full_response}) \ No newline at end of file diff --git a/meraki/diagram.png b/meraki/diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..881a4311b074864c4f65c1ddffe3ecad99d39a2e GIT binary patch literal 58470 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 S`o&kkKLuG8nNq1&@Ba@C;fDAC literal 0 HcmV?d00001 diff --git a/meraki/my_pipeline.py b/meraki/my_pipeline.py new file mode 100644 index 00000000..ec9a7736 --- /dev/null +++ b/meraki/my_pipeline.py @@ -0,0 +1,62 @@ + +# from pdfminer.high_level import extract_text +from haystack.nodes import PromptNode +# from haystack.pipelines import GenerativeQAPipeline +# from haystack.utils import print_answers,convert_files_to_docs +import os +# from haystack import Pipeline +from haystack.nodes.prompt import PromptNode, PromptModel +from haystack.nodes import PromptNode, PromptTemplate, AnswerParser +# from haystack.nodes import BM25Retriever +from haystack.pipelines import Pipeline +from haystack.schema import Document + +os.environ['FAISS_NO_AVX2'] = '1' + +from langchain.document_loaders import TextLoader +from langchain.embeddings import HuggingFaceEmbeddings +from langchain.text_splitter import CharacterTextSplitter +from langchain.vectorstores import FAISS + + + + + +def MyHaystackPipeline(query): + print(query) + + + + rag_prompt = PromptTemplate( + prompt="""Provide a clear and concise response that summarizes the key points and information presented in the text. + Use an unbiased and journalistic tone. Do not repeat text, in short way possible within 70 words. + \n\n Related text: {join(documents)} \n\n Question: {query} \n\n Answer:""", + + output_parser=AnswerParser(), + ) + loader = TextLoader("Datasets/case-123.txt") + documents = loader.load() + text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0) +# docs = text_splitter.split_documents(documents) + + embeddings = HuggingFaceEmbeddings(model_name="all-MiniLM-L6-v2") + docs = text_splitter.split_documents(documents) + + db = FAISS.from_documents(docs, embeddings) + docs = db.similarity_search(query) + print(docs[0].page_content) + + prompt_node = PromptNode( + model_name_or_path="mistralai/Mistral-7B-v0.1 OR PATH TO THE MODEL", api_key='YOUR_API_KEY', default_prompt_template=rag_prompt, max_length=350 + ) + + + pipe = Pipeline() + # pipe.add_node(component=retriever, name="retriever", inputs=["Query"]) + pipe.add_node(component=prompt_node, name="prompt_node", inputs=["Query"]) + ans = pipe.run(query=query,documents=[Document(docs[0].page_content)]) + print(ans["answers"][0].answer) + return ans["answers"][0].answer + +# print(MyHaystackPipeline("Tell me about Olivia Thompson case?")) + From 066e1742713ded0fe9eda624129b6f5cf941cf00 Mon Sep 17 00:00:00 2001 From: Prajna Date: Wed, 6 Dec 2023 16:49:28 +0530 Subject: [PATCH 2/5] Update README.md --- meraki/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meraki/README.md b/meraki/README.md index e0995b75..4a7e0e21 100644 --- a/meraki/README.md +++ b/meraki/README.md @@ -4,7 +4,7 @@ ## A Brief of the Prototype: -![Project Diagram](./diagram.png) +![Project Diagram](diagram.png) Our Chatbot is a cutting-edge tool designed to empower legal practitioners by providing in-depth analysis and comprehensive insights into legal cases. Tailored specifically for the legal profession, this chatbot offers a seamless and efficient way for legal professionals to navigate through complex cases, aiding them in making informed decisions and formulating effective strategies. ### Key Features: From 1fef4aeca2a099c058e78abd479c20ef0c861c8c Mon Sep 17 00:00:00 2001 From: Prajna Date: Wed, 6 Dec 2023 17:02:49 +0530 Subject: [PATCH 3/5] Update README.md --- meraki/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meraki/README.md b/meraki/README.md index 4a7e0e21..1464979c 100644 --- a/meraki/README.md +++ b/meraki/README.md @@ -3,8 +3,8 @@ #### Team Leader Email - prajnac20@gmail.com ## A Brief of the Prototype: +![diagram](https://github.com/prajnac20/oneAPI-GenAI-Hackathon-2023/assets/47785645/4ca86a1a-ad1b-4369-9141-e38bdb84d226) -![Project Diagram](diagram.png) Our Chatbot is a cutting-edge tool designed to empower legal practitioners by providing in-depth analysis and comprehensive insights into legal cases. Tailored specifically for the legal profession, this chatbot offers a seamless and efficient way for legal professionals to navigate through complex cases, aiding them in making informed decisions and formulating effective strategies. ### Key Features: From c5205f6a6845a28c1ef7f6e66d63182060f4998d Mon Sep 17 00:00:00 2001 From: Prajna Date: Sat, 16 Dec 2023 07:39:33 +0530 Subject: [PATCH 4/5] Create similarity_search.py --- similarity_search.py | 88 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 similarity_search.py diff --git a/similarity_search.py b/similarity_search.py new file mode 100644 index 00000000..7174716a --- /dev/null +++ b/similarity_search.py @@ -0,0 +1,88 @@ +from langchain.document_loaders import TextLoader +from langchain.text_splitter import CharacterTextSplitter +import sklearn +from sklearn.feature_extraction.text import TfidfVectorizer +from sklearn.metrics.pairwise import cosine_similarity +from sklearnex import patch_sklearn,config_context +from langchain.embeddings import HuggingFaceEmbeddings +from langchain.vectorstores import FAISS +import modin.pandas as mpd +import pandas as pd +import time +from haystack.nodes import PreProcessor +from haystack.utils import convert_files_to_docs +import glob + + +def covert_docs(): + docs = convert_files_to_docs("new_dataset/datasets", split_paragraphs=True) + preprocessor = PreProcessor( + clean_empty_lines=True, + clean_whitespace=True, + clean_header_footer=True, + split_by="word", + split_respect_sentence_boundary=True, + ) + docs = preprocessor.process(docs) + for doc in docs: + doc.content = doc.content.replace("\n", " ") + return docs +doc = covert_docs() +list_page = [x.content for x in doc] + +def similarity_search(query,k): + # doc = covert_docs() + # list_page = [x.content for x in doc] + # Enable Intel Optimization for Scikit-Learn + + st = time.time() + patch_sklearn() + with config_context(target_offload="cpu:32"): + tfidf_vectorizer = TfidfVectorizer(analyzer="char") + sparse_matrix = tfidf_vectorizer.fit_transform([query]+list_page) + cosine = cosine_similarity(sparse_matrix[0,:],sparse_matrix[1:,:]) + et = time.time() + print(pd.DataFrame({'cosine':cosine[0],'strings':list_page}).sort_values('cosine',ascending=False).iloc[:k]) + + elapsed_time = et - st + print('Execution time with optimization:', elapsed_time, 'seconds') + +def similarity_search_without_optimisation(query,k): + + st = time.time() + + # clustering = DBSCAN(eps=3, min_samples=2).fit(X) + tfidf_vectorizer = TfidfVectorizer(analyzer="char") + sparse_matrix = tfidf_vectorizer.fit_transform([query]+list_page) + cosine = cosine_similarity(sparse_matrix[0,:],sparse_matrix[1:,:]) + et = time.time() + print(pd.DataFrame({'cosine':cosine[0],'strings':list_page}).sort_values('cosine',ascending=False).iloc[:k]) + + elapsed_time = et - st + print('Execution time without optimization:', elapsed_time, 'seconds') + +def similarity_search_using_faiss(path,query): + st = time.time() + loader = TextLoader(path) + documents = loader.load() + text_splitter = CharacterTextSplitter(chunk_size=900, chunk_overlap=0) + docs = text_splitter.split_documents(documents) + embeddings = HuggingFaceEmbeddings(model_name="all-MiniLM-L6-v2") +# Equivalent to SentenceTransformerEmbeddings(model_name="all-MiniLM-L6-v2") + db = FAISS.from_documents(docs, embeddings) +# def faiss_query(query) + query = "Tell me about Olivia Thompson Case?" + docs = db.similarity_search(query) + print(docs[0].page_content) + et = time.time() + elapsed_time = et - st + print('Execution time with FAISS:', elapsed_time, 'seconds') + +query = "the Secretary of States right to recover certain social security benefits." + + +# similarity_search_without_optimisation(k=2,query= query) +similarity_search(k=2,query=query) + +# si +# milarity_search_using_faiss("Datasets/case.txt",query = "Who is Olivia Thompson") From aa572f4c145218d2dd4e6aa37de86071cc709e95 Mon Sep 17 00:00:00 2001 From: Prajna Date: Fri, 5 Apr 2024 09:43:16 +0530 Subject: [PATCH 5/5] Update similarity_search.py --- similarity_search.py | 87 -------------------------------------------- 1 file changed, 87 deletions(-) diff --git a/similarity_search.py b/similarity_search.py index 7174716a..8b137891 100644 --- a/similarity_search.py +++ b/similarity_search.py @@ -1,88 +1 @@ -from langchain.document_loaders import TextLoader -from langchain.text_splitter import CharacterTextSplitter -import sklearn -from sklearn.feature_extraction.text import TfidfVectorizer -from sklearn.metrics.pairwise import cosine_similarity -from sklearnex import patch_sklearn,config_context -from langchain.embeddings import HuggingFaceEmbeddings -from langchain.vectorstores import FAISS -import modin.pandas as mpd -import pandas as pd -import time -from haystack.nodes import PreProcessor -from haystack.utils import convert_files_to_docs -import glob - -def covert_docs(): - docs = convert_files_to_docs("new_dataset/datasets", split_paragraphs=True) - preprocessor = PreProcessor( - clean_empty_lines=True, - clean_whitespace=True, - clean_header_footer=True, - split_by="word", - split_respect_sentence_boundary=True, - ) - docs = preprocessor.process(docs) - for doc in docs: - doc.content = doc.content.replace("\n", " ") - return docs -doc = covert_docs() -list_page = [x.content for x in doc] - -def similarity_search(query,k): - # doc = covert_docs() - # list_page = [x.content for x in doc] - # Enable Intel Optimization for Scikit-Learn - - st = time.time() - patch_sklearn() - with config_context(target_offload="cpu:32"): - tfidf_vectorizer = TfidfVectorizer(analyzer="char") - sparse_matrix = tfidf_vectorizer.fit_transform([query]+list_page) - cosine = cosine_similarity(sparse_matrix[0,:],sparse_matrix[1:,:]) - et = time.time() - print(pd.DataFrame({'cosine':cosine[0],'strings':list_page}).sort_values('cosine',ascending=False).iloc[:k]) - - elapsed_time = et - st - print('Execution time with optimization:', elapsed_time, 'seconds') - -def similarity_search_without_optimisation(query,k): - - st = time.time() - - # clustering = DBSCAN(eps=3, min_samples=2).fit(X) - tfidf_vectorizer = TfidfVectorizer(analyzer="char") - sparse_matrix = tfidf_vectorizer.fit_transform([query]+list_page) - cosine = cosine_similarity(sparse_matrix[0,:],sparse_matrix[1:,:]) - et = time.time() - print(pd.DataFrame({'cosine':cosine[0],'strings':list_page}).sort_values('cosine',ascending=False).iloc[:k]) - - elapsed_time = et - st - print('Execution time without optimization:', elapsed_time, 'seconds') - -def similarity_search_using_faiss(path,query): - st = time.time() - loader = TextLoader(path) - documents = loader.load() - text_splitter = CharacterTextSplitter(chunk_size=900, chunk_overlap=0) - docs = text_splitter.split_documents(documents) - embeddings = HuggingFaceEmbeddings(model_name="all-MiniLM-L6-v2") -# Equivalent to SentenceTransformerEmbeddings(model_name="all-MiniLM-L6-v2") - db = FAISS.from_documents(docs, embeddings) -# def faiss_query(query) - query = "Tell me about Olivia Thompson Case?" - docs = db.similarity_search(query) - print(docs[0].page_content) - et = time.time() - elapsed_time = et - st - print('Execution time with FAISS:', elapsed_time, 'seconds') - -query = "the Secretary of States right to recover certain social security benefits." - - -# similarity_search_without_optimisation(k=2,query= query) -similarity_search(k=2,query=query) - -# si -# milarity_search_using_faiss("Datasets/case.txt",query = "Who is Olivia Thompson")