Maison > Article > développement back-end > d[IA]gnose : vectorisation des diagnostics avec des modèles Python et LLM intégrés
Dans l'article précédent, nous avons présenté l'application d[IA]gnosis développée pour prendre en charge le codage des diagnostics dans la CIM-10. Dans cet article, nous verrons comment InterSystems IRIS for Health nous fournit les outils nécessaires pour la génération de vecteurs à partir de la liste de codes CIM-10 à l'aide d'un modèle de langage pré-entraîné, son stockage et la recherche ultérieure de similitudes sur tous ces vecteurs générés. .
L'une des principales fonctionnalités apparues avec le développement des modèles d'IA est ce que nous appelons RAG (Retrieval-Augmented Generation) qui nous permet d'améliorer les résultats des modèles LLM en incorporant un contexte dans le modèle. Eh bien, dans notre exemple, le contexte est donné par l'ensemble des diagnostics CIM-10 et pour les utiliser il faut d'abord les vectoriser.
Comment vectoriser notre liste de diagnostics ?
Pour la génération de vecteurs nous avons utilisé la bibliothèque Python SentenceTransformers qui facilite grandement la vectorisation de textes libres à partir de modèles pré-entraînés. Depuis leur propre site Web :
Sentence Transformers (alias SBERT) est le module Python incontournable pour accéder, utiliser et former des modèles d'intégration de texte et d'images de pointe. Il peut être utilisé pour calculer des intégrations à l'aide de modèles Sentence Transformer (démarrage rapide) ou pour calculer des scores de similarité à l'aide de modèles Cross-Encoder (démarrage rapide). Cela ouvre la voie à un large éventail d'applications, notamment la recherche sémantique, la similarité textuelle sémantique et l'exploration de paraphrase.
Parmi tous les modèles développés par la communauté SentenceTransformers, nous avons trouvé BioLORD-2023-M, un modèle pré-entraîné qui générera des vecteurs à 786 dimensions.
Ce modèle a été formé à l'aide de BioLORD, une nouvelle stratégie de pré-formation permettant de produire des représentations significatives de phrases cliniques et de concepts biomédicaux.
Les méthodologies de pointe fonctionnent en maximisant la similarité dans la représentation des noms faisant référence au même concept et en empêchant l'effondrement grâce à un apprentissage contrastif. Cependant, comme les noms biomédicaux ne sont pas toujours explicites, ils aboutissent parfois à des représentations non sémantiques.
BioLORD surmonte ce problème en fondant ses représentations conceptuelles à l'aide de définitions, ainsi que de courtes descriptions dérivées d'un graphe de connaissances multi-relationnel composé d'ontologies biomédicales. Grâce à cette base, notre modèle produit des représentations de concepts plus sémantiques qui correspondent plus étroitement à la structure hiérarchique des ontologies. BioLORD-2023 établit un nouvel état de l'art en matière de similarité de texte sur les phrases cliniques (MedSTS) et les concepts biomédicaux (EHR-Rel-B).
Comme vous pouvez le voir dans sa définition, ce modèle est pré-entraîné avec des concepts médicaux qui seront utiles lors de la vectorisation de nos codes ICD-10 et de notre texte libre.
Pour notre projet, nous allons télécharger ce modèle pour accélérer la création des vecteurs :
if not os.path.isdir('/shared/model/'): model = sentence_transformers.SentenceTransformer('FremyCompany/BioLORD-2023-M') model.save('/shared/model/')
Une fois dans notre équipe, nous pouvons saisir les textes à vectoriser dans des listes pour accélérer le processus, voyons comment nous vectorisons les codes ICD-10 que nous avons préalablement enregistrés dans nos ENCODER.Object.Codes cours.
st = iris.sql.prepare("SELECT TOP 50 CodeId, Description FROM ENCODER_Object.Codes WHERE VectorDescription is null ORDER BY ID ASC ") resultSet = st.execute() df = resultSet.dataframe() if (df.size > 0): model = sentence_transformers.SentenceTransformer("/shared/model/") embeddings = model.encode(df['description'].tolist(), normalize_embeddings=True) df['vectordescription'] = embeddings.tolist() stmt = iris.sql.prepare("UPDATE ENCODER_Object.Codes SET VectorDescription = TO_VECTOR(?,DECIMAL) WHERE CodeId = ?") for index, row in df.iterrows(): rs = stmt.execute(str(row['vectordescription']), row['codeid']) else: flagLoop = False
Comme vous pouvez le constater, nous extrayons d'abord les codes stockés dans notre table de codes ICD-10 que nous n'avons pas encore vectorisés mais que nous avons enregistrés dans une étape précédente après l'avoir extrait du fichier CSV, puis nous extrayons la liste des descriptions à vectoriser et en utilisant la bibliothèque Python sentence_transformers nous allons récupérer notre modèle et générer les plongements associés.
Enfin, nous mettrons à jour le code ICD-10 avec la description vectorisée en exécutant UPDATE. Comme vous pouvez le constater, la commande pour vectoriser le résultat renvoyé par le modèle est la commande SQL TO_VECTOR dans IRIS.
D'accord, nous avons notre code Python, il nous suffit donc de l'envelopper dans une classe qui étend Ens.BusinessProcess et de l'inclure dans notre production, puis de le connecter au Service Métier en charge de la récupération le fichier CSV et c'est tout !
Voyons à quoi ressemblera ce code dans notre production :
Comme vous pouvez le constater, nous avons notre Business Service avec l'adaptateur EnsLib.File.InboundAdapter qui nous permettra de collecter le fichier de code et de le rediriger vers notre Business Process dans lequel nous effectuerons toutes les opérations de vectorisation et de stockage, nous donnant un ensemble d'enregistrements comme le suivant :
Maintenant, notre application serait prête à commencer à rechercher des correspondances possibles avec les textes que nous lui envoyons !
Dans le prochain article nous montrerons comment l'application front-end développée en Angular 17 s'intègre à notre production dans IRIS for Health et comment IRIS reçoit les textes à analyser, les vectorise et recherche des similitudes dans la CIM-10 table de codes.
Ne le manquez pas !
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!