Streamlit in SnowflakeアプリからCortexとClaude3(Haiku/Opus)の対話機能を比較してみた

# はじめに
前回の記事で、Streamlit in Snowflake（SiS）でCortexと対話できるチャットアプリを作成しました。

https://qiita.com/hiro-wa/items/0a22a896cc54cdc63479

次に同じチームの井上さんが、SnowflakeからClaude3を利用する手順について記事を書いてくださいました。（実装にはSnowflakeの他にAWS環境も必要になります）

https://qiita.com/Itsuki_Inoue/items/5863a100aab776956747

外部ネットワークアクセスを使うことでCortex以外のモデルをSnowflakeから呼び出せるのは面白いですね。

そして今回はその後続として、前回作成したSiSアプリからCortexだけでなくClaude3も利用できるようにして、**Snowflake上でCortexとClaude3の比較**をやっていこうと思います。
それぞれのモデルに対して質問を投げかけた時に、回答がどう変化するのか等を比較します。

※元々Claude3のHaikuを使って検証していたのですが、2024年4月16日にOpusもリリースされたので、Opusも急遽追加して、**Cortex(mistral-large)・Claude3(Haiku)・Claude3(Opus)** の3つのモデルで比較します。


# 検証環境
今回の検証は、前回同様に以下のSnowflakeアカウントで行いました。
- リージョン：US East (N. Virginia)
- エディション：Enterprise

# 作ったアプリ

今回作成したアプリのコードから一部抜粋したものを下記に載せます。
基本的な構成や翻訳・要約機能のコードは [前回の記事](https://qiita.com/hiro-wa/items/0a22a896cc54cdc63479) を参考にしてください。

- import部分
```python
import streamlit as st
import time
import datetime
from snowflake.snowpark.context import get_active_session
from snowflake.cortex import Complete, Summarize, Translate
```

- 対話機能の関数

Cortexの場合はプロンプトを単純な文字列として関数に渡していますが、Claude3では会話の履歴も渡すようにしています。
```python
def complete_claude3(sub_model, prompt, session):
    if sub_model == "haiku":
        model_name = "anthropic.claude-3-haiku-20240307-v1:0"
    elif sub_model == "sonnet":
        model_name = "anthropic.claude-3-sonnet-20240229-v1:0"
    elif sub_model == "opus":
        model_name = "anthropic.claude-3-opus-20240229-v1:0"
    sql = f"SELECT ask_claude3({prompt}, '{model_name}');"
    return session.sql(sql).collect()[0][0]

def chat(api_model, sub_model):
    if "messages" not in st.session_state:
        st.session_state.messages = []
    
    for message in st.session_state.messages:
        if message["api_model"] == api_model:
            with st.chat_message(message["role"]):
                st.markdown(message["content"])
    
    if original_prompt := st.chat_input("文章を入力してください。"):
        start_time = time.time()
        with st.chat_message("user"):
            st.markdown(original_prompt)
        st.session_state.messages.append({
            "role": "user",
            "api_model": api_model,
            "content": original_prompt
        })
        
        session = get_active_session()
        json_prompt = None if api_model == "Cortex" else []
        
        if  api_model == "Claude3":
            for message in st.session_state.messages:
                if message["api_model"] == "Claude3":
                    json_prompt.append({
                        "role": message["role"],
                        "content": message["content"]
                    })
        response = ""
        if api_model == "Cortex":
            response = Complete(sub_model, original_prompt)
        elif api_model == "Claude3":
            response = complete_claude3(sub_model, json_prompt, session)
        
        with st.chat_message("assistant"):
            st.markdown(response)
        st.session_state.messages.append({
            "role": "assistant",
            "api_model": api_model,
            "content": response
        })

        end_time = time.time()
        
        session.write_pandas(
            session.create_dataframe(
                [[
                    "対話",
                    api_model,
                    sub_model,
                    original_prompt,
                    json_prompt,
                    response,
                    end_time - start_time,
                    datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
                ]],
                schema=[
                    "llm_func",
                    "api_model",
                    "sub_model",
                    "original_prompt",
                    "json_prompt",
                    "response",
                    "duration",
                    "time"
                ]
            ).to_pandas(),
            "BOT_LOGS",
            schema="PUBLIC",
            database="CLAUDE3_DB"
        )
```
後から比較しやすいように、プロンプトや回答内容、応答時間などをテーブルへ格納するようにしています。

（このようにテーブルに格納される）
![2024-04-17 151131.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319284/5a5b0094-61a4-9271-201c-021afea1d6fa.png)



- 画面全体

前回同様、サイドバーで使いたい機能を選択できるようになっており、対話を選んだ場合にモデルをCortexとClaude3から選べるようにしています。
```python
with st.sidebar:
    st.title("AI Bot")
    
    llm_func = st.radio(
        "使用したい機能を選んでください",
        ["対話", "翻訳", "要約"],
        horizontal=True
    )
    
    if llm_func == "対話":
        api_model_list = ["Cortex", "Claude3"]
    else:
        api_model_list = ["Cortex"]
    api_model = st.radio(
        "使用したいAIモデルを選んでください",
        api_model_list,
        horizontal=True
    )
    
    if llm_func == "対話":
        if api_model == "Cortex":
            sub_model = st.radio(
                "使用したい言語モデルを選んでください",
                ("mistral-large", "mixtral-8x7b", "llama2-70b-chat", "mistral-7b", "gemma-7b", "reka-flash")
            )
        elif api_model == "Claude3":
            sub_model = st.radio(
                "使用したいモデルを選んでください",
                ("haiku", "sonnet", "opus")
            )

st.header(f"{llm_func} ({api_model})")

if llm_func == "対話":
    chat(api_model, sub_model)
elif llm_func == "翻訳":
    translate_any_to_any()
elif llm_func == "要約":
    summarize_any_to_ja()
```

Claude3を呼び出すためのUDFは[SnowflakeとClaude3の連携の記事](https://qiita.com/Itsuki_Inoue/items/5863a100aab776956747)をベースに実装していますが、Claude3が複数メッセージに対応できるかを検証するために、UDF内の`prepare_request_body_text`関数は上記記事内のコードからは若干変更を加えています。
プロンプトとして1つの文字列を渡すのではなく、下記のように会話の履歴をjson形式（引数: dialogue）で渡すようにしています。

```python
def prepare_request_body_text(dialogue, model):
    default_max_tokens = 4096

    if model == 'anthropic.claude-3-opus-20240229-v1:0' or model == 'anthropic.claude-3-sonnet-20240229-v1:0' or model == 'anthropic.claude-3-haiku-20240307-v1:0':
        body = {
            "anthropic_version": "bedrock-2023-05-31",
            "max_tokens": default_max_tokens,
            "messages": dialogue
        }
    else:
        raise ValueError("Unsupported model ID")

    return json.dumps(body)
```

またClaude3のOpusを使うためにAWSのリージョンはus-west-2を使用しています。

完成したSiSアプリのUIはこのようになっています。

![2024-04-17 144610.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319284/db3d482d-7eac-794d-daf2-b79798a3e620.png)



# 検証内容

下記の観点でいくつかの質問をしてみて、Cortex(mistral-large)・Claude3(Haiku)・Claude3(Opus)による回答精度や速度を比較します。
- 日本語の質問
- 英語の質問
- 複数メッセージへの対応

:::note warn
あくまでもこれは記事執筆時点における少ないケースでの比較です。質問の仕方や内容・使い方などによって結果は変化し得ます。
:::

また、コストについても比較してみます。


## 日本語の質問に対する回答

まずは日本語への対応度を調べるために日本語で質問してみます。

質問は下記の3つです。
1. 日本の人口を教えてください。
2. Snowflakeの創設者を教えてください。
3. 三平方の定理を説明してください。

### 質問① 「日本の人口を教えてください。」

**■ Cortex(mistral-large)の回答**

> As of October 1, 2021, the estimated population of Japan is about 125.49 million people. However, this number is constantly changing due to births, deaths, and migration. For the most up-to-date information, please refer to the latest statistics from the Japanese government or a reliable demographic data source.

応答時間：2.76s


**■ Claude3(Haiku)の回答**

> はい、2023年3月時点の日本の人口は以下のとおりです。
> 
> - 日本の総人口: 約1億2,546万人 (2023年3月時点の推計値)
> 
> 日本の人口は長期的に減少傾向にあり、少子高齢化が進行しています。直近の10年間で約300万人以上減少しています。
> 
> 人口減少と高齢化は日本社会に大きな影響を与えており、様々な分野での課題となっています。政府は人口問題への対策を重点的に行っていますが、簡単に解決できる問題ではありません。
> 
> 以上が日本の現在の人口状況の概要です。もし詳細な情報が必要でしたら、ぜひ追加でお聞きします。

応答時間：5.16s


**■ Claude3(Opus)の回答**

> 日本の総人口は、2022年10月1日時点で1億2522万6568人です。これは、総務省統計局が発表した最新の推計人口に基づいています。
> 
> 日本の人口は、2008年の1億2808万人をピークに減少傾向にあります。これは主に、少子高齢化が進んでいることが原因です。出生率の低下と平均寿命の延びにより、高齢者の割合が増加し、年少人口と生産年齢人口の割合が減少しています。
> 
> 2022年10月1日時点での年齢構成は以下の通りです：
> 
> - 年少人口（0～14歳）：1449万人（11.6％）
> - 生産年齢人口（15～64歳）：7414万人（59.2％）
> - 高齢者人口（65歳以上）：3660万人（29.2％）
> 
> 今後も日本の人口減少は続くと予測されており、2065年には9000万人を下回ると推計されています。人口減少と高齢化は、労働力不足や社会保障制度への影響など、日本社会に様々な課題をもたらすと考えられています。

応答時間：17.67s

**■ 評価**
総務省が出している統計データによると、[2021年10月1日時点での日本の人口]((https://www.stat.go.jp/data/jinsui/2021np/index.html))は1億2550万2千人なので、Cortexの回答（1億2549万人）はほぼ正解に近いと言えます。
しかし回答の言語が英語になってしまいました。

同様に総務省によると、[2023年3月1日時点での人口](https://www.stat.go.jp/data/jinsui/pdf/202303.pdf) は１億2449万人なので、Claude3(Haiku)の回答（約1億2546万人）は100万人ほどのずれがあります。

また、[2022年10月1日時点での人口](https://www.stat.go.jp/data/jinsui/2022np/index.html) は1億2494万7千人なので、Claude3(Opus)の回答（1億2522万人）は30万人ほどのズレがあります。
2008年がピークであることは正しいですが、年齢構成の数字には総務省のデータと比べると若干ズレがあります。

付加情報の多さなどから考えるとClaude3(Haiku/Opus)の方がより良い回答をしているように見えますが、回答内容の正確さや応答時間ではCortexの方が優れていると判断できます。

次にもう少し難しい質問をしてみます。


### 質問② 「Snowflakeの創設者を教えてください。」

**■ Cortex(mistral-large)の回答**

>  Snowflakeは、ベン・ワートハイム、ターンバイ・グプタ、マーク・シナイダーによって2012年に創設されました。これらの3人の共同創業者は、データベースとデータウェアハウス分野における経験豊富なエンジニアです。

応答時間：4.05s


**■ Claude3(Haiku)の回答**

> Snowflakeの創設者は以下の3人です。
> 1. Benoit Dageville - Snowflakeの共同創業者兼Chief Technology Officer。Oracleでデータベースエンジニアとして長年の経験を持つ。
> 2. Thierry Cruanes - Snowflakeの共同創業者兼Chief Architect。Oracleでの豊富な経験を持ち、SQL処理に関する専門家。
> 3. Marcin Zukowski - Snowflakeの共同創業者兼Vice President of Engineering。MPP (Massively Parallel Processing) データベースの開発に長けている。
>
> この3人がOracleからSpinoutして、2012年にSnowflakeを設立しました。Snowflakeはクラウド上で動作するデータウェアハウスサービスとして、急成長を遂げてきました。

応答時間：5.77s


**■ Claude3(Opus)の回答**

> Snowflakeの創設者は、次の3人です。
> 
> 1. Benoit Dageville (ブノワ・ダジュヴィル)
> 2. Thierry Cruanes (ティエリー・クルアネス)
> 3. Marcin Żukowski (マルシン・ズコフスキ)
> 
> Benoit DagevilleとThierry Cruanesは、以前Oracleでともに働いていたフランス人のエンジニアです。Marcin Żukowskiはポーランド人のエンジニアで、Vectorwise（列指向のデータベース）の開発に関わっていました。
> 
> 2012年、彼らは従来のデータウェアハウスの限界を感じ、クラウドネイティブでスケーラブルなデータウェアハウスを構築するためにSnowflakeを設立しました。その革新的なアーキテクチャにより、Snowflakeはクラウドデータウェアハウスの分野でリーダー的存在となっています。

応答時間：15.92s

**■ 評価**

Cortexの方は、間違った3人を回答してしまいました。

Claude3(Haiku)は創業者3人の名前はあっていますが、それぞれの情報に間違いが含まれています。
Claude3(Haiku)の回答ではBenoitがCTO、ThierryががChief Architectと言っていますが、正しい役職は、BenoitがPresident of Productで、ThierryがCTOです。
またMarcinは元Oracle社員ではないため、「3人がOracleからSpinoutして」の文も間違っています。

Claude3(Opus)の回答は全て正しいようです。


- 参考情報
  - [Benoit Dageville - LinedIn](https://www.linkedin.com/in/benoit-dageville-3011845/)
  - [Thierry Cruanes - Snowflake Blog](https://www.linkedin.com/in/thierry-cruanes-3927363/)
  - [Thierry Cruanes - LinedIn](https://www.snowflake.com/blog/authors/thierry-cruanes/)
  - [Marcin Zukowski - LinedIn](https://www.linkedin.com/in/marcinzukowski/)


1つ目の質問ではCortexの方が正確な回答をしていましたが、今回はどちらかというとClaude3(Haiku/Opus)の方がより正確な回答をしました。

これまでは単純な知識に関する質問でしたが、次は説明をしてもらうタイプの質問をしてみます。


### 質問③ 「三平方の定理を説明してください。」

**■ Cortex(mistral-large)の回答**

> The Three Squares Theorem, also known as Legendre's three-square theorem, is a fundamental result in number theory. It states that a natural number can be represented as the sum of three squares of integers if and only if it is not of the form $4^k(8m + 7)$ for non-negative integers $k$ and $m$.
> 
> In simpler terms, any positive integer that is not in the form of a power of 4 times a number that is 7 more than a multiple of 8 can be written as the sum of three perfect squares. For example, $13 = 2^2 + 2^2 + 3^2$.
> 
> This theorem was first conjectured by Pierre de Fermat and later proven by Adrien-Marie Legendre in 1798. It is a special case of the Fermat's theorem on sums of two squares and the Lagrange's four-square theorem, which states that every natural number can be represented as the sum of four integer squares.

応答時間：6.79s


**■ Claude3(Haiku)の回答**

> 三平方の定理は以下のように説明できます:
> 
> 1. 直角三角形において、
> a が直角の辺の長さ、
> b が直角の辺の長さ、
> c が斜辺の長さ、
> と定義します。
> 
> 2. 三平方の定理は、
> a^2 + b^2 = c^2
> と表すことができます。
> 
> 3. つまり、直角三角形の2辺の長さの平方和は、斜辺の長さの平方に等しいという関係式です。
> 
> 4. これは、ピタゴラスが発見した定理であり、幾何学や物理学など様々な分野で使用されている重要な定理です。
> 
> 5. 三平方の定理を使うことで、直角三角形の3辺の長さがわかれば、他の2辺の長さを求められるようになります。
> また、2辺の長さがわかれば、残りの1辺の長さを求められるようになります。
> 
> この定理は、直角三角形の性質を示す基本的な定理で、幅広い分野で活用されています。

応答時間：7.03s


**■ Claude3(Opus)の回答**

> 三平方の定理は、直角三角形において、直角をはさむ2辺の長さの2乗の和が、斜辺の長さの2乗に等しいという関係を表しています。これは、ピタゴラスの定理とも呼ばれています。
> 
> 三平方の定理は以下の式で表されます：
> 
> a^2 + b^2 = c^2
> 
> ここで、aとbは直角をはさむ2辺の長さ、cは斜辺の長さを表します。
> 
> この定理は、以下のような場面で役立ちます：
> 
> 1. 直角三角形の残りの1辺の長さを求める：2辺の長さがわかっている場合、三平方の定理を使って残りの1辺の長さを計算できます。
> 
> 2. 三角形が直角三角形かどうかを判定する：3辺の長さがわかっている場合、三平方の定理を使って、その三角形が直角三角形かどうかを判断できます。
> 
> 3. 座標平面上の2点間の距離を求める：座標平面上の2点の座標がわかっている場合、三平方の定理を使って、その2点間の距離を計算できます。
> 
> 三平方の定理は、数学や科学、工学など多くの分野で広く応用されています。建築、土木工学、航海、天文学などでも重要な役割を果たしています。

応答時間：17.91s

**■ 評価**

Cortexは三平方の定理とは違う法則に関する回答になってしまいましたが、原因としては「三平方の定理」を「Three Squares Theorem」という言葉として処理してしまい、これが三平方の定理ではない別の定理として認識されてしまったからだと考えられます。

Claude3(Haiku)もおおよそ正しい説明ができていますが、5番の文が間違っています。

Claude3(Opus)の方は全体を通して正しく三平方の定理を説明できていることが分かります。


### 日本語の質問に対するまとめ

日本語のそれぞれの質問に対する応答の評価を表にまとめると下記のようになります。

<table border="1">
  <tr>
    <th rowspan="2">質問</th>
    <th colspan="2" style="text-align: center;">Cortex(mistral-large)</th>
    <th colspan="2" style="text-align: center;">Claude3(Haiku)</th>
    <th colspan="2" style="text-align: center;">Claude3(Opus)</th>
  </tr>
  <tr>
    <th>正確さ</th>
    <th>応答速度(s)</th>
    <th>正確さ</th>
    <th>応答速度(s)</th>
    <th>正確さ</th>
    <th>応答速度(s)</th>
  </tr>
  <tr>
    <td>日本の人口を教えてください。</td>
    <td>◯　　　　　　　</td>
    <td>2.76　　　　　　</td>
    <td>×<br>数値に大きなズレ</td>
    <td>5.16　　　　　　</td>
    <td>△<br>数値に若干のズレ</td>
    <td>17.67　　　　　　</td>
  </tr>
  <tr>
    <td>Snowflakeの創設者を教えてください。</td>
    <td>×<br>回答が間違い</td>
    <td>4.05　　　　　　</td>
    <td>△<br>間違った文が含まれる</td>
    <td>5.77　　　　　　</td>
    <td>◯　　　　　　　</td>
    <td>15.92　　　　　　</td>
  </tr>
  <tr>
    <td>三平方の定理を説明してください。</td>
    <td>×<br>回答が間違い</td>
    <td>6.79　　　　　　</td>
    <td>△<br>間違った文が含まれる</td>
    <td>7.03　　　　　　</td>
    <td>◯　　　　　　　</td>
    <td>17.91　　　　　　</td>
  </tr>
</table>

日本語で質問をした場合、Cortexは難しい質問に対する正解率は低くなりました。
現在Snowflakeから利用できる言語モデルのバージョンではまだ日本語への対応力が弱いと考えられます。
今後Cortex LLMが日本リージョンでも利用できるようになるタイミングでの精度向上に期待ですね。
また、Cortexは簡単な質問に対しては応答速度は速いが、質問の難易度や回答トークン数が上がるにつれて応答時間が伸びました。

Claude3(Haiku)は、おおよそは正しい情報だが、詳細まで確認すると間違った情報が含まれていました。

Claude3(Opus)はCortexやClaude3(Haiku)と比べるとより正解に近い回答をしました。

速度で見ると、Cortexが一番早く、Claude3は外部から呼び出すためどの質問に対しても応答時間は長くなりました。
しかしClaude3のHaikuは軽量なモデルだけあって、Opusよりもかなり早く回答できています。


## 英語の質問に対する回答

次に、日本語でした質問と同じものを英語でしてみます。
英語での質問は下記です。
1. Please tell me the population of Japan.
2. Who are the founders of Snowflake?
3. Please explain the Pythagorean proposition.

### 質問① 「Please tell me the population of Japan.」

**■ Cortex(mistral-large)の回答**

>  The population of Japan as of 2021 is approximately 126 million people.

応答時間：1.00s


**■ Claude3(Haiku)の回答**

> The current population of Japan is around 125.5 million as of 2022.
> 
> Some more details on Japan's population:
> 
> - Japan has the 11th largest population in the world.
> 
> - The population has been declining in recent years due to low birth rates and an aging population. Japan has one of the oldest populations globally.
> 
> - The largest city and metropolitan area is Tokyo, which has a population of over 37 million people in the greater Tokyo area.
> 
> - Other major cities include Yokohama, Osaka, Kobe, Kyoto, and Nagoya.
> 
> - Japan's population is concentrated primarily on the main island of Honshu, with lower population densities in the northern island of Hokkaido and the southern islands.
> 
> So in summary, the latest estimated population of Japan as of 2022 is approximately 125.5 million people.

応答時間：5.17s


**■ Claude3(Opus)の回答**

> According to the World Bank, the population of Japan was estimated to be 125,681,593 in 2021. Japan is the world's eleventh-most populous country and the second-most populous island country. However, Japan's population has been declining in recent years due to low birth rates and an aging population. The population peaked in 2010 at 128,057,352 and has been falling since then. The Japanese government has been implementing various measures to address this issue, such as promoting work-life balance and providing support for child-rearing.

応答時間：9.23s

**■ 評価**

日本語の質問のところで書いたように、総務省によると2021年10月の日本の人口は1億2550万2千人なので、Cortexの回答（2021年の人口はおよそ1億2600万人）は四捨五入していると考えれば間違いではないと言えます。

一方Claude3(Haiku)の回答（2022年の人口は1億2550万人）ですが、この数字は実際のデータでは2021年の人口であり2022年の人口はもう少し少ないため、若干間違っていると言えます。その他の世界で11番目の人口などの情報は間違っていません。（2022年時点）

Claude3(Opus)は[World Bankのデータ](https://data.worldbank.org/indicator/SP.POP.TOTL?end=2022&locations=JP&start=2004)を参照しています。
World Bankによると、2021年の日本の人口は125,681,593人なので、Claude3(Opus)の回答（125,681,593人）と一致しています。
また2010年がピークであることやその時の人口などは、World Bankのデータとは一致しています。
これは総務省のデータとは若干乖離がありますが、調査方法により統計結果に差が出るのは仕方ないと考えると、Claude3(Opus)ではデータを正しく示せていると言えます。

Clude3(Haiku)は若干間違えましたが、CortexとClaude3(Opus)は参照元は違えど、共に正しい回答をしたと判断できます。
またCortexの応答時間は1秒で、かなり早く答えを返しました。


### 質問② 「Who are the founders of Snowflake?」

**■ Cortex(mistral-large)の回答**

>  The founders of Snowflake are Benoit Dageville, Thierry Cruanes, and Marcin Zukowski. They started the company in 2012 with the goal of reinventing the data warehouse for the cloud.

応答時間：2.06s


**■ Claude3(Haiku)の回答**

> The founders of Snowflake are:
> 
> 1. Mike Speiser - Speiser is the managing director at Sutter Hill Ventures and was one of the co-founders and driving forces behind Snowflake.
> 
> 2. Benoit Dageville - Dageville is the co-founder and president of products at Snowflake. He has extensive experience in database architecture and engineering.
> 
> 3. Thierry Cruanes - Cruanes is the co-founder and chief technology officer at Snowflake. He has a background in database internals and infrastructure.
> 
> 4. Marcin Żukowski - Żukowski is the co-founder and vice president of engineering at Snowflake. He previously worked on database and data warehouse technology.
> 
> These four individuals founded Snowflake in 2012. Snowflake is a cloud-based data warehousing company that has become one of the fastest-growing enterprise software companies in recent years. The founders' expertise in databases and data infrastructure was key to Snowflake's development and success.

応答時間：5.38s

**■ Claude3(Opus)の回答**

> Snowflake was founded in 2012 by three individuals:
> 
> 1. Benoit Dageville (President of Products)
    - Former Data Warehouse Architect at Oracle
    - Ph.D. in Computer Science from the University of Paris
> 2. Thierry Cruanes (CTO)
    - Former Lead Developer of Oracle's Coherence in-memory computing platform
    - Ph.D. in Computer Science from the University of Paris
> 3. Marcin Zukowski (CEO)
    - Former CEO of Vectorwise, a database company acquired by Actian Corporation
    - Ph.D. in Computer Science from the Vrije Universiteit in Amsterdam
> 
> Prior to founding Snowflake, the three founders worked together at Oracle, Vectorwise, and Actian Corporation, bringing extensive experience in data warehousing, database architecture, and cloud computing to their new venture. Their combined expertise led to the development of Snowflake's innovative cloud-based data warehousing solution.

応答時間：13.31s

**■ 評価**

Snowflakeの創設者について日本語で質問をした時はCortexは回答を間違えていましたが、英語で質問した場合は正しい情報を返してくれました。

Claude3(Haiku)は日本語で質問をした時に比べるとMike Speiserという人物が増えていますが、この人物はSnowflakeの初期投資家であり創業CEOでもあるため、創設者として間違ってはいないと言えます。

Claude3(Opus)は、おおよそ正しい情報を回答できています。


しかしClaude3(Opus)の下記の表現にはわずかに語弊があります。

> the three founders worked together at Oracle, Vectorwise, and Actian Corporation

正しい表現としては「BenoitとThierryがOracleで共に働いていて、MarcinのみがVectorwise（後にActian Corporationに買収された企業）で働いていた」になると思われます。


### 質問③「Please explain the Pythagorean proposition.」

**■ Cortex(mistral-large)の回答**

>  The Pythagorean theorem is a fundamental principle in geometry, discovered by the ancient Greek mathematician Pythagoras. It states that in a right-angled triangle, the square of the length of the hypotenuse (the side opposite the right angle) is equal to the sum of the squares of the lengths of the other two sides. This can be written as: a² + b² = c², where c represents the length of the hypotenuse, and a and b represent the lengths of the other two sides. This theorem is widely used in geometry, trigonometry, and physics.

応答時間：4.00s


**■ Claude3(Haiku)の回答**

> The Pythagorean proposition, also known as the Pythagorean theorem, is a fundamental theorem in geometry that relates the lengths of the sides of a right triangle. It states that in a right triangle, the square of the length of the hypotenuse (the side opposite the right angle) is equal to the sum of the squares of the lengths of the other two sides.
> 
> Mathematically, the Pythagorean proposition can be expressed as:
> 
> a^2 + b^2 = c^2
> 
> Where:
> - a and b are the lengths of the two sides of the right triangle, and
> - c is the length of the hypotenuse.
> 
> The Pythagorean theorem has several important properties and applications:
> 
> 1. It allows you to calculate the length of the hypotenuse given the lengths of the other two sides, or to calculate the length of one of the other sides given the lengths of the hypotenuse and the other side.
> 
> 2. It is the foundation for many geometric proofs and constructions, and is widely used in various fields, such as physics, engineering, and mathematics.
> 
> 3. It has many different proofs, some of which are geometric and others are algebraic. The original proof is attributed to the ancient Greek mathematician Pythagoras and his followers.
> 
> 4. The Pythagorean theorem can be generalized to higher dimensions, where it becomes the basis for the Pythagorean identity in trigonometry and the distance formula in analytic geometry.
> 
> The Pythagorean proposition is considered one of the most important and fundamental theorems in mathematics, and its applications extend far beyond the realm of geometry.

応答時間：7.69s

**■ Claude3(Opus)の回答**

> The Pythagorean proposition, also known as the Pythagorean theorem, is a fundamental relation in Euclidean geometry that states:
> 
> In a right-angled triangle, the square of the length of the hypotenuse (the side opposite the right angle) is equal to the sum of the squares of the lengths of the other two sides (called the catheti).
> 
> Mathematically, it can be expressed as:
> 
> a² + b² = c²
> 
> where a and b are the lengths of the catheti, and c is the length of the hypotenuse.
> 
> The theorem is named after the ancient Greek mathematician Pythagoras, who is credited with its discovery, although it is likely that the theorem was known to earlier civilizations.
> 
> The Pythagorean theorem has numerous proofs and applications in various fields, including:
> 
> 1. Mathematics: It is used in geometric calculations, trigonometry, and distance calculations in coordinate geometry.
> 
> 2. Physics: It is applied in vector calculations, force analysis, and calculating distances and trajectories.
> 
> 3. Engineering and construction: It is used to ensure that structures are built with right angles and to calculate distances, heights, and slopes.
> 
> 4. Navigation: The theorem is used to calculate distances between points and to determine the shortest path between two locations.
> 
> The Pythagorean theorem is a critical concept in mathematics and has far-reaching applications in various scientific and technical fields.

応答時間：16.64s

**■ 評価**

日本語で質問をした時はCortexは違う法則の説明になってしまっていましたが、英語で質問をした場合は正しく三平方の定理について説明できています。

Claude3(Haiku)の方は日本語で質問をした時は若干間違った情報がありましたが、英語では正確な情報を答えられています。

Claude3(Opus)も正確な情報を答えられています。


### 英語の質問に対するまとめ

英語のそれぞれの質問に対する応答の評価を表にまとめると下記のようになります。

<table border="1">
  <tr>
    <th rowspan="2">質問</th>
    <th colspan="2" style="text-align: center;">Cortex(mistral-large)</th>
    <th colspan="2" style="text-align: center;">Claude3(Haiku)</th>
    <th colspan="2" style="text-align: center;">Claude3(Opus)</th>
  </tr>
  <tr>
    <th>正確さ</th>
    <th>応答速度(s)</th>
    <th>正確さ</th>
    <th>応答速度(s)</th>
    <th>正確さ</th>
    <th>応答速度(s)</th>
  </tr>
  <tr>
    <td>Please tell me the population of Japan.</td>
    <td>◯</td>
    <td>1.00</td>
    <td>△<br>数値に若干のズレ</td>
    <td>5.17</td>
    <td>◯</td>
    <td>9.23</td>
  </tr>
  <tr>
    <td>Who are the founders of Snowflake?</td>
    <td>◯</td>
    <td>2.06</td>
    <td>◯</td>
    <td>5.38</td>
    <td>△<br>一部間違い</td>
    <td>13.31</td>
  </tr>
  <tr>
    <td>Please explain the Pythagorean proposition.</td>
    <td>◯</td>
    <td>4.00</td>
    <td>◯</td>
    <td>7.69</td>
    <td>◯</td>
    <td>16.64</td>
  </tr>
</table>

英語で質問すると、Claude3(Haiku/Opus)の回答には一部間違った情報も含まれていましたが、Cortexは全ての質問に正確に答えることができました。
かつ日本語の時に比べると応答速度も上がっています。

Cortexが日本語から英語に返ることで精度が上がったことから考えると、Cortexに質問をしたい場合は、英語で質問文を入力するか、Complete関数を呼び出す前に下記の例のようにTranslate関数を呼び出して一度翻訳を挟むと、精度や応答速度が上がると考えられます。
```python
Translate(prompt, "ja", "en")
```

ただ、**翻訳が間違っていると回答も間違ったものになってしまう**ということに注意する必要があります。
今回の質問例で言うと、「三平方の定理」をTranslate関数で翻訳した場合、「Theorem of three squares」という英語に変換されてしまいます。
この言葉は英語での三平方の定理を正しく表していないため、この言葉を使って「Please explain the Theorem of three square.」というような質問をしても三平方の定理に関する正しい回答が返ってきません。
一度翻訳を挟む場合は、「翻訳後の英語が正しいか」を確認する必要があります。


## 複数メッセージへの対応

次に、会話のように複数のターンがある時に正しく回答を返せるかを検証します。

検証方法としては、まず日本の人口を聞いた後に、「中国はどうですか？」という質問を続けます。
過去のやりとりを反映できている場合、「中国はどうですか？」は中国の人口を聞いているのだと判断できるので、中国の人口を答えればOKということになります。

**■ Cortex(mistral-large)の回答**

![スクリーンショット 2024-04-10 143754.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319284/be5966a5-f0e5-0f05-7eef-60330f0c5218.png)

**■ Claude3(Opus)の回答**

![2024-04-17 152116.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319284/58b3274c-6212-85e6-5cb4-d7c5553a2333.png)


**■ 評価**

Cortexの方は過去のやりとりを反映できておらず中国の人口は答えられませんでしたが、Claude3(Opus)の方は過去のやりとりを反映し中国の人口を返してくれました。（Haikuも同様に過去のやり取りを反映できる）
CortexのComplete関数は、現在はPythonではマルチメッセージには対応していないので、1つのメッセージに対する応答を返すだけしかできません。（[公式ドキュメント](https://docs.snowflake.com/en/user-guide/snowflake-cortex/llm-functions#using-snowflake-cortex-llm-functions-with-python)にも記載されている）

ただPythonではなくSQLのCOMPLETE関数はマルチメッセージに対応しているので、SiSアプリの中から下記のようなSQL文でCOMPLETE関数を呼び出し、引数として会話の履歴を渡せばマルチメッセージにも対応できます。
```sql
SELECT SNOWFLAKE.CORTEX.COMPLETE(
    'mistral-large',
    [
        {'role': 'user', 'content': '日本の人口を簡潔に教えてください。'},
        {'role': 'assistant', 'content': ' As of 2021, Japanese population is approximately 126 million people. It is the 11th most populated country in the world. The population is rapidly aging and there is a low birth rate, which are significant issues for the country.'},
        {'role': 'user', 'content': '中国はどうですか？'}
    ], {}
);
```

## コスト
最後にコストについて比較してみます。
CortexとClaude3で応答時間の差は数秒だったためWHの稼働によるコストはほぼ同じと考え、トークンによるコストの違いのみを見ていきます。
- Cortex(mistral-large)
    - トークン1,000,000個あたり5.10クレジット（= トークン1,000個あたり0.0051クレジット）
    - N. VirginiaリージョンでEnterpriseエディションの場合、**トークン1,000個あたり0.0153USD**
- Claude3(Haiku)
    - **入力トークン1,000個あたり0.00025 USD**
    - **出力トークン1,000個あたり0.00125 USD**
- Claude3(Opus)
    - **入力トークン1,000個あたり0.01500 USD**
    - **出力トークン1,000個あたり0.07500 USD**

トークンによる価格を総合的に考えると、 **Claude3(Haiku) < Cortex(mistral-large) < Claude3(Opus)** の順であり、Claude3(Opus)が最も高価であると判断できます。

- 参考情報
  - https://docs.snowflake.com/en/user-guide/snowflake-cortex/llm-functions#cost-considerations
  - https://aws.amazon.com/jp/bedrock/pricing/
    - （2024/04/18時点では英語表示にしないとOpusの料金は表示されない）


# まとめ

今回の検証結果を表にまとめると下記のようになります。
<table border="1">
  <tr>
    <th>評価観点</th>
    <th>Cortex(mistral-large)</th>
    <th>Claude3(Haiku)</th>
    <th>Claude3(Opus)</th>
  </tr>
  <tr>
    <td>日本語に対する回答精度</td>
    <td>△<br>質問によっては間違える</td>
    <td>△<br>一部間違った情報が含まれる</td>
    <td>〇　　　　　　　　</td>
  </tr>
  <tr>
    <td>日本語に対する応答速度</td>
    <td>早</td>
    <td>中</td>
    <td>遅</td>
  </tr>
  <tr>
    <td>英語に対する回答精度</td>
    <td>〇</td>
    <td>△<br>質問によってはわずかに間違える</td>
    <td>△<br>質問によってはわずかに間違える</td>
  </tr>
  <tr>
    <td>英語に対する応答速度</td>
    <td>早</td>
    <td>中</td>
    <td>遅</td>
  </tr>
  <tr>
    <td>複数メッセージへの対応</td>
    <td>△<br>SQLでなら可能</td>
    <td>〇　　　　　　　　</td>
    <td>〇　　　　　　　　</td>
  </tr>
  <tr>
    <td>コスト</td>
    <td>中</td>
    <td>小</td>
    <td>大</td>
  </tr>
</table>
（※速度やコストは3つのモデルでの相対的な評価値）

Cortex(mistral-large)に英語で質問した場合が精度・速度ともに一番良かったので、現時点では日本語で質問をしたい場合でも**英語に翻訳して質問をするのがベストな使い方**だと思いました。

Claude3(Haiku/Opus)は日本語・英語共に、ある程度は回答精度も良く詳細な情報まで示してくれるものの、外部ネットワーク呼び出しが発生するのもあり応答時間は長くなってしまいました。

日本語の性能はClaude3(Opus)が最も良かったため、どうしても日本語で質問をしたい場合は、応答時間がかかってもいいのであればSiSアプリからClaude3(Opus)を呼び出すという選択肢もありだとは思います。

またCortexで会話のような複数メッセージに対応したい場合は、PythonのComplete関数ではなく、SQLでCOMPLETE関数を呼び出すことで実現できます。


# 仲間募集

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>

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


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

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


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

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

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


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

Alteryxは、業務ユーザーからIT部門まで誰でも使えるセルフサービス分析プラットフォームです。
Alteryx導入の豊富な実績を持つNTTデータは、最高位にあたるAlteryx Premiumパートナーとしてお客さまをご支援します。

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

https://enterprise-aiiot.nttdata.com/service/alteryx
</details>


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

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

https://enterprise-aiiot.nttdata.com/service/datarobot
</details>


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

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


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

NTTデータでは、Snowflake Inc.とソリューションパートナー契約を締結し、クラウド・データプラットフォーム「Snowflake」の導入・構築、および活用支援を開始しています。
NTTデータではこれまでも、独自ノウハウに基づき、ビッグデータ・AIなど領域に係る市場競争力のあるさまざまなソリューションパートナーとともにエコシステムを形成し、お客さまのビジネス変革を導いてきました。
Snowflakeは、これら先端テクノロジーとのエコシステムの形成に強みがあり、NTTデータはこれらを組み合わせることでお客さまに最適なインテグレーションをご提供いたします。

https://enterprise-aiiot.nttdata.com/service/snowflake
</details>