Cortex Analyst REST API

자연어 쿼리로 데이터에 대한 질문에 답하려면 이 API를 사용합니다.

메시지 보내기

POST /api/v2/cortex/analyst/message

요청에 제공된 의미 체계 모델 또는 의미 체계 뷰 를 사용하여 지정된 질문에 대한 SQL 쿼리를 생성합니다. 1개 이상의 모델을 지정할 수 있으며, 여러 모델을 지정하면 Cortex Analyst 가 가장 적합한 모델을 선택합니다. 이전 쿼리를 기반으로 후속 질문을 할 수 있는 멀티턴 대화를 할 수 있습니다. 자세한 내용은 Cortex Analyst 에서의 멀티 턴 대화 섹션을 참조하십시오.

요청에는 사용자 질문이 포함되며, 응답에는 사용자 질문과 애널리스트 응답이 포함됩니다. 응답의 각 메시지에는 다양한 유형의 여러 내용 블록이 포함될 수 있습니다. 현재 내용 오브젝트의 text 필드에 지원되는 3개 값은 type, suggestions, sql 입니다.

응답은 처리가 완료된 후 한꺼번에 전송하거나 생성되는 대로 순차적으로 전송할 수 있습니다.

헤더 요청

헤더

설명

Authorization

(필수) 승인 토큰. 자세한 내용은 서버에 인증하기 섹션을 참조하십시오.

Content-Type

(필수) 애플리케이션/json

X-Snowflake-Authorization-Token-Type

(선택 사항) 승인 토큰 유형. 기본값은 OAuth 입니다. 자세한 내용은 서버에 인증하기 섹션을 참조하십시오.

요청 본문

요청 본문에서:

  • 마지막 messages[].role 필드를 화자의 역할(user 여야 함)로 설정합니다.

  • content 오브젝트에 사용자의 질문을 포함합니다. 이 오브젝트에서:

    • typetext 으로 설정합니다.

    • text 를 사용자의 질문으로 설정합니다.

  • 다음 중 하나를 포함하십시오.

    • YAML 의 의미 체계 모델 사양.

    • 의미 체계 모델 사양이 포함된 YAML 파일의 경로. 이 파일은 스테이지에 있어야 합니다.

    • 의미 체계 뷰의 이름입니다.

다음 테이블에서는 요청 본문에서 설정할 수 있는 필드에 대해 설명합니다.

필드

설명

messages[].role

(필수) 메시지를 생성하는 엔터티의 역할. 현재는 user 만 지원합니다.

유형: 문자열:열거형

예: user

messages[].content[]

(필수) 메시지의 일부인 내용 오브젝트.

유형: 오브젝트

예:

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

messages[].content[].type

(필수) 내용 유형. 현재는 text 만 지원됩니다.

유형: 문자열:열거형

예: text

messages[].content[].text

(필수) 사용자의 질문.

유형: 문자열

예: Which company had the most revenue?

semantic_model_file

의미 체계 모델 YAML 파일의 경로. 데이터베이스 및 스키마를 포함하여 완전히 정규화된 스테이지 URL이어야 합니다.

여러 의미 체계 모델을 지정하려면 semantic_models 필드를 사용합니다.

대신 요청에 YAML 사양을 직접 제공하려면 semantic_model 필드를 의미 체계 모델에 대한 YAML 사양으로 설정하십시오.

유형: 문자열

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

semantic_model

전체 의미 체계 모델 YAML을 포함하는 문자열.

여러 의미 체계 모델을 지정하려면 semantic_models 필드를 대신 사용하십시오.

대신 파일에서 YAML 사양을 가리키려면 파일을 스테이지에 업로드하고 semantic_model_file 필드를 파일 경로로 설정합니다.

유형: 문자열

semantic_models

semantic_model_file 또는 semantic_view 필드를 포함하는 JSON 오브젝트가 포함된 배열입니다.

이러한 필드는 최상위 수준인 semantic_model_filesemantic_view 필드와 동일한 의미를 갖습니다.

  • semantic_model_file 는 스테이지에 저장된 YAML 파일에 의미 체계 모델 정의가 포함된 파일을 지정합니다. (이 양식의 요청에 의미 체계 모델에 대한 YAML 을 직접 지정할 수 없습니다.)

  • semantic_view의미 체계 뷰 의 정규화된 이름을 지정합니다. 예:

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

각 쿼리에 대해 Cortex Analyst 목록에서 가장 적합한 모델 또는 뷰를 선택합니다.

이 기능은 Cortex Analyst 와의 사용자 상호 작용을 간소화합니다. 쿼리할 데이터 소스를 선택할 필요도 없고, 각각에 사용할 의미 체계 모델이나 의미 체계 뷰를 추적할 필요도 없습니다. 각 쿼리에 모든 모델 또는 뷰를 지정하고 Cortex Analyst 가 어떤 쿼리를 사용할지 알아서 결정하도록 하십시오.

유형: 배열

Cortex Analyst 는 2개 이상의 모델 또는 뷰를 지정할 것을 요구하지 않습니다. 단일 모델 또는 뷰를 지정하는 경우 요청은 최상위 수준 semantic_model_file 또는 semantic_view 필드를 포함하는 요청과 기능적으로 동일합니다.

단일 모델 요청에 semantic_models 을 사용하면 모델이나 뷰 수에 관계없이 동일한 클라이언트 코드를 사용할 수 있다는 장점이 있습니다.

semantic_view

의미 체계 뷰 의 정규화된 이름. 예:

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

이름이 대/소문자를 구분하거나 따옴표로 묶지 않은 식별자 에 허용되지 않는 문자를 포함하는 경우 이름을 백슬래시 이스케이프 큰따옴표로 묶어야 합니다. 예를 들어, 데이터베이스 이름, 스키마 이름 및 뷰 이름에 하이픈(my-database.my-schema.my-semantic-view)이 포함된 경우입니다.

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

여러 개의 의미 체계 뷰를 지정하려면 semantic_models 필드를 사용합니다.

유형: 문자열

stream

(선택 사항) true 로 설정하면 응답이 생성될 때 서버 전송 이벤트 를 사용하여 클라이언트로 스트리밍됩니다(스트림 응답 참조). 그렇지 않으면 Cortex Analyst 가 사용자의 질문을 완전히 처리한 후에 전체 응답이 반환됩니다.

유형: 부울

중요

요청 본문에서 다음 필드 중 하나를 지정해야 합니다.

  • semantic_model_file

  • semantic_model

  • semantic_models

  • semantic_view

스테이지의 파일에 의미 체계 모델을 지정하는 예제

{
    "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

의미 체계 뷰 지정 예시

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

스트림이 아닌 응답

이 작업은 아래 나열된 응답 코드를 반환할 수 있습니다. 응답은 항상 다음과 같은 구조를 갖습니다. 현재 응답에는 text, suggestion, sql 의 세 가지 내용 유형이 지원됩니다. 내용 유형 suggestionsql 은 상호 배타적이므로 응답에 sql 내용 유형이 포함되어 있으면 suggestion 내용 유형이 포함되지 않으며 그 반대도 동일합니다. suggestion 내용 유형은 사용자 질문이 모호하고 Cortex Analyst 가 해당 쿼리에 대해 SQL 문을 반환할 수 없는 경우에만 응답에 포함됩니다.

요청에 semantic_models 필드가 포함된 경우 응답에는 요청에 대해 어떤 의미 체계 모델이 선택되었는지를 나타내는 semantic_model_selection 필드가 포함됩니다.

이전 버전과의 호환성을 보장하려면 구현에서 콘텐츠 유형을 고려하고 해당 유형을 처리해야 합니다.

코드

설명

200

문이 성공적으로 실행되었습니다.

응답 본문에는 다음 필드가 포함된 메시지 오브젝트가 포함되어 있습니다.

  • message: 사용자와 분석가 간의 대화 메시지입니다.

  • message (오브젝트): 채팅 내의 메시지를 나타냅니다.

  • message.role (문자열:열거형): 메시지를 생성한 엔터티입니다. user 또는 analyst 중 하나입니다.

  • message.content[] (오브젝트): 메시지의 일부인 내용 오브젝트입니다.

  • message.content[].type (문자열:열거형): 메시지의 내용 유형입니다. text, suggestion 또는 sql 중 하나입니다.

  • message.content[].text (문자열): 내용의 텍스트입니다. 내용 유형 text 에 대해서만 반환됩니다.

  • message.content[].statement (문자열): SQL 문입니다. 내용 유형 sql 에 대해서만 반환됩니다.

  • message.content[].confidence (object): 신뢰도 관련 정보를 포함합니다. sql 콘텐츠 유형에 대해서만 반환됩니다.

  • message.content[].confidence.verified_query_used (object): SQL 응답 생성에 사용된 검증된 쿼리 리포지토리에서 검증된 쿼리를 나타냅니다. 확인된 쿼리가 사용되지 않은 경우 필드 값은 null 입니다.

  • message.content[].confidence.verified_query_used.name (string): 사용된 검증된 쿼리의 이름으로, 검증된 쿼리 리포지토리에서 추출한 이름입니다.

  • message.content[].confidence.verified_query_used.question (string): 검증된 쿼리 리포지토리에서 추출한 검증된 쿼리가 답변한 질문입니다.

  • message.content[].confidence.verified_query_used.sql (string): 사용된 검증된 쿼리의 SQL 문으로, 검증된 쿼리 리포지토리에서 추출한 것입니다.

  • message.content[].confidence.verified_query_used.verified_at (정수): 쿼리가 확인될 때의 타임스탬프를 숫자로 표현한 것으로, 확인된 쿼리 리포지토리에서 추출합니다.

  • message.content[].confidence.verified_query_used.verified_by (string): 검증된 쿼리 리포지토리에서 추출한 쿼리를 검증한 사람입니다.

  • message.content[].suggestions (문자열): SQL을 생성할 수 없는 경우 의미 체계 모델에서 SQL을 생성할 수 있는 질문 목록입니다. 내용 유형 suggestion 에 대해서만 반환됩니다.

  • warnings : 사용자의 요청에 대한 분석가의 경고 목록입니다.

  • warnings[].message (string): 하나의 개별 경고에 대한 자세한 설명을 포함합니다.

  • response_metadata (오브젝트): 응답 생성 세부 정보가 포함된 메타데이터입니다.

  • response_metadata.model_names: 응답을 생성하는 데 사용되는 모델 목록입니다.

  • response_metadata.cortex_search_retrieval (오브젝트): Cortex Search로 확인된 엔터티입니다.

  • response_metadata.question_category (문자열): 요청의 질문이 분류되는 방식입니다.

기본적으로 응답은 Cortex Analyst 가 사용자의 질문을 완전히 처리한 후에 한꺼번에 반환됩니다. 스트림 모드 응답 형식은 스트림 응답 섹션을 참조하십시오.

{
    "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

스트림 응답

스트림 모드를 사용하면 전체 응답이 생성될 때까지 기다리지 않고 Cortex Analyst 가 생성되는 대로 클라이언트가 응답을 받을 수 있습니다. 이렇게 하면 사용자가 출력을 훨씬 더 빨리 보기 시작하므로 특히 오래 실행되는 쿼리의 경우 애플리케이션의 응답 속도가 향상됩니다. 또한 스트림 응답은 응답을 생성하는 과정에서 Cortex Analyst 의 현재 위치를 파악하는 데 도움이 되는 상태 정보와 Cortex Analyst 가 예상대로 작동하지 않을 때 무엇이 잘못되었는지 파악하는 데 도움이 되는 경고를 제공합니다.

스트림 응답을 받으려면 요청 본문의 stream 필드를 true 로 설정합니다. 스트리밍 응답은 서버 전송 이벤트 를 사용합니다.

Cortex Analyst 는 5가지 유형의 이벤트를 스트림 응답으로 전송합니다.

  • status: SQL 생성 프로세스에 대한 상태 업데이트를 전달합니다.

  • message.content.delta: 응답의 일부를 포함합니다. 이 이벤트는 여러 번 발송됩니다.

  • error: Cortex Analyst 에 오류가 발생하여 요청을 계속 처리할 수 없음을 나타냅니다. 더 이상 message.content.delta 이벤트가 전송되지 않습니다.

  • warnings: 처리 중 발생하는 모든 경고를 포함합니다. 경고는 처리를 중단하지 않습니다.

  • response_metadata: 요청 처리에 대한 데이터를 표시하기 위해 응답이 끝날 때 전송됩니다.

  • done: 처리가 완료되었으며 더 이상 message.content.delta 이벤트가 전송되지 않음을 알리기 위해 전송됩니다.

이 중 message.content.delta 이벤트는 실제 응답 내용을 담고 있기 때문에 이해해야 할 가장 중요한 이벤트입니다. 각 delta 에는 전체 응답의 일부 필드에서 토큰이 포함되어 있습니다. 각 delta 이벤트는 한 글자부터 전체 응답까지 포함할 수 있으며, 길이가 다를 수 있습니다. 토큰이 생성될 때 토큰을 받게 되며, 이를 최종 응답으로 조합하는 것은 사용자의 몫입니다.

중요

서로 다른 응답(심지어 매우 유사한 응답)으로 인한 이벤트는 다양할 수 있습니다. 이벤트가 동일한 순서 또는 동일한 내용으로 발송된다는 보장은 없습니다.

간단한 예

다음은 간단한 쿼리에 대한 스트림이 아닌 샘플 응답입니다.

{
    "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

그리고 이는 해당 응답에 대해 가능한 일련의 스트리밍 이벤트 중 하나입니다(다른 일련의 이벤트도 가능합니다):

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" }

message.content.delta 응답의 index 필드를 사용하여 이벤트가 전체 응답의 어느 필드에 속하는지 확인합니다. 예를 들어, 여기서 처음 2개의 delta 이벤트는 인덱스 0을 사용하며, 이는 비스트리밍 응답의 content 배열에서 첫 번째 필드(요소 0)의 일부임을 의미합니다. 마찬가지로, SQL 응답을 포함하는 delta 이벤트는 인덱스 1을 사용합니다.

추천의 예

이 예에는 모호한 질문에 대한 추천 질문이 포함되어 있습니다. 다음은 스트림이 아닌 응답입니다.

{
    "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

그리고 그 응답을 구성하는 일련의 스트리밍 이벤트는 다음과 같습니다.

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" }

이 예제에서 비스트리밍 응답의 content 필드는 배열입니다. content 의 요소 중 하나는 suggestions 배열입니다. 따라서 textsuggestions 델타 이벤트에 대한 index 필드의 의미는 이 2개의 서로 다른 배열에 있는 요소의 위치를 나타냅니다. 전체 응답을 수집할 때 이러한 인덱스를 별도로 추적해야 합니다.

참고

현재 생성된 SQL 문은 항상 단일 이벤트로 전송됩니다. 향후에는 그렇지 않을 수도 있습니다. 클라이언트는 여러 이벤트에서 SQL 문을 수신할 수 있도록 준비해야 합니다.

기타 예제

Cortex Analyst GitHub 저장소 에서 Cortex Analyst 용 Streamlit 스트리밍 클라이언트를 찾을 수 있습니다. 이 데모는 로컬에서 실행해야 하며 SiS 는 현재 스트림을 지원하지 않습니다.

스트림 응답에 대한 대화형 데모를 보려면 AI/ML Studio(Snowsight 내)의 Cortex Analyst Playground를 참조하십시오.

스트리밍 이벤트 스키마

다음은 Cortex Analyst 가 스트리밍 응답으로 보낸 이벤트의 OpenAPI/Swagger 스키마입니다.

status
message.content.delta
오류
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
경고
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

피드백 보내기

POST /api/v2/cortex/analyst/feedback

정성적인 최종 사용자 피드백을 제공합니다. Snowsight 내에서 피드백은 Monitoring 아래의 Semantic Model Admins 에 표시됩니다.

헤더 요청

헤더

설명

Authorization

(필수) 승인 토큰. 자세한 내용은 서버에 인증하기 섹션을 참조하십시오.

Content-Type

(필수) 애플리케이션/json

요청 본문

필드

설명

request_id

(필수) 메시지를 보내기 위해 요청한 요청의 ID입니다. /api/v2/cortex/analyst/messagerequest_id 필드에 반환됩니다. 자세한 내용은 스트림이 아닌 응답 섹션을 참조하십시오.

유형: 문자열

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

positive

(요구 사항) 피드백이 긍정적인지 부정적인지 여부(긍정 또는 ‘좋아요’의 경우 true, 부정 또는 ‘싫어요’의 경우 false).

유형: 부울

예:

true

feedback_message

(선택 사항) 사용자의 피드백 메시지입니다.

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

응답

상태 코드 200의 빈 응답 본문입니다.

액세스 제어 요구 사항

요구 사항에 대한 자세한 내용은 액세스 제어 요구 사항 섹션을 참조하십시오.

API 인증에 대한 자세한 내용은 Snowflake를 사용하여 Snowflake REST APIs 인증하기 섹션을 참조하십시오.