OpenAIクラスを読む②

# 目次
1. はじめに
2. 内容
3. Embeddeingsクラス
4. Filesクラス
5. おわりに

# 1. はじめに

この記事はOpenAIのAPIを触るにあたって、勉強した内容を共有する目的で書いています。
OpenAI公式の[API Refernce](https://platform.openai.com/docs/api-reference/introduction)を読む方が参考になります。
対象や環境などは[前回の記事](https://qiita.com/mocisot/items/1227effd02ca967f5558)をご覧ください。

# 2. 内容

1. Embeddingsクラス
    * 概要
    * createメソッド
2. Filesクラス 
    * 概要
    * createメソッド
    * retrieveメソッド

# 3. Embeddingsクラス

### 概要

Embeddingsクラスはテキストの類似度を比較するのに用いられます。
openaiモジュールの中にある```embeddings.py```の27~139行目に書いてあります。

### createメソッド

Embeddingsクラスのcreateメソッドについて見ていきます。
同ファイル内の47~139行目に書かれています。
47~61行目を引用します。
```python:embeddings.py
    def create(
        self,
        *,
        input: Union[str, List[str], Iterable[int], Iterable[Iterable[int]]],
        model: Union[str, EmbeddingModel],
        dimensions: int | NotGiven = NOT_GIVEN,
        encoding_format: Literal["float", "base64"] | NotGiven = NOT_GIVEN,
        user: str | NotGiven = NOT_GIVEN,
        # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
        # The extra values given here take precedence over values defined on the client or passed to this method.
        extra_headers: Headers | None = None,
        extra_query: Query | None = None,
        extra_body: Body | None = None,
        timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN,
    ) -> CreateEmbeddingResponse:
```
ここから分かるのは以下の3点です。
* 引数には```input```と```model```を設定する必要がある
* ```model```には```"text-embedding-ada-002", "text-embedding-3-small", "text-embedding-3-large"```のいずれかを設定する必要がある
* ```CreateEmbeddingResponse```クラスを返す

次にCreateEmbeddingResponseクラスを見てみます。
```create_embedding_response.py```の20~31行目に書かれています。
このクラスの中身を筆者の分かる範囲でまとめると以下のようになります。
* ```data```  : ```Embedding```クラスのリスト
* ```model``` : 回答につかったモデル名
* ```usage``` : 回答で消費したトークン量

最後にEmbeddingクラスを見ます。
```embedding.py```の11~23行目に書かれています
このクラスの中身を同様にまとめると以下のようになります。
* ```embedding``` : ベクトル
* ```index``` : 要素番号

まとめると以下のように書くことで、テキストをベクトル化することができます。
```python:example_1.py
client = OpenAI()
text = "Hello World!"    #任意の文章.
response = client.embeddings.create(
    model="text-embedding-3-large"
    input=text
)
```

# 4. Filesクラス

### 概要

FilesクラスはAPIを使ってChatGPTにファイルを送信する際に用いられます。
openaiモジュールの中にあるfiles.pyの40~349行目に書かれています。

### createメソッド

Filesクラスのcreateメソッドについて見ていきます。
同ファイル内の60~131行目に書かれています。
60~71行目を引用します。
```python:files.py
    def create(
        self,
        *,
        file: FileTypes,
        purpose: FilePurpose,
        # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
        # The extra values given here take precedence over values defined on the client or passed to this method.
        extra_headers: Headers | None = None,
        extra_query: Query | None = None,
        extra_body: Body | None = None,
        timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN,
    ) -> FileObject:
```
ここから分かるのは以下の3点です。
* 引数には```file```と```purpose```を設定する必要がある
* ```purpose```には```"assistants", "batch", "fine-tune", "vision", "user_data", "evals"```のいずれかを指定する必要がある
* ```FileObject```クラスを返す

また、OpenAI公式の[API Refernce](https://platform.openai.com/docs/api-reference/files/create)によると引数の```file```にはファイルの名前ではなく、```open("file", "rb")```としてバイナリで入れる必要があります。
つまり、```open```関数の第2引数が```rb```であれば問題ないということです。

次にFileObjectクラスを見てみます。
```file_object.py```の11~51行目に書かれています。
このクラスの中身を筆者の分かる範囲でまとめると以下のようになります。
* ```id``` : 送信したファイルの識別するもの
* ```bytes``` : ファイルの容量
* ```created_at``` : Unixでのタイムスタンプ
* ```filename``` : ファイルの名前
* ```purpose``` : ファイルを送信した目的
* ```status``` : ファイルの提出状況
* ```expires_at``` : ファイルの有効期限

最後に以上を踏まえてcreateメソッドの動作例を見てみましょう。

```python:example_2.py
client = OpenAI()
file_name = "image.png"    #任意のふぁいるめい
response = client.files.create(
    file=open(file_name,"rb")
    purpose="vision"
)
```

### retrieveメソッド
次にFilesクラスのretrieveメソッドについて見ていきます。
同ファイル内の133~164行目に書かれています。
133~143行目を引用します。
```python:files.py
    def retrieve(
        self,
        file_id: str,
        *,
        # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
        # The extra values given here take precedence over values defined on the client or passed to this method.
        extra_headers: Headers | None = None,
        extra_query: Query | None = None,
        extra_body: Body | None = None,
        timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN,
    ) -> FileObject:
```
ここから分かるのは以下の3点です。
* 引数には```file_id```を設定する必要がある
* ```FileObject```クラスを返す
retrieveという英単語の意味からも推察される通り、引数に指定した```file_id```を```id```に持つファイルを取得します。この過程を追っていくととても大変なので省略します。悪しからず。

# 5. おわりに
次回は```Assistants```クラス、```Threads```クラスを予定しています。
改善点がありましたらご教示くださると幸いです。