Cortex Analyst

개요

Cortex Analyst 는 완전 관리형 LLM 기반 Snowflake Cortex 기능으로, Snowflake의 정형 데이터를 기반으로 비즈니스 질문에 신뢰할 수 있는 답변을 제공할 수 있는 애플리케이션을 구축할 수 있도록 도와줍니다. Cortex Analyst 를 사용하면 비즈니스 사용자는 SQL을 작성하지 않고도 자연어로 질문하고 직접 답변을 받을 수 있습니다. 편리한 REST API로 제공되는, Cortex Analyst 는 모든 애플리케이션에 원활하게 통합할 수 있습니다.

프로덕션 등급 대화형 셀프 서비스 분석 솔루션을 구축하려면 정확한 텍스트-SQL 응답을 생성하는 서비스가 필요합니다. 대부분의 팀에게 정확도, 지연 시간, 비용의 균형을 성공적으로 맞추는 서비스를 개발하는 것은 어려운 작업입니다. Cortex Analyst 는 이러한 모든 복잡성을 처리하고 매우 정확한 텍스트-SQL 응답을 생성하는 완전 관리형 정교한 에이전트 AI 시스템을 제공함으로써 이 프로세스를 간소화합니다. 비즈니스 팀에 매우 정교한 셀프 서비스 대화형 분석을 신속하게 제공하는 동시에 복잡한 RAG 솔루션 패턴, 모델 실험, GPU 용량 계획과 같은 시간 낭비를 피할 수 있습니다. 생성된 SQL 쿼리는 확장 가능한 Snowflake 엔진에 대해 실행되므로 업계 최고의 가격 성능과 낮은 총소유비용(TCO)을 보장합니다.

Cortex Analyst 를 빠르게 시작하고 싶으신가요? 자습서: Cortex Analyst를 사용한 시계열 수익 데이터에 대한 질문에 답하기 자습서를 사용해 보십시오.

주요 기능

  • 자연어 쿼리를 통한 셀프 서비스 분석. Snowflake의 정형 데이터에서 즉각적인 답변을 받고 이해하여 비즈니스 팀과 비전문 사용자에게 만족감을 선사할 수 있습니다. Cortex Analyst 를 사용하면, 자연어로 질문하고 즉시 정확한 답변을 받을 수 있는 다운스트림 채팅 애플리케이션을 구축할 수 있습니다.

  • 기존 비즈니스 워크플로에 통합할 수 있는 편리한 REST API. Cortex Analyst 는 API 우선 접근법을 통해 최종 사용자 경험을 완벽하게 제어할 수 있습니다. 기존 비즈니스 도구 및 플랫폼에 Cortex Analyst 를 손쉽게 통합하여 Streamlit 앱, Slack, Teams, 사용자 지정 채팅 인터페이스 등 비즈니스 사용자가 이미 작업 중인 도구에 데이터 인사이트의 강력한 기능을 제공할 수 있습니다.

  • 최신 대규모 언어 모델 기반: 기본적으로 Cortex Analyst 는 Snowflake의 지능형 완전 관리형 AI 서비스인 Snowflake Cortex 내에서 안전하게 실행되는 최신 Meta Llama 및 Mistral 모델에 의해 구동됩니다. 선택 사항으로 Cortex Analyst 에 최신 Azure 호스팅 OpenAI GPT 모델에 대한 액세스 권한을 부여할 수도 있습니다. 런타임 시에 Cortex Analyst 는 각 쿼리에 대해 최고의 정확도와 성능을 보장하기 위해 최적의 모델 조합을 선택합니다. 자세한 내용은 Azure OpenAI 모델 사용 활성화하기 섹션을 참조하십시오. LLMs이 발전함에 따라 Snowflake는 성능과 정확도를 더욱 향상하기 위해 더 많은 모델을 추가할 수 있는 방법을 지속적으로 모색할 예정입니다.

  • 높은 정밀도와 정확도를 위한 의미 체계 모델: 일반 AI 솔루션의 경우 데이터베이스 스키마만 제공되면 스키마에 비즈니스 프로세스 정의 및 메트릭 처리와 같은 중요한 정보가 부족하기 때문에 텍스트-SQL 변환에 어려움을 겪는 경우가 많습니다. Cortex Analyst 는 비즈니스 사용자와 데이터베이스 사이의 간극을 메우는 의미 체계 모델 을 사용하여 이러한 한계를 극복합니다. 경량 YAML 파일로 캡처된 의미 체계 모델의 전체 구조와 개념은 데이터베이스 스키마와 유사하지만, 데이터에 대한 의미 체계에 대해 더 풍부한 설명을 제공할 수 있습니다.

  • 보안 및 거버넌스. Snowflake의 개인정보 보호 우선 기반과 엔터프라이즈급 보안을 통해 최고 수준의 개인정보 보호 및 거버넌스로 데이터가 보호되므로, 안심하고 AI 기반 사용 사례를 탐색할 수 있습니다.

    • Cortex Analyst 는 고객 데이터에 대한 훈련을 하지 않습니다. 당사는 고객 데이터를 사용하여 당사 고객 기반 전반에서 사용할 수 있는 모델을 훈련시키거나 세부조정을 수행하지 않습니다. 또한 추론을 위해 Cortex Analyst 는 의미 체계 모델 YAML 파일에 제공되는 메타데이터(예: 테이블 이름, 열 이름, 값 유형, 설명 등)를 SQL 쿼리를 생성하기 위한 용도로만 활용합니다. 그런 다음 이 SQL 쿼리는 Snowflake 가상 웨어하우스에서 실행되어 최종 출력을 생성합니다.

    • 데이터는 Snowflake의 거버넌스 경계 내에 유지됩니다. 기본적으로 Cortex Analyst 는 Mistral과 Meta의 Snowflake가 호스팅하는 LLMs으로 구동되므로 메타데이터 또는 프롬프트 등 어떤 데이터도 Snowflake의 거버넌스 경계를 벗어나지 않습니다. Azure OpenAI 모델을 사용하도록 선택하는 경우, 메타데이터 및 프롬프트만 Snowflake의 거버넌스 경계 외부로 전송됩니다.

    • Snowflake의 개인정보 보호 및 거버넌스 기능과의 완벽한 통합. Cortex Analyst 는 Snowflake의 역할 기반 액세스 제어(RBAC) 정책과 완벽하게 통합되어 생성 및 실행되는 SQL 쿼리가 설정된 모든 액세스 제어를 준수합니다. 이를 통해 강력한 데이터 보안 및 거버넌스가 보장됩니다.

액세스 제어 요구 사항

Cortex Analyst 를 의미 체계 모델과 함께 사용하려면 다음 권한이 필요합니다.

권한

오브젝트

USAGE

의미 체계 모델이 스테이지에 업로드된 경우 의미 체계 모델 YAML 파일이 포함된 스테이지입니다.

SELECT

의미 체계 모델에 정의된 테이블.

Cortex Analyst API에 대한 요청에는 인증 정보가 포함되어야 합니다. 이 항목의 예제에서는 세션 토큰을 사용하여 Snowflake 계정을 인증합니다.

리전 가용성

다음 리전에서는 Cortex Analyst 를 기본적으로 사용할 수 있습니다.

  • AWS ap-northeast-1(도쿄)

  • AWS ap-southeast-2(시드니)

  • AWS us-east-1(버지니아)

  • AWS us-west-2(오리건)

  • AWS eu-central-1(프랑크푸르트)

  • AWS eu-west-1(아일랜드)

  • Azure 동부 US 2(버지니아)

  • Azure 서유럽(네덜란드)

Snowflake 계정이 다른 클라우드 리전에 있는 경우에도 리전 간 추론 를 활용하여 Cortex Analyst 를 사용할 수 있습니다. 리전 간 추론이 활성화되면 Cortex Analyst 는 기본 리전에서 사용할 수 없는 모델에 대한 요청을 다른 리전에서 처리합니다. 최적의 성능을 위해 AWS US 리전과 함께 리전 간 추론을 구성합니다.

참고

Azure OpenAI 모델을 사용하도록 선택 하면 Gov 및 VPS 배포를 제외한 모든 AWS, Azure 및 GCP 리전에서 Cortex Analyst 를 사용할 수 있습니다.

알려진 문제 및 제한 사항

  • 의미 체계 모델 YAML 파일을 스테이지에 업로드하면 해당 의미 체계 모델에 대한 액세스는 해당 파일이 업로드된 스테이지에 대한 액세스로 제어됩니다. 즉, 스테이지에 액세스할 수 있는 모든 역할은 해당 역할이 기본 테이블에 액세스할 수 없더라도 해당 스테이지의 의미 체계 모델에 액세스할 수 있습니다.

  • 조인은 의미 체계 모델에서 직접 지원되지 않습니다. 대신, 미리 조인된 데이터가 포함된 뷰를 사용하십시오.

  • 기본적으로, Cortex Analyst 는 분당 20건의 요청으로 속도가 제한되며, 이는 개념 증명에는 충분합니다. 더 높은 한도를 요청하려면 영업 엔지니어에게 문의하십시오.

Azure OpenAI 모델 사용 활성화하기

기본적으로 Cortex Analyst 는 Snowflake가 호스팅하는 Cortex LLMs으로 구동됩니다. 그러나 명시적으로 Cortex Analyst 가 Microsoft Azure에서 호스팅하는 최신 OpenAI GPT 모델과 Snowflake에서 호스팅하는 모델을 함께 사용할 수 있도록 선택할 수 있습니다. 런타임 시에 Cortex Analyst 는 각 쿼리에 대해 최고의 정확도와 성능을 보장하기 위해 최적의 모델 조합을 선택합니다.

ENABLE_CORTEX_ANALYST_MODEL_AZURE_OPENAI 매개 변수를 사용하여 Azure OpenAI GPT 모델을 사용하도록 계정을 구성할 수 있습니다. 기본적으로 이 매개 변수는 비활성화되어 있으며 ACCOUNTADMIN 역할만 ALTER ACCOUNT 명령을 사용하여 설정할 수 있습니다.

USE ROLE ACCOUNTADMIN;

ALTER ACCOUNT SET ENABLE_CORTEX_ANALYST_MODEL_AZURE_OPENAI = TRUE;
Copy

이 매개 변수의 현재 값을 확인하려면 다음 SQL 문을 사용합니다.

SHOW PARAMETERS LIKE 'ENABLE_CORTEX_ANALYST_MODEL_AZURE_OPENAI' IN ACCOUNT
Copy

자세한 내용은 ENABLE_CORTEX_ANALYST_MODEL_AZURE_OPENAI 섹션을 참조하십시오.

이 매개 변수를 활성화하면 Cortex Analyst 는 다음의 조합으로 구동될 수 있습니다.

  • Snowflake 호스팅 모델, 현재 Mistral Large 및 Llama3 모델

  • Azure OpenAI 모델, 현재 GPT-4o(명시적 옵트인 필요)

참고

Cortex Analyst 는 향후 성능과 정확도를 더욱 개선하기 위해 다른 모델을 사용할 수 있습니다.

고려 사항

의미 체계 모델 파일은 메타데이터 로 분류됩니다. Cortex Analyst 에서 Azure OpenAI 모델을 사용하도록 선택하면 의미 체계 모델은 서드 파티인 Microsoft Azure에서 처리됩니다. 그러나 고객 데이터는 Azure와 공유되거나 처리되지 않습니다.

ENABLE_CORTEX_ANALYST_MODEL_AZURE_OPENAI

TRUE인 경우 ENABLE_CORTEX_ANALYST_MODEL_AZURE_OPENAI 계정 매개 변수 는 Cortex Analyst 가 Azure OpenAI 모델을 사용하도록 허용합니다.

매개 변수 유형

세션

데이터 타입

BOOLEAN

설명

Cortex Analyst 가 요청을 처리하는 데 Azure OpenAI 모델을 사용할 수 있는지 여부를 제어합니다.

  • FALSE: Cortex Analyst 는 요청을 처리할 때 Snowflake 호스팅 모델만 사용합니다.

  • TRUE: Cortex Analyst 는 요청을 처리하는 데 Snowflake 호스팅 모델 외에 Azure OpenAI 모델을 사용할 수 있습니다.

기본값

FALSE

Cortex Analyst 예제

다음 단계에 따라 Cortex Analyst 를 사용하는 대화형 Streamlit in Snowflake(SiS) 또는 독립 실행형 Streamlit 앱을 생성할 수 있습니다.

  1. 의미 체계 모델 만들기

  2. 의미 체계 모델을 스테이지 업로드

  3. Streamlit in Snowflake 앱 생성 및 실행

  4. Streamlit in Snowflake 앱과 상호 작용

의미 체계 모델 만들기

의미 체계 모델 은 데이터 세트에 대한 추가적인 의미 체계의 사양을 허용함으로써 비즈니스 사용자와 데이터베이스 정의 간의 언어 차이와 관련된 문제를 해결하는 경량 메커니즘입니다. 더 설명적인 이름이나 동의어와 같은 추가적인 의미 체계는 Cortex Analyst 가 데이터 질문에 훨씬 더 신뢰할 수 있는 답변을 제공할 수 있도록 합니다.

  1. Cortex Analyst 가 답변하기를 원하는 질문 목록부터 작성하십시오. 이를 바탕으로 의미 체계 모델에 대한 데이터 세트를 결정합니다.

  2. 사양 에 따라 의미 체계 모델 YAML을 생성합니다. 편의를 위해 의미 체계 모델 생성기 사용해 보십시오. 또한 의미 체계 모델 생성을 위한 팁 항목도 살펴보십시오.

의미 체계 모델 업로드

의미 체계 모델 YAML 파일을 스테이지 에 업로드하거나 요청 본문에 의미 체계 모델 YAML을 문자열로 전달할 수 있습니다. 의미 체계 모델 YAML을 스테이지에 업로드하면 해당 의미 체계 모델에 대한 액세스는 해당 파일이 업로드된 스테이지에 대한 액세스로 제어됩니다. 즉, 스테이지에 액세스할 수 있는 모든 역할은 해당 역할이 모델의 기반이 되는 테이블에 액세스할 수 없더라도 해당 스테이지의 의미 체계 모델에 액세스할 수 있습니다. 스테이지에 대한 액세스 권한이 부여된 역할이 해당 스테이지의 모든 의미 체계 모델에서 참조하는 모든 테이블에 대한 SELECT 액세스 권한이 있어야 합니다.

의미 체계 모델이 포함된 스테이지를 설정하는 방법에 대한 예는 다음과 같습니다. 한 스테이지(public)에는 조직의 모든 구성원이 액세스할 수 있는 반면, 다른 스테이지(sales)에는 sales_analyst 역할만 액세스할 수 있습니다.

스테이지에 대한 데이터베이스와 스키마를 생성합니다. 다음 예제에서는 이름이 definition 인 스키마가 있는 이름이 semantic_model 인 데이터베이스를 생성하지만, 이러한 이름에 유효한 식별자 문자열을 사용할 수 있습니다.

CREATE DATABASE semantic_model;
CREATE SCHEMA semantic_model.definitions;
GRANT USAGE ON DATABASE semantic_model TO ROLE PUBLIC;
GRANT USAGE ON SCHEMA semantic_model.definitions TO ROLE PUBLIC;

USE SCHEMA semantic_model.definitions;
Copy

그런 다음 의미 체계 모델을 저장하기 위한 스테이지를 생성합니다.

CREATE STAGE public DIRECTORY = (ENABLE = TRUE);
GRANT READ ON STAGE public TO ROLE PUBLIC;

CREATE STAGE sales DIRECTORY = (ENABLE = TRUE);
GRANT READ ON STAGE sales TO ROLE sales_analyst;
Copy

Snowsight를 사용하는 경우 페이지를 새로 고치고 데이터베이스 오브젝트 탐색기 에서 새로 생성된 스테이지를 찾을 수 있습니다. 새 탭에서 스테이지 페이지를 열고 Snowsight에서 YAML 파일을 업로드할 수 있습니다.

또는 Snowflake CLI 클라이언트 를 사용하여 로컬 파일 시스템에서 업로드할 수 있습니다.

snow stage copy file:///path/to/local/file.yaml @sales
Copy

Streamlit in Snowflake 만들기

이 예제는 자연어 질문을 입력으로 받아 공급자가 제공한 의미 체계에 따라 답변을 생성하기 위해 Cortex Analyst 를 호출하는 Streamlit in Snowflake 앱을 만드는 방법을 보여줍니다.

Snowflake에서 Streamlit 앱을 생성하고 실행하는 방법에 대한 자세한 내용은 Streamlit in Snowflake 정보 섹션을 참조하십시오.

  1. Snowsight 를 사용하여 Streamlit 앱 만들기 의 지시에 따라 Snowsight에서 새 Streamlit 앱을 생성합니다.

  2. 아래의 Streamlit 코드를 코드 편집기에 복사합니다.

  3. 자리 표시자 값을 사용자의 계정 세부 정보로 바꿉니다.

  4. 앱을 미리 보려면 Streamlit 미리보기 창에서 Run 을 선택하여 콘텐츠를 업데이트합니다.

from typing import Dict, List, Optional

import _snowflake
import json
import streamlit as st
import time
from snowflake.snowpark.context import get_active_session

DATABASE = "SNOWFLAKE_SEMANTIC_CONTEXT"
SCHEMA = "DEFINITIONS"
STAGE = "PUBLIC"
FILE = "revenue_timeseries.yaml"

def send_message(prompt: str) -> dict:
    """Calls the REST API and returns the response."""
    request_body = {
        "messages": [
            {
                "role": "user",
                "content": [
                    {
                        "type": "text",
                        "text": prompt
                    }
                ]
            }
        ],
        "semantic_model_file": f"@{DATABASE}.{SCHEMA}.{STAGE}/{FILE}",
    }

    resp = _snowflake.send_snow_api_request(
        "POST",
        f"/api/v2/cortex/analyst/message",
        {},
        {},
        request_body,
        {},
        30000,
    )

    if resp["status"] < 400:
        return json.loads(resp["content"])
    else:
        st.session_state.messages.pop()
        raise Exception(
            f"Failed request with status {resp['status']}: {resp}"
        )

def process_message(prompt: str) -> None:
    """Processes a message and adds the response to the chat."""
    st.session_state.messages.append(
        {"role": "user", "content": [{"type": "text", "text": prompt}]}
    )
    with st.chat_message("user"):
        st.markdown(prompt)
    with st.chat_message("assistant"):
        with st.spinner("Generating response..."):
            response = send_message(prompt=prompt)
            request_id = response["request_id"]
            content = response["message"]["content"]
            st.session_state.messages.append(
                {**response['message'], "request_id": request_id}
            )
            display_content(content=content, request_id=request_id)  # type: ignore[arg-type]


def display_content(
    content: List[Dict[str, str]],
    request_id: Optional[str] = None,
    message_index: Optional[int] = None,
) -> None:
    """Displays a content item for a message."""
    message_index = message_index or len(st.session_state.messages)
    if request_id:
        with st.expander("Request ID", expanded=False):
            st.markdown(request_id)
    for item in content:
        if item["type"] == "text":
            st.markdown(item["text"])
        elif item["type"] == "suggestions":
            with st.expander("Suggestions", expanded=True):
                for suggestion_index, suggestion in enumerate(item["suggestions"]):
                    if st.button(suggestion, key=f"{message_index}_{suggestion_index}"):
                        st.session_state.active_suggestion = suggestion
        elif item["type"] == "sql":
            display_sql(item["statement"])


@st.cache_data
def display_sql(sql: str) -> None:
    with st.expander("SQL Query", expanded=False):
        st.code(sql, language="sql")
    with st.expander("Results", expanded=True):
        with st.spinner("Running SQL..."):
            session = get_active_session()
            df = session.sql(sql).to_pandas()
            if len(df.index) > 1:
                data_tab, line_tab, bar_tab = st.tabs(
                    ["Data", "Line Chart", "Bar Chart"]
                )
                data_tab.dataframe(df)
                if len(df.columns) > 1:
                    df = df.set_index(df.columns[0])
                with line_tab:
                    st.line_chart(df)
                with bar_tab:
                    st.bar_chart(df)
            else:
                st.dataframe(df)


def show_conversation_history() -> None:
    for message_index, message in enumerate(st.session_state.messages):
        chat_role = "assistant" if message["role"] == "analyst" else "user"
        with st.chat_message(chat_role):
            display_content(
                content=message["content"],
                request_id=message.get("request_id"),
                message_index=message_index,
            )


def reset() -> None:
    st.session_state.messages = []
    st.session_state.suggestions = []
    st.session_state.active_suggestion = None


st.title("Cortex analyst")
st.markdown(f"Semantic Model: `{FILE}`")

if "messages" not in st.session_state:
    reset()

with st.sidebar:
    if st.button("Reset conversation"):
        reset()

show_conversation_history()

if user_input := st.chat_input("What is your question?"):
    process_message(prompt=user_input)

if st.session_state.active_suggestion:
    process_message(prompt=st.session_state.active_suggestion)
    st.session_state.active_suggestion = None
Copy

Streamlit 앱과 상호 작용

  1. 브라우저에서 Streamlit 앱으로 이동하거나 Streamlit in Snowflake 미리 보기 창으로 이동합니다.

  2. 자연어로 데이터에 대한 질문(예: “What questions can I ask?”)을 시작합니다.

독립 실행형 Streamlit 앱 만들기

위의 예제 코드를 사용하여 독립 실행형 앱을 생성할 수도 있습니다.

  1. Streamlit 을 설치합니다.

  2. 로컬에 analyst_api.py 라는 Python 파일을 생성합니다.

  3. 아래 Streamlit 코드를 파일에 복사합니다.

  4. 자리 표시자 값을 사용자의 계정 세부 정보로 바꿉니다.

  5. streamlit run analyst_api.py 를 사용하여 Streamlit 앱을 실행합니다.

다음 코드에 지정된 데이터베이스와 스키마는 의미 체계 모델 YAML 파일의 스테이지 위치입니다. Snowflake 커넥터에서 사용되는 역할은 의미 체계 모델에 정의된 기본 데이터에 액세스할 수 있어야 합니다.

from typing import Any, Dict, List, Optional

import pandas as pd
import requests
import snowflake.connector
import streamlit as st


HOST = "<host>"
DATABASE = "<database>"
SCHEMA = "<schema>"
STAGE = "<stage>"
FILE = "<file>"

if 'CONN' not in st.session_state or st.session_state.CONN is None:
    st.session_state.CONN = snowflake.connector.connect(
        user="<user>",
        password="<password>",
        account="<account>",
        host=HOST,
        port=443,
        warehouse="<warehouse>",
        role="<role>",
    )


def send_message(prompt: str) -> Dict[str, Any]:
    """Calls the REST API and returns the response."""
    request_body = {
        "messages": [{"role": "user", "content": [{"type": "text", "text": prompt}]}],
        "semantic_model_file": f"@{DATABASE}.{SCHEMA}.{STAGE}/{FILE}",
    }
    resp = requests.post(
        url=f"https://{HOST}/api/v2/cortex/analyst/message",
        json=request_body,
        headers={
            "Authorization": f'Snowflake Token="{st.session_state.CONN.rest.token}"',
            "Content-Type": "application/json",
        },
    )
    request_id = resp.headers.get("X-Snowflake-Request-Id")
    if resp.status_code < 400:
        return {**resp.json(), "request_id": request_id}  # type: ignore[arg-type]
    else:
        st.session_state.messages.pop()
        raise Exception(
            f"Failed request (id: {request_id}) with status {resp.status_code}: {resp.text}"
        )


def process_message(prompt: str) -> None:
    """Processes a message and adds the response to the chat."""
    st.session_state.messages.append(
        {"role": "user", "content": [{"type": "text", "text": prompt}]}
    )
    with st.chat_message("user"):
        st.markdown(prompt)
    with st.chat_message("assistant"):
        with st.spinner("Generating response..."):
            response = send_message(prompt=prompt)
            request_id = response["request_id"]
            content = response["message"]["content"]
            st.session_state.messages.append(
                {**response['message'], "request_id": request_id}
            )
            display_content(content=content, request_id=request_id)  # type: ignore[arg-type]


def display_content(
    content: List[Dict[str, str]],
    request_id: Optional[str] = None,
    message_index: Optional[int] = None,
) -> None:
    """Displays a content item for a message."""
    message_index = message_index or len(st.session_state.messages)
    if request_id:
        with st.expander("Request ID", expanded=False):
            st.markdown(request_id)
    for item in content:
        if item["type"] == "text":
            st.markdown(item["text"])
        elif item["type"] == "suggestions":
            with st.expander("Suggestions", expanded=True):
                for suggestion_index, suggestion in enumerate(item["suggestions"]):
                    if st.button(suggestion, key=f"{message_index}_{suggestion_index}"):
                        st.session_state.active_suggestion = suggestion
        elif item["type"] == "sql":
            display_sql(item["statement"])


@st.cache_data
def display_sql(sql: str) -> None:
    with st.expander("SQL Query", expanded=False):
        st.code(sql, language="sql")
    with st.expander("Results", expanded=True):
        with st.spinner("Running SQL..."):
            df = pd.read_sql(sql, st.session_state.CONN)
            if len(df.index) > 1:
                data_tab, line_tab, bar_tab = st.tabs(
                    ["Data", "Line Chart", "Bar Chart"]
                )
                data_tab.dataframe(df)
                if len(df.columns) > 1:
                    df = df.set_index(df.columns[0])
                with line_tab:
                    st.line_chart(df)
                with bar_tab:
                    st.bar_chart(df)
            else:
                st.dataframe(df)


def show_conversation_history() -> None:
    for message_index, message in enumerate(st.session_state.messages):
        chat_role = "assistant" if message["role"] == "analyst" else "user"
        with st.chat_message(chat_role):
            display_content(
                content=message["content"],
                request_id=message.get("request_id"),
                message_index=message_index,
            )


def reset() -> None:
    st.session_state.messages = []
    st.session_state.suggestions = []
    st.session_state.active_suggestion = None


st.title("Cortex analyst")
st.markdown(f"Semantic Model: `{FILE}`")

if "messages" not in st.session_state:
    reset()

with st.sidebar:
    if st.button("Reset conversation"):
        reset()

show_conversation_history()

if user_input := st.chat_input("What is your question?"):
    process_message(prompt=user_input)

if st.session_state.active_suggestion:
    process_message(prompt=st.session_state.active_suggestion)
    st.session_state.active_suggestion = None
Copy

Cortex Analyst 기능 비활성화

계정에서 Cortex Analyst 를 사용하지 않으려면 ACCOUNTADMIN 역할을 사용하여 ENABLE_CORTEX_ANALYST 매개 변수를 변경하여 기능을 비활성화합니다.

USE ROLE ACCOUNTADMIN;
ALTER ACCOUNT SET ENABLE_CORTEX_ANALYST = FALSE;
Copy

매개 변수 유형

세션

데이터 타입

BOOLEAN

설명

계정에서 Cortex Analyst 기능을 활성화할지 여부를 제어합니다.

  • FALSE: Cortex Analyst 함수를 사용할 수 없습니다.

  • TRUE: Cortex Analyst 함수를 사용할 수 있습니다. ENABLE_CORTEX_ANALYST_MODEL_AZURE_OPENAI 가 TRUE로 설정된 경우 Cortex Analyst 는 Azure OpenAI 모델과 Snowflake 호스팅 모델을 사용할 수 있습니다. 그렇지 않으면 Snowflake에 호스팅된 모델만 사용할 수 있습니다.

기본값

TRUE

비용 고려 사항

Cortex Analyst 는 2024년 11월 15일까지 무료로 제공됩니다. 가격 및 청구에 대한 자세한 내용은 곧 공개될 예정입니다.