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()