METROPOLE / app.py
kheopss's picture
sigbnataire
76f7f9b
import logging
import sys
from IPython.display import Markdown, display
from sqlalchemy import text
from llama_index.core import ServiceContext, PromptHelper
#from llama_index.core import LLMPredictor,OpenAIEmbedding
from llama_index.embeddings.openai import OpenAIEmbedding
from llama_index.llms.openai import OpenAI
from llama_index.core.indices.struct_store.sql_query import NLSQLTableQueryEngine
from sqlalchemy import (create_engine, MetaData, Table, Column, String, Integer)
import re
from llama_index.core import Document, VectorStoreIndex
from mistralai.client import MistralClient
from mistralai.models.chat_completion import ChatMessage
from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler
from langchain_community.llms import HuggingFaceTextGenInference
import re
import os
import gradio as gr
from dotenv import load_dotenv
import os
import openai
# Load environment variables from .env file
load_dotenv()
OPENAI_API_KEY = os.getenv('openai_key')
db_user = os.getenv('db_s_user')
db_password = os.getenv('db_s_pwd')
db_host = os.getenv('db_s_host')
db_name = os.getenv('db_s_name')
connection_string = f"postgresql+psycopg2://{db_user}:{db_password}@{db_host}/{db_name}"
engine = create_engine(connection_string)
metadata_obj = MetaData()
engine = create_engine(connection_string)
def query_fun(input_txt):
query_similarity =f"""
SELECT set_limit(0.2);
SELECT
item,
suppleant,
signataire,
theme,
GREATEST(similarity(item,'{input_txt}'), similarity(theme, '{input_txt}')) AS sml
FROM public.info_2
WHERE
item % '{input_txt}' OR theme % '{input_txt}' OR signataire % '{input_txt}'
ORDER BY
sml DESC,
item
LIMIT 5;
"""
result_list=[]
with engine.connect() as connection:
result = connection.execute(text(query_similarity))
for row in result:
result_list.append(str(row[0]))
result_list.append(str(row[1]))
result_list.append(str(row[2]))
result_list.append(str(row[3]))
return result_list
def gradio_interface(input_text):
result = process_text(input_text)
return result
def process_text(input_text):
texte_sans_apostrophes = re.sub(r"'", "", input_text)
sml_input = query_fun(texte_sans_apostrophes)
if not sml_input:
result = "cette information n'existe pas dans votre base de données"
print(result)
return result
# Découper la liste en sous-listes de trois éléments chacun
split_list = [sml_input[i:i + 4] for i in range(0, len(sml_input), 4)]
# Créer les textes désirés pour chaque sous-liste
texts = [f" * item: {sublist[0]} theme:{sublist[3]} premier signataire: {sublist[2]}, suppléant: {sublist[1]}" for sublist in split_list]
# Regrouper tous les textes en une seule variable, séparés par des sauts de ligne
text = '\n'.join(texts)
print(text)
from openai import OpenAI
client = OpenAI(api_key=OPENAI_API_KEY)
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": f"You are an expert in math.based on the folowing context answer direct response: {text}"},
{"role": "user", "content": f"{input_text}"},
]
)
print(text)
return response.choices[0].message.content
examples=[
"qui est habilité de signer au Devis et bons de commande égale à 14.000 €HT ?",
"Qui peut renouveler l'adhésion à des associations professionnelles ?",
"qui est habilité de signer au Devis et bons de commande égale à 4.000 €HT ?",
"qui est habilité de signer au courriers liés aux demandes d'attestations fiscales et sociales et assurances",
"qui signe décision de mobilité interne",
"Est-ce qu'Anne-Marie Atlan signe les bons de commande à 80 000 ?",
]
iface = gr.Interface(
fn=gradio_interface,
inputs="text",
outputs="text",
title="Métropole Signature Expert",
description="Provide a question related to signing authorities and get a response.",
examples=examples,
cache_examples=False,
)
iface.launch()