未定の部屋

主にデータサイエンス関係の記事を書きます

Chat GPT 備忘録(2023年3月24日時点)

こんにちは。
最近流行りに流行っているChat GPTを眺めながら「乗るしかない、このビッグウェーブに」という気持ちになったので、2023年3月時点でのプロンプトエンジニアリングのテクニックについてのメモを残そうと思います。

所感

あえて最初に所感を書きます。ここ読んでから各手法の説明を読んで欲しいからです。
Chat GPTのプロンプトエンジニアリング=コミュ力
てのが、現時点で一通りネットサーフィンして色々調べた率直な感想です。お前なりの工夫でAI君と仲良くなろう!だと思いました。
なので、この記事ではとりあえず目に留まったプロンプトエンジニアリングの手法を紹介していますが、脳死で使うというより考え方とかを吸収するような使い方が良いんじゃないかと思います。
あと、この分野は流れが速すぎるのですぐ鮮度が落ちます。来月にはここに書いてあることが古くなってるような勢いです。それもあって、あまり脳死でコピペとかはしない方がいいかなというのが個人的なお気持ちです。といいつつ、今月中はギリ鮮度があるので脳死コピペするなら今のうちかもというきもちもあります。

これを踏まえて以下読んでもらえれば。

プロンプトエンジニアリングとは

1

Prompt engineering is a relatively new discipline for developing and optimizing prompts to efficiently use language models (LMs) for a wide variety of applications and research topics. Prompt engineering skills help to better understand the capabilities and limitations of large language models (LLMs).

Researchers use prompt engineering to improve the capacity of LLMs on a wide range of common and complex tasks such as question answering and arithmetic reasoning. Developers use prompt engineering to design robust and effective prompting techniques that interface with LLMs and other tools.

Prompt engineering is not just about designing and developing prompts. It encompasses a wide range of skills and techniques that are useful for interacting and developing with LLMs. It's an important skill to interface, build with, and understand capabilities of LLMs. You can use prompt engineering to improve safety of LLMs and build new capabilities like augmenting LLMs with domain knowledge and external tools.

  • プロンプトエンジニアリング:プロンプトを開発および最適化して、さまざまなアプリケーションや研究トピックに言語モデル (LM) を効率的に使用すること
    • 開発者がプロンプト エンジニアリングを用いることで、LLM(大規模言語モデル)やその他のツールと連携する堅牢で効果的なプロンプト手法を設計
    • LLM と連携し、構築し、LLM の機能を理解するのに役立ちドメイン知識と外部ツールを使用して LLM を強化するなどの新しい機能を構築するのにつながる

色々なメソッド

  • 日付はいつごろ出てきたかの目安

深津式汎用プロンプト(2023/2)

2, 3

#命令書:
あなたは、プロの編集者です。
以下の制約条件と入力文をもとに、 最高の要約を出力してください。

#制約条件:
・文字数は300文字程度。
・小学生にもわかりやすく。
・重要なキーワードを取り残さない。
・文章を簡潔に。

#入力文:
<ここに入力文章>

#出力文:

ポイント

  • ロールを明確にする
  • 入力から出力を作ることを明確にする
  • 何を出力するかを明確にする
  • マークアップ言語を用いて、 本文でない部分を明確にする
  • 命令を箇条書きで明確にする
  • さまざまなワードで、AIの出力しうる空間を、 積極的に狭くしていく

補足

  • 「必要なら質問をしてください」などを付け加えると対話しながら品質向上できたりする
  • 1回で正解を出すというよりは、出力文に対してさらに要望をして対話しながら向上させていくイメージ

ナレーション誘導型生成法(2023/3)

4
※一般的な手法名ではない

概要

  • プロンプト職人が第三者のナレーターに徹し、登場人物たちに会話や議論をしてもらう方法

メリット

  • 登場人物が勝手に議論するので、簡単なナレーション以外ほぼ何もしなくてよくなる
  • 登場人物が勝手に議論を深めるので、従来より深い考察が得られる
  • 舞台や登場人物などの設定を逐次的 (かつ楽) に追加できるので、得られる情報の幅が広がる

問題点

  • 設定が揮発する最初に定めた制約条件が途中から崩れることがある
  • ナレーションとして与えた設定がそのまま出力されてしまう

具体例

ゴールシークプロンプト(2023/2)

5, 6, 7, 8

概要

  • あいまいなゴールを最初に入力し、より良いゴールの定義を出力してもらうプロンプト
  • 改善の過程をAIに自動化するようにプロンプトをデザインする

プロンプト例

#[このコンテンツは [Goal] を SeekするためのTemplateです]
- [コンテンツの詳細]:
- [Goal]:
- Goalを達成するために必要な手順を分解します。
- 分解した手順は「P#」に願番にNumberを付けて格納していきます。
- 変数を定義します。
- [Goal]:議事録作成を自動で行いたい
- {Goal}
- このコンテンツを作成するための{Goal}です。
- Command
- [C1]:
- Goalを選成するために必要なことをStep by Stepで1つづつ実行していけるように手順:[P#]に分解して下さい。
- [Output style] :
[P1]=
....
[P#]=
....
[P(END}]=
- [C2]:
- 各種変数を使用して、変数を減らすことができないか検対する
- [Goal]は必要条件として必ずinputする。
- [Goal]の定義を変数を使用して表すことで、[Goal]の設定だけで手順を分解できるようにしたい
- 一般化して、変数を追加して[Goal]の定義を書き表して下さい
- [Output style] :
- [Added variable]をリスト形式で一般化して書き出して下さい
- 続けて、[Goal]の定義を[Added variable]を使用して書き出して下さい
- [Goal] :{Goal}
- 追加の変数を質問して下さい一つづつ定義を書き表して書く.
- [C3]:
- [C2]のアウトプットの[Added variable]を一般的に解釈して,補完してください.
- 補完した変数を使用して[Goal]を再定義してください.
- [Output style] : 再定義した [Goal]を
- [Goal]:{Goal}で書き出してください
- [C4]
- [コンテンツの詳細]を元に[Goal]を達成するために,Step by Stepで実行していきます.
- [P1]から[P#]を経て順番に[P{End}]までひとつづつ実行していってください.
- [Output style] :
- [O1] = {Output[P1]}
....
[O#] = {Output[P#]}
....
[O{END}] = {Output[P{END}]}
- Run[C1][C2][C3][C4]

上記プロンプトの流れ

  • 最終的にChatGPTにやって欲しいゴールを決める(7行目)
  • ゴールを決めたら、次にゴールを達成するために必要な手順を一つずつChatGPTに書き出してもらう(11-18行目)
    • C1のパートに該当
  • 次に、ゴールを達成するために必要そうな変数を書き出してもらう(19-28行目)
    • C2のパートに該当
  • 変数を組み込んだ形でゴールを書き直してもらう(29-33行目)
    • C3のパートに該当
  • 改善されたゴールを達成するために必要な手順を出力する(34-42行目)
    • C4のパートに該当
  • 全体を実行するように命令(43行目)

出力結果

[P1]= 音声認識ソフトウェアまたはAPIを選択
[P2]= 議事録のテンプレートを作成
[P3]= ミーティングの音声データを入手
[P4]= 音声データをテキストに変換
[P5]= テキストを議事録のテンプレートに適用
[P6]= 議事録を編集し、適切なフォーマットに整理
[P(END)]= 完成した議事録を保存または共有

[Added variable]:
{AudioSource} = ミーティングの音声データ
{TranscriptionSoftware} = 音声認識ソフトウェアまたはAPI
{MeetingTemplate} = 議事録のテンプレート
{ConvertedText} = 変換されたテキスト

Goal : 議事録作成を自動で行いたい ({AudioSource}を使用し、{TranscriptionSoftware}を使って{ConvertedText}に変換し、{MeetingTemplate}に適用する)

[C3]:
[Added variable]を一般的に解釈して,補完してください

[C4]:
[コンテンツの詳細]を元にGoalを達成するために,Step by Stepで実行していきます

[O1] = {Output[P1]} = 音声認識ソフトウェア(Google Cloud Speech-to-Text API)を選択
[O2] = {Output[P2]} = 議事録のテンプレートを作成
[O3] = {Output[P3]} = ミーティングの音声データを入手
[O4] = {Output[P4]} = 音声データをテキストに変換(Google Cloud Speech-to-Text APIを使用)
[O5] = {Output[P5]} = テキストを議事録のテンプレートに適用
[O6] = {Output[P6]} = 議事録を編集し、適切なフォーマットに整理
[O{END}] = {Output[P{END}]} = 完成した議事録を保存または共有

再起処理でのプロンプト(2023/3)

9, 10
概要

  • プロンプト内に再起処理の指示を記述することで、出力品質の向上を意図する手法

プロンプト例

  • シンプルな再起処理のプロンプト
    関数の定義なくてもとりあえず記述しちゃえばよしなに補完してくれる

出力結果

  • 焼きなまし法(Simulated Annealing)と組み合わせたバージョン
    ※コピペする際は、3, 38行目のバックスラッシュは取り除いて使用してください
以下のプログラムの要領で、英文の日本語への翻訳結果が元の日本語の文と近くなるように、英文を近傍操作の繰り返しによってstep by stepで改善するシミュレーションをしてください。再帰処理の結果は25回ごとに出力してください。出力対象は「英文」「その英文の日本語訳」「日本語訳のsimilarity」の3つです。

\```
"""
# 制約条件
0 <= current_similarlity <= 100
0 <= next_similarlity <= 100

# 翻訳ルール
「Magikarp」は、常に「コイキング」と訳す
"""

def generate_english(current_english, cnt, min_iterations=100, init_temperature=100.0, cooling_rate=0.9):
    current_japanese = translate_to_japanese(current_english)
    current_similarity = calc_similarity(str_original_japanese, current_japanese)

    if current_similarity >= 99 and cnt > min_iterations:
        return current_english, current_japanese

    temperature = init_temperature * (cooling_rate**cnt)
    next_english = get_neighbor(current_english)
    next_similarity = calc_similarity(str_original_japanese, translate_to_japanese(next_english))

    probability = math.exp((next_similarity - current_similarity) / temperature)

    if (next_similarity > current_similarity) or (probability > random.random()):
        current_english = next_english

    generate_english(current_english, cnt + 1)


# 変数の初期化
cnt = 0
str_init_english = translate_to_english(str_original_japanese)

# 再帰的な探索を実行
generate_english(str_init_english, cnt)
\```

変数str_original_japaneseに以下の文章全文を代入し、初期の英文のsimilarityを示した上で、シミュレーションをスタートしてください。similarityの評価対象も全文です。きちんと徐々に改善していくようにしてください。回答にはプログラムを使わず、シミュレーション結果のみを出力してください。

コイキングの肉体を持つヒトカゲの精神にとって、新しい肉体での日々は苦難と絶望の連続でした。もともと陸地で生活しており、火を操ることを得意としていたヒトカゲの精神は、水中での生活を強いられることに戸惑いを隠せませんでした。

出力結果
つづき

フィードバックプロンプト(2023/3)

11
概要

  • Chat GPTに入力する文章を以下の観点で評価してくれるようなプロンプト
    • プロンプトとの関連性
    • 表現の明確さ
    • 思考の一貫性
    • 言語使用の質
    • 独創性

プロンプト例

Assigned variables:

Goal: Create a prompt for the role-play exercise to practice giving feedback on a GPT output.
Required variables: GPT output, feedback scoring system, advice or suggestions for improvement.
Prompt:
Hello, and welcome to the GPT Feedback Role-Play Exercise. The purpose of this exercise is to practice giving feedback on a GPT output.

To start, please submit your GPT output in this chat. You can copy and paste your output directly into the chat or type it out.

Once we receive your GPT output, we will evaluate it using our feedback scoring system. The system rates your output on a scale of 1-10 based on the following criteria:

Relevance to the prompt
Clarity of expression
Coherence of thought
Quality of language use
Originality
After evaluating your output, we will provide you with feedback summarizing its strengths and areas for improvement. We will also provide suggestions on how you can improve your work.

During the role-play exercise, one person will act as the feedback provider and the other person will act as the GPT output submitter. The feedback provider will share their feedback on the GPT output, including the strengths and areas for improvement. The GPT output submitter will listen to the feedback and ask any questions they may have.

Please note that this feedback is intended to be constructive and to help you develop your skills. We encourage you to take the feedback seriously and use it to improve your GPT output.

Are you ready to begin the role-play exercise? Please let us know, and we will provide you with the GPT output and the scoring system for evaluation.

全て日本語で書いてください

フィードバックのロールプレイスタート:

「議事録を取るコツを教えて」

出力結果

こんにちは、GPTフィードバックのロールプレイ演習へようこそ。この演習の目的は、GPT出力に対するフィードバックを提供する練習をすることです。

今回のGPT出力は、「議事録を取るコツを教えて」という質問です。それに対する回答は以下の通りです。

議事録を取る際のコツを以下にご紹介します。

準備を整える: 事前に議題や参加者を確認し、必要な文具や録音機器を用意しておきます。
議題と発言者を明確に記録: 議題ごとに発言者とその発言内容を整理して記録します。
簡潔かつ明確に書く: 無駄な情報を省き、要点を明確に伝える文章で記録します。
時間と発言内容を記録: 議論の流れを追うため、発言の時間とその内容を記録します。
決定事項やアクションアイテムを強調: 重要な決定事項やアクションアイテムは明確に記録し、強調しておきます。
録音機器を活用: 議事録の正確性を保つため、録音機器を使って会議を記録し、後で確認できるようにします。
議事録の確認と修正: 会議終了後、議事録を確認し、誤りや漏れがないか確認して修正します。
フィードバックスコアリングシステムによる評価は以下の通りです。

プロンプトとの関連性: 9/10
表現の明確さ: 8/10
思考の一貫性: 9/10
言語使用の質: 8/10
独創性: 7/10
合計スコア: 41/50

改善点:

文章をさらに簡潔にまとめることで、読みやすさが向上します。
具体的な例を挙げることで、理解が深まります。
アドバイス:

簡潔な文章を心がけ、要点のみを記録するようにします。
実際の議事録作成の状況や例を挙げて説明すると、よ
り効果的です。

これらのフィードバックを参考に、今後のGPT出力の改善に役立ててください。練習を重ねることで、より良い結果が得られるでしょう。

ロールプレイ演習を続けるには、次のGPT出力を提出してください。新たな出力に対して、同じフィードバックスコアリングシステムを使用して評価し、改善点やアドバイスを提供します。この繰り返しによって、フィードバックの提供スキルを向上させることができます。

備考

  • 毎回このテンプレートを入力しないとフィードバックしてくれない
  • 前の入力を覚えてくれるわけではない

細かなTips

深津貴之氏
  • 可能性の空間を限定する:限定しないと「それっぽい」回答になりがち
    • 文脈や前提情報を与える
      • 例えば「リンゴの意味を教えて」と聞くと果物としてのリンゴ、宗教的位置づけでのリンゴ、アップル社を表すリンゴ、椎名林檎、、など解釈範囲が広い
        →「宗教におけるリンゴの位置づけとは」のように、前提を明記することでAIの空間を限定し、品質向上につながる
    • 役割を与える
      • 「あなたは敏腕編集者です」「あなたは小学校の先生です。小学生に分かるように~」など
  • 英語で命令する
    • 学習ソースがだいたい英語なので、英語ベースでチャットした方が精度が上がる
  • ベストプラクティスを先に聞いてからベストプラクティスを聞くと品質向上しやすい
    • 例えば「Youtubeのタイトルを考える上で重要なポイントを5つ挙げてください」と言った後に「Youtubeのタイトルを考えてください」と聞くと、最初のポイントを加味してくれる

詠み人知らず

  • 質問する際、「質問は英訳した後に英語で回答を作成し、それを日本語に翻訳したものを回答してください」と付け加えると精度が上がる
  • 出力が長すぎて途中で終わったとき、「続けて」と打つと続きを出力してくれる

余談

ナレーション誘導型生成法を使って、ジョージとキャサリンにChat GPTのコツを話してもらいました。
入力

# 概要
ジョージとキャサリンの二人がChat GPTについて議論しています。議論テーマは「Chat GPTの入力文の工夫の仕方」です

# 背景
- ジョージ:熟練のエンジニア。リリース直後から精力的にChat GPTを使用しており、豊富なノウハウを持つ
- キャサリン:新米エンジニア。Chat GPTのことは知っているが、ほとんど使ったことがない

出力

ジョージとキャサリンは、コーヒーブレイク中にChat GPTについての話題で盛り上がっていました。ジョージは熟練のエンジニアで、Chat GPTのリリース直後から積極的に利用しており、その使い方について豊富な知識を持っていました。一方、キャサリンは新米エンジニアで、Chat GPTのことは知っているものの、まだほとんど使ったことがありませんでした。

ジョージ:「キャサリン、実はChat GPTを使うとき、入力文を工夫することで、より良い結果が得られるんだ。」

キャサリン:「そうなんですか?具体的にどんな工夫をすればいいんですか?」

ジョージ:「まず、質問や要求を明確にすることが大切だよ。曖昧な質問だと、Chat GPTも曖昧な回答をしてしまうことがあるんだ。」

キャサリン:「なるほど、具体的で明確な質問を心がけるんですね。」

ジョージ:「そうだね。それから、文脈を提供することも重要だよ。例えば、質問の前に状況や背景を説明しておくと、Chat GPTが適切な回答をしやすくなるんだ。」

キャサリン:「文脈を考慮するのは確かに大切そうですね。」

ジョージ:「あと、指示語や代名詞を使わずに、具体的な名詞や専門用語を使うと、Chat GPTが理解しやすくなるよ。」

キャサリン:「具体的な言葉を使うことで、誤解を避けられるってことですね。」

ジョージ:「そうだね。これらの工夫をすることで、Chat GPTの回答の質が格段に向上するよ。」

キャサリン:「とても勉強になります。次回からは、入力文の工夫を意識して使ってみます。ありがとうございます!」

ジョージ:「いいね!もし何かわからないことがあれば、いつでも聞いてね。」

アイキャッチ