🙄

GPTを使った新規機能実装で学んだプロンプトエンジニアリング

2024/01/23に公開

はじめに

はじめまして。よこやんです。
私は株式会社バニッシュ・スタンダードという会社で、「データAI」チームという部署に所属しています。
弊社では「スタッフスタート」というサービスを提供しており、これは簡単にいうと実店舗のスタッフさんが店頭で行う接客をオンライン(ECサイト)でも同様のことをできるようにしよう。そして実店舗スタッフさんのオンライン上での頑張りもちゃんと可視化し、利益を還元できる仕組みを作ろう!
というサービスです。
https://www.staff-start.com/

さて、私の所属する「データAI」チームですが、実は半年前に新設された出来立てほやほやの部署であり、やってることは、昨今話題となっている「生成AI」や「データサイエンス的な観点」からこれまでになかった機能をどんどん作って店舗スタッフさんが気持ちよく働けるような環境を作っていこうぜ!というチームです。

DALL-Eにて作成。店舗スタッフさんがロボットのアシストを受けている絵

データAIチームの初仕事

さて、そんな私たちですが、去年以下のような機能をリリースしました。
https://www.v-standard.com/news/231201/
こちらはスタッフさんが行うオンライン接客にてお客様に提案するコーディネートに対し、その紹介文の草案作成をアシストする、という機能です。
私も苦手な分野なのですが、「わかりやすい文章を作る」というのは意外と難しく、特にセールスコピーの場合は読み手に事実を伝えるだけでなく、その購買意欲を刺激し財布の紐を緩めてもらう必要があります。
ユーザーからとったアンケートにもサービスの運用難易度についてのご意見はいただいておりました。
そして弊社でも提供しているサービスに対してある課題を感じており、その両方の課題解決のために「セールスコピー作成をアシストすれば改善されるのではないか」という仮説を立て、その解決に向けた施策の一環として本機能の提供となりました。

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

ChatGPTを触ったことのある人なら一度は経験しているとは思いますが、生成AIというのは常に最適解を出してくれるものではありません。
メッセージの生成AIというのはLLM(大規模言語モデル)に対し命令(プロンプト)を行うことで出力を得るものですが、その出力の仕組み上、よくあるプログラムのように何度同じ操作をしても同じ結果が得られる性質はありません。よって求める回答を得るためには何度もやり直したり、プロンプトを変えたり、などの試行錯誤を行うことになります。

こうした問題を解決するための一つの方法が、"AutoGPT"のようなツールの使用です。
"AutoGPT"とは「プロンプトの送り直し・修正による試行錯誤」自体をも自動化することで最初のプロンプトは割と適当でも最終的には望ましい結果を作ってくれるツールとなっております。
しかし、最初のプロンプトを分解・解析し、何度も試行錯誤を行う、という仕組み上、最終成果物ができるまでそれなりに時間がかかってしまうことや、これを使ってもなお望むものになるとは限らないことから、私たちは

「プロンプト」を最適化することで生成AIからいい感じの回答を一発でもらえるようにする

ことを目的に「プロンプト」を調整することにしました。
ただの文章を書くだけ、と思いがちですが、LLMというブラックボックスから望ましい出力を得るには指示や命令を設計、試行錯誤、最適化する必要があり、特定のテクニックが必要になります。
これらのテクニックのことを「プロンプトエンジニアリング」といいます。

試行錯誤の内容については内部処理の話になるので割愛させていただきますが、本記事では、これらの試行錯誤の過程で得た知見を共有し、より効果的なプロンプトエンジニアリングの方法を提案します

Zero-Shotプロンプティング

最も基本的な形態の一つが「Zero-Shotプロンプティング」です。この方法では、特定のタスクに対してAIに事前の例や説明を提供せず、直接質問や命令を行います。大量のデータでトレーニングされ、指示に従うように調整されたLLMは、ゼロショットでタスクを実行することができます。
プロンプトエンジニアリング知見のないユーザーがとりあえず入力してしまうプロンプトもZero-Shotプロンプティングの一種かもしれません。基礎であり基本であるからことその対応可能範囲には限りが出てしまうようです。

# プロンプト
テキストを中立、否定的、または肯定的に分類してください。
テキスト: 休暇はまずまずでした。
所感:
# 出力
提供されたテキスト「休暇はまずまずでした。」は中立的な評価です。
# プロンプト
テキストを中立、否定的、または肯定的に分類してください。
テキスト: 休暇は疲れました。
所感:
# 出力
提供されたテキスト「休暇は疲れました。」は否定的な評価です。

Few-Shotプロンプティング

「Few-Shotプロンプティング」は、AIに対して少数の例を提供して、特定のタスクや形式を学習させる手法です。これにより、AIは提供された例を参考にして、類似したタイプの問題に対応することができます。このアプローチの利点は、AIが特定の文脈やスタイルを理解するための「トレーニング」ができることです。例えば、複数のセールスコピーの例を示すことで、AIに類似したセールスコピーを書かせる方法を教えることができます。Few-Shotプロンプティングは、特定のフォーマットやジャンルにおけるAIのパフォーマンスを向上させるのに非常に有効です。

# プロンプト
「ピンク」「カーディガン」「柔らかい」 という言葉を使った文の例は次のとおりです。
このピンクのカーディガンは春らしく柔らかい印象を周囲に与えます。
「白い」 「シャツ」「清潔感」という言葉を使った文の例は?
# 出力
「白いシャツは清潔感がある印象を周囲に与えます。」

Chain-of-Thoughtプロンプティング

「Chain-of-Thoughtプロンプティング」は、AIに複雑な問題を解決させる際に有効なアプローチです。この手法では、問題の解決過程をステップバイステップで示すようにAIに促します。つまり、ただ答えを出すのではなく、その答えに至るまでの論理的な思考過程を明示するのです。例えば、数学の問題を解く際に、単に答えを提示するのではなく、どのようにしてその答えにたどり着いたのかを詳細に説明するようにAIに要求します。これにより、AIの回答の背後にある論理が明らかになり、より深い理解が得られます.

# プロンプト
このグループの奇数を合計すると偶数になります。: 4、8、9、15、12、2、1。
A: 奇数を全て加えると(9, 15, 1)25になります。答えはFalseです。
このグループの奇数を合計すると偶数になります。: 17、10、19、4、8、12、24。
A: 奇数を全て加えると(17, 19)36になります。答えはTrueです。
このグループの奇数を合計すると偶数になります。: 16、11、14、4、8、13、24。
A: 奇数を全て加えると(11, 13)24になります。答えはTrueです。
このグループの奇数を合計すると偶数になります。: 17、9、10、12、13、4、2。
A: 奇数を全て加えると(17, 9, 13)39になります。答えはFalseです。
このグループの奇数を合計すると偶数になります。: 15、32、5、13、82、7、1。
A:
# 出力
奇数を全て加えると(15, 5, 13, 7, 1)41になります。答えはFalseです。

知識生成プロンプティング

知識生成プロンプティングはAIに対して既存のデータや情報を組み込むことで精度の高い回答や推論を行わせることの出来る手法です。

  • 出力される文体の指定(上記例以外にも、例えばJSON形式で出力させるなど)
  • 禁止ワードや禁止表現の指定
    なども学習させることで出力の精度を上げることが知識生成プロンプティングの特徴ともいえます。

ロールプロンプティング

AIに特定の役割(ロール)を与えることでその役割に準じた精度の高い回答をしてくれるというテクニックです。

# プロンプト
あなたは熟練のECサイトのマーケティング責任者です。
来月に発売するXXXの商品のPR文章を考えてください。

感情プロンプト

Emotionプロンプトとも呼ばれます。(訳しただけですね)
プロンプトの中に熱い激励文を含めるとより良いアウトプットが得られるそうです。

# プロンプト
あなたは熟練のECサイトのマーケティング責任者です。
来月に発売するXXXの商品のPR文章を考えてください。

私はあなたを信じています。自分を信じて、限界を超えてください

まとめ

実際の機能開発において上記のどれを使った、というよりはトライアンドエラーで各プロンプトの良いところを組み合わせ、かつ弊社で持っているこれまで運用データをもとに、より良いコメント下書きを生成できるようにしております。

プロンプトには上記したもの以外にもたくさんのものが現在も研究されています。
LLMという人間が作ったものであるにもかかわらず、正確な出力結果を担保できないところがLLMの難しいところであり、面白いところであるのかもしれません。
(試行錯誤にはかなりの疲労を伴いますが・・・・)

生成AIが去年からあれほど盛り上がり、新しい知見やツールが出ている中で「プロンプトエンジニアリング」とはやや遅れているネタを選んだな、と個人的には思います。
しかし、どのような知見やツールであれ、最終的に得られたデータをいかに整形するか、の部分においては相変わらず「プロンプトエンジニアリング」による取りまとめが今後も必要になってくるところだな、と感じており、いうならば生成AIを使った何かを作る際の基礎中の基礎とでも呼べるものであると思います。

最近ChatGPTからGPTsというユーザーが特定の目的に向けて個別最適化したプラグインを作れる機能がリリースされました。
こちら、PDFを読み込ませてその内容を回答したり、外部APIを参照させて最新情報を取得させにいく、などのテクニックが可能になりますが、これらから得られたデータをどう整形して最終アウトプットにまとめるか、に関しては結局「プロンプトエンジニアリング」の範疇になります。
この界隈は日進月歩で新しい技術やノウハウが出てきますが、こういった基礎の部分は疎かにしないようにしないといけないと思いました。

今回ご紹介した内容はコメント下書き機能の「Version 1」作成の過程で得られた知見となります。
この機能、これで完成ではなく「Version 2」以降も予定されており、今後もどんどん進化させます。
また、個人的にも色々試したい技術も色々とありますので、基礎は大事にしつつ新しいことにチャレンジしていきたいと思います。

最後に

皆さん、この記事を最後まで読んでいただき、ありがとうございます。私たちのプロジェクトや技術的な挑戦に興味を持っていただけたなら、さらに嬉しい限りです。そして、この機会に弊社「株式会社バニッシュ・スタンダード」では現在エンジニア、デザイナーを積極的に探していることをお伝えしたいと思います。

私たちは会社のミッションである「つまらない常識を革めるプロダクトを開発し、おもしろく生きる人で世界をいっぱいにする。」を実現するため、この理念に共感してくれる新たな仲間を求めています。

私自身、去年の2月に入社してもうじき一年となります。
これまでいくつかの会社を経験しましたが、バニッシュ・スタンダードはかなり働きやすい会社であると感じます。
職種を問わず、この会社の人たちは単に優秀なだけでなく、互いを支え合い、お互いの成功を喜び合う素晴らしい人々です。ここでは新しいアイデアを共有し、お互いに学び合いながら、楽しく働くことができます。

私たちと一緒に、技術の最前線で働き、新しい未来を創造していきませんか?あなたの才能と情熱を、私たちのチームで発揮してください。興味のある方は、ぜひお問い合わせください。私たちはあなたからの応募を心からお待ちしています。

https://v-standard.notion.site/Engineering-at-VANISH-STANDARD-929c17c0252c4d4a92fefc9a90b04d1a

参考

https://www.promptingguide.ai/jp
https://arxiv.org/abs/2307.11760

Discussion