google colabでClaude3 APIサービスを触ってみる

## はじめに

　昨日、「鯱.py」という勉強会でClaude3 APIを触ったので覚書がてら記事にしたいと思います。

 ## Claudeとは

　ClaudeはAnthropic社が開発したAIアシスタントです。(ざっくり言うとAnthropic社の作ったChatGPTみたいなものです。もともとAnthropic社はOpenAIでGPTの研究をしていた技術者が設立した会社です。)
　以下、ClaudeによるClaudeの説明。
 
　Claudeの主な特徴は以下の通りです:

- 自然言語対話が可能で、様々な質問に対して適切な回答を提供できます
- 文書の要約、分析、ライティングなどの作業をサポートできます
- プログラミング、数学、一般知識などの幅広い分野の質問に答えられます
- 2023年8月時点での最新の知識を持っており、それ以降の出来事については2023年8月時点の視点から回答します
- 人間の対話相手として振る舞い、適切な言語表現を心がけています

　Anthropic社はClaudeを通じて、人工知能技術の可能性を示し、人々の生活に有意義な影響を与えることを目指しています。

## Claude3のモデル

　Claude3にはHaiku, Sonnet, and Opusの3つのモデルがあって、高速かつ低コストなHaiku、最も強力なモデルのOpus、その2つの中間のSonnetとなっています。
　以下はAnthropic社から公表されているベンチマークです。

 ![GH1CKKlbkAAKR_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350321/52675fce-d923-a587-bf33-083456578872.png)

## APIキーの取得

　それではAPIの使用にあたって、まずはこちら(https://console.anthropic.com) でアカウントを作成し、APIキーを取得してください。

　詳しくは、以下のサイトを確認して下さい。

https://support.anthropic.com/ja/articles/8114521-claude-api%E3%81%AB%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF%E3%81%A9%E3%81%86%E3%81%99%E3%82%8C%E3%81%B0%E3%81%84%E3%81%84%E3%81%A7%E3%81%99%E3%81%8B

　取得したAPIはこちらでGoogle colabのシークレット機能に追加しておきましょう。

![スクリーンショット 2024-04-07 150735.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350321/6619c571-0aa9-6669-e082-69744a532c69.png)


## Google colabで実装

　以下のクイックスタートガイドに沿って、Google colabでコードを実装していきましょう。

https://docs.anthropic.com/claude/docs/quickstart-guide

まずはanthropicライブラリのインストール。
 
 ```python
!pip install anthropic
 ```

続いて、anthropicライブラリのインポート、anthropicインスタンスを生成しGoogle colabのシークレット機能で設定したAPIキーをインスタンスに設定します。
(********はGoogle colabのシークレット機能に登録した名前です。)

 ```python
import anthropic
from google.colab import userdata

client = anthropic.Anthropic(
    api_key=userdata.get('********')
)
```

　そしてAPIコール。引数を簡単に説明すると、モデルには低コストのhaiku設定、最大トークン数は1000、temperature（出力のランダム性をコントロールする値）を0.0に設定しています。また、このチャットの役割として"あなたは優秀なコピーライター"と設定し、Claude3に"日本酒、日本ワインの立ち呑みバーのコピーを1つ考えてください"と問い合わせています。

```python
message = client.messages.create(
    model="claude-3-haiku-20240307",
    max_tokens=1000,
    temperature=0.0,
    system="あなたは優秀なコピーライターです。",
    messages=[
        {"role": "user", "content": "日本酒、日本ワインの立ち呑みバーのコピーを１つ考えてください。"}
    ]
)

print(message.content[0].text)
```

　APIの戻り値として以下の内容が返ってきました。

```
以下のようなコピーを考えました。

「日本の伝統と革新が出会う、隠れ家の立ち呑み酒場」

日本酒と日本ワインの魅力を存分に味わえる、落ち着いた雰囲気の立ち呑み酒場。厳選された銘柄が並ぶ
カウンターで、熟練の店主が丁寧に注ぐ一杯は格別。伝統の技と革新的なアプローチが融合した、隠れ家
のような特別な空間。日本の酒文化を心ゆくまで堪能できる、大人の隠れ家へようこそ。
```

　低コストなモデルでもなかなか優秀な回答が返ってきました。


## Prompt libraryを使ってみる。

　AnthropicのHPには以下のプロンプト集のページもあるので、そこからも一つ使ってみましょう。

https://docs.anthropic.com/claude/prompt-library

　使ってみるのは、以下のPythonの関数を作成してくれるPromptを日本語で呼び出せるように少し書き換えて使ってみます。

https://docs.anthropic.com/claude/page/function-fabricator

　今回は一番性能のいいopusを指定し、画像を引数として取り、エッジ検出画像を戻り値で返す関数を作成してもらいます。

```python
system_prompt = """
Your task is to create a Python function based on the Japanese request provided. The 
request describes the desired functionality of the function, including input parameters
and expected return values. Implement the function according to the given specification, 
ensure that edge cases are handled, perform any necessary validation and follow Python 
programming best practice. Include appropriate 
Japanese comments in the code to explain the logic and help other developers understand 
the implementation.
"""

message = client.messages.create(
    model="claude-3-opus-20240229",
    max_tokens=1000,
    temperature=0.0,
    system=system_prompt,
    messages=[
        {"role": "user", "content": "引数で画像を受取り、OpenCVでエッジ検出処理を施した画像を戻り値で返す関数を作成してください。"}
    ]
)

print(message.content[0].text)
```

出力結果は以下です。
```
以下は、引数で画像を受け取り、OpenCVを使用してエッジ検出処理を施した画像を戻り値で返す関数の実装例です。

```python
import cv2
import numpy as np

def detect_edges(image):
    """
    画像のエッジ検出を行う関数

    Args:
        image (numpy.ndarray): 入力画像（BGR形式）

    Returns:
        numpy.ndarray: エッジ検出処理後の画像（グレースケール）
    """
    # 画像をグレースケールに変換
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

    # ガウシアンフィルタを適用してノイズを除去
    blurred = cv2.GaussianBlur(gray, (5, 5), 0)

    # Cannyアルゴリズムを使用してエッジ検出
    edges = cv2.Canny(blurred, 100, 200)

    return edges

# 使用例
if __name__ == "__main__":
    # 画像の読み込み
    image = cv2.imread("input_image.jpg")

    # 画像が正常に読み込まれたことを確認
    if image is not None:
        # エッジ検出処理を実行
        edges = detect_edges(image)

        # 結果の表示
        cv2.imshow("Original Image", image)
        cv2.imshow("Edges", edges)
        cv2.waitKey(0)
        cv2.destroyAllWindows()
    else:
        print("画像の読み込みに失敗しました。")
　```

この関数では、以下の処理を行っています。

1. 入力画像をグレースケールに変換します。
2. ガウシアンフィルタを適用して画像のノイズを除去します。
3. Cannyアルゴリズムを使用してエッジ検出を行います。
4. エッジ検出処理後の画像を戻り値として返します。

関数の引数として、numpy.ndarray形式のBGR画像を受け取ります。戻り値として、エッジ検出処理後のグレースケール画像を返します。

使用例では、`cv2.imread()`を使用して画像を読み込み、`detect_edges()`関数を呼び出してエッジ検出処理を実行しています。処理結果は`cv2.imshow()`を使用して表示されます。

注意点として、画像の読み込みに失敗した場合はNoneが返されるため、適切なエラーハンドリングを行っています。

```

　関数を作成するだけじゃなく、使用例やコードの説明まで回答してくれました。

　せっかく関数を作ってくれたので、そのまま動作確認をしてみましょう。作成してくれたコードをgoogle colabに貼り付けます。

 ```python
import cv2
import numpy as np

def detect_edges(image):
    """
    画像のエッジ検出を行う関数

    Args:
        image (numpy.ndarray): 入力画像（BGR形式）

    Returns:
        numpy.ndarray: エッジ検出処理後の画像（グレースケール）
    """
    # 画像をグレースケールに変換
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

    # ガウシアンフィルタを適用してノイズを除去
    blurred = cv2.GaussianBlur(gray, (5, 5), 0)

    # Cannyアルゴリズムを使用してエッジ検出
    edges = cv2.Canny(blurred, 100, 200)

    return edges
 ```

 　google colabにテスト用の画像をアップして、関数を呼び出して戻り値の画像を表示します。テスト用の画像には[pixabay](https://pixabay.com/ja/)のフリー画像を使用します。

![test.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350321/bf28a47c-2e8e-ad26-5864-6b7986d99ddf.jpeg)


```python
import matplotlib.pyplot as plt

image_path = '/content/test.jpg'

image = cv2.imread(image_path)

edges = detect_edges(image)

plt.imshow(edges)
plt.axis('off')
plt.show()
```

　出力結果は以下

![ダウンロード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350321/b55c5b2c-ded0-cb94-a368-9e35a0d1efce.png)

　正しく、エッジ検出できていますね。

 ## まとめ

　以上、この記事ではAnthropic社によるAIアシスタントClaude3の紹介とその利用方法を解説、APIキーの取得からGoogle colabでの実装、Prompt libraryを使った具体的な例までを紹介しました。
 
　個人的な使用感ではOpenAIのAPIに全然負けてないし、Prompt libraryにはたくさんいいプロンプトがあるので便利だと思いました。