Réaliser un chatbot médical grâce au Large Language Model
ou comment l'IA peut aider les médecins dans la préparation de la consultation médicale.

Chez Primary, nous sommes à la recherche de nouveaux outils afin d'améliorer l'expérience de nos patients en cabinet, et rendre l'exercice de nos médecins le plus confortable possible. La consultation est donc au centre de nos préoccupations, et sa préparation est un levier important afin de la rendre plus efficace.
Notre équipe a débuté la conception d'un outil de préparation de consultation, permettant d'obtenir un maximum d'informations sur l'état de santé du patient avant qu'il n'arrive au cabinet, et de restituer ces informations de manière claire et concise à notre équipe médicale.
C'est là qu'un Large Language Model (LLM) peut apporter de la valeur !
Nous avons décidé de nous servir d'un LLM afin de simplifier la génération d'un questionnaire de préparation à la consultation (appelé dans notre jargon pré-anamnèse), et ne pas tomber dans un arbre décisionnel très complexe, peu flexible et difficilement maintenable.
Nous avons tellement aimé les tests que nous avons fait avant de passer à l'implémentation, que nous nous sommes dit qu'il était dommage de ne pas les partager. Nous allons construire ensemble un chatbot médical :)
A vos claviers
Bien entendu, nous avons évalué différentes technologies, ce petit test porte sur l'API de l'assistant OpenAI, car elle permet une prise en mains assez simple du LLM. L'assistant OpenAI garde en mémoire les échanges sur un fil de conversation. Cette fonctionnalité peut être intéressante dans notre cas, car elle nous évite de fournir l'ensemble de l'historique de la conversation à chaque interaction.
Pré-requis à suivre : ici
avoir python installé
un environnement virtuel python (optionnel)
avoir une clef valide d'API OpenAI
installer la librairie openai
Première étape, initialiser notre modèle, dans notre fichier test assistant-test.py
from openai import OpenAI
client = OpenAI()
def create_assistant():
assistant = client.beta.assistants.create(
name="Mon Assistant de Test",
instructions='Tu es un médecin généraliste.Tu demandes au patient quels sont ses symptômes et s\'il va bien. '
'Pose une seule question à la fois et au maximum 5 questions dans la conversation'
'Quand tu as terminé, écris "fin"',
model="gpt-3.5-turbo"
)
return assistant
assistant = create_assistant()
print(assistant)
Bravo, vous avez initialisé votre assistant, si vous regardez bien vos logs lorsque vous lancez ce bout de code, vous verrez qu'OpenAI a conservé vos instructions, et généré un assistant avec un id. Nous allons donc nous en servir afin de discuter avec lui.
---------------
LOGS
Assistant(id='votre_id_d_assistant', created_at=1719583152, description=None, file_ids=[], instructions='Tu es un médecin généraliste.Tu demandes au patient quels sont ses symptômes et s\'il va bien.Quand tu as terminé, écris "fin"', metadata={}, model='gpt-3.5-turbo', name='Mon Assistant de Test', object='assistant', tools=[], top_p=1.0, temperature=1.0, response_format='auto')
Dans un fichier bot.py, nous allons initialiser un thread de conversation grâce à la méthode create_thread, puis associer notre fil à notre assistant.
from openai import OpenAI
client = OpenAI()
assistant_id = "votre_id_d_assistant"
def create_thread():
return client.beta.threads.create()
Ensuite, nous allons mettre en place la logique permettant de poser une question et de lire le dernier message envoyé par l'assistant. Le principe est simple, comme dans une discussion, vous aurez le rôle "user", et l'assistant le rôle..."assistant".
def answer_to_a_question(thread_id):
# méthode permettant de lire les réponses d'open ai
question = read_last_message(thread_id)
# vous allez discuter directement avec le bot
response = input(question)
# méthode permettant d'envoyer les réponses à open ai
answer(response, thread_id)
# méthode permettant de lancer l'assistant
run_assistant(thread_id)
def answer(response, thread_id):
client.beta.threads.messages.create(
thread_id=thread_id,
role="user",
content=response
)
# nous accédons au dernier message produit par le LLM
# via la liste de messages du thread
def read_last_message(thread_id):
messages = client.beta.threads.messages.list(
thread_id=thread_id
)
return messages.data[0].content[0].text.value
Enfin, il faut implémenter la logique permettant de récupérer les questions de l'assistant de manière asynchrone (il faut pull les questions de l'assistant jusqu'à ce qu'elles soient présentes), mais aussi associer le thread que nous avons précédemment créé afin de lancer la conversation.
def retrieve_run_status(run_id, thread_id):
run = client.beta.threads.runs.retrieve(
thread_id=thread_id,
run_id=run_id
)
return run.status
def run_assistant(thread_id):
run = client.beta.threads.runs.create(
thread_id=thread_id,
assistant_id=assistant_id,
)
status = retrieve_run_status(run.id, thread_id)
while status != "completed":
status = retrieve_run_status(run.id, thread_id)
return run
Lancez votre chatbot à l'aide du code ci-dessous et fournissez lui des réponses plausibles.
thread = create_thread()
run_assistant(thread.id)
tours = 0
while tours < 5:
answer_to_a_question(thread.id)
tours += 1
--------
Bonjour, comment je peux vous aider aujourd'hui ? Quels sont vos symptômes et comment vous sentez-vous ?
j'ai mal à la gorge
Est-ce que vous avez également de la fièvre ?
oui
Avez-vous aussi des difficultés à avaler ?
oui comme lorsqu'on a une angine
Avez-vous des ganglions enflés au niveau du cou ?
non
D'accord, je vous recommande de prendre un antalgique pour soulager la douleur et de boire beaucoup d'eau. Si les symptômes persistent, je vous conseille de consulter un médecin. Prenez soin de vous et reposez-vous. Si vous avez d'autres préoccupations, n'hésitez pas à me le faire savoir. Bon rétablissement !
Fin
Ici, nous avons sciemment bloqué le nombre de questions à 5 car le LLM n'est pas parfait :
les questions ne sont pas idempotentes pour un ensemble de réponses donné
même si les instructions indiquent un nombre maximal de 5 questions, le LLM peut aller plus loin, il faut le bloquer programmatiquement
la qualité du chatbot dépend quasi-exclusivement de la qualité du prompt, il faut donc l'améliorer en réalisant plusieurs itérations, et en ajoutant des instructions. C'est un métier, cela s'appelle le prompt engineering.
les réponses du chatbot peuvent parfois être surprenantes : il faut envisager un monitoring du bot pour s'assurer de sa qualité, notamment lors d'une montée de version.
Nous espérons que ce petit exercice de découverte du Large Language Model vous aura donné envie de creuser le sujet :-)



