【Cortex Agents】Snowflakeから構造・非構造データを組み合わせて分析するエージェント機能が登場！

# はじめに

## Snowflake における AI
2024年6月、Snowflakeは自身のブランドとしていた「DATA CLOUD」を、AI時代により即した「**AI DATA CLOUD**」**へと刷新**しました。これ以降、現在に至るまで Snowflake は、下記に示すような多くの AI・ML・LLM系リリースを行ってきました。
- **Document AI**：非構造データの取り込みを OCR や LLM を活用して簡単に行える機能（ただし現時点で日本語には未対応）
- **Cortex Search**：ドキュメント検索を高い性能で行えるハイブリッド検索機能
- **Cortex Analyst**：自然言語で質問をすると SQL による分析結果を返してくれる機能

その他、LLM を SQL関数や Python、API としてサーバーレス・マネージレスに利用できる機能も非常に便利です。最近では Anthropic社と協力し、**Snowflake の LLM に Claude 3.5 Sonnet を追加した**ことも話題になりました。

## Cortex Agents
そんな中、Snowflake は満を持して、エージェント機能である「**Snowflake Cortex Agents**」を発表・リリースしました🎉🎉🎉　このリリースは、Anthropic と Snowflake が提携したことによって実現した機能でもあります。

本記事ではその **Snowflake Cortex Agents が何なのか解説**し、**実際にどのように動くのか確認**していきます。



# Snowflake Cortex Agents とは？
Snowflake Cortex Agents は、2025年2月12日、Public Preview として突如発表されたエージェント機能です。

https://www.snowflake.com/en/blog/ai-data-agents-snowflake-cortex/

この発表を見た時、私は Cortex Analyst と Cortex Search の統合とは違うのだろうか？それを Cortex Agents と呼んでいるのだろうか？と想像しました。しかしよくよく記事を読んでみるとそうではないことが分かりました。

<!--

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Snowflake Cortex Agents are here. A game-changer for AI-driven workflows:<br><br>✅ Search quality that outperforms anything else out there.<br>✅ Accurate retrieval - not just guesswork - from structured + unstructured data, seamlessly.<br>✅ Enterprise-grade privacy &amp; control.<br><br>Built…</p>&mdash; sridhar (@RamaswmySridhar) <a href="https://twitter.com/RamaswmySridhar/status/1889707381183123925?ref_src=twsrc%5Etfw">February 12, 2025</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

-->

## Cortex Agents の役割

Cortex Agents の主な役割は、**構造化データと非構造化データを組み合わせてエージェント型にデータ分析を行うこと**です。この記事では、具体的な例として、財務アナリストが、収益データ（構造化）と財務レポートや市場調査レポート（非構造化）を組み合わせて分析する必要があると述べています。

Cortex Agents では、その両方の視点からの分析を、エージェントが自ら考え選択し、深堀り分析を行っていくようです。この機能は、まさに**データとAIが融合した Snowflake ならではの機能**だと直感しました。


## Cortex Agents の動き
Cortex Agentsは、エージェントとして、**ユーザーからの質問を複数のタスクに分割し、それぞれのタスクに適したツールを使って、分析結果と回答の生成を行う**ことができます。

曖昧な単語については Cortex Search（RAG機能）から検索し、分析が求められている場合は Cortex Analyst（自然言語から SQL の実行結果を返す機能）を使い、さらに必要に応じて、自ら SQL を生成して分析を広く行うこともできるようです。

Cortex Agents 関連のタスクとして、下記の4つのワークフローが定義されています。
1. **計画**：サブタスクへの分割、ツール間のルーティング、曖昧語の検索
1. **ツールの実行**：計画をもとに、ツールを実行していく
1. **リフレクション**：各ツールの実行後、結果をエージェントが評価し、次のステップ（説明を深める、反復する、最終的な応答を生成する）を決定していく
1. **監視と改善**：管理者が TruLens（AI Observability）を使用して、Cortex Agents のパフォーマンスを監視し改善していく

テキストだけだとわかりにくいかもしれないので、Cortex Agents の簡単な概要図を作成しておきました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3540224/712ed646-decd-44ae-800c-49dae0b19afa.png)




これらの4つのワークフローと Snowflake の特徴（セキュリティやガバナンス、すでに蓄積されたデータ など）や機能を組み合わせて、安全な環境で LLM による分析環境を提供することができると言えます✨️


# Snowflake Cortex Agents を動かしてみる

Cortex Agents には、すでにドキュメントやクイックスタート、YouTube動画などのリソースが上がっています。本章では、ハンズオンを試してみたいと思います。

https://docs.snowflake.com/user-guide/snowflake-cortex/cortex-agents

https://quickstarts.snowflake.com/guide/getting_started_with_cortex_agents/index.html

https://www.youtube.com/watch?v=SDqyB-yWaAE&ab_channel=SnowflakeDevelopers

## Cortex Agents クイックスタートのテーマ

このクイックスタートでは、実際のビジネスシナリオを想定し、営業ユーザーに向けたアシスタントアプリを構築します。販売データや営業時の会話テキストといった、構造化データと非構造化データを活用します。

Snowflake らしく非常に簡単なステップで、エージェントによる計画からツール実行、リフレクションまでの流れを体験していきましょう🎉

:::note
なお本記事では、クイックスタートを再現するのではなく、あくまでも補足的な解説を行います。実際にハンズオンを行いたい方は、Snowflake のクイックスタートサイトをご確認ください！
:::

:::note warn
現時点で、Cortex Agents は東京リージョンに未対応です。下記のリージョンで検証するようにしてみてください。
https://docs.snowflake.com/user-guide/snowflake-cortex/cortex-agents#availability
:::


## 作成したリソースの確認

### 事前準備（テーブルなど）
事前準備として、次のようなリソースを作成しました。
- 営業指標のテーブル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3540224/1dd2da8d-8584-402e-a8db-db125a8f51ba.png)

- 営業時の会話テキスト
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3540224/4082645a-b475-45b8-ab41-a5d82c158b5f.png)
<details><summary>TRANSCRIPT_TEXT 列のサンプル</summary>

> Initial discovery call with TechCorp Inc's IT Director and Solutions Architect. Client showed strong interest in our enterprise solution features, particularly the automated workflow capabilities. Main discussion centered around integration timeline and complexity. They currently use Legacy System X for their core operations and expressed concerns about potential disruption during migration. Team asked detailed questions about API compatibility and data migration tools. Action items: 1) Provide detailed integration timeline document 2) Schedule technical deep-dive with their infrastructure team 3) Share case studies of similar Legacy System X migrations. Client mentioned Q2 budget allocation for digital transformation initiatives. Overall positive engagement with clear next steps.

機械翻訳
> TechCorp Inc の IT ディレクターおよびソリューション アーキテクトとの最初の調査通話。クライアントは、当社のエンタープライズ ソリューション機能、特に自動ワークフロー機能に強い関心を示しました。主な議論は、統合のタイムラインと複雑さを中心に行われました。彼らは現在、中核業務にレガシー システム X を使用しており、移行中の潜在的な中断について懸念を表明しました。チームは、API の互換性とデータ移行ツールについて詳細な質問をしました。アクションアイテム: 1) 詳細な統合タイムライン文書を提供する 2) インフラストラクチャ チームとの技術的な詳細調査のスケジュールを設定する 3) 同様のレガシー System X 移行のケース スタディを共有する。クライアントは、デジタル変革イニシアチブのための第 2 四半期の予算配分について言及しました。明確な次のステップを持つ全体的に前向きな取り組み。

</details>

- 営業時の会話テキストをもとにしたRAG（Cortex Search）
- セマンティックモデル（Cortex Analyst用）

### アプリの構築
続いて、エージェントアプリとして Streamlit アプリを構築しました。このアプリでは、主に2つパートに別れています。1つ目は、チャット入出力を行う Streamlit アプリインターフェイスです。2つ目は、Cortex Agents API へリクエストを送る部分です。


■ **Streamlit アプリ**
Streamlit のアプリインターフェイスを下記に示します。特に難しいことはなく、ユーザーからの問い合わせを入力して、`snowflake_api_call(query, jwt_token)` として Cortex Agents API を実行し、その結果を出力するようになっています。

<details><summary>Streamlitインターフェイス</summary>

```python
def main():
    st.title("Intelligent Sales Assistant")

    # Initialize JWT Generator
    jwt_token = generate_jwt.JWTGenerator(
        SNOWFLAKE_ACCOUNT,
        SNOWFLAKE_USER,
        RSA_PRIVATE_KEY_PATH
    ).get_token()

    # Sidebar for new chat
    with st.sidebar:
        if st.button("New Conversation", key="new_chat"):
            st.session_state.messages = []
            st.rerun()

    # Initialize session state
    if 'messages' not in st.session_state:
        st.session_state.messages = []

    # Chat input form
    with st.form(key="query_form"):
        query = st.text_area(
            "",
            placeholder="Ask about sales conversations or sales data...",
            key="query_input",
            height=100
        )
        submit = st.form_submit_button("Submit")

    if submit and query:
        # Add user message to chat
        st.session_state.messages.append({"role": "user", "content": query})
        
        # Process query
        with st.spinner("Processing your request..."):
            sse_client = snowflake_api_call(query, jwt_token)
            text, citations, debug_info, sql, other_info = process_sse_response(sse_client)
            
            # Display chat history
            if text:
                st.session_state.messages.append({"role": "assistant", "content": text})

            for message in st.session_state.messages:
                with st.container():
                    st.markdown(f"**{'You' if message['role'] == 'user' else 'Assistant'}:**")
                    st.markdown(message["content"].replace("•", "\n\n-"))
                    st.markdown("---")
            
            # Display SQL results if present
            if sql:
                st.markdown("### Generated SQL")
                st.code(sql, language="sql")
                results, columns = run_snowflake_query(sql)
                if results and columns:
                    df = pd.DataFrame(results, columns=columns)
                    st.write("### Sales Metrics Report")
                    st.dataframe(df)
```

</details>


■ **Cortex Agents APIの実行**
Cortex Agents APIへのリクエスト送信部分を下記に示します。

`snowflake_api_call()`関数で、Cortex Agents APIを実行しています。主には、`Payload`に、Cortex Agentsに扱わせたいツールやそのオプションを指定するだけで良いようですね。

<details><summary>Cortex Agents APIへのリクエスト</summary>

```python
def snowflake_api_call(query: str, jwt_token: str, limit: int = 10):
    """Make API call to Cortex Agents"""
    url = f"https://{SNOWFLAKE_ACCOUNT_URL}/api/v2/cortex/agent:run"
    
    headers = {
        'X-Snowflake-Authorization-Token-Type': 'KEYPAIR_JWT',
        'Content-Type': 'application/json',
        'Accept': 'text/event-stream',
        'Authorization': f'Bearer {jwt_token}'
    }
    
    payload = {
        "model": "claude-3-5-sonnet",
        "messages": [
            {
                "role": "user",
                "content": [{"type": "text", "text": query}]
            }
        ],
        "tools": [
            {
                "tool_spec": {
                    "type": "cortex_analyst_text_to_sql",
                    "name": "analyst1"
                }
            },
            {
                "tool_spec": {
                    "type": "cortex_search",
                    "name": "search1"
                }
            }
        ],
        "tool_resources": {
            "analyst1": {"semantic_model_file": SEMANTIC_MODELS},
            "search1": {
                "name": CORTEX_SEARCH_SERVICES,
                "max_results": limit
            }
        }
    }
    
    response = requests.post(url=url, headers=headers, json=payload, stream=True)
    return sseclient.SSEClient(response)
```

</details>

## アシスタントアプリ実行の様子

準備が整ったので、Cortex Agents による営業支援アシスタントを実際に触ってみましょう！

無事に起動できると、次のような画面が表示されます。早速、テーブルに格納されていた TechCorp社の売上について問い合わせてみました。すると、そつなく質問を解釈し、SQLを生成し、実行・表示まで行ってもらうことができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3540224/eac88c88-f4ea-43a9-9281-1f95ea46caf3.png)

さらに、Cortex Search を検索するような質問「TechCorp社とは何ですか？」を送ってみたところ、検索結果が返ってきました。~~これをコンテキストとして回答させるように構成することができるのか、それとも Cortex Analyst Agents 側で回答を生成するのかは不明ですが、いずれにしても検索までは行えていることは確認できました。~~　日本時間の 2/13 16時に Cortex Search が取得したコンテキストをもとに回答を出力するように修正されていました！（下記2枚目の画像参照）（コンテキストが先に表示されてしまっていますが、これは Streamlit アプリ側のロジックを調整すれば如何様にもできそうですね）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3540224/5d78942f-cabf-48e0-b1a1-e1271b511409.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3540224/d2d4b36a-bb35-4326-8b6e-34ee8b343f79.png)


YouTube 動画の方では、ドキュメントを参照しながら動作していることが分かります！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3540224/327408d8-4755-42be-b17b-3ab341bf896a.png)


クイックスタートで実際に Cortex Agents を実行してみて、Snowflake がエージェント機能の開発に前向きであることが分かり、ますます今後のアップデートが非常に楽しみになりました！


## 実行時に詰まるかもしれないポイント

:::note info
今は当該クイックスタートがStreamlit in Snowflakeで動くものに変わったので、特に困る部分はないかなと思います！そのため本項目は参考程度に残しておきます。
:::


### キーペア認証の設定が必要
下記のようにして、キーペア認証を設定しました。
```bash
openssl genrsa 2048 | openssl pkcs8 -topk8 -v2 des3 -inform PEM -out rsa_key.p8
openssl rsa -in rsa_key.p8 -pubout -out rsa_key.pub
```

```sql
ALTER USER example_user SET RSA_PUBLIC_KEY='xxx...';
```

### app.py の url に誤りがある
~~下記のように修正して実行しました。~~
→リポジトリ側が修正されていたため対応不要です。

```python
# 208行目付近
url = f"https://{SNOWFLAKE_ACCOUNT_URL}/api/v2/cortex/agent:run"

# 258行目付近
response = requests.post(url=url, headers=headers, json=payload, stream=True)
```

### 実行時にJWTトークンのencode時にエラーが出る
次のようなエラーが出たため、JWTライブラリをインストールし直しました。
> AttributeError: module 'jwt' has no attribute 'encode'
```bash
pip uninstall JWT  
pip uninstall PyJWT  
pip install PyJWT
```

# おまけ
冒頭に示した記事に、いくつか面白い機能アップデートやリリースについて記載があったため紹介します。

## Cortex Analyst のモデル変更が示唆される
記事内には、Anthropic の Claude 3.5 Sonnet を使用することで、パフォーマンスをさらに強化されたと記載されていました。つまり、Snowflake 内ではすでに Cortex Analyst に Claude 3.5 Sonnet を適用した検証がなされているということです。

Cortex Analyst は現在、mistral-large という、英語圏の言語に特化したモデル（日本語も扱えるが得意ではない）を使用しています。それが Claude 3.5 Sonnet によりどのように変化するのか、非常に楽しみです！🎉

## Cortex AI Observability がまもなくリリースされる
Snowflake は、TruEra社という AI Observability を専門とする会社を買収しています。その製品である [TruLens](https://www.trulens.org/) が Snowflake に組み込まれることを一同楽しみに待っていたのですが、ここに来てついにそれが言及されました。

**関連性、根拠、有害性、応答速度、コストといった指標について監視し、それらを改善**していくことができる機能です。Snowsight（Snowflake の Web UI） で AI Observability ができるようになるのが楽しみですね！まもなくリリースとのことです。

## DataVolo によりマルチモーダルデータ統合が強化される
DataVolo は、データフローの開発や管理を行える OSS ツールである Apache Nifi に Contribute している会社です。さらに、Apache Nifi に対して**マルチモーダル・非構造・様々なクラウドストレージとのコネクタなどの機能を付加した DataVolo という製品を開発**しています。

Snowflake は DataVolo を買収しています。記事内では、**DataVolo によってマルチモーダルデータを処理する能力が強化されていく**ことを示しており、着実に製品のインテグレーションが進んでいることを示しています。


## Cortex Search のコストが30%削減される
Cortex Search は、高速に検索結果を返せる一方で、常にリソースが起動している都合、常にコストがかかり続けてしまいます。そのコストが30%削減されるとのことなので、より安く、そして多くのデータをこれまでと同じコストで使用することができます🎉

# おわりに

本日 2025年2月12日（米国時間）突如としてリリースされた **Cortex Agents** について、その動作の様子を理解いただけたでしょうか？自然言語でクエリを生成する **Cortex Analyst** や RAG機能である **Cortex Search** よりもさらに上位の概念としてそれらを活用した Snowflake らしいエージェント機能であることが分かりました。

Snowflake は2024年11月「Snowflake Intelligence」と呼ばれる機能も発表（未リリース）しています。すなわち、Cortex Agents 自体はまだ道の途中に過ぎず、さらにエージェント系機能を拡充させていくことの現れなのではないかと考えています。

今後も Snowflake の **AI DATA CLOUD** リリースに目が離せません！👀


## 仲間募集

NTTデータ テクノロジーコンサルティング事業本部 では、以下の職種を募集しています。

<details><summary>1. クラウド技術を活用したデータ分析プラットフォームの開発・構築(ITアーキテクト/クラウドエンジニア)</summary>

クラウド／プラットフォーム技術の知見に基づき、DWH、BI、ETL領域におけるソリューション開発を推進します。
https://enterprise-aiiot.nttdata.com/recruitment/career_sp/cloud_engineer

</details>

<details><summary>2. データサイエンス領域（データサイエンティスト／データアナリスト）</summary>

データ活用／情報処理／AI／BI／統計学などの情報科学を活用し、よりデータサイエンスの観点から、データ分析プロジェクトのリーダーとしてお客様のDX／デジタルサクセスを推進します。
https://enterprise-aiiot.nttdata.com/recruitment/career_sp/datascientist

</details>

<details><summary>3.お客様のAI活用の成功を推進するAIサクセスマネージャー</summary>

DataRobotをはじめとしたAIソリューションやサービスを使って、
お客様のAIプロジェクトを成功させ、ビジネス価値を創出するための活動を実施し、
お客様内でのAI活用を拡大、NTTデータが提供するAIソリューションの利用継続を推進していただく人材を募集しています。
https://nttdata.jposting.net/u/job.phtml?job_code=804

</details>

<details><summary>4.DX／デジタルサクセスを推進するデータサイエンティスト《管理職/管理職候補》</summary>
データ分析プロジェクトのリーダとして、正確な課題の把握、適切な評価指標の設定、分析計画策定や適切な分析手法や技術の評価・選定といったデータ活用の具現化、高度化を行い分析結果の見える化・お客様の納得感醸成を行うことで、ビジネス成果・価値を出すアクションへとつなげることができるデータサイエンティスト人材を募集しています。

https://nttdata.jposting.net/u/job.phtml?job_code=898

</details>


## ソリューション紹介

<details><summary> Trusted Data Foundationについて</summary><div>

～データ資産を分析活用するための環境をオールインワンで提供するソリューション～
https://www.nttdata.com/jp/ja/lineup/tdf/
最新のクラウド技術を採用して弊社が独自に設計したリファレンスアーキテクチャ（Datalake+DWH+AI/BI）を顧客要件に合わせてカスタマイズして提供します。
可視化、機械学習、DeepLearningなどデータ資産を分析活用するための環境がオールインワンで用意されており、これまでとは別次元の量と質のデータを用いてアジリティ高くDX推進を実現できます。

</div></details>

<details><summary> TDFⓇ-AM（Trusted Data Foundation - Analytics Managed Service）について</summary><div>

～データ活用基盤の段階的な拡張支援（Quick Start) と保守運用のマネジメント（Analytics Managed）をご提供することでお客様のDXを成功に導く、データ活用プラットフォームサービス～
https://www.nttdata.com/jp/ja/lineup/tdf_am/
TDFⓇ-AMは、データ活用をQuickに始めることができ、データ活用の成熟度に応じて段階的に環境を拡張します。プラットフォームの保守運用はNTTデータが一括で実施し、お客様は成果創出に専念することが可能です。また、日々最新のテクノロジーをキャッチアップし、常に活用しやすい環境を提供します。なお、ご要望に応じて上流のコンサルティングフェーズからAI/BIなどのデータ活用支援に至るまで、End to Endで課題解決に向けて伴走することも可能です。

</div></details>


<details><summary> NTTデータとDatabricksについて </summary>
NTTデータは、お客様企業のデジタル変革・DXの成功に向けて、「databricks」のソリューションの提供に加え、情報活用戦略の立案から、AI技術の活用も含めたアナリティクス、分析基盤構築・運用、分析業務のアウトソースまで、ワンストップの支援を提供いたします。

https://www.nttdata.com/jp/ja/lineup/databricks/

</details>


<details><summary>NTTデータとTableauについて </summary><div>

ビジュアル分析プラットフォームのTableauと2014年にパートナー契約を締結し、自社の経営ダッシュボード基盤への採用や独自のコンピテンシーセンターの設置などの取り組みを進めてきました。さらに2019年度にはSalesforceとワンストップでのサービスを提供開始するなど、積極的にビジネスを展開しています。

これまでPartner of the Year, Japanを4年連続で受賞しており、2021年にはアジア太平洋地域で最もビジネスに貢献したパートナーとして表彰されました。
また、2020年度からは、Tableauを活用したデータ活用促進のコンサルティングや導入サービスの他、AI活用やデータマネジメント整備など、お客さまの企業全体のデータ活用民主化を成功させるためのノウハウ・方法論を体系化した「デジタルサクセス」プログラムを提供開始しています。
https://www.nttdata.com/jp/ja/lineup/tableau/

</div></details>


<details><summary>NTTデータとAlteryxについて </summary><div>
Alteryxは、業務ユーザーからIT部門まで誰でも使えるセルフサービス分析プラットフォームです。

Alteryx導入の豊富な実績を持つNTTデータは、最高位にあたるAlteryx Premiumパートナーとしてお客さまをご支援します。

導入時のプロフェッショナル支援など独自メニューを整備し、特定の業種によらない多くのお客さまに、Alteryxを活用したサービスの強化・拡充を提供します。

https://www.nttdata.com/jp/ja/lineup/alteryx/

</div></details>

<details><summary>NTTデータとDataRobotについて </summary><div>
DataRobotは、包括的なAIライフサイクルプラットフォームです。

NTTデータはDataRobot社と戦略的資本業務提携を行い、経験豊富なデータサイエンティストがAI・データ活用を起点にお客様のビジネスにおける価値創出をご支援します。

https://www.nttdata.com/jp/ja/lineup/datarobot/

</div></details>

<details><summary> NTTデータとInformaticaについて</summary><div>

データ連携や処理方式を専門領域として10年以上取り組んできたプロ集団であるNTTデータは、データマネジメント領域でグローバルでの高い評価を得ているInformatica社とパートナーシップを結び、サービス強化を推進しています。
https://www.nttdata.com/jp/ja/lineup/informatica/

</div></details>

<details><summary>NTTデータとSnowflakeについて </summary><div>
NTTデータでは、Snowflake Inc.とソリューションパートナー契約を締結し、クラウド・データプラットフォーム「Snowflake」の導入・構築、および活用支援を開始しています。

NTTデータではこれまでも、独自ノウハウに基づき、ビッグデータ・AIなど領域に係る市場競争力のあるさまざまなソリューションパートナーとともにエコシステムを形成し、お客さまのビジネス変革を導いてきました。
Snowflakeは、これら先端テクノロジーとのエコシステムの形成に強みがあり、NTTデータはこれらを組み合わせることでお客さまに最適なインテグレーションをご提供いたします。

https://www.nttdata.com/jp/ja/lineup/snowflake/

</div></details>