Kontextsets – Übersicht

Ein Kontextset ist eine Sammlung datenbankspezifischer Informationen, mit denen Tools wie QueryData Abfragen mit hoher Genauigkeit generieren können. Kontextsätze können Vorlagen, Facetten und Wertsuchen enthalten, die QueryData helfen, Ihr Datenbankschema und die Geschäftslogik Ihrer Anwendungen zu verstehen.

Die folgenden Datenbanken werden unterstützt:

  • AlloyDB for PostgreSQL
  • Cloud SQL for MySQL
  • Cloud SQL for PostgreSQL
  • Spanner
  • Firestore mit MongoDB-Kompatibilität
  • Bigtable

Was sind Kontextsets?

Damit Sie effektive agentische Anwendungen erstellen können, müssen Tools wie QueryData Ihre Datenorganisation und Geschäftslogik verstehen. Diese Informationen stellen Sie in Form eines Kontextsets bereit.

Sie definieren den Kontext in Dateien, die JSON-Objekte für jeden Kontexttyp enthalten. Sie können diese Kontextdateien mithilfe des Kontext-Engineering-Agenten erstellen. Anschließend laden Sie die Kontextdatei in einen Kontextsatz hoch, den Sie in der Google Cloud-Konsole erstellen. Durch diesen Prozess können Tools wie QueryData das spezifische Schema der Datenbank und die Geschäftslogik der Anwendung erlernen.

Die Kontextdatei sieht in etwa so aus:

{
  "templates": [
    {
      "nl_query": "List all luxury hotels",
      "sql": "SELECT CAST(_key AS STRING) AS hotel_id, CAST(cf['name'] AS STRING) AS name, CAST(cf['location'] AS STRING) AS location FROM `hotels` WHERE CAST(cf['price_tier'] AS STRING) = 'Luxury' ORDER BY _key ASC",
      "intent": "hotels in Luxury tier",
      "manifest": "hotels in a given product tier",
      "parameterized": {
        "parameterized_intent": "hotels in ? tier",
        "parameterized_sql": "SELECT CAST(_key AS STRING) AS hotel_id, CAST(cf['name'] AS STRING) AS name, CAST(cf['location'] AS STRING) AS location FROM `hotels` WHERE CAST(cf['price_tier'] AS STRING) = ? ORDER BY _key ASC"
      }
    }
  ],
  "facets": [
    {
      "sql_snippet": "CAST(CAST(hotels.cf['rating'] AS STRING) AS FLOAT64) >= 4.5",
      "intent": "hotels with rating at least 4.5",
      "manifest": "hotels with rating at least a given number",
      "parameterized": {
        "parameterized_intent": "hotels with rating at least ?",
        "parameterized_sql_snippet": "CAST(CAST(hotels.cf['rating'] AS STRING) AS FLOAT64) >= ?"
      }
    }
  ],
  "value_searches": [
    {
      "query": "SELECT CAST(T.cf['location'] AS STRING) AS value, 'hotels.location' AS `columns`, 'City' AS concept_type, 0 AS distance, '' AS context FROM `hotels` AS T WHERE CAST(T.cf['location'] AS STRING) = CAST($value AS STRING)",
      "concept_type": "City",
      "description": "Exact match for hotel city in hotels table"
    }
  ]
}

Dateiformat des Kontextsets

Eine Kontextset-Datei besteht aus einer ausgewählten Sammlung von Vorlagen, Facetten und Wertsuchen im JSON-Format, die Tools wie QueryData dabei unterstützen, Fragen in natürlicher Sprache in Abfragen für eine bestimmte Datenbank zu übersetzen. Durch die Definition des Kontexts wird eine hochpräzise SQL-Generierung für gängige Abfragemuster sichergestellt.

Um die Genauigkeit zu maximieren, muss der Kontextsatz genau und umfassend sein und die erwarteten Anwendungsabfragen abdecken.

Kontextsätze können in den Regionen us-central1, us-east1, europe-west4 und asia-southeast1 erstellt werden. Sie müssen eine Region auswählen, wenn Sie den ersten Kontextsatz in einem Projekt erstellen. Spätere Kontextgruppen verwenden dieselbe Region.

Abfragevorlagen

Abfragevorlagen sind eine Sammlung repräsentativer Fragen in natürlicher Sprache mit entsprechenden SQL-Abfragen. Sie enthalten auch Erklärungen, um eine deklarative Begründung für die Generierung von SQL aus natürlicher Sprache zu liefern.

Ein Abfragevorlagenobjekt sieht in etwa so aus:

{
  "templates": [
    {
      "nl_query": "List all luxury hotels",
      "sql": "SELECT CAST(_key AS STRING) AS hotel_id, CAST(cf['name'] AS STRING) AS name, CAST(cf['location'] AS STRING) AS location FROM `hotels` WHERE CAST(cf['price_tier'] AS STRING) = 'Luxury' ORDER BY _key ASC",
      "intent": "hotels in Luxury tier",
      "manifest": "hotels in a given product tier",
      "parameterized": {
        "parameterized_intent": "hotels in ? tier",
        "parameterized_sql": "SELECT CAST(_key AS STRING) AS hotel_id, CAST(cf['name'] AS STRING) AS name, CAST(cf['location'] AS STRING) AS location FROM `hotels` WHERE CAST(cf['price_tier'] AS STRING) = ? ORDER BY _key ASC"
      }
    }
  ],
  ...
}

Die Hauptkomponenten des JSON-Objekts der Abfragevorlage sind:

  • nl_query: Ein Beispiel für eine Abfrage in natürlicher Sprache, die von Tools wie QueryData verarbeitet wird.
  • sql: Die SQL-Abfrage für die Abfrage in natürlicher Sprache.
  • intent: Das Ziel oder der Zweck der Abfrage in natürlicher Sprache. Wenn nicht festgelegt, wird dieser Wert standardmäßig auf die Abfrage in natürlicher Sprache gesetzt.
  • manifest: Eine verallgemeinerte, automatisch generierte Form des Intents.
  • parameterized_intent: Eine automatisch generierte Vorlage des Intents, bei der Entitätswerte durch Parameter ersetzt werden.
  • parameterized_sql: Eine automatisch generierte Vorlage der SQL-Abfrage, die der parametrisierten Absicht entspricht.

Abfrageattribute

Abfrageattribute sind eine ausgewählte Gruppe repräsentativer Bedingungen in natürlicher Sprache mit entsprechenden SQL-Prädikaten. Attribute verwalten Filter und Bedingungen, sodass Abfragevorlagen attributbasierte Suchen durchführen können.

Ein Abfrage-Facettenobjekt sieht in etwa so aus:

{
  ...
  "facets": [
    {
      "sql_snippet": "CAST(CAST(hotels.cf['rating'] AS STRING) AS FLOAT64) >= 4.5",
      "intent": "hotels with rating at least 4.5",
      "manifest": "hotels with rating at least a given number",
      "parameterized": {
        "parameterized_intent": "hotels with rating at least ?",
        "parameterized_sql_snippet": "CAST(CAST(hotels.cf['rating'] AS STRING) AS FLOAT64) >= ?"
      }
    }
  ]
}

Die Hauptkomponenten des JSON-Objekts für Facetten sind:

  • sql_snippet: Ein SQL-Snippet. Um Unklarheiten zu vermeiden, sollten Sie Spaltennamen mit Tabellennamen qualifizieren (z. B. table_name.column_name).
  • intent: Eine Erklärung des SQL-Prädikats.
  • manifest: Eine verallgemeinerte, automatisch generierte Form des Intents.
  • parameterized_intent: Eine automatisch generierte Vorlage des Intents, bei der Entitätswerte durch Parameter ersetzt werden.
  • parameterized_sql_snippet: Eine vorlagenbasierte, automatisch generierte Form des sql_snippet, die der parametrisierten Absicht entspricht.

Suchanfragen bewerten

Wertsuchanfragen sind von Entwicklern definierte Abfragen, die Übereinstimmungsfunktionen verwenden, um Werte und ihren Kontext in einer Datenbank zu finden. Bei der Wertverknüpfung werden die Ergebnisse dieser Abfragen verwendet, um zu ermitteln, welche Tabellen und Spalten einen übereinstimmenden Wert enthalten, den Konzepttyp des Werts zu verstehen und Rechtschreibfehler zu korrigieren.

Die QueryData API verwendet die Wertverknüpfung, um natürliche Sprache genauer in SQL zu konvertieren. Durch die Verwendung von Suchanfragen für Werte kann die API Rechtschreibfehler korrigieren und Werttypen anhand von Datenbankwerten auflösen, was die Conversion-Genauigkeit verbessert.

Die Wertverknüpfung verbessert die Genauigkeit der Konvertierung von natürlicher Sprache in SQL. Wenn ein Nutzer beispielsweise fragt: „Gibt es Flüge ab Heathrow?“, speichert die Datenbank den Flughafennamen möglicherweise als „London Heathrow“. Ohne Wertverknüpfung filtert das generierte SQL möglicherweise nach WHERE name = 'Heathrow' und gibt keine Ergebnisse zurück. Wertsuchanfragen weisen den KI-Agenten an, „Heathrow“ dem richtigen Datenbankwert „London Heathrow“ und dem zugehörigen Schemaspeicherort (airports.name) zuzuordnen. So wird sichergestellt, dass die generierte SQL-Abfrage korrekt ist.

Beispiel für eine Suchanfrage nach einem Wert:

{
  ...
  "value_searches": [
    {
      "query": "SELECT CAST(T.cf['location'] AS STRING) AS value, 'hotels.location' AS `columns`, 'City' AS concept_type, 0 AS distance, '' AS context FROM `hotels` AS T WHERE CAST(T.cf['location'] AS STRING) = CAST($value AS STRING)",
      "concept_type": "City",
      "description": "Exact match for hotel city in hotels table"
    }
  ]
}

Die Hauptkomponenten des JSON-Objekts für die Wertsuche sind:

  • query: Eine parametrisierte SQL-Anweisung, die die Logik für den Abgleich einer Wertphrase mit den in einer Datenbank gespeicherten Werten definiert. Das Ergebnisset projiziert in der Regel den übereinstimmenden Wert, den Schemaspeicherort, den Konzepttyp und einen normalisierten Distanzmesswert (zwischen 0 und 1).
  • concept_type: Ein semantisches Label, das dem Wert zugewiesen ist, z. B. district oder loan_status. Dieses Label hilft bei der Wertverknüpfung und schließlich bei Tools wie der QueryData API, die Rolle der Wertphrase im Schema zu verstehen. Außerdem wird eine SQL-Anweisung erstellt, die auf das Konzept für den Wert sowie auf die Tabelle und Spalte abzielt, in der die Wertphrase vorkommt.
  • description: Eine Beschreibung der Suchlogik.

Beschränkungen

Für Kontextgruppen gelten die folgenden Einschränkungen:

  • Kontextsets für Datenbanken unterstützen nur Vorlagen, Facetten und Wertesuchen.
  • GoogleSQL for Bigtable unterstützt keine Set-Vorgänge (UNION ALL). Daher wird die Wertverknüpfung über mehrere Suchanfragen hinweg nicht unterstützt. Eine solche Anfrage ist erfolgreich, aber die Werte werden bei Kontextgruppen mit mehr als einer Wertsuche nicht verknüpft.
  • Kontextsätze für Datenbanken werden nur vom Endpunkt QueryData in der Conversational Analytics API verwendet.

Nächste Schritte