data-sarbacane / app.py
cdupland
Add dotenv support and enhance agent selection in app.py; refactor get_retreive_answer to handle multiple namespaces in vectore_store.py
fc3050e
import os
import streamlit as st
import time
from langchain_openai import ChatOpenAI # Nouvel import pour OpenAI
from langchain.prompts import PromptTemplate
from pinecone import Pinecone, ServerlessSpec
from vectore_store import get_retreive_answer
from dotenv import load_dotenv
load_dotenv()
PINECONE_API_KEY = os.environ.get("PINECONE_API_KEY")
index_name = os.environ.get("PINECONE_INDEX_NAME")
print(PINECONE_API_KEY)
pc = Pinecone(api_key=PINECONE_API_KEY)
existing_indexes = [index_info["name"] for index_info in pc.list_indexes()]
if index_name not in existing_indexes:
pc.create_index(
name=index_name,
dimension=3072,
metric="cosine",
spec=ServerlessSpec(cloud="aws", region="us-east-1"),
)
while not pc.describe_index(index_name).status["ready"]:
time.sleep(1)
index = pc.Index(index_name)
# Initialiser l'historique s'il n'existe pas déjà
if "history" not in st.session_state:
st.session_state["history"] = []
# Interface Streamlit
st.title("Application LLM avec LangChain")
st.write("Posez une question au modèle de langage et obtenez une réponse.")
# Sélectionnez l'agent via un bouton radio
# Sélectionnez le type d'agent via un bouton radio
agent_type = st.radio(
"Choisissez le type d'agent :",
("Agent IA Service Client Augmenté", "Agent IA Produit Augmenté", "Agent Campaign Marketing"), # "Agent IA Commercial Augmenté",
index=0 # "Agent IA Service Client Augmenté" est sélectionné par défaut
)
# Configuration des templates et namespaces en fonction de l'agent sélectionné
# Configuration des templates et namespaces en fonction de l'agent sélectionné
if agent_type == "Agent IA Service Client Augmenté":
namespaces = ["chat","tic_email"]
prompt_template = PromptTemplate(
input_variables=["question","context","messages"],
template=(
"Votre rôle est d’agir comme un Agent IA de Service Client Augmenté. Vous devez :\n\n"
"1. Anticiper les besoins et insatisfactions des clients :\n"
" - Identifiez les questions et préoccupations potentielles des clients avant même qu’ils ne les expriment.\n\n"
"2. Pré-générer des réponses adaptées :\n"
" - En fonction des questions les plus fréquentes et des problèmes courants, proposez des réponses prédéfinies qui peuvent être facilement adaptées aux situations spécifiques.\n\n"
"3. Améliorer les processus et formations internes :\n"
" - Fournissez des suggestions basées sur les retours clients pour optimiser les processus internes de service client et améliorer les formations des agents.\n\n"
"### Objectif :\n"
"Fournir des réponses réactives et de qualité, afin d’accroître la satisfaction client et d’optimiser les performances du service.\n"
"Sachant le context suivant: {context}, et l'historique de la conversation: {messages}, {question}\n"
)
)
elif agent_type == "Agent IA Produit Augmenté":
namespaces = ["chat","tic_email"]
prompt_template = PromptTemplate(
input_variables=["question","context","messages"],
template=(
"Votre rôle est d’agir comme un Agent IA Produit Augmenté et responsable du service Produit :\n\n"
"1. Fournir des données objectives pour les réunions de feedback :\n"
" - Catégorisation, Quantification et Reporting des données liées à nos produits et services.\n\n"
"2. Identifier rapidement les tendances et opportunités :\n"
" - Analysez les données pour déceler les tendances et proposer des améliorations.\n\n"
"3. Détecter et résoudre les problèmes en temps réel :\n"
" - Surveillez en continu la satisfaction des clients et identifiez les problèmes potentiels.\n\n"
"### Objectif :\n"
"Aider à prioriser les actions basées sur des données, gagner du temps, et améliorer la satisfaction client.\n"
"Sachant le context suivant: {context}, et l'historique de la conversation: {messages}, {question}\n"
)
)
# elif agent_type == "Agent IA Commercial Augmenté":
# namespaces = ["chat","tic_email"]
# prompt_template = PromptTemplate(
# input_variables=["question"],
# template=(
# "Votre rôle est d’agir comme un Agent IA Commercial Augmenté. Vous devez :\n\n"
# "1. Détection de pistes business dans le CRM :\n"
# " - Analysez les données du CRM pour identifier les opportunités de vente qui sont actuellement détectées manuellement.\n\n"
# "### Objectif :\n"
# "Automatiser la détection des pistes commerciales et augmenter l'efficacité des processus de vente."
# )
# )
elif agent_type == "Agent Campaign Marketing":
namespaces = ["campaigns"]
prompt_template = PromptTemplate(
input_variables=["question","context","messages"],
template=(
"Votre rôle est d’agir comme un Agent IA de Campaign Marketing.\n\n"
"Proposes des campagnes marketing qualitatives, ciblées et efficace.\n"
"Sachant le context suivant: {context}, et l'historique de la conversation: {messages}, {question}\n"
)
)
# Créez un modèle OpenAI
llm = ChatOpenAI(model="gpt-4o-mini")
# Chaîne qui combine le modèle LLM et le prompt
llm_chain = prompt_template | llm # Nouvelle façon d'utiliser LLMChain
# Champ pour entrer la question
question = st.text_input("Votre question :")
# Bouton pour soumettre la question
if st.button("Envoyer"):
if question:
context = get_retreive_answer(index, namespaces=namespaces, prompt=question)
if not context:
print("no context found for prompt reormatting")
for chunk in context:
print(chunk.metadata)
chunk_name = chunk.metadata["filename"]
if st.session_state["history"]:
messages = st.session_state["history"]
else:
messages = []
# Utilisation de la chaîne pour obtenir une réponse
response = llm_chain.invoke({"question": question, "context": context, "messages": messages}) # Utilisation de invoke() au lieu de run()
# Ajouter la question et la réponse à l'historique
st.session_state["history"].append({"question": question, "response": response.content})
else:
st.write("Veuillez poser une question.")
# Affichage de l'historique des échanges
if st.session_state["history"]:
st.write("### Historique des échanges")
for i, exchange in enumerate(st.session_state["history"]):
st.write(f"**Échange {i + 1}**")
st.write(f"**Question :** {exchange['question']}")
st.write(f"**Réponse :** {exchange['response']}")
st.write("---")