大規模言語モデル(LLMs)の 2 つのタイプ
大型言語モデル(LLMs)の 2 種類
指示調整 LLM:指示に従おうとする
指示を微調整し、それに従う際に良い試みを行う。
RLHF:人間のフィードバックを用いた強化学習
OpenAI Python API ライブラリを使用
import openai
import os
from dotenv import load_dotenv, find_dotenv
_ = load_dotenv(find_dotenv())
openai.api_key = os.getenv('OPENAI_API_KEY')
def get_completion(prompt, model="gpt-3.5-turbo"):
messages = [{"role": "user", "content": prompt}]
response = openai.ChatCompletion.create(
model=model,
messages=messages,
temperature=0, # これはモデルの出力のランダム性の度合いです
)
return response.choices[0].message["content"]
明確で具体的な指示を書く#
区切り文字を使用#
text = f"""
モデルにやってほしいことを表現するには、 \
できるだけ明確で具体的な指示を提供する必要があります。 \
これにより、モデルは望ましい出力に向かって導かれ、 \
無関係または不正確な応答を受け取る可能性が減ります。 \
明確なプロンプトを書くことと短いプロンプトを書くことを混同しないでください。 \
多くの場合、長いプロンプトはモデルにとってより明確さと文脈を提供し、 \
より詳細で関連性のある出力につながります。
"""
prompt = f"""
三重バックティックで区切られたテキストを \
1つの文に要約してください。
```{text}```
"""
response = get_completion(prompt)
print(response)
プロンプトインジェクションを避ける:
構造化された出力を要求する#
モデルの出力を解析しやすくするために、HTML や JSON のような構造化された出力を要求することが役立ちます。
prompt = f"""
3つの架空の書籍タイトルとその著者およびジャンルのリストを生成してください。
次のキーを持つJSON形式で提供してください:
book_id、title、author、genre。
"""
response = get_completion(prompt)
print(response)
モデルに条件が満たされているか確認させる#
条件が満たされている例。
text_1 = f"""
お茶を入れるのは簡単です!まず、水を沸かす必要があります。 \
それが行われている間に、カップを取り、ティーバッグを入れます。 \
水が十分に熱くなったら、ティーバッグの上に注ぎます。 \
少し置いておいて、茶が浸出するのを待ちます。 \
数分後、ティーバッグを取り出します。 \
お好みで、味に合わせて砂糖やミルクを加えることができます。 \
これで完成です!美味しいお茶ができました。
"""
prompt = f"""
三重引用符で区切られたテキストが提供されます。
それに指示のシーケンスが含まれている場合、 \
次の形式でそれらの指示を書き直してください:
ステップ1 - ...
ステップ2 - …
…
ステップN - …
テキストに指示のシーケンスが含まれていない場合、 \
単に「ステップは提供されていません」と書いてください。
\"\"\"{text_1}\"\"\"
"""
response = get_completion(prompt)
print("テキスト1の完了:")
print(response)
指定された形式で出力をサポートしていない場合は、他の出力形式を提供する必要があります。指定された形式で出力を要求します。以下は「ステップは提供されていません」と出力する例です。
text_2 = f"""
今日は太陽が明るく輝いていて、鳥たちが歌っています。 \
公園を散歩するには素晴らしい日です。 \
花が咲き、木々がそよ風に揺れています。 \
人々は外に出て、素敵な天気を楽しんでいます。 \
ピクニックをしている人もいれば、ゲームをしたり、 \
ただ草の上でリラックスしている人もいます。 \
自然の美しさを楽しむには完璧な日です。
"""
prompt = f"""
三重引用符で区切られたテキストが提供されます。
それに指示のシーケンスが含まれている場合、 \
次の形式でそれらの指示を書き直してください:
ステップ1 - ...
ステップ2 - …
…
ステップN - …
テキストに指示のシーケンスが含まれていない場合、 \
単に「ステップは提供されていません」と書いてください。
\"\"\"{text_2}\"\"\"
"""
response = get_completion(prompt)
print("テキスト2の完了:")
print(response)
少ないサンプルのプロンプト#
タスクを成功裏に完了する例を提供し、
その後、モデルにそのタスクを実行させます。
prompt = f"""
あなたのタスクは、一貫したスタイルで答えることです。
<子供>: 忍耐について教えて。
<祖父母>: 最も深い谷を刻む川は、控えめな泉から流れ出し、 \
最も壮大な交響曲は1つの音から生まれ、 \
最も複雑なタペストリーは1本の糸から始まります。
<子供>: 回復力について教えて。
"""
response = get_completion(prompt)
print(response)
モデルに「考える」時間を与える#
タスクを完了するために必要なステップを指定する#
text = f"""
魅力的な村で、兄妹のジャックとジルは、 \
丘の上の井戸から水を汲むために出発しました。 \
彼らが登るとき、楽しそうに歌っていると、 \
不運が襲いました—ジャックが石につまずき、丘を転がり落ち、 \
ジルもそれに続きました。 \
少し打撲を受けたものの、2人は家に戻り、 \
心地よい抱擁を受けました。 \
不運にもかかわらず、彼らの冒険心は衰えず、 \
喜びを持って探検を続けました。
"""
# 例1
prompt_1 = f"""
次のアクションを実行してください:
1 - 三重バックティックで区切られた以下のテキストを1文で要約します。
2 - 要約をフランス語に翻訳します。
3 - フランス語の要約に含まれる各名前をリストします。
4 - 次のキーを含むJSONオブジェクトを出力します:french_summary、num_names。
回答を改行で区切ってください。
テキスト:
```{text}```
"""
response = get_completion(prompt_1)
print("プロンプト1の完了:")
print(response)
指定された形式で出力を要求します。
prompt_2 = f"""
あなたのタスクは、次のアクションを実行することです:
1 - <>で区切られた以下のテキストを1文で要約します。
2 - 要約をフランス語に翻訳します。
3 - フランス語の要約に含まれる各名前をリストします。
4 - 次のキーを含むJSONオブジェクトを出力します:french_summary、num_names。
次の形式を使用してください:
テキスト:<要約するテキスト>
要約:<要約>
翻訳:<要約の翻訳>
名前:<フランス語の要約に含まれる名前のリスト>
出力JSON:<要約とnum_namesを含むjson>
テキスト:<{text}>
"""
response = get_completion(prompt_2)
print("\nプロンプト2の完了:")
print(response)
急いで結論を出す前に、モデルに自分で解決策を見つけさせる#
prompt = f"""
あなたのタスクは、学生の解決策が正しいかどうかを判断することです。
問題を解決するために、次のことを行います:
- まず、自分自身で問題の解決策を考えます。
- 次に、自分の解決策と学生の解決策を比較し、 \
学生の解決策が正しいかどうかを評価します。
自分で問題を解決するまで、学生の解決策が正しいかどうかを決めないでください。
次の形式を使用してください:
質問:
```
ここに質問
```
学生の解決策:
```
ここに学生の解決策
```
実際の解決策:
```
解決策を考えるためのステップとあなたの解決策
```
学生の解決策は、あなたが計算した実際の解決策と同じですか:
```
はいまたはいいえ
```
学生の評価:
```
正しいまたは不正確
```
質問:
```
私は太陽光発電の設置を構築しており、 \
財務を計算するのに助けが必要です。
- 土地は1平方フィートあたり100ドルです。
- ソーラーパネルは1平方フィートあたり250ドルで購入できます。
- メンテナンスの契約を交渉しましたが、年間10万ドルの固定費と、 \
1平方フィートあたり10ドルの追加費用がかかります。
最初の運用年の総コストは、平方フィート数の関数として何ですか。
```
学生の解決策:
```
xを設置のサイズ(平方フィート)とします。
コスト:
1. 土地のコスト:100x
2. ソーラーパネルのコスト:250x
3. メンテナンスコスト:100,000 + 100x
総コスト:100x + 250x + 100,000 + 100x = 450x + 100,000
```
実際の解決策:
"""
response = get_completion(prompt)
print(response)
その他#
バックスラッシュに関する説明:
このコースでは、テキストを画面に適合させるためにバックスラッシュを使用し、
改行文字 '\n' を挿入しないようにしています。
改行文字を挿入するかどうかにかかわらず、GPT-3 は実際には影響を受けません。
ただし、一般的には、LLM を使用する際に、プロンプトに改行文字を挿入することがモデルの性能に影響を与えるかどうかを考慮することができます。
コースの出所と著作権は、 ChatGPT Prompt Engineering for Developers - DeepLearning.AI に帰属します。