Amazon QをChatGPT、GitHub Copilot Chatと比較してみた

### はじめに
昨年の11月27日(月) ～ 12月1日(金)に開催されたAWS re:Invent 2023にて発表されたAWSの生成AIである「Amazon Q」について、「ChatGPT」や「GitHub Copilot Chat」と比較してみました。

### Amazon Qとは
Amazon Qは、AWSが開発したチャット型の生成AIです。
ナレッジベースにAWSの各種ドキュメントを持っており、自然言語処理を用いて、ユーザーが入力した文章に対して、適切な応答を生成することができます。
Amazon Qは、マネジメントコンソールや各種サービスと統合されています。

価格は、Amazon Q ビジネスプランが月額20USD、Amazon Q ビルダープランが月額25USDで利用することができます。
**※2024年4月11日現在、プレビュー期間となっており、多くの機能が無料で利用することができます。**

現在、Amazon Qは日本語には非対応で、英語のみの対応となっています。

### CodeWhisperer
Amazon QはCodeWhispererに統合されており、VS Code等のエディタ上で利用することができます。
CodeWhisperer上でAmazon Qを利用することで、コードの要約やコードの生成を行うことができます。

### ChatGPTとGitHub Copilot Chatとの比較
コード生成に利用できる生成AIとして有名なChatGPTやGitHub Copilot Chatと比較してみました。
※ChatGPTは無料版のGPT-3.5を利用しています。
#### 比較①
各生成AIに以下のプロンプトでPHPのコードを生成させてみました。
※Amazon Qのみ、Google翻訳を利用して英語に翻訳してから生成させています。
```
PHPで与えられた文字列に含まれる単語の数をカウントするコードを作って。
(Create a code to count the number of words contained in a given string in PHP.)
```

#### 結果①
##### ChatGPT
```php
<?php
// 与えられた文字列
$inputString = "This is a sample sentence with several words.";
// 単語の数をカウントするロジック
$wordCount = str_word_count($inputString);
// 結果を表示
echo "与えられた文字列 '$inputString' に含まれる単語の数は $wordCount 個です。";
?>
```
ChatGPTは、与えられたプロンプトに対して、適切なコードを生成することができました。
単語数のカウントには、`str_word_count`関数を利用しています。

##### GitHub Copilot Chat
```php
<?php
function countWords($string) {
    return str_word_count($string);
}
$string = "Hello, this is a test string.";
echo "The string contains " . countWords($string) . " words.";
?>
```
GitHub Copilot Chatも、与えられたプロンプトに対して、適切なコードを生成することができました。
独自の関数`countWords`を定義し、`str_word_count`関数を利用しています。

##### Amazon Q
```php
<?php
function countWords($string) {
  $words = explode(" ", $string);
  return count($words);
}
$string = "Hello world, how are you today?";
echo countWords($string); // Prints 7
?>
```
Amazon Qも、与えられたプロンプトに対して、適切なコードを生成することができました。
独自の関数`countWords`を定義し、`explode`関数と`count`関数を利用しています。他の生成AIと比較して、少し力技な実装となっているような印象を受けました。
また、**コメントにはPrints 7と記載されていますが、実際には6が出力され、コメントと処理内容の乖離が見られました。**

---

依頼したプロンプトのような簡単なコード生成においては、ChatGPT、GitHub Copilot Chat、Amazon Qのいずれも適切なコードを生成することができました。
ですが、**Amazon Qは他の生成AIと比較して、少し力技な実装となっているような印象を受け、コメントと処理内容の乖離が見られました。**
その点において、ChatGPTやGitHub Copilot Chatの方が、より適切なコードを生成することができたと言えると思います。
個人的には、GitHub Copilot Chatが独自の関数を定義している点が、より完成度が高いと感じました。

#### 比較②
各生成AIに以下の`docker-compose.yml`ファイルに`mysql`サービスを追加するように依頼してみました。
ボリュームをマウントしたり、ポート番号を8008という少し特殊な値に設定しています。
```yaml
services:
  php:
    build: ./docker/php
    volumes:
      - ./docker/php/php.ini:/usr/local/etc/php/php.ini
      - ./:/home/test
    environment:
      APACHE_DOCUMENT_ROOT: /home/test/public
    working_dir: /home/test/
    ports:
      - 8008:80
```

```
mysql8.0のコンテナも追加したい
(I want to add a mysql8.0 container.)
```

#### 結果②
##### ChatGPT
```yaml
version: '3.7'

services:
  php:
    build: ./docker/php
    volumes:
      - ./docker/php/php.ini:/usr/local/etc/php/php.ini
      - ./:/home/test
    environment:
      APACHE_DOCUMENT_ROOT: /home/test/public
    working_dir: /home/test/
    ports:
      - 8008:80
  mysql:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: examplepassword
      MYSQL_DATABASE: exampledb
      MYSQL_USER: exampleuser
      MYSQL_PASSWORD: examplepassword
    ports:
      - 3306:3306
```

##### GitHub Copilot Chat
```yaml
services:
  php:
    build: ./docker/php
    volumes:
      - ./docker/php/php.ini:/usr/local/etc/php/php.ini
      - ./:/home/test
    environment:
      APACHE_DOCUMENT_ROOT: /home/test/public
    working_dir: /home/test/
    ports:
      - 8008:80
  mysql:
    image: mysql:8.0
    command: --default-authentication-plugin=mysql_native_password
    volumes:
      - db_data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: root_password
      MYSQL_DATABASE: test_db
      MYSQL_USER: test_user
      MYSQL_PASSWORD: test_password
    ports:
      - 3306:3306
volumes:
  db_data:
```

##### Amazon Q
```yaml
services:
  # existing php service
  mysql:
    image: mysql:8.0
    volumes:
      - db_data:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: somepassword
      MYSQL_DATABASE: mydb
    ports:
      - 3306:3306
volumes:
  db_data: {}
```

ChatGPT、GitHub Copilot Chat、Amazon Qのいずれも、与えられたプロンプトに対して、適切なコードを生成することができました。
あまり差異が見られなかったため、さらに追加のプロンプトを与えてみました。
```
phpのコンテナとmysqlのコンテナに依存関係を持たせたい
(I want to have a dependency between the php container and mysql container.)
```

##### ChatGPT
```yaml
version: '3.7'
services:
  php:
    build: ./docker/php
    volumes:
      - ./docker/php/php.ini:/usr/local/etc/php/php.ini
      - ./:/home/test
    environment:
      APACHE_DOCUMENT_ROOT: /home/test/public
    working_dir: /home/test/
    ports:
      - 8008:80
    depends_on:
      - mysql
  mysql:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: examplepassword
      MYSQL_DATABASE: exampledb
      MYSQL_USER: exampleuser
      MYSQL_PASSWORD: examplepassword
    ports:
      - 3306:3306
```

##### GitHub Copilot Chat
```yaml
services:
  php:
    build: ./docker/php
    volumes:
      - ./docker/php/php.ini:/usr/local/etc/php/php.ini
      - ./:/home/test
    environment:
      APACHE_DOCUMENT_ROOT: /home/test/public
    working_dir: /home/test/
    ports:
      - 8008:80
    depends_on:
      - mysql
  mysql:
    image: mysql:8.0
    command: --default-authentication-plugin=mysql_native_password
    volumes:
      - db_data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: root_password
      MYSQL_DATABASE: test_db
      MYSQL_USER: test_user
      MYSQL_PASSWORD: test_password
    ports:
      - 3306:3306
volumes:
  db_data:
```

##### Amazon Q
```yaml
version: '3'

services:
  php:
    build: ./docker/php 
    volumes: 
      - ./docker/php/php.ini:/usr/local/etc/php/php.ini
      - ./:/var/www/html
    ports:
      - 8000:80
  mysql:
    image: mysql:latest
    volumes:
      - db_data:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=my-secret-pw
      - MYSQL_DATABASE=my_database
    ports: 
      - 3306:3306
    depends_on: 
      - php
volumes:
  db_data: {}
```

ChatGPT、GitHub Copilot Chatは、与えられたプロンプトに対して、適切なコードを生成することができました。
一方、Amazon Qは、依存関係を持たせるというプロンプトに対しては、適切なコードを生成できましたが、**既存のphpのport番号が8000になってしまっている点や、volumeの指定が誤っている点が見られました。**

### まとめ
Amazon Qは最も新しくでた生成AIであるためか、他の生成AIと比較してまだまだ改善の余地があると感じました。
CodeWhisperer上から呼び出して利用する、コード生成などの汎用的な用途としては、まだChatGPTやGitHub Copilot Chatに分があると思います。
しかし、Amazon QはAWSの各種ドキュメントをナレッジベースとして持っているため、マネジメントコンソール上から利用する際などの、AWSのサービスに関する質問に対しては、他の生成AIよりも適切な回答を返すことができると思います。
特に、AWSは新しいサービスが続々とリリースされているため、ChatGPT等が持っていない最新の情報を持っていることが強みとなると思います。
チャット機能以外にも、言語のバージョンアップや機能生成などの機能も予定されているため、今後の発展が楽しみです。

### 参考URL
- [AWS re:Invent 2023](https://aws.amazon.com/jp/events/reinvent-2023/)
- [Amazon Q](https://aws.amazon.com/jp/q/)
- [Amazon Q の価格](https://aws.amazon.com/jp/q/pricing/)
- [CodeWhisperer](https://aws.amazon.com/jp/codewhisperer/)
- [Amazon Q with CodeWhisperer](https://aws.amazon.com/jp/codewhisperer/q/)
- [ChatGPT](https://chat.openai.com/)
- [GitHub Copilot Chat](https://github.com/features/copilot/)