Spaces:
Sleeping
Sleeping
File size: 4,279 Bytes
56a3465 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 |
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()
|