For AI agents: the complete documentation index is available at https://docs.ovhcloud.com/fr/llms.txt, the full documentation bundle is available at https://docs.ovhcloud.com/fr/llms-full.txt, and this page is available as Markdown at https://docs.ovhcloud.com/fr/guides/public-cloud/ai-machine-learning/ai-endpoints-chatbot-memory-langchain.md.

AI Endpoints - Activer la mémoire de conversation dans votre chatbot avec LangChain

Voir en Markdown

Intégrez la mémoire de conversation à votre chatbot en utilisant AI Endpoints et LangChain

Info

AI Endpoints est couvert par les Conditions particulières OVHcloud Public Cloud (voir l’Annexe 10 – « Conditions spécifiques – AI Endpoints »).

Introduction

Vous souhaitez créer un chatbot capable de tenir des conversations plus naturelles et cohérentes avec vos utilisateurs ?

Dans ce tutoriel, nous allons découvrir comment mettre en œuvre la mémoire conversationnelle à l’aide de LangChain et du modèle Mistral 7B grâce à OVHcloud AI Endpoints. Cela permettra à votre chatbot de se souvenir des interactions précédentes et d’utiliser ce contexte pour générer des réponses plus précises et pertinentes.

Nous présenterons les différents types de mémoire disponibles dans LangChain. Nous comparerons ensuite le comportement du chatbot avec et sans mémoire.

Comparaison entre un chatbot avec et sans mémoire

Définitions

Avant de plonger dans le code, prenons le temps de comprendre les différents types de mémoire disponibles dans LangChain :

Mémoire conversationnelle

La mémoire conversationnelle des LLM (Language Learning Models) désigne la capacité de ces modèles à se souvenir des informations issues des interactions précédentes au sein d’une même conversation, et à les réutiliser.

Elle fonctionne d’une manière similaire à la façon dont les humains utilisent leur mémoire à court terme dans les conversations du quotidien.

Cette fonctionnalité est essentielle pour maintenir le contexte et la cohérence tout au long d’un dialogue. Elle permet au modèle de se rappeler des détails, des faits ou des questions mentionnés plus tôt dans la conversation (historique de la conversation), et d’utiliser efficacement ces informations pour générer des réponses plus pertinentes correspondant aux nouvelles entrées de l’utilisateur.

La mémoire conversationnelle peut être mise en œuvre grâce à diverses techniques et architectures, notamment avec LangChain.

Types de mémoire dans LangChain

LangChain propose plusieurs modules de mémoire pouvant être utilisés au sein d’une ConversationChain. Chacun présente des compromis différents en matière de longueur de mémoire, d’utilisation de tokens et de style de résumé.

  • ConversationBufferMemory : stocke la liste complète des messages de la conversation. Ensuite, toutes les interactions entre l’humain et l’IA sont transmises au paramètre history.
  • ConversationSummaryMemory : résout un problème qui survient avec ConversationBufferMemory : la consommation rapide d’un grand nombre de tokens, dépassant souvent la limite de la fenêtre de contexte des LLM les plus avancés. Ce second composant permet de limiter l’utilisation abusive des tokens tout en exploitant la mémoire. Il résume l’historique de la conversation avant de l’envoyer au paramètre dédié (history).
  • ConversationBufferWindowMemory : introduit une fenêtre dans la mémoire tampon, ne conservant en mémoire que les K interactions les plus récentes.
  • ConversationSummaryBufferMemory : un mélange de ConversationSummaryMemory et de ConversationBufferWindowMemory. Il résume les interactions les plus anciennes tout en conservant les tokens les plus récents de la conversation entre l’humain et l’IA.

Prérequis

En pratique

Configurer l’environnement

Afin d’utiliser facilement les API AI Endpoints, créez un fichier .env pour stocker les variables d’environnement :

LLM_AI_ENDPOINT=https://oai.endpoints.kepler.ai.cloud.ovh.net/v1
OVH_AI_ENDPOINTS_ACCESS_TOKEN=<ai-endpoints-api-token>

Veillez à remplacer la valeur du token (OVH_AI_ENDPOINTS_ACCESS_TOKEN) par la vôtre. Si vous n’en avez pas encore, suivez les instructions du guide AI Endpoints - Premiers pas.

Ensuite, créez un fichier requirements.txt avec les librairies nécessaires :

python-dotenv==1.0.1
langchain_openai==0.1.14
openai==1.68.2
langchain==0.2.17

Puis, lancez l’installation de ces dépendances :

pip install -r requirements.txt

Notez que Python 3.11 est utilisé dans ce tutoriel.

Importer les librairies et variables nécessaires

Une fois ceci fait, vous pouvez créer un notebook ou un fichier Python (par exemple, chatbot-memory-langchain.ipynb), dans lequel vous importerez d’abord vos librairies comme suit :

import os
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain.chains import ConversationChain
from langchain.memory import ConversationBufferWindowMemory

Après ces lignes, chargez et accédez aux variables d’environnement de votre fichier .env :

# access the environment variables from the .env file
load_dotenv()

ai_endpoint_token = os.getenv("OVH_AI_ENDPOINTS_ACCESS_TOKEN")
ai_endpoint_url = os.getenv("LLM_AI_ENDPOINT")

💡 Vous êtes maintenant prêt à tester votre LLM sans mémoire conversationnelle !

Tester Mistral 7B sans mémoire conversationnelle

Testez le modèle de manière simple et observez ce qui se passe avec le contexte :

# Set up the LLM
llm = ChatOpenAI(
        model_name="Mistral-7B-Instruct-v0.3", 
        openai_api_key=ai_endpoint_token,
        openai_api_base=ai_endpoint_url, 
        max_tokens=512,
        temperature=0.0
)

prompt = ChatPromptTemplate.from_messages([
("system", "You are an assistant. Answer to the question."),
("human", "{question}"),
])

# Create the conversation chain
chain = prompt | llm

# Start the conversation
question = "Hello, my name is Elea"
response = chain.invoke(question)
print(f"👤: {question}")
print(f"🤖: {response.content}")

question = "What is the capital of France?"
response = chain.invoke(question)
print(f"👤: {question}")
print(f"🤖: {response.content}")

question = "Do you know my name?"
response = chain.invoke(question)
print(f"👤: {question}")
print(f"🤖: {response.content}")

Vous devriez obtenir le résultat suivant :

👤: Hello, my name is Elea
🤖: Hello Elea, nice to meet you. How can I assist you today?
👤: What is the capital of France?
🤖: The capital city of France is Paris. Paris is one of the most famous and visited cities in the world. It is known for its art, culture, and cuisine.
👤: Do you know my name?
🤖: I'm an assistant and I don't have the ability to know your name without being told.

Notez ici que le modèle ne stocke pas la conversation en mémoire, puisqu’il ne se souvient plus du prénom envoyé dans le premier prompt.

Ajouter une fenêtre de mémoire à votre LLM

Dans cette étape, nous ajoutons une fenêtre de mémoire de conversation grâce au composant suivant afin de résoudre le problème de mémoire, en utilisant ConversationBufferWindowMemory de LangChain :

memory = ConversationBufferWindowMemory(k=10)

Le paramètre k définit le nombre d’interactions stockées.

Notez que si nous définissons k=1, cela signifie que la fenêtre se souviendra uniquement de la toute dernière interaction entre l’humain et l’IA. C’est-à-dire la dernière entrée humaine et la dernière réponse de l’IA.

Ensuite, nous devrons créer la chaîne de conversation :

conversation = ConversationChain(llm=llm, memory=memory)

ce qui donne le code suivant :

# Set up the LLM
llm = ChatOpenAI(
        model_name="Mistral-7B-Instruct-v0.3", 
        openai_api_key=ai_endpoint_token,
        openai_api_base=ai_endpoint_url,
        max_tokens=512,
        temperature=0.0
)

# Add Converstion Window Memory
memory = ConversationBufferWindowMemory(k=10)

# Create the conversation chain
conversation = ConversationChain(llm=llm, memory=memory)

# Start the conversation
question = "Hello, my name is Elea"
response = conversation.predict(input=question)
print(f"👤: {question}")
print(f"🤖: {response}")

question = "What is the capital of France?"
response = conversation.predict(input=question)
print(f"👤: {question}")
print(f"🤖: {response}")

question = "Do you know my name?"
response = conversation.predict(input=question)
print(f"👤: {question}")
print(f"🤖: {response}")

En exécutant le code précédent, vous devriez obtenir ce type de résultat :

👤: Hello, my name is Elea
🤖: Hello Elea, nice to meet you. I'm an AI designed to assist and engage in friendly conversations. How can I help you today? Would you like to know a joke, play a game, or discuss a specific topic? I'm here to help and provide lots of specific details from my context. If I don't know the answer to a question, I'll truthfully say I don't know. So, what would you like to talk about today? I'm all ears!
👤: What is the capital of France?
🤖: The capital city of France is Paris. Paris is one of the most famous and romantic cities in the world. It is known for its beautiful architecture, iconic landmarks, world-renowned museums, delicious cuisine, vibrant culture, and friendly people. Paris is a must-visit destination for anyone who loves travel, adventure, history, art, culture, and new experiences. So, if you ever have the opportunity to visit Paris, I highly recommend that you take it! You won't be disappointed!
👤: Do you know my name?
🤖: Yes, I do. Your name is Elea. How can I help you today, Elea? Would you like to know a joke, play a game, or discuss a specific topic? I'm here to help and provide lots of specific details from my context. If I don't know the answer to a question, I'll truthfully say I don't know. So, what would you like to talk about today, Elea? I'm all ears!

Comme vous pouvez le constater, grâce à ConversationBufferWindowMemory, votre modèle garde une trace de la conversation et retrouve les informations échangées précédemment.

Note : ici, la fenêtre de mémoire est de k=10, n’hésitez pas à personnaliser la valeur de k selon vos besoins.

Conclusion

Bravo 🎉 ! Vous pouvez désormais bénéficier de la mémoire générée par l’historique de vos interactions avec le LLM. 🤖 Cela vous permettra de fluidifier les échanges avec le chatbot et d’obtenir des réponses plus pertinentes !

Vous avez également constaté à quel point il est facile d’utiliser AI Endpoints pour créer des solutions clé en main innovantes.

➡️ Accédez au code complet ici.

Aller plus loin

Si vous souhaitez en savoir plus, consultez l’article suivant sur la mémoire d'un chatbot avec LangChain4j.

Pour une formation ou une assistance technique sur la mise en œuvre de nos solutions, contactez votre commercial ou consultez la page Professional Services pour obtenir un devis et faire analyser votre projet par nos experts.

Votre avis nous intéresse !

N’hésitez pas à nous faire part de vos questions, retours et suggestions concernant AI Endpoints et ses fonctionnalités :

  • Dans le canal #ai-endpoints du serveur Discord OVHcloud, où vous pouvez échanger avec la communauté et les équipes OVHcloud.
Cette page vous a-t-elle aidé ?