Connecteur Microsoft Graph : Décryptage

Simon Emmanuel RIVAS
Catégorie : Copilot / Graph / Innovations Integration
01/04/2024

Les connecteurs Microsoft Graph jouent un rôle fondamental en ouvrant Graph à des données extérieures à l’écosystème Microsoft 365. L’utilisation d’un connecteur Graph en conjonction avec Microsoft Search améliore considérablement la complétude de l’indexation des données de l’entreprise. Cela permet d’élargir les capacités de recherche au-delà du contenu Microsoft 365.

Je vous partage ici quelques notes issues de mon expérience afin de démystifier certains concepts et de mettre en lumière certains points d’attention importants lors de mise en œuvre de connecteurs Graph.

 

Un peu d’histoire

Commençons par poser quelques éléments de contexte.

Microsoft a annoncé la possibilité d’étendre Graph avec des connecteurs personnalisés dès novembre 2019, lors de la conférence Microsoft Ignite. Cette annonce faisait partie d’une série d’extensions et d’améliorations de Microsoft Graph visant à augmenter sa flexibilité et sa capacité à intégrer diverses sources de données et services, offrant ainsi une expérience plus unifiée et intégrée aux utilisateurs et aux développeurs.

Le SDK a pour sa part été annoncé en early preview à la conférence Build de 2022 (https://devblogs.microsoft.com/microsoft365dev/increase-engagement-and-discoverability-of-your-data-with-microsoft-graph-connectors/).

Il a ensuite été annoncé de manière officielle à Build 2023 (https://www.microsoft.com/en-us/microsoft-365/blog/2023/05/23/empowering-every-developer-with-plugins-for-microsoft-365-copilot/)

En résumé, le principe n’est pas neuf mais sa concrétisation l’est beaucoup plus!

 

Ingérer des données externes : pour quoi faire?

Nous l’avons vu en introduction, les connecteurs permettent d’injecter des données de systèmes externes dans Graph, permettant ainsi de les indexer et de donner une vision plus complète des données de l’entreprise. Certes, mais pour quoi faire?

Alimenter Graph et Copilot avec des donénes externes au travers d'un connecteur Graph

Injecter des données de systèmes externes dans Microsoft Graph via des connecteurs offre des avantages considérables en termes d’accessibilité et d’intelligence des données. Cette intégration centralisée ouvre la porte à des recherches sémantiques avancées qui comprennent le contexte et le sens des termes recherchés, bien au-delà de simples mots-clés. Ainsi, au lieu de rechercher des données isolément dans chaque système, Graph permet aux utilisateurs de réaliser des requêtes transversales qui exploitent, analysent et interprètent l’ensemble des données de l’entreprise, englobant à la fois les données internes et externes.

Par conséquent, plutôt que de jongler entre les interfaces de multiples systèmes externes, souvent disparates et sans liens entre elles, les utilisateurs bénéficient d’une expérience unifiée et cohérente à travers Graph.

 

Vous avez dit RAG?

Un connecteur Graph peut être considéré comme une déclinaison du pattern Retrieval-Augmented Generation (RAG), centrée sur contexte de Copilot. Ce pattern combine la récupération d’informations pertinentes d’une part et la génération de contenu d’autre part. Il s’appuie sur une base de données vectorielle pour enrichir et contextualiser les réponses générées par un modèle génératif.

Dans cette optique, le connecteur Graph fonctionne comme la composante de récupération du pattern RAG : il extrait et rend accessibles les données des systèmes externes à Copilot, permettant ainsi de générer des réponses précises et contextualisées.

La sophistication des connecteurs Graph réside dans leur outillage (c’est-à-dire l’API et les interfaces administratives). Couplé avec Copilot, un connecteur offre donc un usage avancé et industrialisé du pattern RAG au sein de l’écosystème Microsoft.

 

Ai-je besoin d’un connecteur ou… d’autre chose?

Avant de foncer tête baissée dans l’implémentation d’un nouveau connecteur, il convient de se demander si c’est bien d’un connecteur dont on a besoin.

Nous l’avons vu, un connecteur permet d’importer des données externes à Microsoft 365 et de les indexer vectoriellement pour effectuer des recherches sémantiques. Les données de référence, qui sont relativement statiques et ne changent pas fréquemment, sont en effet des candidates idéales pour l’ingestion via un connecteur Graph. Ces données peuvent inclure des informations d’entreprise telles que les nomenclatures de produits, les informations sur l’organisation, les annuaires d’entreprise, ou les bases de données de connaissances. L’avantage d’indexer de telles données réside dans leur pertinence à long terme et leur nécessité dans les recherches récurrentes, ce qui justifie leur intégration dans un index vectoriel pour des recherches sémantiques efficaces et rapides au sein de l’écosystème Microsoft 365.

En revanche, si l’exigence est d’avoir un accès en temps réel aux données, sans la nécessité de les indexer, un plugin serait plus approprié. Les plugins interagissent directement avec les systèmes externes, ce qui est idéal pour les scénarios nécessitant des données les plus fraiches possibles ou pour intégrer des fonctionnalités en temps réel.

Il faut également prendre en compte la limitation de Microsoft Graph, qui est de 10 connexions par organisation (bien que cette limite puisse être augmentée sur demande). Cette limite est importante à considérer dans le cadre de la planification de l’architecture d’intégration de données de l’entreprise.

 

Question de responsabilité : qui dans l’entreprise doit créer ces connecteurs?

Qui doit porter la responsabilité de mise en oeuvre d'un connecteur Graph

La mise en œuvre d’un connecteur dans une entreprise soulève la question des responsabilités et de définir les rôles de chaque équipe impliquée. Au cœur de ce processus se trouve la pratique de l’intégration, qui joue un rôle central car l’essence de la création d’un connecteur Graph se résume fondamentalement à un problématique ETL (Extraction, Transformation, Chargement).

Partant de là, il convient de considérer 2 aspects topologiques essentiels :

  • La diffusion et l’adoption de la pratique d’Intégration dans l’entreprise : centralisée, fédérée ou décentralisée
  • L’organisation autour de la (ou des) plateforme d’intégration elle-même.

La structure exacte du partage des responsabilités variera donc d’une entreprise à l’autre, et variera certainement également dans le temps. Le point central ici n’est pas de discuter de ces éléments topologiques (c’est un sujet à part entière, qui dépasse largement le cadre de cet article) mais de souligner qu’il s’agit bel et bien d’un projet d’intégration. En conséquence, l’organisation associée sera similaire à celle de n’importe quel autre projet d’intégration.

 

Anatomie d’un connecteur Graph et enregistrement

Un connecteur est fondamentalement assez simple. Il est composé des 3 à 4 éléments suivants :

  • Une App registration dans Entra ID, à laquelle on accorde des droits pour autoriser le connecteur à interagir avec l’API Graph;
  • Du code custom (quelle que soit sa forme), qui se prévaut de cette identité et interagit avec l’API Graph. Le code a pour responsabilité d’extraire les données du système externe, les préparer et les charger dans Graph;
  • Une connexion Graph, qui peut être initiée directement par le code custom, et au travers de laquelle ce code va pouvoir injecter des données;
  • Optionnellement un connecteur Graph, qui sert de surface de gestion pour les administrateurs du tenant.

Anatomie d'un connecteur Graph

Connecteur vs connexion vs code

Dans la littérature actuellement disponible, les termes connecteur et connexion sont souvent utilisés de manière interchangeable alors que je les ai séparés au paragraphe précédent.

En effet, ce mélange est en réalité un très léger abus de langage :

  • Un connecteur est une simple abstraction. Il est utile uniquement à des fins de gestion d’une connexion pour les admins d’un tenant en offrant une interface de configuration et de contrôle (dans le portail d’administration Teams). Il est possible de packager un connecteur sous forme d’application Teams mais c’est facultatif.
    Ci-dessous une illustration : le connecteur permet principalement de configurer la visibilité de la connexion associée et de l’activer/désactiver :

Interface de gestion d'un connecteur graph dans le portail d'admin Teams

  • Une connexion est le composant qui va réellement créer un espace d’ingestion des données externes dans Graph. Elle définit par exemple le format des données (schéma) qui vont être ingérées et comment elles doivent être présentées (types de résultats)
  • Pour encore affiner la compréhension des termes, le programme ou code custom qui va effectivement interagir avec les API Graph ne fait pas partie de la connexion (ni du connecteur) à proprement parler. Il doit être considéré comme un simple agent ou un client de la connexion.

NOTE : le schéma évoqué plus haut est constitué de :

  • La liste des métadonnées : des propriétés qui devront être associées à chaque item envoyé dans Graph.
  • La forme du contenu (string brute ou Html)

 

Focus sur l’architecture technique sous jacente (= le code) d’un connecteur Graph

La structure de l’application qui va effectivement implémenter la logique d’interaction avec Graph (c’est-à-dire le custom code évoqué plus haut) peut varier largement, s’adaptant à la complexité des données et aux exigences de l’entreprise. Fondamentalement, elle encapsule la logique d’interaction avec l’API Graph pour :

  • Créer (ou supprimer) la connexion ;
  • Pousser des données conformément à un schéma spécifié.

Au plus simple, un script PowerShell peut suffire pour des tâches d’intégration de base, exploitant l’accessibilité et la simplicité de la ligne de commande pour effectuer des synchronisations périodiques de données. À l’opposé, pour des solutions à fort volume de données et/ou plus réactives, une application serverless orientée événements utilisant par exemple des Azure Functions peut être plus adaptée.

 

Critères de conception

Pour déterminer l’architecture la plus adaptée, il convient de se poser les questions suivantes :

  • Quelle est la fréquence de mise à jour des données requise ?
  • Quel est le volume de données à gérer ?
  • Comment identifier les données éligibles à l’injection dans Graph? A-t-on besoin d’un mécanisme de Change Data Capture?
  • Comment traiter les erreurs d’intégration des données dans Graph?
  • A-t-on besoin d’une haute disponibilité ou d’une scalabilité automatique ?
  • Est-ce que la solution doit être facilement maintenable par les équipes IT existantes ?

Etc. Les réponses à ces questions guideront le choix entre une solution simple ou évoluée.

Au passage, toutes ces questions rappellent évidemment très fortement les questions que l’on se pose classiquement dans un projet d’Intégration. Et pour cause : comme expliqué plus haut, il s’agit d’un projet d’intégration comme un autre!

 

Limitations techniques à gérer

Enfin, il convient de prendre en compte certaines limitations de l’API, qu’il faut donc savoir gérer proprement:

  • 25 item maximum par seconde;
  • 25 actions maximum par seconde et par connexion;

Des mécanismes de throttling adaptés peuvent donc s’imposer en fonction du volume des données à injecter et de la fréquence de mise à jour de ces données.

En complément, pour un connecteur vraiment résilient, une stratégie de retry éventuellement associée à un découplage entre les fonctions d’extraction et de chargement peuvent s’avérer nécessaires.

 

Pour qui ces bonnes données??

Le contrôle de l’accès aux données injectées via un connecteur Graph pose évidemment de grosses questions. Le défi semble a priori encore plus important lorsque le système externe, source de ces données, ne s’appuie pas sur EntraID pour gérer l’accès à ses données : comment faire correspondre les modèles de sécurité de Graph et dudit système? Comment s’assurer qu’un utilisateur n’ait pas accès dans Graph à une donnée qui devrait lui être interdite?

Heureusement, il est possible de « synchroniser » les permissions. Cela passe par 2 mécanismes complémentaires :

  • Des ACL (Access Control List) : chaque donnée injectée est associée avec une ACL décrivant quel utilisateur ou quel groupe a accès à cette donnée, qu’il s’agisse d’un groupe AD ou d’un groupe ou non (cf point suivant)
  • Si le système externe ne s’appuie pas sur des groupes AD, il est également possible de créer des groupes externes dans Graph, ce qui revient à peu près à répliquer le modèle de permissions du système externe dans Graph. Ces groupes externes pourront ensuite être référencés directement dans les ACL, et des membres pourront leur être affectés.

 

Résultat – et limitation fonctionnelle (pour le moment) des connecteurs Graph

Un dernier point qui mérite d’être souligné : à l’heure de l’écriture de ces lignes, Copilot supporte uniquement des prompts simples qui contiennent explicitement le titre de l’item injecté au travers du connecteur.

Par exemple, imaginons que l’on injecte les informations de sociétés partenaires, et que le titre complet de chacun des item (c’est-à-dire chacune desdites sociétés) soit le nom de l’entreprise. Les prompts à Copilot devront alors porter explicitement sur le nom de l’entreprise et rester simple :

Exemple de recherche optimale de données issues d'un connecteur Graph

Dans le cas contraire, les résultats seront aléatoires. Je demande dans l’exemple ci-dessous des informations un peu plus avancées, contenues non pas dans le titre mais dans le corps de l’item. Dans ce cas parfois Copilot trouvera les informations demandées, comme ci-dessous :

Exemple (heureux) de recherche non optimale

Et parfois non :

Exemple (malheureux) de recherche non optimale
Vous allez dire « tout ça pour ça », et c’est vrai que ça peut être décevant de prime abord. Mais cette limitation est connue et Microsoft travaille très activement à améliorer l’exploitabilité des données issues des connecteurs. Il est d’ailleurs possible qu’au moment de la publication de cet article, cette limitation soit déjà levée.

 

En synthèse

La création d’un connecteur Graph est techniquement un jeu d’enfant : les APIs et SDKs mis à disposition par Microsoft permettent d’abaisser la complexité de mise en oeuvre.
En revanche, il est important de garder en tête qu’il s’agit d’un projet d’intégration à part entière. Il convient donc de le mener avec toute la rigueur qui s’impose pour ce genre de projet.