Cortex Analyst REST API¶
자연어 쿼리로 데이터에 대한 질문에 답하려면 이 API를 사용합니다.
메시지 보내기¶
POST /api/v2/cortex/analyst/message
요청에 제공된 의미 체계 모델 또는 의미 체계 뷰 를 사용하여 지정된 질문에 대한 SQL 쿼리를 생성합니다. 1개 이상의 모델을 지정할 수 있으며, 여러 모델을 지정하면 Cortex Analyst 가 가장 적합한 모델을 선택합니다. 이전 쿼리를 기반으로 후속 질문을 할 수 있는 멀티턴 대화를 할 수 있습니다. 자세한 내용은 Cortex Analyst 에서의 멀티 턴 대화 섹션을 참조하십시오.
요청에는 사용자 질문이 포함되며, 응답에는 사용자 질문과 애널리스트 응답이 포함됩니다. 응답의 각 메시지에는 다양한 유형의 여러 내용 블록이 포함될 수 있습니다. 현재 내용 오브젝트의 text
필드에 지원되는 3개 값은 type
, suggestions
, sql
입니다.
응답은 처리가 완료된 후 한꺼번에 전송하거나 생성되는 대로 순차적으로 전송할 수 있습니다.
헤더 요청¶
헤더 |
설명 |
---|---|
|
(필수) 승인 토큰. 자세한 내용은 서버에 인증하기 섹션을 참조하십시오. |
|
(필수) 애플리케이션/json |
|
(선택 사항) 승인 토큰 유형. 기본값은 OAuth 입니다. 자세한 내용은 서버에 인증하기 섹션을 참조하십시오. |
요청 본문¶
요청 본문에서:
마지막
messages[].role
필드를 화자의 역할(user
여야 함)로 설정합니다.content
오브젝트에 사용자의 질문을 포함합니다. 이 오브젝트에서:type
를text
으로 설정합니다.text
를 사용자의 질문으로 설정합니다.
다음 중 하나를 포함하십시오.
YAML 의 의미 체계 모델 사양.
의미 체계 모델 사양이 포함된 YAML 파일의 경로. 이 파일은 스테이지에 있어야 합니다.
의미 체계 뷰의 이름입니다.
다음 테이블에서는 요청 본문에서 설정할 수 있는 필드에 대해 설명합니다.
필드 |
설명 |
---|---|
|
(필수) 메시지를 생성하는 엔터티의 역할. 현재는 유형: 문자열:열거형 예: |
|
(필수) 메시지의 일부인 내용 오브젝트. 유형: 오브젝트
|
|
(필수) 내용 유형. 현재는 유형: 문자열:열거형 예: |
|
(필수) 사용자의 질문. 유형: 문자열 예: |
|
의미 체계 모델 YAML 파일의 경로. 데이터베이스 및 스키마를 포함하여 완전히 정규화된 스테이지 URL이어야 합니다. 여러 의미 체계 모델을 지정하려면 대신 요청에 YAML 사양을 직접 제공하려면 유형: 문자열 예: |
|
전체 의미 체계 모델 YAML을 포함하는 문자열. 여러 의미 체계 모델을 지정하려면 대신 파일에서 YAML 사양을 가리키려면 파일을 스테이지에 업로드하고 유형: 문자열 |
|
이러한 필드는 최상위 수준인
각 쿼리에 대해 Cortex Analyst 목록에서 가장 적합한 모델 또는 뷰를 선택합니다. 이 기능은 Cortex Analyst 와의 사용자 상호 작용을 간소화합니다. 쿼리할 데이터 소스를 선택할 필요도 없고, 각각에 사용할 의미 체계 모델이나 의미 체계 뷰를 추적할 필요도 없습니다. 각 쿼리에 모든 모델 또는 뷰를 지정하고 Cortex Analyst 가 어떤 쿼리를 사용할지 알아서 결정하도록 하십시오. 유형: 배열 팁 Cortex Analyst 는 2개 이상의 모델 또는 뷰를 지정할 것을 요구하지 않습니다. 단일 모델 또는 뷰를 지정하는 경우 요청은 최상위 수준 단일 모델 요청에 |
|
의미 체계 뷰 의 정규화된 이름. 예: {
/* ... */
"semantic_view": "MY_DB.MY_SCHEMA.SEMANTIC_VIEW"
/* ... */
}
이름이 대/소문자를 구분하거나 따옴표로 묶지 않은 식별자 에 허용되지 않는 문자를 포함하는 경우 이름을 백슬래시 이스케이프 큰따옴표로 묶어야 합니다. 예를 들어, 데이터베이스 이름, 스키마 이름 및 뷰 이름에 하이픈( {
/* ... */
"semantic_view": "\"my-database\".\"my-schema\".\"\"my-semantic-view\"\""
/* ... */
}
여러 개의 의미 체계 뷰를 지정하려면 유형: 문자열 |
|
(선택 사항) 유형: 부울 |
중요
요청 본문에서 다음 필드 중 하나를 지정해야 합니다.
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"
}
의미 체계 뷰 지정 예시¶
{
"messages": [
{
"role": "user",
"content": [
{
"type": "text",
"text": "which company had the most revenue?"
}
]
}
],
"semantic_view": "MY_DB.MY_SCH.MY_SEMANTIC_VIEW"
}
스트림이 아닌 응답¶
이 작업은 아래 나열된 응답 코드를 반환할 수 있습니다. 응답은 항상 다음과 같은 구조를 갖습니다. 현재 응답에는 text
, suggestion
, sql
의 세 가지 내용 유형이 지원됩니다. 내용 유형 suggestion
및 sql
은 상호 배타적이므로 응답에 sql
내용 유형이 포함되어 있으면 suggestion
내용 유형이 포함되지 않으며 그 반대도 동일합니다. suggestion
내용 유형은 사용자 질문이 모호하고 Cortex Analyst 가 해당 쿼리에 대해 SQL 문을 반환할 수 없는 경우에만 응답에 포함됩니다.
요청에 semantic_models
필드가 포함된 경우 응답에는 요청에 대해 어떤 의미 체계 모델이 선택되었는지를 나타내는 semantic_model_selection
필드가 포함됩니다.
이전 버전과의 호환성을 보장하려면 구현에서 콘텐츠 유형을 고려하고 해당 유형을 처리해야 합니다.
코드 |
설명 |
---|---|
200 |
문이 성공적으로 실행되었습니다. 응답 본문에는 다음 필드가 포함된 메시지 오브젝트가 포함되어 있습니다.
|
기본적으로 응답은 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" } }
스트림 응답¶
스트림 모드를 사용하면 전체 응답이 생성될 때까지 기다리지 않고 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"
}
]
}
}
그리고 이는 해당 응답에 대해 가능한 일련의 스트리밍 이벤트 중 하나입니다(다른 일련의 이벤트도 가능합니다):
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?"
]
}
]
}
}
그리고 그 응답을 구성하는 일련의 스트리밍 이벤트는 다음과 같습니다.
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
배열입니다. 따라서 text
및 suggestions
델타 이벤트에 대한 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
- 경고
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
피드백 보내기¶
POST /api/v2/cortex/analyst/feedback
정성적인 최종 사용자 피드백을 제공합니다. Snowsight 내에서 피드백은 Monitoring 아래의 Semantic Model Admins 에 표시됩니다.
헤더 요청¶
헤더 |
설명 |
---|---|
|
(필수) 승인 토큰. 자세한 내용은 서버에 인증하기 섹션을 참조하십시오. |
|
(필수) 애플리케이션/json |
요청 본문¶
필드 |
설명 |
---|---|
|
(필수) 메시지를 보내기 위해 요청한 요청의 ID입니다. 유형: 문자열 예: |
|
(요구 사항) 피드백이 긍정적인지 부정적인지 여부(긍정 또는 ‘좋아요’의 경우 유형: 부울 예:
|
|
(선택 사항) 사용자의 피드백 메시지입니다. 예: |
응답¶
상태 코드 200의 빈 응답 본문입니다.
액세스 제어 요구 사항¶
요구 사항에 대한 자세한 내용은 액세스 제어 요구 사항 섹션을 참조하십시오.
API 인증에 대한 자세한 내용은 Snowflake를 사용하여 Snowflake REST APIs 인증하기 섹션을 참조하십시오.