[翻訳] OpenAI APIのテキストコンプリーション

[Text completion \- OpenAI API](https://platform.openai.com/docs/guides/completion) [2023/4/10時点]の翻訳です。

:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

[Databricks](https://qiita.com/organizations/databricks)の[ユーザー会](https://jedai.connpass.com/?gmem=1)でChatGPTの勉強会やります。

https://jedai.connpass.com/event/278235/

テキストの生成、操作方法を学びます。

# イントロダクション

[completions](https://platform.openai.com/docs/api-reference/completions)エンドポイントは様々なタスクに活用できます。これは、我々のすべての[モデル](https://platform.openai.com/docs/models)に対するシンプルかつパワフルなインタフェースを提供します。プロンプトとして幾つかのテキストを入力すると、モデルは指定した文脈やパターンに合致させようと試みるテキストを生成します。例えば、APIにプロンプト「デカルトが言ったように、我思う故に」を与えると、高い確率でコンプリーション「我あり」と返します。

コンプリーションの探索をスタートするベストな方法は、我々のプレイグラウンドを通じたものです。コンプリーションを生成するために、プロンプトを送信できるシンプルなテキストボックスです。以下のようなサンプルからスタートすることができます:

```
Write a tagline for an ice cream shop.
```

送信すると、以下のような結果が確認できることでしょう。

```
Write a tagline for an ice cream shop.
We serve up smiles with every scoop!
```

このAPIはデフォルトでは決定論的ではないので、実際のコンプリーションが異なる場合があります。これは、プロンプトが同じものであったとしても、呼び出すたびに若干異なるコンプリーションを取得すること意味します。[temperature](https://platform.openai.com/docs/api-reference/completions/create#completions/create-temperature)を0に設定することで出力をほぼ決定論的にすることができますが、少々の変動は残ります。

このシンプルな、テキスト入力、テキスト出力のインタフェースは、手順ややりたいことのいくつかの例を示すことで、モデルを「プログラム」できることを意味します。成功するかどうかは通常、タスクの複雑性やあなたのプロンプトの品質に依存します。実用的なルールは、中学生が解く問題をどのように記述するのかを考えるというものです。適切に記述されたプロンプトは、モデルがあなたの欲しいものやどのように反応すべきかを理解するのに十分な情報を提供します。

このガイドでは、一般的なプロンプトデザインのベストプラクティスやサンプルをカバーします。我々のCodexモデルを用いたコードの操作に関しては、[code guide](https://platform.openai.com/docs/guides/code)をご覧ください。

:::note
デフォルトモデルのトレーニングデータは2021で途切れており、最近のイベントに関する知識を持たないことがあることに注意してください。将来的にはさらに連続したトーレニングを追加する予定です。
:::

# プロンプトデザイン

## 基本

我々のモデルは、オリジナルの物語の生成から、複雑なテキスト分析の実行まであらゆることを行うことができます。これらは多くのことを実行可能なので、何が欲しいのかを明示的に説明しなくてはなりません。伝えるだけでなく例を示すことが、多くの場合において良いプロンプトの秘密となります。

プロンプトを作成する際の3つの基本的なガイドラインが存在します:

**示して伝えましょう。** 指示、例、これら二つの組み合わせを通じて欲しいものを明確にしましょう。モデルにアイテムをアルファベット順でランキングさせたい、感情ごとに段落を分類させたい場合には、欲しいものを示すようにしましょう。

**質の高いデータを提供しましょう。** 分類器を構築したい、モデルをパターンに従わせたい場合には、十分な例を提供するようにしましょう。提供するサンプルを構成するようにしてください。通常モデルは基本的なスペルミスに気づいて、レスポンスを返すほどスマートですが、これが意図的なものであると仮定し、レスポンスに影響を及ぼす場合もあります。

**設定をチェックしましょう。** temperatureとtop_pの設定は、レスポンス生成の際に、モデルがどれだけ決定論的であるのかを制御します。一つのの適切な回答が存在するレスポンスを訪ねる際、これらの値を低くしたいと思うことでしょう。より多岐に渡るレスポンスを探しているのであれば、これらの値を大きくしたいと考えるでしょう。これらの設定を利用する人の最もよくある間違いは、これらを「賢さ」や「創造性」の制御のためのものだと仮定してしまうということです。

## トラブルシューティング

APIを期待通り実行させたい際にトラブルに直面する場合には、以下のチェックリストに従ってください:

1. 意図している生成結果が何であるべきなのかが明確ですか？
1. 十分なサンプルがありますか？
1. 提示するサンプルの間違いをチェックしましたか？(APIは直接連絡しません)
1. 適切にtemperatureとtop_pを使用していますか？

## 分類

APIでテキスト分類器を作成するには、タスクの説明といくつかの例を提供します。この例は、ツイートの感情の分類方法を示しています。

```
Decide whether a Tweet's sentiment is positive, neutral, or negative.

Tweet: I loved the new Batman movie!
Sentiment:
```

この例では、いくつかの機能に注意を払う価値があると言えます。

1. **入力と出力を説明するのに簡素な言葉を使いましょう。** ここでは、入力の「ツイート」と期待されるアウトプット「感情」に対してシンプルな言葉を使っています。ベストプラクティスとして、簡素な言葉から始めましょう。入出力を示すのに略語やヒントを用いることが多いかもしれませんが、可能な限り説明的になることからスタートし、その後で追加の用語を削除しても、パフォーマンスが一定であることを確認しましょう。
1. **APIにすべてのケースに対してどのように反応すべきかを示しましょう。** この例では、手順の中に可能性のある感情ラベルを含めています。人間であっても何がポジティブなのかネガティブなのかを判断するのが難しく、どちらでもないシチュエーションに遭遇することは多々あるので、ニュートラルのラベルが重要となります。
1. **馴染みのあるタスクでは必要なサンプルの数は少なくなります。** この分類器においてはサンプルを提供していません。これは、APIがすでに感情とツイートの概念を理解しているからです。APIの馴染みのない何かに対する分類器を構築するのであれば、さらなるサンプルを提供する必要があるかもしれません。

## 分類器の効率の改善

分類器の構築方法を理解したので、これを例に取って、一つのAPI呼び出しから複数の結果を得るようにすることで、より効率的なものにしましょう。

```
Classify the sentiment in these tweets:

1. "I can't stand homework"
2. "This sucks. I'm bored 😠"
3. "I can't wait for Halloween!!!"
4. "My cat is adorable ❤️❤️"
5. "I hate chocolate"

Tweet sentiment ratings:
```

APIに番号を振ったリストを提供することで、一度のAPI呼び出しで5つの(さらにはこれ以上の)ツイートをレーティングすることができます。

リストの作成あるいはテキストの評価をAPIに依頼する際には、ドリフトを避けるために確率の設定(Top Pやtemperature)に注意を払うことが重要となります。

1. 複数のテストを実行することで、確率の設定が適切に調整されていることを確認しましょう。
1. リストをあまりにも長くすることで、APIのドリフトの可能性を上げないようにしましょう。

## 生成

このAPIを用いて達成できる最もパワフルでシンプルなタスクは、新たなアイデアや入力の別バージョンを生成するというものです。物語のアイデア、ビジネス計画、キャラクターの説明、マーケティングのスローガンなど何でも訪ねることができます。この例では、フィットネスにおけるバーチャルリアリティを用いたアイデアを生み出すためにAPIを使用しています。

```
Brainstorm some ideas combining VR and fitness:
```

必要であれば、プロンプトに幾つかのサンプルを含めることで、レスポンスの品質を改善することができます。

## 会話

このAPIは、人間や自分自身との会話を進めることに非常に熟達しています。APIは数行の指示のみで、フラストレーションを感じたりすることなしにインテリジェントに質問に回答するカスタマーサービスチャットボットとして動作したり、ジョークやダジャレを話す機知に富んだ会話パートナーとして動作するのを確認しています。鍵となるのは、APIにどのように振る舞得べきかを伝え、いくつかの例を示すことです。

ここでは、AIが質問に応えるロールをAPIが演じる例を示しています:

```
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:
```

会話を進める能力を持つチャットボットの作成に必要なのはこれがすべてです。シンプルさの背後には、注意を払う価値のあるいくつかの物事が動作しています:

1. **意図だけではなく、どのように振る舞うのかもAPIに伝えています。** 他のプロンプトと同じように、APIに対してサンプルが表現することのヒントを与えていますが、もう一つの鍵となる詳細情報も追加しています: 「The assistant is helpful, creative, clever, and very friendly.」というフレーズによって、どのようにやり取りをするのかに関して明示的な指示を与えています。

    この指示なしには、APIは迷子になったり、やり取りをしている人間のまねをしたり、皮肉屋になったり、避けたいと考える挙動を示すかもしれません。

1. **APIにアイデンティティを与えています。** 最初の時点でAPIにAIアシスタントになるように指示しています。APIには本質的なアイデンティティは存在しませんが、これによって、可能な限り真実に近い方法で反応する助けになっています。APIに対して、生物学の研究者として働く女性として反応するように指示すると、そのような背景を持つ誰かに期待するような方法で、APIからインテリジェントかつ思慮に富んだコメントを受け取ることになるでしょう。

この例では、若干皮肉屋で質問に答えたくないチャットボットを作成しています。

```
Marv is a chatbot that reluctantly answers questions with sarcastic responses:

You: How many pounds are in a kilogram?
Marv: This again? There are 2.2 pounds in a kilogram. Please make a note of this.
You: What does HTML stand for?
Marv: Was Google too busy? Hypertext Markup Language. The T is for try to ask better questions in the future.
You: When did the first airplane fly?
Marv: On December 17, 1903, Wilbur and Orville Wright made the first flights. I wish they’d come and take me away.
You: What is the meaning of life?
Marv: I’m not sure. I’ll ask my friend Google.
You: Why is the sky blue?
```

楽しくて、少々の助けとなるチャットボットを作成するには、質問のいくつかの例とどのようにAPIが回答するのかを示す回答を提供します。必要なのは皮肉的なレスポンスいくつか与えることだけであり、APIはパターンをピックアップして、終わりのない辛辣な反応を返すようになります。

## トランスフォーメーション

このAPIは、情報を表現するために用語や文字を活用する様々な手法に慣れている言語モデルです。これは、自然言語テキストからコードや英語以外の言語など多岐に渡っています。また、このAPIは要約、変換、別の方法での表現を可能にするレベルでコンテンツを理解することができます。

### 翻訳

この例では、英語からフランス語、スペイン語、日本語への変換方法をAPIに示しています。

```
Translate this into French, Spanish and Japanese:

What rooms do you have available?
```

APIはすでにこれらの言語を理解しているのでこのサンプルは動作し、これらに教える必要はありません。

英語からAPIの馴染みのない別の言語に翻訳したい場合、さらなるサンプルを提供したり、より流暢にさせるために[モデルをファインチューン](https://platform.openai.com/docs/guides/fine-tuning)する必要があるかもしれません。

### 変換

この例では、映画の名前を絵文字に変換しています。これは、APがパターンをピックアップし、他の文字を取り扱うことができる適応性を示しています。

```
Convert movie titles into emoji.

Back to the Future: 👨👴🚗🕒 
Batman: 🤵🦇 
Transformers: 🚗🤖 
Star Wars:
```

### 要約

このAPIはテキストのコンテキストを理解し、別の方法で言い換えることができます。この例では、より長く高度なテキスト文から子どもが理解できるであろう説明文を生成しています。これは、このAPIは言語に対して深く理解をしていることを示しています。

```
Summarize this for a second-grade student:

Jupiter is the fifth planet from the Sun and the largest in the Solar System. It is a gas giant with a mass one-thousandth that of the Sun, but two-and-a-half times that of all the other planets in the Solar System combined. Jupiter is one of the brightest objects visible to the naked eye in the night sky, and has been known to ancient civilizations since before recorded history. It is named after the Roman god Jupiter.[19] When viewed from Earth, Jupiter can be bright enough for its reflected light to cast visible shadows,[20] and is on average the third-brightest natural object in the night sky after the Moon and Venus.
```

### コンプリーション

すべてのプロンプトはコンプリーションになりますが、テキストコンプリーション自身のタスクを、どこまでAPIにピックアップさせたいのか、どこで中断したいのかを例を通じて考えることが役に立つことがあります。例えば、このプロンプトが与えられた際、APIは垂直農業に関して、延々と思考を継続することでしょう。APIがプロンプトの意図にフォーカスし続けるようにするために、[temperature](https://platform.openai.com/docs/api-reference/completions/create#completions/create-temperature)の設定を引き下げたり、脇道にそれさせたままにするために設定を引き上げることができます。

```
Vertical farming provides a novel solution for producing food locally, reducing transportation costs and
```

この次のプロンプトは、Reactのコンポーネントの記述に役立てるためにコンプリーションをどのように使うのかを示しています。APIに幾つかのコードを送信すると、APIはReactライブラリを理解しているので、残りを継続することができます。コードの理解や生成に関連するタスクにおいては、我々の[Codexモデル](https://platform.openai.com/docs/models/codex)を使用することをお勧めします。詳細は[code guide](https://platform.openai.com/docs/guides/code)をご覧ください。

```
import React from 'react';
const HeaderComponent = () => (
```

### 事実に基づくレスポンス

このAPIには、トレーニングしたデータから学んだ数う多くの知識があります。また、非常に本当らしく聞こえるが、捏造された事実であるレスポンスを提供する能力も有しています。APIが答えを作り上げる可能性を制限するための方法が2つ存在します。

1. **APIに教師データを提供する。** APIに質問に回答するための本体テキスト(Wikipediaエントリーなど)を提供すると、作り話を返す可能性が減少します。
1. **低い確率を用い、APIに「わかりません」の言い方を示す。** APIがレスポンスに自信がない場合に「わかりません」や他のバリエーションが適切であることを言うことを理解すると、答えを作り出す傾向が減少します。

この例では、APIに質問のサンプルと知っている回答の例と知らないことの例、クエスチョンマークを与えています。また、確率をゼロに設定しているので、疑わしい場合にAPIは「?」を回答します。

```
Q: Who is Batman?
A: Batman is a fictional comic book character.

Q: What is torsalplexity?
A: ?

Q: What is Devz9?
A: ?

Q: Who is George Lucas?
A: George Lucas is American film director and producer famous for creating Star Wars.

Q: What is the capital of California?
A: Sacramento.

Q: What orbits the Earth?
A: The Moon.

Q: Who is Fred Rickerson?
A: ?

Q: What is an atom?
A: An atom is a tiny particle that makes up everything.

Q: Who is Alvan Muntz?
A: ?

Q: What is Kozar-09?
A: ?

Q: How many moons does Mars have?
A: Two, Phobos and Deimos.

Q:
```

# テキストの挿入(ベータ)

コンプリーションエンドポイントは、[prefix prompt](https://platform.openai.com/docs/api-reference/completions/create#completions/create-prompt)に加えて[prefix prompt](https://platform.openai.com/docs/api-reference/completions/create#completions/create-prompt)を提供することで、テキスト内でのテキストの挿入もサポートしています。この要件は通常、長い形態のテキストの記述、段落間の意向、アウトラインへの準拠、モデルをエンディングに向かわせる場合に生じます。また、これはコードに対しても動作し、関数やファイルの途中に挿入する際に使用することができます。詳細は[code guide](https://platform.openai.com/docs/guides/code/inserting-text)をご覧ください。

我々の予測能力においてサフィックスコンテキストがどのように重要になるのかを説明するために、「Today I decided to make a big change.」というプロンプトを考えてみます。この文を完成させるための様々な方法が思いつくと思います。しかし、物語の最後「I’ve gotten many compliments on my new hair!」を追加すると意図されるコンプリーションが明らかとなります。
![Screenshot 2023-04-10 at 16.24.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/53b44c16-5fe5-476a-3b24-2837d2553b5c.png)


モデルに追加のテキストを提供することで、より制御可能なものとなります。しかし、これはモデルにとっては、制約され、より困難なタスクとなります。

## ベストプラクティス

テキストの挿入はベータ版の新機能であり、より良い結果を得るためにはAPIの使用方法を修正しなくてはならないかもしれません。こちらに幾つかのベストプラクティスを示します:

**max_tokens > 256を使いましょう。** このモデルは長いコンプリーションの挿入には長けています。`max_tokens`が小さすぎると、モデルは接尾辞に接続できる前に中断する場合があります。長い`max_tokens`を用いている際においても、生成されるトークンの数で課金されることに注意してください。

**finish_reason == "stop"を使うようにしましょう。** モデルが自然な停止地点に到達した際、あるいはユーザーが停止シーケンスを入力した際に、`finish_reason`が「`stop`」に設定されます。これは、モデルがうまく接尾辞に接続することができたことを示しており、コンプリーションの品質における良いシグナルとなります。`n > 1`あるいは、再サンプリング(次のポイントをご覧ください)を使用している際に、いくつかのコンプリーションから選択する際に特に適切なものとなります。

**3 - 5回の再サンプリングを行いましょう。** ほぼすべてのコンプリーションは接頭辞に接続されますが、より困難なケースではモデルが接尾辞の接続に苦戦することがあります。このようなケースでは、3 - 5回の再サンプリング(あるいは`best_of`と`k=3,5`の活用)、`finish_reason`として「`stop`」となったサンプルをピックアップすることが効果的な方法であることを発見しました。再サンプリングの過程では、多くの場合、ダイバーシティを高めるために高いtemperatureを必要とするかもしれません。

:::note
**注意**
返却されたすべてのサンプルが`finish_reason == "length"`になっている場合、`max_tokens`が小さすぎ、プロンプトと接尾辞を自然に接続する前に、モデルのトークンが尽きた可能性があります。再サンプリングの前に`max_tokens`を増加させることを検討してください。
:::

**より多くのヒントを与えましょう。** モデルの生成処理を支援すべきいくつかのケースにおいては、ストップすべき自然な場所を決定するためにモデルが従うことができるパターンのいくつかのサンプルを提供することで、ヒントを与えることができます。
![Screenshot 2023-04-10 at 16.24.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/e2de2a0c-34f0-96c9-2227-a5b67821f095.png)


# テキストの編集(アルファ)

[edits](https://platform.openai.com/docs/api-reference/edits)エンドポイントは、テキストを完成させるのではなくテキストの編集に活用することができます。いくつかのテキストと、編集方法の指示を与えることで、`text-davinci-edit-001`モデルはそれに応じて編集しようとします。これは、テキストの翻訳、編集、調整向けの自然なインタフェースです。また、これはコードのリファクタリングや操作にも有用です。詳細は[code guide](https://platform.openai.com/docs/guides/code/editing-text)をご覧ください。この初期のベータ期間は、editsエンドポイントの使用料は無料です。

## サンプル
![Screenshot 2023-04-10 at 16.23.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/8b2332bc-af84-1a63-0a4b-436dbbe88dfb.png)