Cortex Analyst REST API

Verwenden Sie diese API, um Fragen zu Ihren Daten mit Abfragen in natürlicher Sprache zu beantworten.

Meldung senden

POST /api/v2/cortex/analyst/message

Erzeugt eine SQL-Abfrage für die angegebene Frage unter Verwendung eines semantischen Modells oder einer semantischen Ansicht, die in der Anfrage angegeben ist. Es können ein oder mehrere Modelle angegeben werden. Wenn mehrere Modelle angegeben werden, wählt Cortex Analyst das am besten geeignete aus. Sie können Multi-Turn-Konversationen führen, bei denen Sie Folgefragen stellen können, die auf früheren Abfragen aufbauen. Weitere Informationen dazu finden Sie unter Multi-Turn-Konversationen in Cortex Analyst.

Die Anfrage enthält eine Frage des Benutzers; die Antwort enthält die Frage des Benutzers und die Antwort des Analysten. Jede Meldung in einer Antwort kann mehrere Inhaltsblöcke unterschiedlichen Typs enthalten. Drei Werte, die derzeit für das Feld type des Inhaltsobjekts unterstützt werden, sind: text, suggestions und sql.

Die Antworten können nach Abschluss der Verarbeitung auf einmal oder schrittweise nach ihrer Erstellung gesendet werden.

Header der Anforderung

Header

Beschreibung

Authorization

(Erforderliche) Autorisierungstoken. Weitere Informationen dazu finden Sie unter Authentifizierung am Server.

Content-Type

(Erforderlich) Anwendung/json

X-Snowflake-Authorization-Token-Type

(Optional) Typ des Autorisierungs-Tokens. Die Standardeinstellung ist OAuth. Weitere Informationen dazu finden Sie unter Authentifizierung am Server.

Text der Anforderung

Im Anfrage-Body:

  • Setzen Sie das letzte Feld messages[].role auf die Rolle des Sprechers, die user sein muss.

  • Nehmen Sie die Frage des Benutzers in das Objekt content auf. In diesem Objekt:

    • Setzen Sie type auf text.

    • Stellen Sie text auf die Frage des Benutzers ein.

  • Fügen Sie einen der folgenden Punkte ein:

    • Die Spezifikation des semantischen Modells in YAML.

    • Der Pfad zu der YAML-Datei, die die Spezifikation des semantischen Modells enthält. Diese Datei muss sich in einem Stagingbereich befinden.

    • Der Name der semantischen Ansicht.

Die folgende Tabelle beschreibt die Felder, die Sie im Body der Anfrage festlegen können:

Feld

Beschreibung

messages[].role

(Erforderlich) Die Rolle der Entität, die die Meldung erstellt. Derzeit wird nur user unterstützt.

Typ: string:enum

Beispiel: user

messages[].content[]

(Erforderlich) Das Inhaltsobjekt, das Teil einer Meldung ist.

Typ: Objekt

Beispiel:

{
  "type": "text",
  "text":  "Which company had the most revenue?"
}
Copy

messages[].content[].type

(Erforderlich) Der Inhaltstyp. Derzeit wird nur text unterstützt.

Typ: string:enum

Beispiel: text

messages[].content[].text

(Erforderlich) Die Frage des Benutzers.

Typ: Zeichenfolge

Beispiel: Which company had the most revenue?

semantic_model_file

Pfad zur Datei des semantischen Modells YAML. Muss eine vollständig qualifizierte Stagingbereich-URL sein, einschließlich der Datenbank und des Schemas.

Um mehrere semantische Modelle anzugeben, verwenden Sie das Feld semantic_models.

Wenn Sie stattdessen die YAML-Spezifikation direkt in der Anfrage bereitstellen möchten, setzen Sie das Feld semantic_model auf die YAML-Spezifikation für das semantische Modell.

Typ: Zeichenfolge

Beispiel: @my_db.my_schema.my_stage/my_semantic_model.yaml

semantic_model

Eine Zeichenfolge, die das gesamte semantische Modell YAML enthält.

Um mehrere semantische Modelle anzugeben, verwenden Sie stattdessen das Feld semantic_models.

Wenn Sie stattdessen auf eine YAML-Spezifikation in einer Datei verweisen möchten, laden Sie die Datei in einen Stagingbereich hoch und setzen das Feld semantic_model_file auf den Pfad zu der Datei.

Typ: Zeichenfolge

semantic_models

Ein Array mit JSON-Objekten, von denen jedes ein Feld semantic_model_file oder semantic_view enthält.

Diese Felder haben die gleiche Semantik wie die Felder semantic_model_file und semantic_view der obersten Ebene:

  • semantic_model_file gibt eine YAML-Datei an, die in einem Stagingbereich gespeichert ist und eine semantische Modelldefinition enthält. (Sie können das YAML für das semantische Modell nicht direkt in der Anfrage mit diesem Formular angeben)

  • semantic_view gibt den vollständig qualifizierten Namen einer semantischen Ansicht an. Beispiel:

    {
      /* ... */
      "semantic_models": [
        {"semantic_view": "my_db.my_sch.my_sem_view_1" },
        {"semantic_view": "my_db.my_sch.my_sem_view_2" }
      ]
      /* ... */
    }
    
    Copy

Für jede Abfrage wählt Cortex Analyst das am besten geeignete Modell oder die am besten geeignete Ansicht aus der Liste aus.

Diese Funktion vereinfacht die Interaktion des Benutzers mit Cortex Analyst. Sie müssen keine Datenquelle für die Abfrage auswählen und Sie müssen sich nicht darum kümmern, welches semantische Modell oder welche semantische Ansicht Sie jeweils verwenden. Geben Sie einfach bei jeder Abfrage alle Ihre Modelle oder Ansichten an und lassen Sie Cortex Analyst herausfinden, welche davon verwendet werden soll.

Typ: Array

Tipp

Für Cortex Analyst ist es nicht erforderlich, dass Sie mehr als ein Modell oder eine Ansicht angeben. Wenn Sie ein einzelnes Modell oder eine Ansicht angeben, entspricht die Anfrage funktionell einer Anfrage, die ein Feld semantic_model_file oder semantic_view der obersten Ebene enthält.

Der Vorteil der Verwendung von semantic_models für Einzelmodellanfragen ist, dass Sie unabhängig von der Anzahl der Modelle oder Ansichten denselben Client-Code verwenden können.

semantic_view

Vollständig qualifizierter Name der semantischen Ansicht. Beispiel:

{
  /* ... */
  "semantic_view": "MY_DB.MY_SCHEMA.SEMANTIC_VIEW"
  /* ... */
}
Copy

Wenn der Name zwischen Groß- und Kleinschreibung unterscheidet oder Zeichen enthält, die in einem nicht in Anführungszeichen gesetzten Bezeichner nicht erlaubt sind, müssen Sie den Namen in doppelte Anführungszeichen einschließen, denen ein umgekehrter Schrägstrich vorangesetzt ist. Zum Beispiel, wenn der Datenbankname, der Schemaname und der Ansichtsname Bindestriche (my-database.my-schema.my-semantic-view) enthalten:

{
  /* ... */
  "semantic_view": "\"my-database\".\"my-schema\".\"\"my-semantic-view\"\""
  /* ... */
}
Copy

Um mehrere semantische Ansichten anzugeben, verwenden Sie das Feld semantic_models.

Typ: Zeichenfolge

stream

(Optional) Bei der Einstellung true wird die Antwort über vom Server gesendete Ereignisse an den Client gestreamt, sobald sie generiert wird (siehe Streaming-Antwort). Andernfalls wird die vollständige Antwort zurückgegeben, nachdem Cortex Analyst die Frage des Benutzers vollständig bearbeitet hat.

Typ: Boolean

Wichtig

Sie müssen eines der folgenden Felder im Body der Anfrage angeben:

  • semantic_model_file

  • semantic_model

  • semantic_models

  • semantic_view

Beispiel für die Angabe eines semantischen Modells in einer Datei in einem Stagingbereich

{
    "messages": [
        {
            "role": "user",
            "content": [
                {
                    "type": "text",
                    "text": "which company had the most revenue?"
                }
            ]
        }
    ],
    "semantic_model_file": "@my_db.my_schema.my_stage/my_semantic_model.yaml"
}
Copy

Beispiel für die Angabe einer semantischen Ansicht

{
  "messages": [
    {
      "role": "user",
      "content": [
        {
          "type": "text",
          "text": "which company had the most revenue?"
        }
      ]
    }
  ],
  "semantic_view": "MY_DB.MY_SCH.MY_SEMANTIC_VIEW"
}
Copy

Antwort ohne Streaming

Diese Operation kann die unten aufgeführten Antwortcodes zurückgeben. Die Antwort hat immer die folgende Struktur. Derzeit werden drei Inhaltstypen für die Antwort unterstützt: text, suggestion und sql. Die Inhaltstypen suggestion und sql schließen sich gegenseitig aus, d. h. wenn die Antwort einen Inhaltstyp sql enthält, enthält sie keinen Inhaltstyp suggestion und umgekehrt. Der Inhaltstyp suggestion ist nur dann in einer Antwort enthalten, wenn die Frage des Benutzers mehrdeutig war und Cortex Analyst keine SQL-Anweisung für diese Abfrage liefern konnte.

Wenn die Anfrage ein semantic_models-Feld enthält, enthält die Antwort ein semantic_model_selection-Feld, das angibt, welches semantische Modell für die Anfrage gewählt wurde.

Um die Vorwärtskompatibilität zu gewährleisten, stellen Sie sicher, dass Ihre Implementierung den Inhaltstyp berücksichtigt und Typen verarbeitet.

Code

Beschreibung

200

Die Anweisung wurde erfolgreich ausgeführt.

Meldung Der Body der Antwort enthält ein Meldungsobjekt, das die folgenden Felder enthält:

  • message: Meldungen der Konversation zwischen dem Benutzer und dem Analysten.

  • message (Objekt): Stellt eine Meldung innerhalb eines Chats dar.

  • message.role (string:enum): Die Entität, von der die Meldung stammt. Eine der folgenden Optionen: user oder analyst.

  • message.content[] (Objekt): Das Inhaltsobjekt, das Teil einer Meldung ist.

  • message.content[].type (string:enum): Der Inhaltstyp der Meldung. Eine der folgenden Optionen: text, suggestion oder sql.

  • message.content[].text (string): Der Text des Inhalts. Wird nur für den Inhaltstyp text zurückgegeben.

  • message.content[].statement (string): Eine SQL-Anweisung. Wird nur für den Inhaltstyp sql zurückgegeben.

  • message.content[].confidence (Objekt): Enthält vertrauensbezogene Informationen. Wird nur für den Inhaltstyp sql zurückgegeben.

  • message.content[].confidence.verified_query_used (Objekt): Stellt die verifizierte Abfrage aus dem geprüften Abfrage-Repository dar, das bei der Erstellung der SQL-Antwort verwendet wird. Wenn keine verifizierte Abfrage verwendet wird, lautet der Feldwert null.

  • message.content[].confidence.verified_query_used.name (string): Der Name der verwendeten verifizierten Abfrage, die aus dem geprüften Abfrage-Repository entnommen wurde.

  • message.content[].confidence.verified_query_used.question (string): Die Frage, die von der verifizierten Abfrage beantwortet wird, extrahiert aus dem geprüften Abfrage-Repository.

  • message.content[].confidence.verified_query_used.sql (string): Die SQL-Anweisung der verwendeten verifizierten Abfrage, die aus dem geprüften Abfrage-Repository entnommen wurde.

  • message.content[].confidence.verified_query_used.verified_at (Ganzzahl): Die numerische Darstellung des Zeitstempels, wann die Abfrage verifiziert wurde, entnommen aus dem geprüften Abfrage-Repository.

  • message.content[].confidence.verified_query_used.verified_by (string): Die Person, die die Abfrage verifiziert hat, entnommen aus dem geprüften Abfrage-Repository.

  • message.content[].suggestions (string): Wenn SQL nicht generiert werden kann, eine Liste der Fragen, für die das semantische Modell SQL generieren kann. Wird nur für den Inhaltstyp suggestion zurückgegeben.

  • warnings: Liste der Warnungen des Analysten bezüglich der Anfrage des Benutzers.

  • warnings[].message (string): Enthält eine detaillierte Beschreibung einer einzelnen Warnung.

  • response_metadata (Objekt): Metadaten mit Details zur Generierung der Antwort.

  • response_metadata.model_names: Liste der Modelle, die zur Erzeugung der Antwort verwendet wurden.

  • response_metadata.cortex_search_retrieval (Objekt): Entitäten, die mit der Cortex Search aufgelöst wurden.

  • response_metadata.question_category (string): Wie die Frage in der Anfrage kategorisiert ist.

In der Standardeinstellung wird die Antwort auf einmal zurückgegeben, nachdem Cortex Analyst die Frage des Benutzers vollständig bearbeitet hat. Siehe Streaming-Antwort für das Format der Antworten im Streaming-Modus.

{
    "request_id": "75d343ee-699c-483f-83a1-e314609fb563",
    "message": {
        "role": "analyst",
        "content": [
            {
                "type": "text",
                "text": "We interpreted your question as ..."
            },
            {
                "type": "sql",
                "statement": "SELECT * FROM table",
                "confidence": {
                    "verified_query_used": {
                        "name": "My verified query",
                        "question": "What was the total revenue?",
                        "sql": "SELECT * FROM table2",
                        "verified_at": 1714497970,
                        "verified_by": "Jane Doe"
                    }
                }
            }
        ]
    },
    "warnings": [
        {
            "message": "Table table1 has (30) columns, which exceeds the recommended maximum of 10"
        },
        {
            "message": "Table table2 has (40) columns, which exceeds the recommended maximum of 10"
        }
    ],
    "response_metadata": {
        "model_names": [
            "claude-3-5-sonnet"
        ],
        "cortex_search_retrieval": [
            {
                "service": "my_db.my_schema.my_search_service",
                "response_body": {
                    "results": [
                        {
                            "CUST_NAME": "customer1"
                        }
                    ],
                    "request_id": "request1"
                },
                "query": "'customer1'"
            }
        ],
        "question_category": "CLEAR_SQL"
    }
}
Copy

Streaming-Antwort

Im Streaming-Modus kann Ihr Client die Antworten empfangen, sobald sie von Cortex Analyst generiert werden, anstatt darauf zu warten, dass die gesamte Antwort generiert wird. Dies verbessert die wahrgenommene Reaktionsfähigkeit Ihrer Anwendung, insbesondere bei lang laufenden Abfragen, da die Benutzer die Ausgabe viel früher sehen. Streaming-Antworten liefern auch Statusinformationen, die Ihnen helfen können, zu verstehen, an welcher Stelle Cortex Analyst bei der Erzeugung einer Antwort steht, sowie Warnungen, die Ihnen helfen können zu verstehen, was schief gelaufen ist, wenn Cortex Analyst nicht wie erwartet funktioniert.

Um eine Streaming-Antwort zu erhalten, setzen Sie das Feld stream im Anfrage-Body auf true. Streaming-Antworten verwenden vom Server gesendete Ereignisse.

Cortex Analyst sendet fünf verschiedene Arten von Ereignissen in einer Streaming-Antwort:

  • status: Informiert Sie über den aktuellen Status des SQL-Generierungsprozesses.

  • message.content.delta: Enthält einen Teil der Antwort. Dieses Ereignis wird mehrmals gesendet.

  • error: Zeigt an, dass Cortex Analyst auf einen Fehler gestoßen ist und die Bearbeitung der Anfrage nicht fortsetzen kann. Es werden keine weiteren message.content.delta-Ereignisse gesendet.

  • warnings: Enthält alle während der Verarbeitung aufgetretenen Warnungen. Warnungen stoppen die Verarbeitung nicht.

  • response_metadata: Wird am Ende einer Antwort gesendet, um Daten zur Verarbeitung der Anfrage anzuzeigen.

  • done: Wird gesendet, um anzuzeigen, dass die Verarbeitung abgeschlossen ist und keine weiteren message.content.delta-Ereignisse gesendet werden.

Von diesen sind die message.content.delta-Ereignisse am wichtigsten zu verstehen, da sie den eigentlichen Inhalt der Antwort enthalten. Jedes delta enthält Token aus einem Feld der vollständigen Antwort. Es ist möglich, dass jedes delta-Ereignis alles zwischen einem einzelnen Zeichen und der gesamten Antwort enthält und dass sie unterschiedlich lang sein können. Sie erhalten diese Token, sobald sie generiert werden. Es liegt an Ihnen, sie zu der endgültigen Antwort zusammenzusetzen.

Wichtig

Die Ereignisse verschiedener Antworten (selbst sehr ähnlicher) können variieren. Es gibt keine Garantie, dass die Ereignisse in der gleichen Reihenfolge oder mit dem gleichen Inhalt gesendet werden.

Einfaches Beispiel

Im Folgenden finden Sie ein Beispiel-Antwort ohne Streaming auf eine einfache Abfrage:

{
    "message": {
        "role": "analyst",
        "content": [
            {
                "type": "text",
                "text": "This is how we interpreted your question and this is how the sql is generated"
            },
            {
                "type": "sql",
                "statement": "SELECT * FROM table"
            }
        ]
    }
}
Copy

Und dies ist eine mögliche Reihe von Streaming-Ereignissen für diese Antwort (eine andere Reihe von Ereignissen ist ebenfalls möglich):

event: status
data: { status: "interpreting_question" }

event: message.content.delta
data: {
  index: 0,
  type: "text",
  text_delta: "This is how we interpreted your question"
}

event: status
data: { status: "generating_sql" }

event: status
data: { status: "validating_sql" }

event: message.content.delta
data: {
  index: 0,
  type: "text",
  text_delta: " and this is how the sql is generated"
}

event: message.content.delta
data: {
  index: 1,
  type: "sql",
  statement_delta: "SELECT * FROM table"
}

event: status
data: { status: "done" }

Verwenden Sie das Feld index in den message.content.delta-Antworten, um festzustellen, zu welchem Feld in der vollständigen Antwort das Ereignis gehört. In diesem Beispiel verwenden die ersten beiden Ereignisse von delta den Index 0, d. h. sie sind Teil des ersten Feldes (Element 0) im content-Array der Antwort ohne Streaming. In ähnlicher Weise verwendet das delta-Ereignis, das die SQL-Antwort enthält, den Index 1.

Beispiel mit Vorschlägen

Dieses Beispiel enthält Fragenvorschläge für eine mehrdeutige Frage. Im Folgenden finden Sie die Antwort ohne Streaming:

{
    "message": {
        "role": "analyst",
        "content": [
            {
                "type": "text",
                "text": "Your question is ambigous, here are some alternatives:"
            },
            {
                "type": "suggestions",
                "suggestions": [
                    "which company had the most revenue?",
                    "which company placed the most orders?"
                ]
            }
        ]
    }
}
Copy

Und hier ist eine mögliche Reihe von Streaming-Ereignissen, die diese Antwort darstellen:

event: status
data: { status: "interpreting_question" }

event: message.content.delta
data: {
  index: 0,
  type: "text",
  text_delta: "Your question is ambigous,"
}

event: status
data: { status: "generating_suggestions" }

event: message.content.delta
data: {
  index: 0,
  type: "text",
  text_delta: " here are some alternatives:"
}

event: message.content.delta
data: {
  index: 1,
  type: "suggestions",
  suggestions_delta: {
    index: 0,
    suggestion_delta: "which company had",
  }
}

event: message.content.delta
data: {
  index: 1,
  type: "suggestions",
  suggestions_delta: {
    index: 0,
    suggestion_delta: " the most revenue?",
  }
}

event: message.content.delta
data: {
  index: 1,
  type: "suggestions",
  suggestions_delta: {
    index: 1,
    suggestion_delta: "which company placed",
  }
}

event: message.content.delta
data: {
  index: 1,
  type: "suggestions",
  suggestions_delta: {
    index: 1,
    suggestion_delta: " the most orders?",
  }
}

event: status
data: { status: "done" }

In diesem Beispiel ist das Feld content der Antwort ohne Streaming ein Array. Eines der Elemente von content ist das Array suggestions. Die Bedeutung der index-Felder für die Delta-Ereignisse text und suggestions bezieht sich also auf den Speicherort der Elemente in diesen beiden verschiedenen Arrays. Sie müssen diese Indizes separat verfolgen, wenn Sie die vollständige Antwort zusammenstellen.

Bemerkung

Derzeit wird die erzeugte SQL-Anweisung immer in einem einzigen Ereignis gesendet. Das wird in Zukunft vielleicht nicht mehr der Fall sein. Ihr Client muss darauf vorbereitet sein, die SQL-Anweisung in mehreren Ereignissen zu erhalten.

Andere Beispiele

Sie finden einen Streamlit-Streaming-Client für Cortex Analyst im Cortex Analyst GitHub Repo. Diese Demo muss lokal ausgeführt werden; SiS unterstützt derzeit kein Streaming.

Eine interaktive Demonstration von Streaming-Antworten finden Sie auf dem Cortex Analyst Spielplatz im AI/ML Studio (in Snowsight).

Schemata für Streaming-Ereignisse

Im Folgenden finden Sie die OpenAPI/Swagger-Schemata der Ereignisse, die von Cortex Analyst in einer Streaming-Antwort gesendet werden.

Status
message.content.delta
Fehler
StreamingError:
type: object
properties:
  message:
    type: string
    description: A description of the error
  code:
    type: string
    description: The Snowflake error code categorizing the error
  request_id:
    type: string
    description: Unique request ID
Copy
Warnungen
Warnings:
type: object
description: Warnings found while processing the request
properties:
  warnings:
    type: array
    items:
      $ref: "#/components/schemas/Warning"
Warning:
type: object
title: The warning object
description: Represents a warning within a chat.
properties:
  message:
    type: string
    description: A human-readable message describing the warning
Copy
response_metadata
ResponseMetadata:
type: object
description: Details about request processing
Copy

Feedback senden

POST /api/v2/cortex/analyst/feedback

Liefert qualitatives Feedback von Benutzern. Innerhalb von Snowsight wird das Feedback in Semantic Model Admins unter Monitoring angezeigt.

Header der Anforderung

Header

Beschreibung

Authorization

(Erforderliche) Autorisierungstoken. Weitere Informationen dazu finden Sie unter Authentifizierung am Server.

Content-Type

(Erforderlich) Anwendung/json

Text der Anforderung

Feld

Beschreibung

request_id

(Erforderlich) Die ID der Anfrage, die Sie zum Senden einer Meldung gestellt haben. Wird im Feld request_id von /api/v2/cortex/analyst/message zurückgegeben. Weitere Informationen dazu finden Sie unter Antwort ohne Streaming.

Typ: Zeichenfolge

Beispiel: 75d343ee-699c-483f-83a1-e314609fb563

positive

(Erforderlich) Ob das Feedback positiv oder negativ ist. true für positiv oder „Daumen hoch“, false für negativ oder „Daumen runter“.

Typ: Boolean

Beispiel:

true

feedback_message

(Optional) Die Feedback-Meldung des Benutzers.

Beispiel: This is the best answer I've ever seen!

Antwort

Leerer Antworttext mit Statuscode 200.

Anforderungen an die Zugriffssteuerung

Informationen zu den erforderlichen Berechtigungen finden Sie unter Anforderungen an die Zugriffssteuerung.

Einzelheiten zum Authentifizieren auf API finden Sie unter Authentifizierung von Snowflake REST APIs mit Snowflake.