Cortex Analyst REST API¶
Use esta API para responder perguntas sobre seus dados com consultas em linguagem natural.
Envio de mensagem¶
POST /api/v2/cortex/analyst/message
Gera uma consulta SQL para a pergunta fornecida usando um modelo semântico ou uma exibição semântica fornecida na solicitação. Um ou mais modelos podem ser especificados; quando vários modelos são especificados, o Cortex Analyst escolhe o mais adequado. É possível ter conversas com várias interações, nas quais pode-se fazer perguntas de acompanhamento que se baseiam em perguntas anteriores. Para obter mais informações, consulte Conversas com múltiplas interações no Cortex Analyst.
A solicitação inclui uma pergunta do usuário; a resposta inclui a pergunta do usuário e a resposta do analista. Cada mensagem em uma resposta pode ter vários blocos de conteúdo de diferentes tipos. Três valores atualmente suportados para o campo type
do objeto de conteúdo são: text
, suggestions
e sql
.
As respostas podem ser enviadas de uma só vez, após a conclusão do processamento, ou de forma incremental, à medida que são geradas.
Cabeçalhos de solicitação¶
Cabeçalho |
Descrição |
---|---|
|
Token de autorização (obrigatório). Para obter mais informações, consulte Autenticação no servidor. |
|
Aplicativo/json (obrigatório) |
|
(Opcional) Tipo de token de autorização. O padrão é OAuth. Para obter mais informações, consulte Autenticação no servidor. |
Corpo da solicitação¶
No corpo da solicitação:
Defina o último campo
messages[].role
como a função de quem fala, que deve seruser
.Inclua a pergunta do usuário no objeto
content
. Neste objeto:Defina
type
comotext
.Defina
text
para a pergunta do usuário.
Inclua um dos seguintes itens:
A especificação do modelo semântico em YAML.
O caminho para o arquivo YAML que contém a especificação do modelo semântico. Esse arquivo deve estar em um estágio.
O nome da exibição semântica.
A tabela a seguir descreve os campos que você pode definir no corpo da solicitação:
Campo |
Descrição |
---|---|
|
A função da entidade que está criando a mensagem (obrigatório). Atualmente só oferece suporte a Tipo: string:enum Exemplo: |
|
O objeto de conteúdo que faz parte de uma mensagem (obrigatório). Tipo: objeto
|
|
O tipo de conteúdo (obrigatório). Atualmente, somente Tipo: string:enum Exemplo: |
|
A pergunta do usuário (obrigatório). Tipo: cadeia de caracteres Exemplo: |
|
Caminho para o arquivo YAML do modelo semântico. Deve ser um URL do estágio totalmente qualificado, incluindo o banco de dados e o esquema. Para especificar vários modelos semânticos, use o campo Se, em vez disso, você quiser fornecer a especificação YAML diretamente na solicitação, defina o campo Tipo: cadeia de caracteres Exemplo: |
|
Uma cadeia de caracteres contendo todo o YAML do modelo semântico. Para especificar vários modelos semânticos, use o campo Se, em vez disso, você quiser apontar para uma especificação YAML em um arquivo, carregue o arquivo em um estágio e defina o campo Tipo: cadeia de caracteres |
|
Uma matriz contendo objetos JSON, cada um dos quais contém um campo Esses campos têm a mesma semântica que os campos de nível superior
Para cada consulta, o Cortex Analyst escolhe o modelo ou a exibição mais adequada da lista. Esse recurso simplifica as interações de usuário com o Cortex Analyst. Você não precisa escolher uma fonte de dados para consultar e não precisa controlar qual modelo semântico ou exibição semântica usar para cada um. Basta especificar todos os seus modelos ou exibições em cada consulta e deixar que o Cortex Analyst descubra qual deles usar. Tipo: matriz Dica O Cortex Analyst não exige que você especifique mais de um modelo ou exibição. Se você especificar um único modelo ou exibição, a solicitação será funcionalmente equivalente a uma solicitação que contenha um campo de nível superior A vantagem de usar |
|
Nome totalmente qualificado da exibição semântica. Por exemplo: {
/* ... */
"semantic_view": "MY_DB.MY_SCHEMA.SEMANTIC_VIEW"
/* ... */
}
Se o nome diferenciar maiúsculas de minúsculas ou contiver caracteres que não são permitidos em um identificador sem aspa, você deverá colocar o nome entre aspas duplas com o caractere de escape de barra invertida. Por exemplo, se o nome do banco de dados, nome do esquema e nome da exibição incluírem hífens ( {
/* ... */
"semantic_view": "\"my-database\".\"my-schema\".\"\"my-semantic-view\"\""
/* ... */
}
Para especificar várias exibições semânticas, use o campo Tipo: cadeia de caracteres |
|
(Opcional) Se definido como Tipo: booliano |
Importante
Você deve especificar um dos seguintes campos no corpo da solicitação:
semantic_model_file
semantic_model
semantic_models
semantic_view
Exemplo de especificação de um modelo semântico em um arquivo em um estágio¶
{
"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"
}
Exemplo de especificação de uma exibição semântica¶
{
"messages": [
{
"role": "user",
"content": [
{
"type": "text",
"text": "which company had the most revenue?"
}
]
}
],
"semantic_view": "MY_DB.MY_SCH.MY_SEMANTIC_VIEW"
}
Resposta sem streaming¶
Essa operação pode retornar os códigos de resposta listados abaixo. A resposta sempre tem a seguinte estrutura. Atualmente, três tipos de conteúdo são suportados para a resposta, text
, suggestion
e sql
. Os tipos de conteúdo suggestion
e sql
são mutuamente exclusivos, de modo que, se a resposta contiver um tipo de conteúdo sql
, ela não conterá um tipo de conteúdo suggestion
e vice-versa. O tipo de conteúdo suggestion
só é incluído em uma resposta se a pergunta do usuário for ambígua e Cortex Analyst não puder retornar uma instrução para essa consulta SQL.
Quando a solicitação contém um campo semantic_models
, a resposta inclui um campo semantic_model_selection
que indica qual modelo semântico foi escolhido para a solicitação.
Para garantir a compatibilidade futura, certifique-se de que sua implementação leve em conta o tipo de conteúdo e trate os tipos.
Código |
Descrição |
---|---|
200 |
A instrução foi executada com sucesso. O corpo da resposta contém um objeto de mensagem que contém os seguintes campos:
|
Por padrão, a resposta é retornada de uma só vez depois que o Cortex Analyst tiver processado totalmente a pergunta do usuário. Consulte Resposta de streaming para saber o formato das respostas do modo de streaming.
{ "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" } }
Resposta de streaming¶
O modo streaming permite que o cliente receba respostas à medida que são geradas pelo Cortex Analyst, em vez de esperar que toda a resposta seja gerada. Isso melhora a percepção da capacidade de resposta de seu aplicativo, especialmente para consultas de longa duração, porque os usuários começam a ver a saída muito antes. As respostas de streaming também fornecem informações de status que podem ajudá-lo a entender onde o Cortex Analyst está no processo de geração de uma resposta e avisos que podem ajudar a entender o que deu errado quando o Cortex Analyst não funciona como o esperado.
Para receber uma resposta de streaming, defina o campo stream
no corpo da solicitação como true
. As respostas de streaming usam os eventos enviados pelo servidor.
O Cortex Analyst envia cinco tipos distintos de eventos em uma resposta de streaming:
status
: transmite atualizações de status sobre o processo de geração SQL.message.content.delta
: contém uma parte da resposta. Esse evento é enviado várias vezes.error
: indica que o Cortex Analyst encontrou um erro e não pode continuar processando a solicitação. Nenhum outro eventomessage.content.delta
será enviado.warnings
: contém todos os avisos encontrados durante o processamento. Os avisos não interrompem o processamento.response_metadata
: enviado no final de uma resposta para exibir dados sobre o processamento da solicitação.done
: enviado para indicar que o processamento foi concluído e que nenhum outro eventomessage.content.delta
será enviado.
Desses, os eventos message.content.delta
são os mais importantes para entender, pois contêm o conteúdo real da resposta. Cada delta
contém tokens de algum campo da resposta completa. É possível que cada evento delta
contenha desde um único caractere até a resposta completa, e eles podem ter comprimentos diferentes. Você recebe esses tokens à medida que eles são gerados; cabe a ele reuni-los na resposta final.
Importante
Os eventos de diferentes respostas (mesmo as extremamente semelhantes) podem variar. Não há garantia de que os eventos serão enviados na mesma ordem ou com o mesmo conteúdo.
Exemplo simples¶
A seguir, uma amostra de resposta sem streaming para uma consulta simples:
{
"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"
}
]
}
}
E essa é uma série possível de eventos de streaming para essa resposta (uma série diferente de eventos também é possível):
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" }
Use o campo index
nas respostas message.content.delta
para determinar de qual campo da resposta completa o evento faz parte. Por exemplo, aqui os dois primeiros eventos delta
usam o índice 0, o que significa que eles fazem parte do primeiro campo (elemento 0) na matriz content
da resposta sem fluxo. Da mesma forma, o evento delta
que contém a resposta SQL usa o índice 1.
Exemplo com sugestões¶
Este exemplo contém perguntas sugeridas para uma pergunta ambígua. A seguir, a resposta sem 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?"
]
}
]
}
}
E aqui está uma possível série de eventos de fluxo contínuo que constituem essa resposta:
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" }
Neste exemplo, o campo de content
da resposta sem fluxo é uma matriz. Um dos elementos de content
é a matriz suggestions
. Portanto, o significado dos campos index
para os eventos delta text
e suggestions
refere-se ao local dos elementos nessas duas matrizes diferentes. Você precisará acompanhar esses índices separadamente ao montar a resposta completa.
Nota
Atualmente, a instrução SQL gerada é sempre enviada em um único evento. Isso pode não ser o caso no futuro. Seu cliente deve estar preparado para receber a instrução SQL em vários eventos.
Outros exemplos¶
Você pode encontrar um cliente de streaming Streamlit para Cortex Analyst no repositório |cortex-analyst| do GitHub. Essa demonstração deve ser executada localmente; o SiS não oferece suporte a streaming no momento.
Consulte o playground do Cortex Analyst no AI/ML Studio (no Snowsight) para obter uma demonstração interativa da resposta de streaming.
Esquemas de eventos de streaming¶
A seguir, os esquemas OpenAPI/Swagger dos eventos enviados pelo Cortex Analyst em uma resposta de streaming.
- status
- message.content.delta
- erro
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
- warnings
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
- response_metadata
ResponseMetadata: type: object description: Details about request processing
Envie feedback¶
POST /api/v2/cortex/analyst/feedback
Fornece feedback qualitativo ao usuário final. No Snowsight, o feedback é mostrado em Semantic Model Admins em Monitoring.
Cabeçalhos de solicitação¶
Cabeçalho |
Descrição |
---|---|
|
Token de autorização (obrigatório). Para obter mais informações, consulte Autenticação no servidor. |
|
Aplicativo/json (obrigatório) |
Corpo da solicitação¶
Campo |
Descrição |
---|---|
|
(Obrigatório) O ID da solicitação que você fez para enviar uma mensagem. Retornado no campo Tipo: cadeia de caracteres Exemplo: |
|
(Obrigatório) Se o feedback é positivo ou negativo. Tipo: booliano Exemplo:
|
|
(Opcional) A mensagem de feedback do usuário. Exemplo: |
Resposta¶
Corpo de resposta vazio com código de status 200.
Requisitos de controle de acesso¶
Para obter informações sobre os privilégios necessários, consulte Requisitos de controle de acesso.
Para obter detalhes sobre a autenticação na API, consulte Autenticando o Snowflake REST APIs com Snowflake.