Spaces:
Sleeping
Sleeping
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() | |