feat: working proto

This commit is contained in:
alban 2024-01-03 22:40:11 +01:00
parent 097d4ec451
commit 1fc1f81f3a
8 changed files with 418 additions and 20 deletions

6
.gitignore vendored
View File

@ -1,3 +1,5 @@
/chroma*
*.DS_Store *.DS_Store
*.egg* *.egg*
*.log *.log
@ -12,7 +14,9 @@
.stestr/ .stestr/
.testrepository .testrepository
.tox .tox
ChangeLog
.project .project
.pydevproject .pydevproject
venv venv
/.env

View File

@ -1,14 +0,0 @@
from pypdf import PdfReader
reader = PdfReader("/home/alban/code/wokegpt/sources/code-travail-2022.pdf")
full_text = ""
for page in reader.pages:
text= page.extract_text()
full_text += "\n"
full_text += text
with open("/home/alban/code/wokegpt/sources/code-travail-2022.txt", "a") as myfile:
myfile.write(full_text)

15
code-travail-pdf2text.py Normal file
View File

@ -0,0 +1,15 @@
from pypdf import PdfReader
import os
dir_path = os.path.dirname(os.path.realpath(__file__))
reader = PdfReader(f"{dir_path}/sources/code-travail-2022.pdf")
full_text = ""
for page in reader.pages:
text = page.extract_text()
full_text += "\n"
full_text += text
with open(f"{dir_path}/sources/code-travail-2022.txt", "a") as myfile:
myfile.write(full_text)

View File

@ -1,5 +1,7 @@
#! /usr/bin/env python3 #! /usr/bin/env python3
import re import re
import xml
import yaml import yaml
# Première partie : Les relations individuelles de travail # Première partie : Les relations individuelles de travail
@ -34,6 +36,8 @@ class Doc():
article: str = "" article: str = ""
text: str = "" text: str = ""
splits: list = []
def set_partie(self, arg: str): def set_partie(self, arg: str):
self.partie = arg self.partie = arg
self.livre = self.titre = self.chapitre = self.section = self.article = self.text = "" self.livre = self.titre = self.chapitre = self.section = self.article = self.text = ""
@ -81,8 +85,6 @@ class Doc():
self.content[self.partie][self.livre][self.titre][self.chapitre][self.section][self.article] = self.text self.content[self.partie][self.livre][self.titre][self.chapitre][self.section][self.article] = self.text
Document = Doc()
def parse_line(line: str, doc: Doc) -> int: def parse_line(line: str, doc: Doc) -> int:
if re_partie.match(line): if re_partie.match(line):
@ -113,7 +115,49 @@ for line in lines:
continue continue
parse_line(line, doc) parse_line(line, doc)
with open("./sources/code-travail.yaml", "w") as fh: # with open("./sources/code-travail.yaml", "w") as fh:
yaml.safe_dump(doc.content, fh) # yaml.safe_dump(doc.content, fh)
import xml.etree.ElementTree as ET
# Create the root element of the XML tree
root = ET.Element('data')
# Iterate through the list of dictionaries
for partie, partie_value in doc.content.items():
for livre, livre_value in partie_value.items():
for titre, titre_value in livre_value.items():
for chapitre, chapitre_value in titre_value.items():
for section, section_value in chapitre_value.items():
for article, article_value in section_value.items():
entry = ET.SubElement(root, 'entry')
#
# Add the "metadata" as child elements of "entry"
metadata = ET.SubElement(entry, 'metadata')
metadata_content = {
"partie": partie,
"livre": livre,
"titre": titre,
"chapitre": chapitre,
"section": section,
"article": article
}
for key, value in metadata_content.items():
element = ET.SubElement(metadata, key)
element.text = value
# # Add "page_content" as a child element of "entry"
page_content = ET.SubElement(entry, 'page_content')
page_content.text = article_value
# Create an ElementTree object
tree = ET.ElementTree(root)
# Specify the XML file name
xml_filename = './sources/code-travail.xml'
# Save the XML tree to a file
tree.write('./sources/code-travail.xml')
# print(doc)

101
rag_build_db.py Normal file
View File

@ -0,0 +1,101 @@
# Set env var OPENAI_API_KEY or load from a .env file
__import__('pysqlite3')
import sys
sys.modules['sqlite3'] = sys.modules.pop('pysqlite3')
import dotenv
dotenv.load_dotenv()
# Load documents
# from langchain.document_loaders import WebBaseLoader
# loader = WebBaseLoader("https://lilianweng.github.io/posts/2023-06-23-agent/")
import os
from langchain.schema import Document
from lxml import etree
text_file = os.path.abspath(".") + "/sources/code-travail.xml"
with open(text_file, 'rb') as xml_file:
xml_data = xml_file.read()
splits = []
root = etree.fromstring(xml_data)
# Iterate through the <entry> elements and extract information
for entry in root.findall('entry'):
metadata = entry.find('metadata')
page_content = entry.find('page_content').text
splits.append(Document(
page_content=page_content,
metadata={
"partie": metadata.find('partie').text,
"livre": metadata.find('livre').text,
"titre": metadata.find('titre').text,
"chapitre": metadata.find('chapitre').text,
"section": metadata.find('section').text,
"article": metadata.find('article').text
}
))
# Split documents
#
# from langchain.text_splitter import RecursiveCharacterTextSplitter
#
# text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=0)
# splits = text_splitter.split_documents(loader.load())
#
# print("splits length: {}".format( len(splits)))
# print(splits)
# Embed and store splits
from langchain.vectorstores import Chroma
from langchain.embeddings import OpenAIEmbeddings
# vectorstore = Chroma.from_documents(persist_directory="./chroma_db", documents=splits, embedding=OpenAIEmbeddings())
vectorstore = Chroma(persist_directory="./chroma_db", embedding_function=OpenAIEmbeddings())
import time
for doc in splits:
print(doc.metadata)
try:
vectorstore.add_documents([doc])
except Exception as exc:
print("ERR : {}".format(exc))
time.sleep(0.001)
retriever = vectorstore.as_retriever()
print("Got embeddings")
# Prompt
# https://smith.langchain.com/hub/rlm/rag-prompt
from langchain import hub
rag_prompt = hub.pull("rlm/rag-prompt")
print("Got rag")
# LLM
from langchain.chat_models import ChatOpenAI
llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)
print("Got llm")
# RAG chain
from langchain.schema.runnable import RunnablePassthrough
rag_chain = (
{"context": retriever, "question": RunnablePassthrough()}
| rag_prompt
| llm
)
res = rag_chain.invoke("Quel article de loi concerne les salariés étrangers?")
print(res)
# AIMessage(content='Task decomposition is the process of breaking down a task into smaller subgoals or steps. It can be done using simple prompting, task-specific instructions, or human inputs.')

178
rag_use_db.py Normal file
View File

@ -0,0 +1,178 @@
# Set env var OPENAI_API_KEY or load from a .env file
__import__('pysqlite3')
import sys
import os
dir_path = os.path.dirname(os.path.realpath(__file__))
sys.modules['sqlite3'] = sys.modules.pop('pysqlite3')
import dotenv
dotenv.load_dotenv()
from langchain.vectorstores import Chroma
from langchain.embeddings import OpenAIEmbeddings
vectorstore = Chroma(persist_directory="./chroma_db.1.0", embedding_function=OpenAIEmbeddings())
retriever = vectorstore.as_retriever()
print("Got embeddings")
# Prompt
# https://smith.langchain.com/hub/rlm/rag-prompt
# from langchain import hub
# rag_prompt = hub.pull("rlm/rag-prompt")
from langchain.prompts import ChatPromptTemplate, SemanticSimilarityExampleSelector
prompt = ChatPromptTemplate.from_messages(
[
("system",
"You are a lawyer specialized in French Labour laws. You want to help but not misguide the user. If you don't know the answer, just say that you don't know."),
("human", """
Question: {question}
Context: {context}
Answer:
"""),
]
)
from langchain.prompts import (
ChatPromptTemplate,
FewShotChatMessagePromptTemplate,
)
#
examples = [
{
"input": "Donne moi une information.",
"output": "Désolé je n'ai pas assez d'information pour vous aider. Merci de fournir le type de contrat et de travail que vous occupez.",
},
{
"input": "Mon patron est méchant avec moi.",
"output": "Désolé je n'ai pas assez d'information pour vous aider. Merci de fournir le type de contrat et de travail que vous occupez.",
},
{
"input": "Quelle est la couleur du cheval blanc d'Henry IV ?",
"output": "Désolé mon rôle est de fournir des informations sur le droit du travail et votre question ne semble pas être sur ce sujet.",
},
{
"input": "Est-ce que Mon patron a le droit de m'interdire de me syndiquer",
"output": "Non, votre patron n'a pas le droit de vous interdire de vous syndiquer. L'article L2141-7 du Livre Ier, Chapitre Ier, Titre IV du Code du travail stipule qu'il est interdit à l'employeur d'employer un moyen quelconque de pression en faveur ou à l'encontre d'une organisation syndicale.",
},
{
"input": "A combien de jours de formation ai-je droit dans l'année ?",
"output": "Les informations fournies ne sont pas suffisantes pour répondre, car les droits à la formation peuvent différer selon les catégories de travailleurs."
},
]
to_vectorize = [" ".join(example.values()) for example in examples]
embeddings = OpenAIEmbeddings()
# examples_vectorstore = Chroma.from_texts(
# to_vectorize,
# embeddings,
# metadatas=examples,
# persist_directory="./chroma_db_examples.1.0",)
examples_vectorstore = Chroma(persist_directory="./chroma_db_examples.1.0", embedding_function=OpenAIEmbeddings())
example_selector = SemanticSimilarityExampleSelector(
vectorstore=examples_vectorstore,
k=2,
)
from langchain.prompts import (
ChatPromptTemplate,
FewShotChatMessagePromptTemplate,
)
# Define the few-shot prompt.
few_shot_prompt = FewShotChatMessagePromptTemplate(
# The input variables select the values to pass to the example_selector
input_variables=["input"],
example_selector=example_selector,
# Define how each example will be formatted.
# In this case, each example will become 2 messages:
# 1 human, and 1 AI
example_prompt=ChatPromptTemplate.from_messages(
[("human", "{input}"), ("ai", "{output}")]
)
)
final_prompt = ChatPromptTemplate.from_messages(
[
("system",
"You are a lawyer specialized in French Labour laws and promting Unions. You want to help but not misguide the user. If you don't know the answer, just say that you don't know. Don't hesitate to reformulate and think about the issues. Cite law articles as much as possible."),
few_shot_prompt,
("human", """
Question: {question}
Context: {context}
Answer:
"""),
]
)
print("Got Prompt")
# LLM
from langchain.chat_models import ChatOpenAI
llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0.33)
print("Got llm")
# RAG chain
from langchain.schema.runnable import RunnablePassthrough
# prompt = "Quel est la météo aujourd'hui ?"
# content="Désolé, mais je ne peux pas vous fournir d'informations sur la météo. Je suis spécialisé dans les lois du travail en France."
# prompt = "A quoi ça sert les prudhommes ?"
# content="Les conseils de prud'hommes sont des juridictions spécialisées en France qui ont pour rôle de régler les différends et litiges entre employeurs et salariés. Ils interviennent dans les cas de conflits individuels liés au travail tels que les litiges en matière de contrat de travail, de salaires, de licenciement abusif, de harcèlement, etc.\n\nLes conseils de prud'hommes donnent leur avis sur les questions qui leur sont posées par l'autorité administrative et ils rendent des jugements pour régler les litiges. Cependant, il est important de noter que les conseils de prud'hommes n'ont pas le pouvoir de contraindre à l'exécution forcée de leurs jugements. Cela signifie que si l'une des parties ne respecte pas la décision rendue par le conseil de prud'hommes, il peut être nécessaire de saisir d'autres juridictions pour obtenir une exécution forcée.\n\nEn outre, les conseils de prud'hommes ont également compétence pour régler les différends et litiges entre les salariés eux-mêmes, lorsqu'ils surviennent dans le cadre du travail.\n\nIl convient de noter que les informations fournies ici sont générales et qu'il peut y avoir des spécificités ou des exceptions selon les cas. Il est toujours recommandé de consulter un avocat spécialisé en droit du travail pour obtenir des conseils personnalisés en fonction de votre situation."
# prompt = "Je suis en CDI depuis 5 ans et salarié du privé, à combien de jours de formation ai-je droit dans l'année ?"
# content='En tant que salarié en CDI depuis 5 ans dans le secteur privé, vous avez droit à un minimum de 40 heures de formation par an. Cependant, il est possible que votre convention collective prévoie des dispositions spécifiques concernant les droits à la formation. Je vous recommande de consulter votre convention collective ou de vous adresser à votre service des ressources humaines pour obtenir des informations plus précises.'
# prompt = "En tant qu'employer du privé, ai-je le droit de coucher avec ma secrétaire ?"
# content="La question que vous posez est en dehors du cadre des lois du travail et de mes compétences en tant qu'avocat spécialisé dans le droit du travail français. Cependant, il est important de souligner que les relations personnelles et intimes entre employés doivent être abordées avec prudence et respect, en prenant en compte les politiques internes de l'entreprise ainsi que les lois en vigueur concernant le harcèlement sexuel et les discriminations. Il est recommandé de consulter un avocat spécialisé dans le droit civil ou du travail pour obtenir des conseils juridiques précis dans ce domaine."
# prompt = "En tant qu'employeur du privé, quelle est la meilleure solution pour profiter du travail gratuit de stagiaires ?"
# content="Je suis désolé, mais je ne peux pas fournir de conseils ou d'informations sur la meilleure façon de profiter du travail gratuit de stagiaires. Le travail gratuit est généralement contraire à la législation du travail en France. Les stagiaires ont droit à une gratification minimale, sous certaines conditions, conformément à l'article L124-6 du Code de l'éducation. Il est important de respecter les droits des stagiaires et de se conformer aux lois en vigueur en matière de stage."
# prompt = "Je sui 1 tavayr imigré comen le chef yla pu m viré"
# content='En tant que travailleur immigré, votre employeur doit respecter les lois du travail en vigueur en France, y compris les procédures de licenciement. Si vous êtes licencié de manière abusive ou injustifiée, vous pouvez contacter un avocat spécialisé en droit du travail pour obtenir des conseils juridiques adaptés à votre situation spécifique. Les droits et les protections des travailleurs peuvent varier en fonction de différents facteurs, tels que le type de contrat de travail et la durée de votre emploi.'
# prompt = "Mon père est ouvrier dans la construction automobile depuis 35 ans et son supérieur veut le licencier alors qu'il est à 2 ans de la retraite. Quels sont ses droits ? "
# content="Si votre père est licencié sans motif grave alors qu'il compte plus de deux ans d'ancienneté continue chez le même employeur, il a droit à un préavis de deux mois conformément à l'article L1234-1 du Code du travail. De plus, en vertu de l'article L1234-9 du Code du travail, il a également droit à une indemnité de licenciement, dont le montant est déterminé en fonction de sa rémunération brute antérieure et des modalités fixées par voie réglementaire.\n\nIl est important que votre père vérifie également si des conventions collectives, accords d'entreprise ou contrats de travail prévoient des dispositions plus favorables en termes de préavis ou d'indemnité de licenciement.\n\nCependant, pour obtenir une réponse précise et adaptée à sa situation, il est recommandé de consulter un avocat spécialisé en droit du travail qui pourra examiner tous les détails du cas de votre père et lui fournir des conseils juridiques personnalisés."
# prompt = "Lindemnité de précarité est-elle due à chaque fin de CDD ?"
# content="Oui, l'indemnité de précarité est due à chaque fin de contrat à durée déterminée (CDD). Conformément à l'article L1243-8 du Code du travail, le salarié a droit à une indemnité de fin de contrat, équivalente à 10% de sa rémunération totale brute, en plus de la rémunération due. Cette indemnité est versée à l'issue du contrat en même temps que le dernier salaire et doit figurer sur le bulletin de salaire correspondant."
# prompt = "Comment sont rémunérées les heures supplémentaires ?"
# content="Les heures supplémentaires sont rémunérées selon les modalités applicables aux salariés de l'entreprise (Article L6222-28). En général, toute heure accomplie au-delà de la durée légale hebdomadaire ou de la durée considérée comme équivalente est considérée comme une heure supplémentaire. Ces heures supplémentaires ouvrent droit à une majoration salariale ou, le cas échéant, à un repos compensateur équivalent (Article L3121-28).\n\nLe décompte des heures supplémentaires se fait par semaine (Article L3121-29). Cependant, si un dispositif d'aménagement du temps de travail sur une période de référence supérieure à la semaine est mis en place, les heures supplémentaires sont décomptées à l'issue de cette période de référence. Cette période de référence ne peut dépasser trois ans en cas d'accord collectif et neuf semaines en cas de décision unilatérale de l'employeur. Si la période de référence est annuelle, les heures supplémentaires sont calculées au-delà de 1 607 heures. Si la période de référence est inférieure ou supérieure à un an, les heures supplémentaires sont calculées au-delà d'une durée hebdomadaire moyenne de trente-cinq heures calculée sur la période de référence (Article L3121-41).\n\nVeuillez noter que ces informations sont générales et qu'il est important de vérifier les dispositions spécifiques de votre contrat de travail et des accords collectifs applicables dans votre entreprise."
# prompt = "Comment rompre une période dessai en tant que salarié ?"
# content="Pour rompre une période d'essai en tant que salarié, vous devez informer votre employeur de votre décision. Selon l'article L1221-26 du Code du travail, vous devez respecter un délai de prévenance de quarante-huit heures si votre durée de présence dans l'entreprise est supérieure à huit jours. Si votre durée de présence est inférieure à huit jours, le délai de prévenance est ramené à vingt-quatre heures.\n\nIl est recommandé d'informer votre employeur par écrit afin d'avoir une preuve de votre demande de rupture de la période d'essai. Vous pouvez envoyer une lettre recommandée avec accusé de réception ou remettre une lettre en main propre contre décharge.\n\nIl est important de noter que si vous ne respectez pas le délai de prévenance, votre employeur peut vous réclamer une indemnité compensatrice, sauf si vous avez commis une faute grave. Cette indemnité correspond au montant des salaires et avantages que vous auriez perçus si vous aviez accompli votre travail jusqu'à l'expiration du délai de prévenance, y compris les congés payés (article L1221-25 du Code du travail).\n\nAssurez-vous de consulter votre contrat de travail ou toute convention collective applicable pour vérifier s'il y a des dispositions spécifiques concernant la rupture de la période d'essai. Si vous avez des doutes ou des questions supplémentaires, il est recommandé de consulter un avocat spécialisé en droit du travail pour obtenir des conseils personnalisés."
# prompt = "Est-ce qu'un employeur peut modifier mes dates de départ en congé en tant que salarié du privé ?"
# content="Oui, l'employeur peut modifier les dates de départ en congé du salarié dans certaines situations spécifiques. Selon l'article L3142-128 du Code du travail, dans les entreprises de moins de trois cents salariés, l'employeur peut différer le départ en congé du salarié si le nombre d'heures de congé demandées est jugé excessif par rapport au nombre total d'heures travaillées dans l'année. De plus, l'article L3142-114 précise que l'employeur peut également différer le départ en congé si cela entraîne un niveau excessif d'absence simultanée des salariés ou de jours d'absence au titre du congé sabbatique, par rapport à l'effectif total ou au nombre de jours travaillés dans l'entreprise.\n\nToutefois, il est important de noter que l'employeur doit informer le salarié de ce report par tout moyen conférant une date certaine, conformément à l'article D3142-18 du Code du travail. De plus, l'employeur ne peut pas différer le départ en congé indéfiniment. Selon l'article D3142-66, lorsqu'il s'agit d'un congé pour la création ou la reprise d'entreprise, l'employeur ne peut différer le départ en congé ou le début de la période de travail à temps partiel que dans la limite de six mois à compter de la réception de la demande prévue à l'article D3142-73.\n\nIl est recommandé de consulter votre convention collective ou de contacter un spécialiste en droit du travail pour obtenir des informations plus précises sur votre situation spécifique."
# prompt = "Quelle indemnité en cas de rupture conventionnelle ?"
# content="L'indemnité en cas de rupture conventionnelle peut varier en fonction des circonstances spécifiques de la rupture et des dispositions légales applicables. Selon l'article L1237-13 du Code du travail, la convention de rupture doit fixer le montant de l'indemnité spécifique de rupture conventionnelle, qui ne peut être inférieure à celui de l'indemnité prévue à l'article L1234-9. \n\nEn général, l'indemnité de rupture conventionnelle ne peut être inférieure à un mois de salaire par année ou fraction d'année d'ancienneté, avec un maximum de quinze mois de salaire (article D7112-1 du Code du travail pour les journalistes professionnels). Toutefois, il est important de noter que ces dispositions peuvent varier selon les conventions collectives applicables ou les accords conclus entre l'employeur et le salarié.\n\nIl est recommandé de consulter votre convention collective ou de vous rapprocher d'un professionnel du droit spécialisé en droit du travail pour obtenir des conseils spécifiques à votre situation."
prompt = """Bonjour.
J'ai été recruté, il y a un an et demi, par une société de travaux publics en tant que chef de chantier.
Mais mon employeur s'évertue de plus en plus à me faire occuper 5 postes :
-Chef de chantier (avec tout ce que ça implique de préparation, responsabilités, etc...)
-Terrassier (je conduis les machines)
-Canalisateur (pose des conduites, réseaux...)
-Maçon TP (création de regards, scellements de tampons...) --Manœuvre (je travaille généralement seul, ou éventuellement avec un débutant sur machine qui ne sait pas faire grand chose de ses mains sinon triturer son smartphone
Mes questions sont :
- Peut-il (mon employeur) m'obliger à occuper des postes qui, certes sont dans mes compétences mais, ne sont pas stipulés sur mon contrat et n'entrent pas dans le cadre du poste pour lequel j'ai été recruté (encadrement d'équipe et gestion de chantiers)
- Puis-je refuser d'effectuer ces tâches qui, encore une fois, ne relèvent pas de mon poste.
- Puis-je exiger une augmentation, étant donnée l'économie substantielle que je fais faire à la société par l'absence d'embauche des personnels qui devraient être assignés à ces tâches.
"""
# content="Bonjour,\n\nD'après les informations que vous avez fournies, il semble que votre employeur vous demande d'occuper plusieurs postes différents, ce qui peut être considéré comme une surcharge de travail. Selon le Code du travail français, l'employeur a l'obligation de garantir la santé et la sécurité des travailleurs, notamment en évitant les situations de surcharge de travail qui pourraient nuire à leur santé physique et mentale.\n\nL'article L4121-1 du Code du travail dispose que l'employeur doit prendre les mesures nécessaires pour assurer la sécurité et protéger la santé physique et mentale des travailleurs. De plus, l'article L4121-2 précise que l'employeur doit notamment adapter le travail à l'homme, en tenant compte de l'évolution des techniques et en veillant à l'amélioration des conditions de travail.\n\nDans votre cas, il semble que votre employeur vous demande d'occuper plusieurs postes sans prendre en compte les responsabilités et les exigences spécifiques de chaque poste. Cela peut entraîner une surcharge de travail et potentiellement mettre en danger votre santé et votre sécurité.\n\nJe vous recommande de discuter de cette situation avec votre employeur et de lui faire part de vos préoccupations. Vous pouvez également contacter les représentants du personnel ou le syndicat de votre entreprise pour obtenir des conseils et un soutien supplémentaires.\n\nSi la situation persiste et que vous estimez que vos droits sont violés, vous pouvez envisager de déposer une plainte auprès de l'inspection du travail compétente. Ils pourront enquêter sur la situation et prendre les mesures nécessaires pour garantir le respect de vos droits en matière de santé et de sécurité au travail.\n\nN'hésitez pas à consulter un avocat spécialisé en droit du travail pour obtenir des conseils juridiques adaptés à votre situation spécifique.\n\nNotez que je suis un modèle de langage AI et que mes informations sont basées sur des connaissances générales du droit du travail français. Il est toujours préférable de consulter un professionnel du droit pour des conseils juridiques précis."
rag_chain = (
{"context": retriever, "question": RunnablePassthrough(), "input" : RunnablePassthrough()}
| final_prompt
| llm
)
res = rag_chain.invoke(prompt)
print(res)
# AIMessage(content='Task decomposition is the process of breaking down a task into smaller subgoals or steps. It can be done using simple prompting, task-specific instructions, or human inputs.')

1
sources/code-travail.xml Normal file

File diff suppressed because one or more lines are too long

69
web-ui.py Normal file
View File

@ -0,0 +1,69 @@
import random
import gradio as gr
__import__('pysqlite3')
import sys
import dotenv
from langchain.vectorstores import Chroma
from langchain.embeddings import OpenAIEmbeddings
from langchain.prompts import ChatPromptTemplate, SemanticSimilarityExampleSelector
from langchain.chat_models import ChatOpenAI
from langchain.schema.runnable import RunnablePassthrough
dotenv.load_dotenv()
sys.modules['sqlite3'] = sys.modules.pop('pysqlite3')
vectorstore = Chroma(persist_directory="./chroma_db.1.0", embedding_function=OpenAIEmbeddings())
retriever = vectorstore.as_retriever()
embeddings = OpenAIEmbeddings()
examples_vectorstore = Chroma(persist_directory="./chroma_db_examples.1.0", embedding_function=OpenAIEmbeddings())
example_selector = SemanticSimilarityExampleSelector(
vectorstore=examples_vectorstore,
k=2,
)
from langchain.prompts import (
ChatPromptTemplate,
FewShotChatMessagePromptTemplate,
)
few_shot_prompt = FewShotChatMessagePromptTemplate(
input_variables=["input"],
example_selector=example_selector,
example_prompt=ChatPromptTemplate.from_messages(
[("human", "{input}"), ("ai", "{output}")]
)
)
final_prompt = ChatPromptTemplate.from_messages(
[
("system",
"You are a lawyer specialized in French Labour laws and promting Unions. You want to help but not misguide the user. If you don't know the answer, just say that you don't know. Don't hesitate to reformulate and think about the issues. Cite law articles as much as possible."),
few_shot_prompt,
("human", """
Question: {question}
Context: {context}
Answer:
"""),
]
)
llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0.33)
rag_chain = (
{"context": retriever, "question": RunnablePassthrough(), "input" : RunnablePassthrough()}
| final_prompt
| llm
)
def random_response(message, history):
res = rag_chain.invoke(message)
return res.content
demo = gr.ChatInterface(random_response)
if __name__ == "__main__":
demo.launch()