Améliorer les résultats de recherche grâce au réglage de la recherche

Un modèle de recherche ajusté peut vous fournir des résultats de meilleure qualité que le modèle de recherche de base.

Le réglage de la recherche est particulièrement utile si vous avez des requêtes propres à un secteur ou à une entreprise qui sont moins bien traitées par les LLM généraux. Il peut être utilisé pour entraîner davantage le modèle de recherche.

Limites

Vous ne pouvez optimiser la recherche que pour les data stores non structurés.

À propos des données d'entraînement

Pour régler un modèle de recherche, vous devez commencer par rassembler des données d'entraînement.

Les données d'entraînement doivent contenir les requêtes que vous prévoyez que vos utilisateurs finaux poseront et des extraits de texte de 250 à 500 mots contenant les informations pertinentes nécessaires pour répondre aux requêtes. Une requête peut être associée à plusieurs extraits, à condition que chacun d'eux contienne des informations qui répondent à la requête.

Les données d'entraînement doivent également contenir des extraits de texte qui ne sont pas associés à des requêtes, mais qui sont par ailleurs similaires aux réponses en termes de style et de longueur. Ces extraits sans requêtes associées fournissent des exemples négatifs aléatoires pour ajuster le modèle. Google vous recommande d'en fournir au moins 10 000.

Voici quelques termes pour décrire les données d'entraînement que vous devrez fournir:

  • Requêtes d'entraînement:requêtes que vous prévoyez que vos utilisateurs finaux poseront. Veillez à vous concentrer sur les requêtes contenant une terminologie spécifique au domaine ou à l'entreprise.

    Fournissez-en au moins 100.

  • Segments extraits:les extraits (généralement plusieurs paragraphes) doivent être repris textuellement dans les documents du data store. L'ensemble des documents du data store est appelé "corpus".

    Vous devez fournir deux types de segments d'extraction:

    • Segments contenant les informations pertinentes nécessaires pour répondre aux requêtes d'entraînement. Il s'agit de segments qui correspondent aux requêtes.

    • Segments qui ne sont associés à aucune requête d'entraînement. Ces segments sont utilisés comme exemples négatifs aléatoires lors du réglage du modèle.

    Une ou deux phrases ne sont pas suffisamment longues pour être un segment d'extraction. Le segment doit contenir suffisamment de contexte pour l'entraînement. Par exemple, en réponse à une requête comme "qui a fondé Google ?", un extrait court comme "Larry Page" est insuffisant. Pour obtenir des exemples de segments suffisamment longs, consultez le tableau suivant.

    Fournissez au moins un segment extractif par requête et au moins 10 000 segments extractifs supplémentaires.

  • Scores de pertinence:les scores de pertinence sont des entiers non négatifs qui évaluent la pertinence du segment d'extraction par rapport à la requête. Vous devez fournir une valeur de score pour chaque paire de requête et de segment d'extraction. Un score de 0 signifie que le segment d'extraction n'est pas du tout pertinent pour la requête. Un score supérieur à zéro indique une certaine pertinence. Pour une évaluation simple, Google recommande d'attribuer un score de 1 à tous les segments pertinents et de 0 aux segments non pertinents. Si vous souhaitez classer la pertinence, vous pouvez attribuer des scores de pertinence de 0 à 10 (par exemple), avec 10 pour les segments les plus pertinents et 0 pour les segments qui ne sont pas du tout pertinents.

    Fournissez au moins 100 scores pertinents et, éventuellement, des scores non pertinents supplémentaires.

Exemples de paires de requêtes et de segments extractifs

Le tableau suivant présente quelques exemples de paires de requêtes et de segments d'extraction. Ces exemples généraux sont tirés de Wikipédia. Toutefois, pour un réglage utile, vous devez fournir des documents issus d'ensembles de données propriétaires contenant des informations spécifiques à votre entreprise et moins facilement disponibles sur le Web.

La dernière paire de ce tableau est un exemple de paire avec un score nul, où la réponse n'est pas pertinente par rapport à la requête.

Requête de formation Segment extractif Score
qui a fondé Google ? Google a été fondé le 4 septembre 1998 par les informaticiens américains Larry Page et Sergey Brin alors qu'ils étaient étudiants en doctorat à l'université de Stanford en Californie.Ensemble, ils détiennent environ 14% des actions cotées en bourse et contrôlent 56% du droit de vote des actionnaires grâce à des actions à droit de vote multiple. La société est devenue publique via une offre publique initiale (IPO) en 2004. En 2015, Google a été réorganisé en tant que filiale à 100 % d'Alphabet Inc. Google est la plus grande filiale d'Alphabet et une société holding pour les propriétés et les intérêts Internet d'Alphabet. Sundar Pichai a été nommé PDG de Google le 24 octobre 2015, en remplacement de Larry Page, qui est devenu PDG d'Alphabet. Le 3 décembre 2019, Pichai est également devenu PDG d'Alphabet. [...] Dans la liste des marques les plus valorisées, Google se classe deuxième selon Forbes et quatrième selon Interbrand. 1
Où le sang est-il pompé après avoir quitté le ventricule droit ? Le sang oxygéné quitte les poumons via les veines pulmonaires, qui le renvoient dans la partie gauche du cœur, complétant ainsi le cycle pulmonaire. Ce sang pénètre ensuite dans l'oreillette gauche, qui le pompe à travers la valve mitrale dans le ventricule gauche. À partir du ventricule gauche, le sang passe par la valve aortique et pénètre dans l'aorte. Le sang est ensuite distribué dans le corps via la circulation systémique avant de revenir à la circulation pulmonaire. Artères Article principal: Artère pulmonaire Du ventricule droit, le sang est pompé par la valve pulmonaire semi-lunaire dans les artères pulmonaires principales gauche et droite (une pour chaque poumon), qui se ramifient en artères pulmonaires plus petites qui se répandent dans les poumons. [...] Le shunt cardiaque est une connexion anormale entre des parties du cœur qui entraîne un flux sanguin qui contourne les poumons. 1
où se trouve le panthéon du bowling ? Le World Bowling Writers ( WBW ) International Bowling Hall of Fame a été créé en 1993 et se trouve dans le International Bowling Museum and Hall of Fame , sur le campus International Bowling à Arlington , au Texas. Histoire Le musée et temple de la renommée du bowling international se trouvait au 11 Stadium Plaza, à Saint-Louis (Missouri, États-Unis), et partageait le même bâtiment que le musée du temple de la renommée des Cardinals de Saint-Louis jusqu'au 8 novembre 2008. Il a déménagé à Arlington et a rouvert ses portes début 2010. En 2012, la WBW a fusionné avec l'International Bowling Media Association. Après la fusion, les membres du Temple de la renommée de la WBW ont rejoint le Temple de la renommée de la IBMA Luby. Les membres du conseil d'administration de la World Bowling Writers, qui ont formé le conseil d'administration du Temple de la renommée, ont voté pour les hommes et les femmes qui ont reçu le plus de votes. 1
Pourquoi le ciel est-il bleu ? Un programme "Hello, World!" est généralement un programme informatique simple qui affiche à l'écran (souvent la console) un message semblable à "Hello, World!", tout en ignorant toute entrée utilisateur. Il s'agit d'un petit extrait de code dans la plupart des langages de programmation à usage général. Ce programme est utilisé pour illustrer la syntaxe de base d'un langage. Un programme "Hello, World!" est souvent le premier écrit par un étudiant d'un nouveau langage de programmation, mais un tel programme peut également être utilisé comme vérification pour s'assurer que le logiciel informatique destiné à compiler ou à exécuter le code source est correctement installé et que son opérateur comprend comment l'utiliser. [...] La version en langage C a été précédée par la propre introduction de Kernighan au langage B en 1972, où la première version connue du programme se trouve dans un exemple utilisé pour illustrer les variables externes. 0

À propos des tests

Après l'entraînement, la recherche ajustée est testée pour déterminer si l'ajustement a amélioré les résultats. Vous pouvez fournir explicitement les requêtes que vous souhaitez tester. Si vous ne fournissez pas de requêtes de test, Vertex AI Search utilise 20% des requêtes d'entraînement comme requêtes de test.

Fichiers d'entraînement

Les données d'entraînement doivent être importées dans trois (ou quatre) fichiers spécifiques:

Les trois fichiers d'entraînement (fichier de corpus, fichier de requête et fichier d'étiquettes d'entraînement) et le fichier d'étiquettes de test (facultatif) doivent être hébergés dans Cloud Storage. Les chemins d'accès aux fichiers sont définis par des champs dans l'appel trainCustomMethod.

Fichier du corpus

Le fichier du corpus contient des segments d'extraction : des segments contenant des informations permettant de répondre aux requêtes du fichier de requêtes et de nombreux segments supplémentaires à utiliser comme exemples négatifs aléatoires lors du réglage du modèle. Vous devez disposer d'au moins 100 segments contenant des réponses aux requêtes. Plusieurs segments peuvent répondre aux requêtes. Vous devez également disposer d'au moins 10 000 segments aléatoires.

Si les documents de votre data store contiennent moins de 500 mots, vous pouvez utiliser des documents entiers comme segments. Sinon, créez de façon programmatique des segments aléatoires de 250 à 500 mots à partir des documents de votre data store et ajoutez-les au fichier du corpus.

Le fichier du corpus est un fichier JSONL (JSON Lines) dans lequel chaque ligne contient les champs _id et text avec des valeurs de chaîne. Exemple :

  {"_id": "doc1", "text": "Google was founded on September 4, 1998, by American computer scientists Larry Page and Sergey Brin while they were PhD students at Stanford University in California. Together they own about 14% of its publicly listed shares and control 56% of its stockholder voting power through super-voting stock. The company went public via an initial public offering (IPO) in 2004. In 2015, Google was reorganized as a wholly owned subsidiary of Alphabet Inc. Google is Alphabet's largest subsidiary and is a holding company for Alphabet's internet properties and interests. Sundar Pichai was appointed CEO of Google on October 24, 2015, replacing Larry Page, who became the CEO of Alphabet. On December 3, 2019, Pichai also became the CEO of Alphabet. [...] On the list of most valuable brands, Google is 105 ranked second by Forbes and fourth by Interbrand."}
  {"_id": "doc2", "text": "Oxygenated blood leaves the lungs through pulmonary veins, which return it to the left part of the heart, completing the pulmonary cycle. This blood then enters the left atrium, which pumps it through the mitral valve into the left ventricle. From the left ventricle, the blood passes through the aortic valve to the aorta. The blood is then distributed to the body through the systemic circulation before returning again to the pulmonary circulation. Arteries Main article: Pulmonary artery From the right ventricle, blood is pumped through the semilunar pulmonary valve into the left and right main pulmonary artery (one for each lung), which branch into smaller pulmonary arteries that spread throughout the lungs. [...] Cardiac shunt is an unnatural connection between parts of the heart that leads to blood flow that bypasses the lungs."}
  {"_id": "doc3", "text": "The World Bowling Writers ( WBW ) International Bowling Hall of Fame was established in 1993 and is located in the International Bowling Museum and Hall of Fame , on the International Bowling Campus in Arlington , Texas. History The International Bowling Museum and Hall of Fame was located at 11 Stadium Plaza, St. Louis, Missouri, USA, and shared the same building with the St. Louis Cardinals Hall of Fame Museum, until November 8, 2008. It moved to Arlington and reopened in early 2010. In 2012, the WBW was merged with the International Bowling Media Association. After the merger, the WBW Hall of Fame inductees became part of the IBMA Luby Hall of Fame.  officers of the World Bowling Writers, which formed the Hall's Board.][...] The man and woman who receive the most votes are elected."}
  {"_id": "doc4", "text": "A \"Hello, World!\" program is generally a simple computer program which outputs (or displays) to the screen (often the console) a message similar to "Hello, World!" while ignoring any user input. A small piece of code in most general-purpose programming languages, this program is used to illustrate a language's basic syntax. A "Hello, World!" program is often the first written by a student of a new programming language, but such a program can also be used as a check to ensure that the computer software intended to compile or run source code is correctly installed, and that its operator understands how to use it.  [...] The C-language version was preceded by Kernighan's own 1972 A Tutorial Introduction to the Language B, where the first known version of the program is found in an example used to illustrate external variables."}

La taille maximale du fichier est de 500 000 lignes.

Fichier de requête

Le fichier de requêtes contient les exemples de requêtes qui seront utilisés pour régler le modèle. Chaque requête doit comporter un ou plusieurs segments d'extraction correspondants dans le fichier du corpus. Vous devez fournir au moins 100 requêtes de correspondance positive. Vous pouvez également fournir des requêtes non pertinentes: il s'agit de requêtes qui correspondent à des segments extractifs avec un score de pertinence de zéro.

Le fichier de requête est au format JSONL et contient les mêmes champs que le fichier Corpus.

Exemple :

  {"_id": "query1", "text": "who founded Google?"}
  {"_id": "query2", "text": "where is blood pumped after it leaves the right ventricle?"}
  {"_id": "query3", "text": "where is the bowling hall of fame located?"}
  {"_id": "query4", "text": "why is the sky blue?"}

Le nombre maximal de requêtes autorisées dans le fichier est de 40 000.

Libellés d'entraînement

Le fichier de libellés d'entraînement relie les requêtes aux segments d'extraction et attribue un score à chaque paire de requêtes et de segments.

Si le fichier d'étiquettes de test n'est pas présent, 20% des requêtes du fichier d'étiquettes d'entraînement sont réservées à l'évaluation du modèle affiné après l'entraînement.

Le fichier contient l'ID d'une requête et l'ID de son segment extractif correspondant (ou non) ainsi qu'un score de pertinence du segment par rapport à la requête. Il doit y avoir au moins une ligne par requête. Si une requête est répondue par deux segments, il y a deux lignes pour cette requête. Score est une valeur entière non négative. Tout score supérieur à zéro indique que le document est lié à la requête. Plus le nombre est élevé, plus le niveau de pertinence est élevé. Si le score est omis, la valeur par défaut est 1.

Le fichier de libellés d'entraînement est un fichier TSV (valeurs séparées par des tabulations) avec un en-tête. Le fichier doit contenir les colonnes query-id, corpus-id et score. query-id est une chaîne qui correspond à la clé _id du fichier de requête, et corpus-id est une chaîne correspondant à _id dans le fichier Corpus.

Exemple :

query-id    corpus-id   score
query1  doc1    1
query2  doc2    1
query3  doc3    1
query3  doc9    1
query4  doc4    0

Le fichier d'étiquettes d'entraînement doit inclure au moins 100 ID de requête uniques. Le nombre d'ID de requête dans le fichier d'étiquettes d'entraînement combiné au nombre de requêtes dans le fichier d'étiquettes de test doit être inférieur à 500 000.

Étiquettes de test

Comme le fichier de libellés d'entraînement, ce fichier facultatif contient les ID de la requête et du segment extractif, ainsi que les scores de pertinence. Il contient moins de requêtes et des requêtes différentes que dans le fichier de libellés d'entraînement. Le cas échéant, les paires de requêtes et de segments d'extraction du fichier sont utilisées pour évaluer le réglage. Si le fichier d'étiquettes de test n'est pas présent, les paires de segments de requête et d'extraction du fichier d'étiquettes d'entraînement sont utilisées pour l'évaluation.

Ce fichier a le même format que le fichier d'étiquettes d'entraînement.

Exemple :

query-id    corpus-id   score
query200    doc200  1
query201    doc201  1
query202    doc202  1

Bien que le fichier d'étiquettes de test soit facultatif, s'il est fourni, il doit contenir au moins trois ID de requête uniques.

Avant de commencer

Activez les fonctionnalités de l'édition Enterprise pour l'application.

Pour régler un modèle de recherche avec vos propres données d'entraînement, procédez comme suit.

Console

Pour régler un modèle à l'aide de la console Google Cloud, procédez comme suit:

  1. Préparez vos données d'entraînement et, éventuellement, vos fichiers de données de test. Utilisez les formats décrits dans la section Fichiers d'entraînement.

  2. Importez les fichiers dans Cloud Storage.

  3. Dans la console Google Cloud, accédez à la page Agent Builder.

    Agent Builder

  4. Sur la page Applications, cliquez sur le nom de l'application pour laquelle vous souhaitez créer un modèle entraîné.

  5. Dans le menu de navigation, cliquez sur Configurations.

  6. Cliquez sur l'onglet Réglages.

  7. Cliquez sur Régler le modèle de base.

  8. Spécifiez les fichiers de corpus, de requête, d'entraînement et, éventuellement, de test que vous avez préparés aux étapes 1 et 2 précédentes.

  9. Cliquez sur Commencer le réglage.

  10. Actualisez la page pour afficher l'état dans le tableau Activité de réglage récente de l'onglet Réglage.

REST

Pour utiliser la méthode trainCustomModel afin d'ajuster un data store, procédez comme suit:

  1. Préparez les fichiers de vos données d'entraînement (et éventuellement de vos données de test). Utilisez les formats décrits dans la section Fichiers d'entraînement.

  2. Placez les fichiers dans un bucket Cloud Storage.

  3. Importez les fichiers du bucket Cloud Storage dans Vertex AI Search en exécutant la commande curl suivante:

    curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    "https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/dataStores/DATA_STORE_ID:trainCustomModel" \
    -d '{
    "gcsTrainingInput": {
     "corpusDataPath": "CORPUS_JSONL_GCS_PATH",
     "queryDataPath": "QUERY_JSONL_GCS_PATH",
     "trainDataPath": "TRAIN_TSV_GCS_PATH",
     "testDataPath": "TEST_TSV_GCS_PATH"
    },
    "modelType": "search-tuning"
    }'
    

    Remplacez les éléments suivants :

    • PROJECT_ID : ID de votre projet Google Cloud

    • DATA_STORE_ID: ID du data store que vous souhaitez optimiser.

    • CORPUS_JSONL_GCS_PATH: chemin d'accès au fichier JSONL du corpus dans Cloud Storage (par exemple, gs://my-bucket/corpus.jsonl).

    • QUERY_JSONL_GCS_PATH: chemin d'accès au fichier JSONL de requête dans Cloud Storage (par exemple, gs://my-bucket/query.jsonl).

    • TRAIN_TSV_GCS_PATH: chemin d'accès au fichier TSV des libellés d'entraînement dans Cloud Storage (par exemple, gs://my-bucket/train.tsv).

    • TEST_TSV_GCS_PATH: champ facultatif permettant de spécifier le chemin d'accès Cloud Storage de votre fichier TSV des libellés de test (par exemple, gs://my-bucket/test.tsv). Si vous ne disposez pas d'un fichier de libellés de test, supprimez le champ testDataPath ou laissez-le vide.

    Pour en savoir plus sur cette méthode, consultez trainCustomModel.

    Le réglage commence automatiquement une fois les fichiers de données importés.

    Cliquez ici pour voir un exemple de commande curl et de réponse.

    curl -X POST
    -H "Authorization: Bearer $(gcloud auth print-access-token)"
    -H "Content-Type: application/json"
    "https://discoveryengine.googleapis.com/v1/projects/12345/locations/global/collections/default_collection/dataStores/my-data-store_4321:trainCustomModel"
    -d '{
    "dataStore":
    "projects/12345/locations/global/collections/default_collection/dataStores/my-data-store_4321",
    "gcsTrainingInput": {
    "corpusDataPath": "gs://my-bucket/corpus.jsonl",
    "queryDataPath": "gs://my-bucket/query.jsonl",
    "trainDataPath": "gs://my-bucket/train.tsv"
    },
    "modelType": "search-tuning"
    }
    {
      "name": "projects/12345/locations/global/collections/default_collection/dataStores/my-data-store_4321/operations/train-custom-model-6071430366161939774",
      "metadata": {
        "@type": "type.googleapis.com/google.cloud.discoveryengine.v1.TrainCustomModelMetadata"
      },
      "response": {
        "@type": "type.googleapis.com/google.cloud.discoveryengine.v1.TrainCustomModelResponse",
        "modelStatus": "in-progress"
      }
    }
  4. Notez la valeur name renvoyée par la méthode trainCustomModel, puis suivez les instructions de la section Obtenir des informations sur une opération de longue durée pour savoir quand l'opération de réglage de la recherche est terminée.

Python

Pour en savoir plus, consultez la documentation de référence de l'API Python de Vertex AI Agent Builder.

Pour vous authentifier auprès de Vertex AI Agent Builder, configurez les Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.


from google.api_core.client_options import ClientOptions
from google.api_core.operation import Operation
from google.cloud import discoveryengine

# TODO(developer): Uncomment these variables before running the sample.
# project_id = "YOUR_PROJECT_ID"
# location = "YOUR_LOCATION" # Values: "global"
# data_store_id = "YOUR_DATA_STORE_ID"
# corpus_data_path = "gs://my-bucket/corpus.jsonl"
# query_data_path = "gs://my-bucket/query.jsonl"
# train_data_path = "gs://my-bucket/train.tsv"
# test_data_path = "gs://my-bucket/test.tsv"


def train_custom_model_sample(
    project_id: str,
    location: str,
    data_store_id: str,
    corpus_data_path: str,
    query_data_path: str,
    train_data_path: str,
    test_data_path: str,
) -> Operation:
    #  For more information, refer to:
    # https://cloud.google.com/generative-ai-app-builder/docs/locations#specify_a_multi-region_for_your_data_store
    client_options = (
        ClientOptions(api_endpoint=f"{location}-discoveryengine.googleapis.com")
        if location != "global"
        else None
    )
    # Create a client
    client = discoveryengine.SearchTuningServiceClient(client_options=client_options)

    # The full resource name of the data store
    data_store = f"projects/{project_id}/locations/{location}/collections/default_collection/dataStores/{data_store_id}"

    # Make the request
    operation = client.train_custom_model(
        request=discoveryengine.TrainCustomModelRequest(
            gcs_training_input=discoveryengine.TrainCustomModelRequest.GcsTrainingInput(
                corpus_data_path=corpus_data_path,
                query_data_path=query_data_path,
                train_data_path=train_data_path,
                test_data_path=test_data_path,
            ),
            data_store=data_store,
            model_type="search-tuning",
        )
    )

    # Optional: Wait for training to complete
    # print(f"Waiting for operation to complete: {operation.operation.name}")
    # response = operation.result()

    # After the operation is complete,
    # get information from operation metadata
    # metadata = discoveryengine.TrainCustomModelMetadata(operation.metadata)

    # Handle the response
    # print(response)
    # print(metadata)
    print(operation)

    return operation

Tester la recherche optimisée et l'utiliser pour des requêtes de recherche individuelles

Une fois le réglage terminé, vous pouvez le tester en comparant les résultats des requêtes avec le modèle affiné et les résultats des mêmes requêtes avec le modèle de base.

Console

Pour prévisualiser le comportement d'un modèle affiné à l'aide de la console Google Cloud, procédez comme suit:

  1. Accédez à l'onglet Tuning (Réglages) :

    1. Dans la console Google Cloud, accédez à la page Agent Builder.

      Agent Builder

    2. Cliquez sur le nom de l'application que vous souhaitez prévisualiser.

    3. Cliquez sur Configurations.

    4. Cliquez sur l'onglet Réglages.

  2. Cliquez sur Modèle optimisé et utilisez le panneau d'aperçu à droite pour effectuer des requêtes qui utilisent le modèle optimisé.

  3. Cliquez sur Modèle de base et utilisez le panneau d'aperçu à droite pour effectuer des requêtes à l'aide du modèle d'origine.

  4. Comparez la qualité des résultats.

REST

Pour évaluer l'effet du réglage, vous pouvez effectuer des requêtes avec le champ enableSearchAdaptor défini sur true, puis sur false, et comparer les résultats. Définir le champ enableSearchAdaptor sur true indique que la version optimisée de la recherche est utilisée pour cette requête.

Pour effectuer des requêtes de recherche qui utilisent le modèle affiné:

  1. Dans l'appel de la méthode de requête, définissez le champ enableSearchAdaptor dans le champ customFineTuningSpec sur true.

    Exemple :

    curl -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    "https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/engines/APP_ID/servingConfigs/default_search:search" \
    -d '{
    "query": "QUERY",
    "customFineTuningSpec": { "enableSearchAdaptor": true }
    }'
    

    Remplacez les éléments suivants :

    • PROJECT_ID : ID de votre projet Google Cloud
    • APP_ID: ID de l'application sur laquelle vous souhaitez effectuer la requête.

Pour en savoir plus sur les requêtes de recherche, consultez Obtenir les résultats de recherche et la méthode servingConfigs.search.

Python

Pour en savoir plus, consultez la documentation de référence de l'API Python de Vertex AI Agent Builder.

Pour vous authentifier auprès de Vertex AI Agent Builder, configurez les Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.

from google.api_core.client_options import ClientOptions
from google.cloud import discoveryengine_v1 as discoveryengine

# TODO(developer): Uncomment these variables before running the sample.
# project_id = "YOUR_PROJECT_ID"
# location = "YOUR_LOCATION"          # Values: "global", "us", "eu"
# engine_id = "YOUR_APP_ID"
# search_query = "YOUR_SEARCH_QUERY"


def search_sample(
    project_id: str,
    location: str,
    engine_id: str,
    search_query: str,
) -> discoveryengine.services.search_service.pagers.SearchPager:
    #  For more information, refer to:
    # https://cloud.google.com/generative-ai-app-builder/docs/locations#specify_a_multi-region_for_your_data_store
    client_options = (
        ClientOptions(api_endpoint=f"{location}-discoveryengine.googleapis.com")
        if location != "global"
        else None
    )

    # Create a client
    client = discoveryengine.SearchServiceClient(client_options=client_options)

    # The full resource name of the search app serving config
    serving_config = f"projects/{project_id}/locations/{location}/collections/default_collection/engines/{engine_id}/servingConfigs/default_config"

    # Optional - only supported for unstructured data: Configuration options for search.
    # Refer to the `ContentSearchSpec` reference for all supported fields:
    # https://cloud.google.com/python/docs/reference/discoveryengine/latest/google.cloud.discoveryengine_v1.types.SearchRequest.ContentSearchSpec
    content_search_spec = discoveryengine.SearchRequest.ContentSearchSpec(
        # For information about snippets, refer to:
        # https://cloud.google.com/generative-ai-app-builder/docs/snippets
        snippet_spec=discoveryengine.SearchRequest.ContentSearchSpec.SnippetSpec(
            return_snippet=True
        ),
        # For information about search summaries, refer to:
        # https://cloud.google.com/generative-ai-app-builder/docs/get-search-summaries
        summary_spec=discoveryengine.SearchRequest.ContentSearchSpec.SummarySpec(
            summary_result_count=5,
            include_citations=True,
            ignore_adversarial_query=True,
            ignore_non_summary_seeking_query=True,
            model_prompt_spec=discoveryengine.SearchRequest.ContentSearchSpec.SummarySpec.ModelPromptSpec(
                preamble="YOUR_CUSTOM_PROMPT"
            ),
            model_spec=discoveryengine.SearchRequest.ContentSearchSpec.SummarySpec.ModelSpec(
                version="stable",
            ),
        ),
    )

    # Refer to the `SearchRequest` reference for all supported fields:
    # https://cloud.google.com/python/docs/reference/discoveryengine/latest/google.cloud.discoveryengine_v1.types.SearchRequest
    request = discoveryengine.SearchRequest(
        serving_config=serving_config,
        query=search_query,
        page_size=10,
        content_search_spec=content_search_spec,
        query_expansion_spec=discoveryengine.SearchRequest.QueryExpansionSpec(
            condition=discoveryengine.SearchRequest.QueryExpansionSpec.Condition.AUTO,
        ),
        spell_correction_spec=discoveryengine.SearchRequest.SpellCorrectionSpec(
            mode=discoveryengine.SearchRequest.SpellCorrectionSpec.Mode.AUTO
        ),
        # Optional: Use fine-tuned model for this request
        # custom_fine_tuning_spec=discoveryengine.CustomFineTuningSpec(
        #     enable_search_adaptor=True
        # ),
    )

    page_result = client.search(request)

    # Handle the response
    for response in page_result:
        print(response)

    return page_result

Activer la recherche optimisée

Une fois que vous avez testé la recherche optimisée et décidé de l'utiliser pour toutes les requêtes de recherche, vous pouvez en faire le modèle de recherche par défaut.

Console

Pour définir le modèle affiné comme modèle par défaut et l'appliquer à la page d'aperçu principale, au widget et aux appels d'API, procédez comme suit:

  1. Accédez à l'onglet Tuning (Réglages) :

    1. Dans la console Google Cloud, accédez à la page Agent Builder.

      Agent Builder

    2. Cliquez sur le nom de l'application.

    3. Cliquez sur Configurations.

    4. Cliquez sur l'onglet Réglages.

  2. Cliquez sur Modèle réglé.

  3. Cliquez sur Publier.

REST

Lorsque vous définissez le modèle affiné comme modèle par défaut, vous n'avez pas besoin de spécifier le champ customFineTuningSpec dans la requête de recherche, comme dans la procédure précédente.

Pour utiliser la version optimisée de la recherche par défaut pour toutes les requêtes de recherche, procédez comme suit:

  1. Pour définir la recherche optimisée comme modèle par défaut, exécutez la commande curl suivante:

    curl -X PATCH \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    -H "X-Goog-User-Project: PROJECT_ID" \
    "https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/engines/APP_ID/servingConfigs/default_search?updateMask=customFineTuningSpec.enableSearchAdaptor" \
    -d '{
    "customFineTuningSpec": {
     "enableSearchAdaptor": true
    }
    }'
    

    Pour en savoir plus sur cette méthode, consultez servingConfigs.patch.

Python

Pour en savoir plus, consultez la documentation de référence de l'API Python de Vertex AI Agent Builder.

Pour vous authentifier auprès de Vertex AI Agent Builder, configurez les Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.


from google.api_core.client_options import ClientOptions
from google.cloud import discoveryengine_v1alpha as discoveryengine

# TODO(developer): Uncomment these variables before running the sample.
# project_id = "YOUR_PROJECT_ID"
# location = "YOUR_LOCATION" # Values: "global"
# engine_id = "YOUR_DATA_STORE_ID"


def update_serving_config_sample(
    project_id: str,
    location: str,
    engine_id: str,
) -> discoveryengine.ServingConfig:
    #  For more information, refer to:
    # https://cloud.google.com/generative-ai-app-builder/docs/locations#specify_a_multi-region_for_your_data_store
    client_options = (
        ClientOptions(api_endpoint=f"{location}-discoveryengine.googleapis.com")
        if location != "global"
        else None
    )
    # Create a client
    client = discoveryengine.ServingConfigServiceClient(client_options=client_options)

    # The full resource name of the serving config
    serving_config_name = f"projects/{project_id}/locations/{location}/collections/default_collection/engines/{engine_id}/servingConfigs/default_search"

    update_mask = "customFineTuningSpec.enableSearchAdaptor"

    serving_config = client.update_serving_config(
        request=discoveryengine.UpdateServingConfigRequest(
            serving_config=discoveryengine.ServingConfig(
                name=serving_config_name,
                custom_fine_tuning_spec=discoveryengine.CustomFineTuningSpec(
                    enable_search_adaptor=True  # Switch to `False` to disable tuned model
                ),
            ),
            update_mask=update_mask,
        )
    )

    # Handle the response
    print(serving_config)

    return serving_config

Désactiver la recherche personnalisée

Si vous ne souhaitez plus utiliser la version optimisée de la recherche (par exemple, si les résultats ne sont pas meilleurs ou pires qu'avant l'optimisation), vous pouvez désactiver la recherche optimisée.

Console

Pour rétablir le modèle de base comme modèle par défaut, procédez comme suit:

  1. Accédez à l'onglet Tuning (Réglages) :

    1. Dans la console Google Cloud, accédez à la page Agent Builder.

      Agent Builder

    2. Cliquez sur le nom de l'application.

    3. Cliquez sur Configurations.

    4. Cliquez sur l'onglet Réglages.

  2. Cliquez sur Modèle de base.

  3. Cliquez sur Publier.

REST

Pour arrêter d'utiliser le modèle affiné, exécutez un appel curl semblable à celui précédent, mais définissez enableSearchAdaptor sur false:

  1. Exécutez la commande curl suivante:

    curl -X PATCH \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    -H "X-Goog-User-Project: PROJECT_ID" \
    "https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/engines/APP_ID/servingConfigs/default_search?updateMask=customFineTuningSpec.enableSearchAdaptor" \
    -d '{
    "customFineTuningSpec": {
     "enableSearchAdaptor": false
    }
    }'
    

    Pour en savoir plus sur cette méthode, consultez servingConfigs.patch.

Python

Pour en savoir plus, consultez la documentation de référence de l'API Python de Vertex AI Agent Builder.

Pour vous authentifier auprès de Vertex AI Agent Builder, configurez les Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.


from google.api_core.client_options import ClientOptions
from google.cloud import discoveryengine_v1alpha as discoveryengine

# TODO(developer): Uncomment these variables before running the sample.
# project_id = "YOUR_PROJECT_ID"
# location = "YOUR_LOCATION" # Values: "global"
# engine_id = "YOUR_DATA_STORE_ID"


def update_serving_config_sample(
    project_id: str,
    location: str,
    engine_id: str,
) -> discoveryengine.ServingConfig:
    #  For more information, refer to:
    # https://cloud.google.com/generative-ai-app-builder/docs/locations#specify_a_multi-region_for_your_data_store
    client_options = (
        ClientOptions(api_endpoint=f"{location}-discoveryengine.googleapis.com")
        if location != "global"
        else None
    )
    # Create a client
    client = discoveryengine.ServingConfigServiceClient(client_options=client_options)

    # The full resource name of the serving config
    serving_config_name = f"projects/{project_id}/locations/{location}/collections/default_collection/engines/{engine_id}/servingConfigs/default_search"

    update_mask = "customFineTuningSpec.enableSearchAdaptor"

    serving_config = client.update_serving_config(
        request=discoveryengine.UpdateServingConfigRequest(
            serving_config=discoveryengine.ServingConfig(
                name=serving_config_name,
                custom_fine_tuning_spec=discoveryengine.CustomFineTuningSpec(
                    enable_search_adaptor=True  # Switch to `False` to disable tuned model
                ),
            ),
            update_mask=update_mask,
        )
    )

    # Handle the response
    print(serving_config)

    return serving_config

Étape suivante

  • Pour comprendre l'impact du réglage de la recherche sur la qualité de la recherche, évaluez la qualité de la recherche. Pour en savoir plus, consultez la section Évaluer la qualité de la recherche.