Créer un connecteur ChatGPT avec Elasticsearch pour interroger les issues GitHub

Découvrez comment créer un connecteur ChatGPT personnalisé et déployer un serveur MCP Elasticsearch qui utilise la rechercher hybride pour interroger les issues GitHub internes.

Agent Builder est désormais disponible en aperçu technique. Commencez avec un essai Elastic Cloud et consultez la documentation d’Agent Builder ici.

OpenAI a récemment annoncé la fonctionnalité connecteurs personnalisés pour ChatGPT sur les plans Pro/Business/Entreprise et Edu. En plus des connecteurs prêts à l'emploi pour accéder aux données sur Gmail, GitHub, Dropbox, etc., il est possible de créer des connecteurs personnalisés en utilisant des serveurs MCP.

Les connecteurs personnalisés vous donnent la possibilité de combiner vos connecteurs ChatGPT existants avec des sources de données supplémentaires comme Elasticsearch pour obtenir des réponses complètes.

Dans cet article, nous allons créer un serveur MCP qui connecte ChatGPT à un index Elasticsearch contenant des informations sur les issues GitHub internes et les requêtes pull. Cela permet de répondre aux requêtes en langage naturel en utilisant vos données Elasticsearch.

Nous déploierons le serveur MCP en utilisant FastMCP sur Google Colab avec ngrok pour obtenir une URL publique à laquelle ChatGPT peut se connecter, éliminant ainsi le besoin d'une configuration complexe de l'infrastructure.

Pour un aperçu complet de MCP et de son écosystème, reportez-vous à la section État actuel du MCP.

Prérequis

Avant de commencer, vous aurez besoin des éléments suivants :

  • Cluster Elasticsearch (8.X ou supérieur)
  • Clé API Elasticsearch avec accès en lecture à votre index
  • Compte Google (pour Google Colab)
  • Compte ngrok (fonctionne avec le niveau gratuit)
  • Compte ChatGPT avec un forfait Pro/Entreprise/Business ou Edu

Comprendre les exigences du connecteur ChatGPT MCP

Les connecteurs ChatGPT MCP nécessitent l'implémentation de deux outils : search et fetch. Pour plus de détails, consultez OpenAI Docs.

Outil de recherche

Renvoie une liste de résultats pertinents depuis votre index Elasticsearch en fonction d'une requête utilisateur.

Ce qu'il reçoit :

  • Une chaîne unique contenant la requête en langage naturel de l'utilisateur.
  • Exemple : "Recherchez les issues liées à la migration d'Elasticsearch."

Ce qu'il renvoie : 

  • Un objet avec une clé result contenant un tableau d'objets de résultats. Chaque résultat inclut :
    • id - Identifiant de document unique
    • title - Titre de l'issue ou de la PR
    • url - Lien vers l'issue/la PR

Dans notre implémentation :

Outil de récupération

Récupère le contenu complet d'un document spécifique.

Ce qu'il reçoit :

  • Chaîne unique contenant l'ID du document Elasticsearch extrait du résultat de la recherche
  • Exemple : "Donnez-moi les détails de la PR-578."

Ce qu'il renvoie :

  • Objet de document complet contenant :
    • id - Identifiant de document unique
    • title - Titre de l'issue ou de la PR
    • text - Description complète du problème/PR et détails
    • url - Lien vers l'issue/la PR
    • type - Type de document (issue, pull_request)
    • status - Statut actuel (ouvert, en cours, résolu)
    • priority - Niveau de priorité (faible, moyen, élevé, critique)
    • assignee - Personne en charge de l'issue/la PR
    • created_date - Date de création
    • resolved_date - Date de résolution (le cas échéant)
    • labels - Balises associées au document
    • related_pr - ID de la requête pull associée

Remarque : Cet exemple utilise une structure plate où tous les champs se trouvent au niveau racine. Les exigences d'OpenAI sont flexibles et prennent également en charge les objets de métadonnées imbriqués.

Issues GitHub et ensemble de données de PR

Pour ce tutoriel, nous allons utiliser un ensemble de données interne de GitHub contenant des issues et des requêtes pull. Ceci représente un scénario dans lequel vous souhaitez interroger des données privées et internes via ChatGPT.

L'ensemble de données est accessible ici. Et nous mettrons à jour l'index des données à l'aide de l'API Bulk.

Cet ensemble de données comprend :

  • Issues avec description, état, niveau de priorité et personnes en charge
  • Requêtes pull avec modifications de code, révisions et informations de déploiement
  • Relations entre les issues et les PR (p. ex., la PR-578 corrige l'ISSUE-1889)
  • Étiquettes, dates et autres métadonnées

Mappings de l'index

L'index utilise les mappings suivants pour prendre en charge la recherche hybride avec ELSER. Le champ text_semantic est utilisé pour la recherche sémantique, tandis que les autres champs permettent la recherche par mot-clé.

Créer le serveur MCP

Notre serveur MCP implémente deux outils conformes aux spécifications d'OpenAI qui utilisent la recherche hybride pour combiner la sémantique et la correspondance de texte pour de meilleurs résultats.

Outil de recherche

Utilise la recherche hybride avec RRF (fusion des rangs réciproques) qui combine la recherche sémantique avec la correspondance de texte :

Points clés :

  • Recherche hybride avec RRF : combine la recherche sémantique (ELSER) et la recherche de texte (BM25) pour de meilleurs résultats.
  • Requête à correspondance multiple : Recherches sur plusieurs champs avec boosting (title^3, text^2, assignee^2). Le symbole caret (^) multiplie les scores de pertinence, en privilégiant les correspondances dans les titres plutôt que dans le contenu.
  • Fuzzy matching (correspondance approximative) : fuzziness: AUTO gère les fautes de frappe et d'orthographe en autorisant les correspondances approximatives.
  • Ajustement des paramètres RRF :
    • rank_window_size: 50 - Spécifie le nombre de résultats principaux de chaque récupérateur (sémantique et texte) pris en compte avant la fusion.
    • rank_constant: 60 - Cette valeur détermine l'influence des documents dans chaque ensemble de résultats sur le classement final.
  • Ne renvoie que les champs obligatoires : id, title, url conformément à la spécification d'OpenAI, et évite d'exposer inutilement des champs supplémentaires.

Outil de récupération

Récupère les détails du document par ID de document, s'il existe :

Points clés :

  • Recherche par champ d'ID de document : utilise une requête de terme sur le champ personnalisé id
  • Renvoie le document complet : inclut le champ complet text avec tout le contenu
  • Structure plate : tous les champs au niveau racine, correspondant à la structure de document d'Elasticsearch.

Déployer sur Google Colab

Nous utiliserons Google Colab pour exécuter notre serveur MCP et ngrok pour l'exposer publiquement afin que ChatGPT puisse s'y connecter.

Étape 1 : Ouvrir le notebook Google Colab

Accédez à notre notebook préconfiguré Elasticsearch MCP pour ChatGPT.

Étape 2 : Configurer vos identifiants

Vous aurez besoin de trois informations :

  • URL Elasticsearch : l'URL de votre cluster Elasticsearch.
  • Clé API Elasticsearch : clé API avec accès en lecture à votre index.
  • Jeton d'authentification ngrok : jeton gratuit fourni par ngrok. Nous utiliserons ngrok pour exposer l'URL du MCP à l'Internet afin que ChatGPT puisse s'y connecter.

Obtenir votre token ngrok

  1. Créez un compte gratuit sur ngrok
  2. Accédez à votre tableau de bord ngrok
  3. Copier votre jeton d'authentification

Ajouter des secrets à Google Colab

Dans le notebook Google Colab :

  1. Cliquez sur l'icône clé dans la barre latérale gauche pour ouvrir Secrets.
  2. Ajoutez ces trois secrets :

3. Activer l'accès aux notebooks pour chaque secret

Étape 3 : Exécuter le notebook

  1. Cliquez sur Runtime (Exécution) puis sur Run all (Tout exécuter) pour exécuter toutes les cellules
  2. Attendez que le serveur démarre (environ 30 secondes)
  3. Recherchez l'URL publique de ngrok dans la sortie

4. La sortie affichera quelque chose comme :

Se connecter à ChatGPT

Nous allons maintenant connecter le serveur MCP à votre compte ChatGPT.

  1. Ouvrez ChatGPT et accédez aux Paramètres.
  2. Accédez à Connectors (Connecteurs).Si vous utilisez un compte Pro, vous devez activer le mode développeur dans les connecteurs.

Si vous utilisez ChatGPT Enterprise ou Business, vous devez publier le connecteur sur votre espace de travail.

3. Cliquez sur Create (Créer).

Remarque : Dans les espaces de travail Business, Entreprise et Edu, seuls les propriétaires, les administrateurs et les utilisateurs ayant activé l'option correspondante (pour Entreprise/Edu) peuvent ajouter des connecteurs personnalisés. Les utilisateurs ayant un rôle de membre standard ne peuvent pas ajouter de connecteurs personnalisés eux-mêmes.

Une fois qu'un connecteur est ajouté et activé par un propriétaire ou un utilisateur administrateur, il devient accessible à tous les membres de l'espace de travail.

4. Saisissez les informations requises et votre URL ngrok se terminant par /sse/. Notez le "/" après "sse". Cela ne fonctionnera pas sans cet élément :

  • Nom : Elasticsearch MCP
  • Description : MCP personnalisé pour la recherche et la récupération d'informations GitHub internes.

5. Appuyez sur Créer pour enregistrer le MCP personnalisé.

La connexion est instantanée si votre serveur est en cours d'exécution. Aucune authentification supplémentaire n'est requise, car la clé API Elasticsearch est configurée sur votre serveur.

Tester le serveur MCP

Avant de poser des questions, vous devez sélectionner le connecteur que ChatGPT doit utiliser.

Prompt 1 : Recherchez les issues

Demandez : "Recherchez les issues liées à la migration d'Elasticsearch", puis confirmez l'appel à l'outil d'action.

ChatGPT appellera l'outil search avec votre requête. Vous pouvez voir qu'il recherche des outils disponibles et se prépare à appeler l'outil Elasticsearch, et confirme auprès de l'utilisateur avant de prendre toute action sur l'outil.

Demande d'appel d'outil :

Réponse de l'outil :

ChatGPT traite les résultats et les présente dans un format conversationnel naturel.

En coulisses

1. Appels de ChatGPT search(“Elasticsearch migration”)

2. Elasticsearch effectue une recherche hybride.

  • La recherche sémantique comprend des concepts tels que "mise à niveau" et "compatibilité des versions".
  • La recherche de texte trouve des correspondances exactes pour "Elasticsearch" et "migration".
  • RRF combine et classe les résultats des deux approches

3. Renvoie les 10 événements les plus pertinents avec id, title, url

4. ChatGPT identifie "ISSUE-1712: migrate from Elasticsearch 7.x to 8.x" (Migrer d'Elasticsearch 7.x vers 8.x) comme résultat le plus pertinent.

Prompt 2 : Obtenez tous les détails

Demandez : "Donnez-moi les détails de l'ISSUE-1889"

ChatGPT comprend que vous souhaitez obtenir des informations détaillées sur un problème spécifique, appelle l'outil fetch et confirme auprès de l'utilisateur avant d'entreprendre des actions sur l'outil.

Demande d'appel d'outil :

Réponse de l'outil :

ChatGPT synthétise les informations et les présente clairement.

En coulisses

Prompt : "Donnez-moi les détails de l'ISSUE-1889"

  1. Appels ChatGPT fetch(“ISSUE-1889”)
  2. Elasticsearch extrait le document complet
  3. Retourne un document complet avec tous les champs au niveau racine
  4. ChatGPT synthétise les informations et répond avec les citations appropriées.

Conclusion

Dans cet article, nous avons créé un serveur MCP personnalisé qui connecte ChatGPT à Elasticsearch à l'aide d'outils MCP de recherche et de récupération dédiés, permettant de lancer des requêtes en langage naturel sur des données privées.

Ce modèle MCP fonctionne pour n'importe quel index Elasticsearch, documentation, produit, log ou toute autre donnée que vous souhaitez interroger en langage naturel.

Pour aller plus loin

Prêt à créer des expériences de recherche d'exception ?

Une recherche suffisamment avancée ne se fait pas avec les efforts d'une seule personne. Elasticsearch est alimenté par des data scientists, des ML ops, des ingénieurs et bien d'autres qui sont tout aussi passionnés par la recherche que vous. Mettons-nous en relation et travaillons ensemble pour construire l'expérience de recherche magique qui vous permettra d'obtenir les résultats que vous souhaitez.

Jugez-en par vous-même