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

大嶋勇樹氏:では続きで、プロンプトエンジニアリングに(ついて)入っていこうと思います。「そもそもプロンプトエンジニアリングって何?」とGPT-4に聞いてみると、「プロンプトエンジニアリングとは、AIシステムに対する入力を設計・最適化するプロセス……」と、長い回答をしてくれます。

ChatGPTに触れたことがある人は見たことがあると思いますが、ChatGPTからの回答はやはり長くて、「一言で答えてほしい」みたいなことがあると思うんですね。

例えば、3行で答えてもらう時にはこんなことをします。「以下の質問に3行で答えてください。質問:"""プロンプトエンジニアリングとは"""」。(スライドを示して)行じゃなくて文というのが適切かもしれませんが、こんな言い方をすると、こんな感じで3文ぐらいで答えてくれます。「プロンプトエンジニアリングとは、AIモデルへの入力を最適化し、意図した出力を得る技術です」と。これがまさにプロンプトエンジニアリングの例です。プロンプトを工夫すると、こんなふうに意図した形式だったりなんだったりで応答を得やすいです。

プロンプトエンジニアリングについては、ナレッジ集みたいなものがいくつか公開されています。例えばOpenAIの公式でもプロンプトエンジニアリングについて書いたページもあれば、「Prompt Engineering Guide」というものも公開されていて。最近日本語に翻訳されたページもできて、わりと話題になっていたと思います。こういったナレッジ集の内外から、プロンプトエンジニアリングの手法をいくつか見ていこうと思います。

プロンプトエンジニアリングの要素

まずは、特にLangChainの入門に関係するものを見ていきます。まずは命令と入力データを分離するというやり方があります。

(スライドを示して)例えば「###」や「"""」で区切って、このように命令と入力データを分離するやり方があります。これが先ほどのプロンプトで使っていたような、ちょっとしたやり方ですね。

ほかには、文脈を入れるやり方があります。例えば外部の情報などを文脈として与えると、文脈に従った回答を得られます。「文脈を踏まえて質問に1文で回答してください」と。そして文脈をいろいろ入れて、「質問:"""LangChainとは?"""」みたいなことをします。

ここの文脈としてはLangChainのドキュメントのある1ページの内容をそのままコピペして貼っている感じなんですが、そうすると「LangChainは、言語モデルを活用したアプリケーション開発のためのフレームワークです」みたいな感じで適切に答えてくれます。

GPT-3.5やGPT-4は、2021年9月までの知識で学習していると公式で言われています。そして今日のテーマのLangChainは2022年に登場しているものなので、この文脈を与えないと「わかりません」と言ってくるか、ハルシネーションというやつで事実ではない嘘の回答をしてくるかということになるんですが、文脈を与えるとけっこうちゃんと答えてくれます。

ほかには出力形式を指定するプロンプトの使い方もあります。出力形式を指定することで、出力をプログラムで扱いやすくできます。(スライドを示して)「以下の料理のレシピを教えてください 料理名:カレー 形式は以下のようなJSONにしてください」とすると、こんな感じでJSON形式で出力を出してくれたりするようなやり方もあります。

プロンプトの要素をいろいろ見てきましたが、Prompt Engineering Guideというサイトで、「プロンプトには以下の要素が含まれる」みたいな整理がされてます。

ここまで見てきたものの整理のような感じですね。「命令」、モデルに実行してほしい特定のタスクまたは命令が含まれることもあれば、「文脈」、外部の情報や追加の文脈を含め、それによってモデルをより良い応答に導くようなこともあります。

「入力データ」を命令と分けて質問とかを書いてあげることもあれば、「出力の指示子」ということで、「出力はJSON形式でこういうふうにしてください」と書いてあげることもあります。

(スライドを示して)こんな要素が出てきます。このあたりのイメージをつけておくと、LangChainに後で入っていく時にもわかりやすくなっていくかなと思っています。

プロンプトのテンプレート化

いろいろ要素を見てきましたが、LangChainとかを使ってLLMを使ったアプリケーションを作る時に、あれ全部をユーザーに入力させるわけにはいかないです。

実際にLLMを使ったアプリケーションを作る時はプロンプトの全体をユーザーに入力させるのではなくて、テンプレート化した一部を入力させることになると思います。

例えばレシピ生成アプリみたいなものを作ったとして、(ユーザーには)たぶん料理名だけ入力させるとか、そんなふうになると思うんですね。入力したものをLLMを使ったアプリケーションが(例えば)「カレー」と受け取って、プロンプトのテンプレートみたいなのを用意しておいて、プログラムで置き換えて、OpenAIのAPIを呼び出して回答を得るようなことをするわけですね。

このプロンプトのテンプレート化はポイントの1つです。このイメージは押さえておいてもらえると続きがわかりやすくなるかと思います。

プロンプトエンジニアリングの2つの手法

プロンプトエンジニアリングの話を少ししてきましたが、最後に有名な手法を2つ紹介しようと思います。有名な手法といってもいろいろありますが、Zero-shot、Few-shotプロンプティングと、Zero-shot CoTプロンプティングを紹介しようと思います。

まずZero-shotやFew-shotといったものですが、例えば「バナナの色は?」みたいなことを「Q:バナナの色は? A:」という聞き方をすると、「バナナの色は成熟度によって変わります。未熟なバナナは緑色で……」とかなんとかかんとかと言ってくれて。(この情報も)正確かもしれないんですが、正直余計な説明が多かったりします。

「そうじゃなくて黄色と言ってほしいんだ」という時は、Few-shotプロンプティングという手法を使って、例えば「Q:リンゴの色は? A:赤 Q:メロンの色は? A:緑 Q:バナナの色は? A:」みたいなプロンプトを与えます。いくつかデモンストレーションを与えたりすると、黄色と求めるような形式で回答を得やすくなる。こんな手法があります。こういうのをFew-shotプロンプティングといいます。

ほかにはZero-shot CoT……。CoTはChain of Thoughtの略ですが、Zero-shot CoTプロンプティングという手法もあります。Zero-shotじゃないのもありますが、Zero-shotのほうがちょっとおもしろいので紹介します。

聞いたことがある方もけっこういるかもしれませんが、プロンプトに「ステップバイステップで考えてみましょう」みたいな言葉を追加すると、それだけで計算が正確になることがあります。

すみません、ちょっと(スライドの)字が小さめかもしれませんが……。「10個リンゴを買って、隣人に何個渡して……」みたいな問題があって、「答えだけ端的に答えてください」みたいなことを言うと間違った答えを言ったりするのに対して、「ステップバイステップで考えてみましょう」という一言を追加してステップバイステップで考えさせたりすると、正確な答えが返ってきたりします。こんな工夫もあったりするわけです。こういうものをZero-shot CoTプロンプティングといいます。

実際にはPrompt Engineering GuideやOpenAIのページにもっといろいろ手法が紹介されているし、そういったところに載っていないプロンプトエンジニアリングの手法もいろいろありますが、このあたりの紹介にとどめようかと思います。

ということで、ここまでプロンプトエンジニアリングの概要として、プロンプトの例をいくつか見てきました。LLMを使ったアプリケーションを作る時は、プロンプトに文脈、contextを含めたり、プロンプトをテンプレート化するのがポイントです。また、Few-shotやZero-shot CoTといった有名な手法も紹介しました。

プロンプトエンジニアリングに少し慣れてきたかと思うので、このあたりでLangChainに入門していこうと思います。プロンプトエンジニアリングのイメージがあるとLangChainに入門しやすいんじゃないかなと思っているので、なんとなくのイメージが少し持てたところで、LangChainに入っていこうと思います。

Q&A

(その前に)いくつか質問をもらっているので回答したいと思います。

まず1つ質問いただいているのが、「text-davinci-003などのモデルは、ローカルで構築してローカルで動かすことはできないでしょうか? どうしてもOpenAIのAPIを叩く必要がありますか?」ということです。

私の認識では、OpenAIのtext-davinci-003はローカルでは動かせないと思っています。モデルをダウンロードできないと思うので、gpt-4もローカルでは動かせなくて、APIを叩くしかないと思っています。ただオープンソースで別で出ているモデルもいろいろあって、そういうのだったらローカルで動かせるというのが私の認識です。

もう1つ質問をもらっています。「LangChainと同等、競合サービスはなにがありますか?『LlamaIndex』がそうですかね?」ということです。

LangChainと近いポジションのサービスでいうと、ChatGPTのプラグインはわりと似ているかもしれないですね。LlamaIndexは後でちょっと出てきます。チャットのほうでもいろいろやり取りしてもらっていますが……。料金周りの補足とかもありがとうございます。

(次回につづく)