Open8

OpenAIのAPI関連メモ

tokoitokoi

fine-tuningについて

https://platform.openai.com/docs/guides/fine-tuning

promptを長くして色々指示を入れ込めば大抵のことはできるけれど、トークン消費激しい。ファインチューニングするとトークン消費を押さえつつ、ねらった回答を生成できる。(あと多分時間パフォーマンスも向上する)

prompt, completionのペアを含むデータセットをCLI(※1)でなげると、ファインチューニングJOBのIDがもらえる。
終わったらファインチューニングされた新しいモデルの名前を取得できる。
以降はそれを指定してcompletions-APIを呼び出せば良い。

※1 : pip install openaiすると、CLIのコマンドopenaiもインストールされる。

tokoitokoi

fine-tuningに関連する費用

https://openai.com/api/pricing/#faq-fine-tuning-pricing-calculation

  • トレーニング費用
    • (トレーニング ファイル内のトークン * トレーニング エポックの数) = 合計トレーニング トークン
    • 上記 1kトレーニングトークンに対して、davinciなら0.03USDかかる。
  • fine-tuningモデルの使用費用
    • 通常モデルと同じ計算方式で使用トークンが決まる
    • 上記 1k使用トークンに対して、davinciなら 0.12USDかかる。

※素のdavinci使用料は、0.02USD / kToken

tokoitokoi

text-davinci-003 で会話させるには

https://platform.openai.com/examples/default-chat

promptに会話ログを含める。
promptの最後の行がAI:になるようにすれば、続きの文を考えてくれる、という寸法。

例:

prompt = """The following is a conversation with an AI assistant. The assistant is helpful, creative, clever, and very friendly.

Human: Hello, who are you?
AI: I am an AI created by OpenAI. How can I help you today?
Human: I'd like to cancel my subscription.
AI:
"""

あとは、AIが生成したもの、人間が書き送ったもの、を同様の形式で数珠つなぎにしたものを毎回promptとしてopenai.Completion.createを実行すればよい。

tokoitokoi

会話を続けていくと、途中でtokenが足りなくなるが、会話ログ部分の先頭を削ってローリングする感じで回していけば、健忘っぽくなるもののそこそこ自然に振る舞えるのでは無いか。(やったことない)

tokoitokoi

同じ事を(素の)davinciでやろうとしても、一人芝居が始まってしまう。
数百のデータでfine-tuningすればいけるのか? (とりあえず数十程度ではダメだった)

tokoitokoi

Embeddingsってなに

文字列の概念を数列化したもの。
さまざまな文書/文字列について、それぞれの概念のようなものを数値化して一緒に保管しておけば、「関連性」に基づいた文書/文字列検索システムを構築できる。

OpenAIは、text-embedding-ada-002モデルをEmbedingsAPIとして提供している。

https://openai.com/blog/new-and-improved-embedding-model/

Completionには最大トークン数という"限界"があるが、Embeddingsを上手く使うと適切(概念的に近そう)な外部データだけをその都度参照して補完させることができる。

  1. Embedingsを使った外部データソースから、元promptに近い文書を検索
  2. 得られた文書だけをpromptの先頭などに追加する
  3. 補完する

https://acro-engineer.hatenablog.com/entry/2023/02/17/100000