Claude 3 OpusとChatGPT Plusの比較

2024/03/12に公開

概要

最近Claude 3 Opusが話題になっていたので気になっていた。
ただ、実際のところどれぐらい出力に差があるのか、明示的なものが見当たらなかったので自分で試してみることにした。
※プロンプトのテクニックに精通しているわけではないので雑比較になります。イメージだけでも伝わればなと思っています。

やること

大きく分けて以下の3点は確認しておきたい。特にFew-Shotに関しては個人的なユースケースに合うため気になっている。

  • Zero-Shotの精度
  • Few-Shotの精度
  • 自然言語によるラリー

内容についてはプロンプトのライブラリと、公式Documentを流し見した程度の習熟度で試しています。

Zero-Shot1

以下のプロンプトで確認。

初級:カレンダーの表示

年と月を入力すると、その月のカレンダーを表示するプログラムを作成してください。
カレンダーは、曜日の名前と日付を正しく配置して表示してください。
Claude
import calendar

def display_calendar(year, month):
    # カレンダーのヘッダー(曜日の名前)を取得
    header = calendar.weekheader(2)
    
    # 指定された年月のカレンダーを取得
    cal = calendar.monthcalendar(year, month)
    
    # カレンダーを表示
    print(f"{year}{month}月")
    print(header)
    
    for week in cal:
        week_str = [str(day).rjust(2) if day != 0 else "  " for day in week]
        print(" ".join(week_str))

# 年と月を入力
year = int(input("年を入力してください: "))
month = int(input("月を入力してください: "))

# カレンダーを表示
display_calendar(year, month)
ChatGPT
# カレンダー表示プログラムの作成
# Pythonのcalendarモジュールを使用して、指定された年月のカレンダーを表示する

import calendar

# ユーザーから年と月を入力してもらう代わりに、サンプルとして2023年3月のカレンダーを表示する
year = 2023  # 年を指定
month = 3    # 月を指定

# 指定された年月のカレンダーを生成する
cal = calendar.month(year, month)

# カレンダーを表示する
print(cal)

Zero-Shot1 結論

ふーむ(´・ω・`)なんとも言えない感じ(´・ω・`)
これだけじゃわからないので、Claudeの方にcalendar.month()を使ったらどうなる?と聞いたらChatGPTの内容を出力してきた。

物足りないので別パターンで試す。

Zero-Shot2

中級:タスク管理アプリケーション

タスクを管理するアプリケーションを作成してください。
タスクの追加、削除、更新、一覧表示の機能を実装してください。
タスクはタイトル、説明、期限、優先度を持つようにしてください。
Claude
import datetime

class Task:
    def __init__(self, title, description, due_date, priority):
        self.title = title
        self.description = description
        self.due_date = due_date
        self.priority = priority

class TaskManager:
    def __init__(self):
        self.tasks = []

    def add_task(self, task):
        self.tasks.append(task)
        print("タスクが追加されました。")

    def remove_task(self, index):
        if 0 <= index < len(self.tasks):
            removed_task = self.tasks.pop(index)
            print(f"タスク '{removed_task.title}' が削除されました。")
        else:
            print("無効なインデックスです。")

    def update_task(self, index, task):
        if 0 <= index < len(self.tasks):
            self.tasks[index] = task
            print(f"タスク '{task.title}' が更新されました。")
        else:
            print("無効なインデックスです。")

    def list_tasks(self):
        if len(self.tasks) == 0:
            print("タスクはありません。")
        else:
            for i, task in enumerate(self.tasks):
                print(f"{i+1}. タイトル: {task.title}")
                print(f"   説明: {task.description}")
                print(f"   期限: {task.due_date}")
                print(f"   優先度: {task.priority}")
                print()

# 使用例
task_manager = TaskManager()

# タスクの追加
task1 = Task("買い物", "スーパーで食料品を買う", datetime.date(2023, 6, 10), "高")
task_manager.add_task(task1)

task2 = Task("レポート作成", "科目Xのレポートを完成させる", datetime.date(2023, 6, 15), "中")
task_manager.add_task(task2)

# タスクの一覧表示
task_manager.list_tasks()

# タスクの更新
updated_task = Task("買い物", "スーパーで食料品とトイレットペーパーを買う", datetime.date(2023, 6, 10), "高")
task_manager.update_task(0, updated_task)

# タスクの削除
task_manager.remove_task(1)

# 再度タスクの一覧表示
task_manager.list_tasks()
ChatGPT
タスク管理アプリケーションの作成には、Python と Flask を使用して簡単なウェブアプリケーションを構築することが一つの方法です。以下はその基本的なステップを説明したものです。
...

つらつらとFlaskで簡易的な実装を出力

Zero-Shot2 結論

それぞれの特色が出たなと感じる。
1つ目の内容を振り返ってみると、Claudeはよりベースに近い部分での実装を提示してくれるが、ChatGPTは実際のユースケースに合わせた形での出力に見える(現時点では)

あまりZero-Shotで確認するととはないが、傾向として知れたのはよかったかもしれない。

Few-Shot

以下のプロンプトで確認。

あなたはソフトウェアエンジニアリングの専門家です。contentをよく読んで質問・要望に答えてください。

<content>
AWS CDKでAPIサーバーを構築している。
CI/CDはGitHubActionsで実行したい。
CDK自体はTypeScriptで記述している。
lambda関数、lambda layerはpythonで記述している。requirements.txtは/lambda/layer/に置いており、install先は/lambda/layer/pythonとする。installしたpythonディレクトリをzip化する必要はない。
GitHubActionsで利用するactionsは最新ものとする。
nodeのバージョンは20とする。
pythonのバージョンは3.11とする。
各種依存関係のインストールは、それぞれ別のnameに定義する。
developブランチ、productionブランチへのマージ時に実行されるようにする。develop、productionのAWS環境が異なるため、異なるsecretを参照するようにする。
</content>

workflowで利用する.ymlを出力して。
Claude
name: CI/CD

on:
  push:
    branches:
      - develop
      - production

env:
  AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
  AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
  AWS_DEFAULT_REGION: ap-northeast-1

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v3

    - name: Set up Node.js
      uses: actions/setup-node@v3
      with:
        node-version: '20'

    - name: Set up Python
      uses: actions/setup-python@v4
      with:
        python-version: '3.11'

    - name: Install Node dependencies
      run: npm ci

    - name: Install Python dependencies
      run: |
        cd lambda/layer
        pip install -r requirements.txt -t python

    - name: Build CDK stack
      run: npm run build

    - name: Deploy to develop
      if: github.ref == 'refs/heads/develop'
      env:
        AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID_DEVELOP }}
        AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY_DEVELOP }}
      run: npx cdk deploy --require-approval never

    - name: Deploy to production
      if: github.ref == 'refs/heads/production'
      env:
        AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID_PRODUCTION }}
        AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY_PRODUCTION }}
      run: npx cdk deploy --require-approval never
ChatGPT
name: CI/CD Workflow for AWS CDK API Server

on:
  push:
    branches:
      - develop
      - production

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        node-version: [20.x]
        python-version: [3.11]
    steps:
      - uses: actions/checkout@v3
      
      - name: Setup Node.js
        uses: actions/setup-node@v3
        with:
          node-version: ${{ matrix.node-version }}
      
      - name: Install CDK dependencies
        run: npm install
      
      - name: Setup Python
        uses: actions/setup-python@v4
        with:
          python-version: ${{ matrix.python-version }}
      
      - name: Install Lambda Layer dependencies
        run: |
          pip install -r ./lambda/layer/requirements.txt -t ./lambda/layer/python
          
      - name: Deploy to AWS
        env:
          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID_DEVELOP if github.ref == 'refs/heads/develop' else secrets.AWS_ACCESS_KEY_ID_PRODUCTION }}
          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY_DEVELOP if github.ref == 'refs/heads/develop' else secrets.AWS_SECRET_ACCESS_KEY_PRODUCTION }}
          AWS_DEFAULT_REGION: 'us-east-1' # ここは適宜変更してください
        run: npx cdk deploy --all

Few-Shotの結論

今回のケースにおいては、両者に大きな差は無さそう。
Claudeに対応する形でのプロンプトで比較しているが、最近のChatGPTは比較的幅広で受け止めてくれるので、ChatGPTに特化させてプロンプトにしたとしても、大差はないと考えている。

色々とプロンプトを試したが、これが欲しいものに一番近づいてくれたものになる。

個人的にはClaudeの方が好み(´・ω・`)

自然言語によるラリー

単純比較が難しいので、箇条書きで気になった点を残します。

  • 欲しい情報に辿り着くためのstep数は大差ない。プロンプト次第でこのあたりは変わるだろうという所感。
    • Opusの方が良くも悪くも簡潔な回答になる。
    • ChatGPTは概要からの解説が多くなる。
  • Opusの方がレスポンスが早いので作業は快適。

所感

現時点で大きな差は見られなかったという感想。
大きな差は確認できなかった以上は、レスポンスが早いという点でClaudeの課金は継続してもいいかなと思う。

OpenAIのエコシステムを有効活用できている人は、そのままGPTを利用するでいいんじゃないかなと思った。

他にも画像認識が優れていたり、コード生成以外の面の優位性があるようなので色々と試してみようと思う。

GitHubで編集を提案

Discussion