見出し画像

LangChain & GPT-3 設定値一覧メモ

LangChainに必要な設定値について、情報が分散しており関数設定に苦労したため、情報を本ページにまとめました。
公開はしておりますが、個人記録用のため、未完成の状態で公開しております。

1. モデル名 / model_name: str = "text-davinci-003"

(OpenAI / "model": "text-davinci-003")

GPT-3のモデルは以下の3つが提供されています。

text-davinci-003
- Max Request / 4,000 tokens
- Pricing / $0.0200 -¥2.6 (1K tokens)
- Description / GPT-3の中で最も高性能なモデルです。他のモデルで可能なあらゆるタスクが可能で、多くの場合、より高い品質、長い出力、より良い命令追従性が得られます。また、テキストに補完記号を挿入することも可能です。

text-curie-001
- Max Request / 2,048 tokens
- Pricing / $0.0020 -¥0.26 (1K tokens)
- Description / 非常に高機能だが、Davinciより高速で低価格。

text-babbage-001
- Max Request / 2,048 tokens
- Pricing / $0.0005 -¥0.065 (1K tokens)
- 素直な応答が可能で、非常に速く、低コスト。

text-ada-001
- Max Request / 2,048 tokens
- Pricing / $0.0004 -¥0.052 (1K tokens)
- 素直な応答が可能で、非常に速く、低コスト。

https://platform.openai.com/docs/models/overview
https://openai.com/api/pricing/

2. トークン / max_tokens: int = 256

(OpenAI / "max_tokens": 7,)

GPTファミリーは、テキストをトークンに変換することによって処理しています。GPTは、トークン間の統計的関係を理解し、一連のトークンの次のトークンを生成します。

トークンは以下のサイトで、どのようにテキストをトークン化しているかを可視化できます。

2-1.max_tokens:int

max_tokensパラメータは、APIが返すトークンの数の上限を設定します。

プロンプトのトークン数と max_tokens を足したものが、モデルのコンテキスト長を超えることはできません。ほとんどの機種のコンテクスト長は 2048 です (ただし 4096 をサポートする最新機種は除く)。

https://platform.openai.com/docs/api-reference/making-requests

>プロンプトのトークン数と max_tokens を足したものが、モデルのコンテキスト長を超えることはできません。

モデルを" text-curie-001(2048 コンテキスト長)"、プロンプトを"How much has Microsoft invested in AI?(8 tokens)"を送信した場合、max_tokensを"2048"と設定しても、APIから返信されるトークン数は2040が最大値となります。

2-2.トークンと日本語について

以下は、同一内容の文章を、英語・日本語でトークン数をカウントしています。下記の例の通り、英語は単語ごとに、1トークンが作成されているのに対して日本語では、文字ごとに1トークンが作成されています。下記例では、日本語は英語に比べトークンが3倍作成されます。そのため、Open AI APIに日本語を用いた場合、英語を用いた場合に比べ、下記例では3倍割高になります。

英語で作成した場合
日本語で作成した場合

3.サンプリング温度 / temperature: float = 0.75

(OpenAI / "temperature": 0,)

わかりにくい関数1位だと思われる関数です。
答えのランダム性を設定しています。
(名前は、温度で、運動が変化する分子をイメージしている?)

温度が低いほど、GPTは、出現率の高い単語を選択するようになります。答えが1つしかない場合は、温度を低く設定する必要があります。逆に、アイデアを出したいときや物語を作りたいときは、温度を高くすると多様性をもたらします。

温度=0のGPT-3を使って、"How to make "という文章を完成させると、完成が得られます。"a good impression on a first date"(初デートで好印象を与える)。これをTemperature = 1で繰り返すと、「ターバン巻きのココナッツヘア」から「油をほとんど全く使わないマヨ」「マインクラフト1の新サーバー」まで出てくるのです。違いがわかりますか?

時々、Temperature をクリエイティビティ設定と呼ぶ人がいますが、公式ドキュメントではそのようなラベルは推奨されていません。クリエイティビティは単にランダム性を上げることよりも複雑です。

温度0
温度0で、「私の好きな動物は?」と聞いてみましょう。
ランダム性が0に制限されていることから予想されるように、GPT-3は最も確率の高い完成形である「a dog」を導き出すでしょう。
ランダム性を排除することで、もう一つの効果があります。GPT-3は、与えられたプロンプトに対して常に同じ出力をするのです。プロンプトを10回実行したところ、全く同じ出力が10回得られました。温度が低いと、安定した、最も確率の高い出力が必要な場合に適しています。(事実の出力、分類など)
「確率を表示する」設定により、GPT-3が世界をどのように見ているか、そして次に来るべき単語(トークン)を見ることができます。
驚くなかれ、"dog "に次いで確率の高い出力は "cat "で、3番目は "gir"。"girffe "から来たトークンである可能性が非常に高いのです。つまり、ランダム性というのは、GPT-3が様々な確率のトークンを作成していることを意味しているのです。

温度1
温度1に設定すると、非常に一貫性のない、時には興味深い結果が得られます。オープンエンドのタスクであっても、温度値1を使用するのは特別な場合のみにしてください。ストーリーの完成やアイデア出しの場合、温度値は0.7から0.9の間であることが一般的です。温度0とは出力が大きく異なり、"Wibblezoo "の場合、動物ですらありません。GPT-3は文脈を維持するが、この設定では信頼性が低くなります。このような設定にすると、長い文章ではGPT-3の方が早く脱字してしまうことが予想されます。

温度0.75
一般的に、クリエイティブなタスクでは0.70~0.90の温度が最も一般的とされています。下の出力を見る前に、「私の好きな動物は」の補完のために設定温度0.75でGPT-3がどのような出力を生成するかを推測してみてください。ランダム性が少し低くなったことで、より安定した結果が得られています。GPT-3は動物のすぐ後にピリオドを打つことが多くなりました。ヴェロキラプトルが出たのはいいのですが、実在しない動物は出てきません。

温度設定には一般的な推奨事項がいくつかありますが、決まったものはありません。これは最も重要な設定の1つであるため、いろいろと試してみて、さまざまな種類のプロンプトにどのような影響を与えるかを確認する価値があります。より良いプロンプターとなるために役立ちます。

https://algowriting.medium.com/gpt-3-temperature-setting-101-41200ff0d0be
温度0の出力
温度1の出力
温度0.75の出力

4.top_p: float = 1

(OpenAI / "top_p": 1,)

Temperatureが、ラインダム性を関数に設定し、確率的な文章を出力するのに対し、top_p=0.1は、確率の高い上位10%の候補から選択されます。値を小さくすることにより、候補が確率の高いものから選ばれます。

Open AI
「temperature」によるサンプリングに代わるもの。
核サンプリングと呼ばれる。
確率質量が上位_pのトークンの結果を考慮するモデルがあります。つまり、0.1は上位10%の確率を構成するトークンのみが考慮されることを意味します。
一般的に、top_pかtemperatureを変更することを推奨するが、両方は推奨しない。

LangChain
各ステップで考慮すべきトークンの総確率質量。

https://platform.openai.com/docs/api-reference/completions/create#completions/create-top_p
https://langchain.readthedocs.io/en/latest/reference/modules/llms.html

5.frequency_penalty: float = 0

既出の単語を用いるかどうかを設定します。
-2.0の場合、同じ単語が繰り返し現れるようになります。
2.0の場合、同じ単語を使うことを避けます。

Frequencyでは、同じ単語を使った回数に応じて、ペナルティを与えます。

Open AI
-2.0 から 2.0 の間の数。正の値は、これまでのテキストにおける既存の頻度に基づいて新しいトークンにペナルティを与え、モデルが同じ行をそのまま繰り返す可能性を減少させる。

LangChain
繰り返されたトークンを頻度に応じてペナルティーを課す。

https://platform.openai.com/docs/api-reference/completions/create
https://langchain.readthedocs.io/en/latest/reference/modules/llms.html

6.presence_penalty: float = 0

既出の単語を用いるかどうかを設定します。
-2.0の場合、同じ単語が繰り返し現れるようになります。
2.0の場合、同じ単語を使うことを避けます。

presenceでは、単語が登場したかどうかで、ペナルティを与えます。

Open AI
-2.0 から 2.0 の間の数値。正の値は、新しいトークンがこれまでのテキストに現れるかどうかに基づいてペナルティを課し、新しいトピックについて話すモデルの可能性を高める。

LangChain
トークンの繰り返しにペナルティを課す。

https://platform.openai.com/docs/api-reference/completions/create
https://langchain.readthedocs.io/en/latest/reference/modules/llms.html

7.n: int = 1

(OpenAI / "n": 1,)

Open AI
各プロンプトに対して生成される入力補完の数。

注意: このパラメータは多くの補完を生成するため、トークン割り当てをすぐに消費してしまう可能性があります。max_tokens と stop に適切な値を設定し、慎重に使用してください。

LangChain
各プロンプトに対して生成するコンプリート数を指定します。

https://platform.openai.com/docs/api-reference/completions/create
https://langchain.readthedocs.io/en/latest/reference/modules/llms.html

8.best_of: int = 1

Open AI
サーバサイドで best_of completions を生成し、「ベスト」(トークンごとの対数確率が最も高いもの)を返す。結果をストリーミングすることはできません。

n と一緒に使うと、best_of が候補の数を、n が返す数を指定します - best_of は n よりも大きくなければなりません。

注意: このパラメータは多くの補完候補を生成するため、トークンの割り当てをすぐに消費してしまう可能性があります。max_tokens と stop に適切な値を設定し、慎重に使用してください。

LangChain
サーバサイドで best_of completions を生成し、"best" を返す。

https://platform.openai.com/docs/api-reference/completions/create
https://langchain.readthedocs.io/en/latest/reference/modules/llms.html

9.model_kwargs: Dict[str, Any] = None

LangChain
明示的に指定されていないcreate callに有効なモデルパラメータを保持する。

https://langchain.readthedocs.io/en/latest/reference/modules/llms.html

10.batch_size: int = 20

LangChain
複数のドキュメントを渡して生成する際に使用するバッチサイズ。

https://langchain.readthedocs.io/en/latest/reference/modules/llms.html

11.request_timeout: Optional[Union[float, Tuple[float, float]]] = None

LangChain
OpenAI補完APIへのリクエストのタイムアウト。デフォルトは600秒です。

https://langchain.readthedocs.io/en/latest/reference/modules/llms.html

12.logit_bias:

Logit_bias は、指定したトークンが Completion に出現する可能性を変更するオプションのパラメータです。
このパラメータは、トークンと、-100 (禁止) から 100 (トークンの排他的選択) までのバイアス値を関連付けた JSON オブジェクトを受け取ります。1 や 1 のような中程度の値では、トークンが選択される確率がより小さく変化します。logit_biasパラメータを使用する場合、バイアスはサンプリングの前にモデルによって生成されたロジットに追加されます。


この記事が気に入ったらサポートをしてみませんか?