Spaces:
Runtime error
Runtime error
| import os | |
| import streamlit as st | |
| from langchain.embeddings.openai import OpenAIEmbeddings | |
| from langchain.vectorstores import Chroma | |
| from langchain.chat_models import ChatOpenAI | |
| from langchain.chains import RetrievalQA | |
| from langchain import PromptTemplate | |
| from langchain.memory import ConversationBufferMemory | |
| from langchain.agents import initialize_agent, Tool, AgentExecutor | |
| from langchain.text_splitter import CharacterTextSplitter | |
| import openai | |
| # Set OpenAI API Key (I used Hugging Face Secrets Environment and Inserted my API Key there) | |
| openai.api_key = os.environ.get("OPENAI_API_KEY") | |
| # Document file paths | |
| file1 = "./data/DIVISION OF ASSETS AFTER DIVORCE.txt" | |
| file2 = "./data/INHERITANCE.txt" | |
| # Function to initialize the OpenAI embeddings and model | |
| def openai_setting(): | |
| embedding = OpenAIEmbeddings() | |
| model_name = "gpt-4o-mini" | |
| llm = ChatOpenAI(model_name=model_name, temperature=0) | |
| return embedding, llm | |
| # Function to split the law content | |
| def law_content_splitter(path, splitter="CIVIL CODE"): | |
| with open(path) as f: | |
| law_content = f.read() | |
| law_content_by_article = law_content.split(splitter)[1:] | |
| text_splitter = CharacterTextSplitter() | |
| return text_splitter.create_documents(law_content_by_article) | |
| # Function to handle chatbot logic | |
| def chatbot1(question): | |
| try: | |
| return agent.run(question) | |
| except Exception as e: | |
| return f"I'm sorry, I'm having trouble understanding your question. Error: {str(e)}" | |
| ### Improve Greeting Function | |
| # Define the greetings list at a global level | |
| greetings = [ | |
| "hello", | |
| "hi", | |
| "hey", | |
| "greetings", | |
| "good morning", | |
| "good afternoon", | |
| "good evening", | |
| "hi there", | |
| "hello there", | |
| "hey there", | |
| "whats up", | |
| "ciao", | |
| "salve", | |
| "buongiorno", | |
| "buona sera", | |
| "buonasera", | |
| "buon pomeriggio", | |
| "buonpomeriggio", | |
| "come stai", | |
| "comestai", | |
| "come va", | |
| "comeva", | |
| "come sta", | |
| "comesta", | |
| ] | |
| # Function to determine if input is a greeting | |
| def is_greeting(input_str): | |
| return any(greet in input_str.lower() for greet in greetings) | |
| # Function to handle chatbot logic | |
| def chatbot(input_str): | |
| # Check if the input starts with a greeting | |
| if any(input_str.lower().startswith(greet) for greet in greetings): | |
| # Check if the input contains more than just a greeting | |
| if len(input_str.split()) <= 3: # Simple check, can be adjusted | |
| return "Hello! Ask me your question about Italian Divorce or Inheritance Law?" | |
| else: | |
| return chatbot1(input_str) | |
| else: | |
| return chatbot1(input_str) | |
| # Splitting the content of law documents | |
| divorce_splitted = law_content_splitter(file1) | |
| inheritance_splitted = law_content_splitter(file2) | |
| # Initializing embedding and language model | |
| embedding, llm = openai_setting() | |
| # Define the prompts | |
| divorce_prompt = """As a specialized bot in divorce law, you should offer accurate insights on Italian divorce regulations. | |
| You should always cite the article numbers you reference. | |
| Ensure you provide detailed and exact data. | |
| If a query doesn't pertain to the legal documents, you should remind the user that it falls outside your expertise. | |
| You should be adept at discussing the various Italian divorce categories, including fault-based divorce, mutual-consent divorce, and divorce due to infidelity. | |
| You should guide users through the prerequisites and procedures of each divorce type, detailing the essential paperwork, expected duration, and potential legal repercussions. | |
| You should capably address queries regarding asset allocation, child custody, spousal support, and other financial concerns related to divorce, all while staying true to Italian legislation. | |
| {context} | |
| Question: {question}""" | |
| DIVORCE_BOT_PROMPT = PromptTemplate( | |
| template=divorce_prompt, input_variables=["context", "question"] | |
| ) | |
| # Define inheritance prompt | |
| inheritance_prompt = """As a specialist in Italian inheritance law, you should deliver detailed and accurate insights about inheritance regulations in Italy. | |
| You should always cite the article numbers you reference. | |
| When responding to user queries, you should always base your answers on the provided context. | |
| Always MUST cite the specific article numbers you mention and refrain from speculating. | |
| Maintain precision in all your responses. | |
| If a user's question doesn't align with the legal documents, you should point out that it's beyond your domain of expertise. | |
| You should elucidate Italian inheritance law comprehensively, touching on topics such as testamentary inheritance, intestate inheritance, and other pertinent subjects. | |
| Make sure to elaborate on the obligations and rights of inheritors, the methodology of estate distribution, asset assessment, and settling debts, all while adhering to Italian law specifics. | |
| You should adeptly tackle questions about various will forms like holographic or notarial wills, ensuring you clarify their legitimacy within Italian jurisdiction. | |
| Offer advice on creating a will, naming heirs, and managing potential conflicts. | |
| You should provide detailed information on tax nuances associated with inheritance in Italy, inclusive of exemptions, tax rates, and mandatory disclosures. | |
| {context} | |
| Question: {question}""" | |
| INHERITANCE_BOT_PROMPT = PromptTemplate( | |
| template=inheritance_prompt, input_variables=["context", "question"] | |
| ) | |
| # Setup for Chroma databases and RetrievalQA | |
| chroma_directory = "./docs/chroma" | |
| inheritance_db = Chroma.from_documents( | |
| documents=inheritance_splitted, | |
| embedding=embedding, | |
| persist_directory=chroma_directory, | |
| ) | |
| inheritance = RetrievalQA.from_chain_type( | |
| llm=llm, | |
| chain_type="stuff", | |
| retriever=inheritance_db.as_retriever(), | |
| chain_type_kwargs={"prompt": INHERITANCE_BOT_PROMPT}, | |
| ) | |
| divorce_db = Chroma.from_documents( | |
| documents=divorce_splitted, embedding=embedding, persist_directory=chroma_directory | |
| ) | |
| divorce = RetrievalQA.from_chain_type( | |
| llm=llm, | |
| chain_type="stuff", | |
| retriever=divorce_db.as_retriever(), | |
| chain_type_kwargs={"prompt": DIVORCE_BOT_PROMPT}, | |
| ) | |
| # Define the tools for the chatbot | |
| tools = [ | |
| Tool( | |
| name="Divorce Italian law QA System", | |
| func=divorce.run, | |
| description="Useful for when you need to answer questions about divorce laws in Italy. Also provides the number of the article you use.", | |
| ), | |
| Tool( | |
| name="Inheritance Italian law QA System", | |
| func=inheritance.run, | |
| description="Useful for when you need to answer questions about inheritance laws in Italy. Also provides the number of the article you use.", | |
| ), | |
| ] | |
| # Initialize conversation memory and ReAct agent | |
| memory = ConversationBufferMemory( | |
| memory_key="chat_history", input_key="input", output_key="output" | |
| ) | |
| react = initialize_agent(tools, llm, agent="zero-shot-react-description") | |
| agent = AgentExecutor.from_agent_and_tools( | |
| tools=tools, agent=react.agent, memory=memory, verbose=False | |
| ) | |
| # Streamlit UI Setup | |
| def setup_ui(): | |
| st.set_page_config(page_title="Italian Law Chatbot", page_icon="⚖️") | |
| st.title("🏛️ Legal Chatbot: Divorce and Inheritance Italy Laws ") | |
| st.write( | |
| """ | |
| [](https://huggingface.co/spaces/sattari/legal-chat-bot/tree/main) | |
| [](https://github.com/pouyasattari/Legal-Chatbot-italy-divorce-inheritance) | |
| [](https://www.sattari.org) | |
|  | |
| """ | |
| ) | |
| st.info( | |
| "Check out full tutorial to build this app on Streamlit [📝 blog](https://sattari.org/legal-chatbot-divorce-and-inheritance-italy-laws/)", | |
| icon="ℹ️", | |
| ) | |
| st.success( | |
| "Check out [Prompt Examples List](https://github.com/pouyasattari/Legal-Chatbot-italy-divorce-inheritance/blob/main/promptExamples.txt) to know how to interact with this ChatBot 🤗 ", | |
| icon="✅", | |
| ) | |
| if "messages" not in st.session_state: | |
| st.session_state.messages = [ | |
| { | |
| "role": "assistant", | |
| "content": "Hello! I'm here to help you with Italian Divorce or Inheritance Law.", | |
| } | |
| ] | |
| # Display previous messages and handle new user input | |
| for message in st.session_state.messages: | |
| with st.chat_message(message["role"]): | |
| st.markdown(message["content"]) | |
| if user_input := st.chat_input( | |
| "Ask your question in English or Italiano ;)" | |
| ): | |
| st.session_state.messages.append({"role": "user", "content": user_input}) | |
| with st.chat_message("user"): | |
| st.markdown(user_input) | |
| # Generate and display chatbot response | |
| with st.chat_message("assistant"): | |
| response_placeholder = st.empty() | |
| response = chatbot(user_input) # Your existing chatbot function | |
| response_placeholder.markdown(response) | |
| # Append the response to the conversation history | |
| st.session_state.messages.append({"role": "assistant", "content": response}) | |
| ## Made by Pouya / www.SATTARI.org | |
| if __name__ == "__main__": | |
| setup_ui() | |