ai_agents / chatbot_page /chatbot.py
Ilyas KHIAT
first push
56a3465
import streamlit as st
from langchain_openai import ChatOpenAI
from langchain_mistralai import ChatMistralAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_core.messages import AIMessage, HumanMessage
def get_response(user_query, chat_history, context,llm=None,history_limit=5,stream=True):
template = """
Étant donné l'historique de la conversation : {chat_history}, le contexte : {context}, et la question de l'utilisateur : {user_question}, veuillez fournir une réponse détaillée et complète. La réponse doit inclure un ou plusieurs des éléments suivants :
1. Une explication claire des concepts clés et des termes liés au sujet.
2. Un aperçu des meilleures pratiques, des stratégies courantes ou des cadres de référence pertinents pour la discussion.
3. Des exemples spécifiques ou des études de cas illustrant les principes abordés.
4. Les défis potentiels ou les considérations à prendre en compte.
5. Des suggestions de ressources supplémentaires ou des actions que l'utilisateur peut entreprendre pour approfondir sa compréhension.
Assurez-vous que la réponse soit adaptée au niveau d'expertise de l'utilisateur et aux spécificités du contexte fourni.
"""
prompt = ChatPromptTemplate.from_template(template)
#llm = ChatOpenAI(model="gpt-4o")
if not llm:
llm = ChatOpenAI(model="gpt-4o-mini")
elif llm == "GPT-4o":
llm = ChatOpenAI(model="gpt-4o")
elif llm == "Mistral Large 2 (FR)":
llm = ChatMistralAI(model_name="mistral-large-2407")
elif llm == "GPT-4o-mini":
llm = ChatOpenAI(model="gpt-4o-mini")
elif llm == "Mistral Nemo (FR)":
llm = ChatMistralAI(model_name="open-mistral-nemo-2407")
chain = prompt | llm
if not stream:
return chain.invoke({
"context": context,
"chat_history": chat_history[-history_limit:],
"user_question": user_query,
})
chain = chain | StrOutputParser()
if history_limit:
return chain.stream({
"context": context,
"chat_history": chat_history[-history_limit:],
"user_question": user_query,
})
return chain.stream({
"context": context,
"chat_history": chat_history,
"user_question": user_query,
})
def handle_display_models(index, models_names):
model = st.radio("Choisir un modèle",models_names, index=index)
return model
def chatbot_main():
st.title("Chatbot")
models_names = ["GPT-4o", "GPT-4o-mini"]
if "chat_history" not in st.session_state:
st.session_state.chat_history = [
AIMessage(content="Salut, Que puis-je faire pour vous ?"),
]
if "model" not in st.session_state:
st.session_state.model = "GPT-4o-mini"
header = st.container()
col1, col2 = header.columns([1, 2])
with col1.popover("Modèles disponibles"):
new_model = handle_display_models(models_names.index(st.session_state.model), models_names)
st.session_state.model = new_model
st.markdown(f"- **{st.session_state.model}**")
for message in st.session_state.chat_history:
if isinstance(message, AIMessage):
with st.chat_message("AI"):
st.markdown(message.content)
elif isinstance(message, HumanMessage):
with st.chat_message("Moi"):
st.write(message.content)
if "response_llm" not in st.session_state:
st.session_state.response_llm = ""
user_query = st.chat_input("Par ici ...")
if user_query is not None and user_query != "":
st.session_state.chat_history.append(HumanMessage(content=user_query))
with st.chat_message("Moi"):
st.markdown(user_query)
with st.chat_message("AI"):
st.markdown(f"**{st.session_state.model}**")
response = st.write_stream(get_response(user_query, st.session_state.chat_history, context=st.session_state.response_llm, llm=st.session_state.model, stream=True))
st.session_state.chat_history.append(AIMessage(content=response))
chatbot_main()