🧠

プロンプト技術を高めるテクニック集【入門編】

2024/03/19に公開

はじめまして。株式会社ナレッジセンスの門脇です。普段はエンジニア兼PMとして、「社内データに基づいて回答してくれる」チャットボットをエンタープライズ企業向けに提供しています(一応、200社以上に導入実績あり)。ここで開発しているチャットボットでは、LLMを活用しており、裏側ではプロンプトエンジニアリングをガッツリ行っています。本記事では、プロンプト技術向上のための知見を共有していきます。

プロンプト技術を高めるテクニック集【入門編】

はじめに

この記事は何

この記事は、LLMから有益な回答を引き出すためのプロンプト技術についてまとめたものです。具体的には、OpenAI、Anthropic、Googleの各社が公開している「プロンプトガイド」(言語モデルから有益な回答を得るためのガイド)を比較し、その共通点を挙げ、解説をしています。

対象読者

  • 生成AIを利用するユーザー
  • 生成AIサービスに取り組むビジネスマン
  • 生成AIサービスに取り組むエンジニア

特にこの「入門編」は、生成AIを普段利用するユーザーにとって有益な記事になることを想定しています。

この記事では、プロンプトエンジニアリングで重要な点は、7つあると定義しています。一つ一つが独立したテクニックになっているため、効果がありそうなものから試していただく形でOKです!

本題

プロンプトエンジニアリングのまとめ

以下は、各社の出している公式ガイド[1][2][3]をまとめた、比較表です。
プロンプト技術を高めるテクニック集【入門編】

OpenAI、Anthropic、Googleの各社が「プロンプトエンジニアリング」についてのガイドを出していますが、こうして比較すると、被っている項目がかなりあります。会社ごとにAIのモデルが違うとはいえ、全て「LLM」という点では共通なので、同じような知見が使えるということですね。

以下、それぞれの項目について、例を挙げて簡単に説明していきます。

1. 指示を明確に

基本中の基本ではありますが、「自分の要求を言語化すること」が一番大切です。
アウトプットが長すぎる場合は「150字以内で」と指示したり、もっと専門的な内容を回答してほしければ「医学論文のようなトーンで、専門用語を適切に使って説明してください」と伝えたりする必要があるということですね。「#」やXMLタグなどを使ってプロンプトの構造を明確にすると、更に回答精度が高まるとのことでした。例えば以下のような形です

以下の文書を分析し、150文字以内でサマリーを作成してください:
<document>
{{ここに文書を記入}}
</document>

<instructions>
{{ここに詳細の指示を記入}}
</instructions>

<example>
{{ここに例を記入}}
</example>

2. 役割を与える

「あなたはXXの専門家です」というように、具体的な役割を提示してあげることで回答精度の向上が期待できます。多くの論文[4]やガイドで言われていることですが、このテクニックも非常に重要です。

例えば「あなたは20年のキャリアを持つベテランシェフです」と設定すれば、料理に関する質問により専門的な視点からの詳しい答えが返ってきます。職業だけでなく、話し方の特徴など「どのように振る舞って欲しいか」を忠実に守ってくれるので、「フレンドリーな文章でお願いします」という指示も有効です。

お気づきかもしれませんが結局のところ、プロンプトのテクニックとは、「1. 指示を明確に」に繋がっています。もっと言うと、プロンプトのテクニックとは、「自分の要求を言語化すること」だと思います。以下、テクニックの解説を続けますが、この点が念頭にあった方が、コツが掴みやすいです。

3. 例示する

AIにして欲しいアウトプットの具体例を提示することで、よりよい回答が返ってくるようになります。

例えば

次のような書き出しでブログのタイトルを提案してください:
例1. 春のお出かけにおすすめの○○な場所をご紹介!
例2. おすすめスポット10選【2024年春】
例3. 東京の観光地、おすすめは?

といった形です。
いわゆる何個か(英語でA few)の例を示す技術は「Few-Shot プロンプティング」とも呼ばれていて、論文など学術的な文脈でも非常に有名なテクニックです。[5]

4. 背景を共有する

自分の要求に関する背景をモデルに伝えることで、文脈に即したより適切な回答が得られます。これ、人間にもかなり近いことが言えますよね。

例えば

私は現在、機械学習を使った画像認識システムの開発プロジェクトを進めています。
目的は...で、期限は...です。
次のステップとして、あなたには以下の文章作成をお願いしたいです:
...

と、プロジェクトの概要や現在の状況を詳しく共有することが大切です。背景がわかれば、モデルもその文脈に合わせて的確なアドバイスをくれるということです。

5. ステップ・バイ・ステップで

プロンプトの先頭に「Let’s think step by step」を追加するだけでGPT-3回答性能が向上したという論文があります。[6]
人間が「やって欲しい」と思っていることは、AIからすると複雑すぎる、ということはよくあります。個人的にも多くの企業に生成AIを導入していますが、普通のビジネスマンに話しかけるような期待で生成AIを使うと、かなり複雑な要求になってしまいます。
なので、「ステップ・バイ・ステップで考えましょう」という伝説的な一文に限らず、順を追って考えさせるよう、誘導することが重要です。
例えば、

XXについて、以下の手順で回答してください
1. 問題点を整理
2. 解決策のアイデアを3つ出す
3. それぞれのメリットとデメリットを分析
4. 最終的にベストな方法を提案

と、段階を踏ませるようなプロンプトは効果的です。一気に完璧な回答を求めるより、少しずつ積み上げさせる方が、求めるような回答につながることが多いです。

6. 考える時間を与える

難しい質問に即答を求めるのではなく、じっくり考えさせることも重要です。

実際、「深呼吸して取り組みましょう」というプロンプトが、最も性能を発揮できたと報告されています。[7](※「Palm」というLLMへの有効性のみ示唆されているので、GPT系には効かない可能性もあります)

以下、最近僕が、個人的に衝撃を受けたプロンプトについて、Claude のガイドから引用します(引用元)

質問に答える前に、<thinking></thinking>タグの中で段階的に考えてください。
そして、<answer></answer>タグの中で最終的な答えを述べてください。

テクニック5の「ステップ・バイ・ステップ」に近い発想ではありますが、まずはメモ書きで考える、ということは、まさに人間がやっていることに近いことです。これで精度が上がると紹介されているのには驚きました。

7. 入力を途中まで書いてあげる

このテクニックについて、Googleによる分かりやすい説明があったので引用します。

言語モデルは、高度な自動補完ツールです。文章を途中まで入力すると、モデルは残りの文章になる可能性が高そうなものを予想できます。その際、例文や文脈を含めれば、モデルはそれらの例文や文脈を考慮に入れることができます。

以下は開発者向けの文章になりますが、生成AIからの回答として、「どうしてもこの形式で返してほしい」ということがあると思います。例えば、AIに4択の問題を出して、AIに回答してもらうことを考えます。AIは「正解は1です」と回答することもあれば単に「1」とだけ回答することもあります。回答の形式を統一したいときには例えば

Q. XXは何でしょうか?
1.xx
2.xx
3.xx
4.xx

A.
回答の番号:

などと、回答の途中までを事前に含めておくことで、AIの回答形式を誘導することができます。

まとめ

「プロンプトエンジニアリング」は有名なテクニックであり、かなり強力です。先日RAGの精度向上のための解説記事 を出しましたが、プロンプト技術はRAGでも非常に重要な役割を持っています。次回はもう少しAdvancedなプロンプト技術について解説する予定です。

また、これは解説する予定はありませんが、以下のように面白いプロンプトテクニックも結構ありますのでご参考ください。笑
https://twitter.com/at_sushi_/status/1739076010392653956

脚注
  1. "Prompt engineering", OpenAI ↩︎

  2. "Prompt engineering", Anthropic ↩︎

  3. "Prompt design strategies", Google ↩︎

  4. "Guided scenarios with simulated expert personae: a remarkable strategy to perform cognitive work" ↩︎

  5. "Cutting Down on Prompts and Parameters: Simple Few-Shot Learning with Language Models" ↩︎

  6. "Large Language Models are Zero-Shot Reasoners" ↩︎

  7. "Large Language Models as Optimizers" ↩︎

ナレッジセンス - AI知見共有ブログ

Discussion