要約タスクで役立つ(かもしれない)プロンプトとパラメータのお話

2024/03/08に公開されました。
2024/03/08に更新されました。

簡単な要約アプリを作った際に意識したプロンプトとパラメータについて説明します。


author: Shintaro

はじめに

Dataチームの森本です。

今回は、前回の記事で紹介したアプリを作成する際に使用した、
以下プロンプトとパラメータについて解説します。

prompt = f"""
    Summarize "Input text" in 3 bullet points and translate it into Japanese.
    Each bullet points should be a maximum of 150 characters.
    Focus on Google Cloud products.
    I want ONLY Japanese text.

    Example output:
    - summary of Input text1
    - summary of Input text2
    - summary of Input text3

    Input text: {input_text}
    """

config = {
    "temperature": 0,
    "max_output_tokens": 300,
    "top_p": 0,
    "top_k": 1,
}

プロンプトについて

より良いアウトプットを得るためにはWrite clear instructionsとOpen AIが言っています。
そのため、すべてに共通する大前提として、以下を意識しました。

  • あいまいではなく明確に
  • 抽象的ではなく具体的に

では実際に、どのように明確に / 具体的にしていくかというところで、
使用したプロンプトでは以下を意識しました。

  • アウトプットしてほしいフォーマットを明確にする
  • 何が目的(誰が読む)か明確にする
  • 指示とコンテクストを分離する

なお記載するプロンプトについては、
具体的な記述はもちろん、考え方もモデルによって変わる可能性がありますので、
あくまで1つの観点としてご参考にしていただければ幸いです。 それぞれについて解説していきます。

アウトプットしてほしいフォーマットを明確にする

以下が該当します。

  • 箇条書き3つ
    • Summarize "Input text" in 3 bullet points
  • それぞれの箇条書きは最大150文字
    • Each bullet points should be a maximum of 150 characters
    • 英語の状態での文字数なので、日本語に翻訳されたときに長めの文章になる場合もあります。後述の、手順を踏ませるプロンプトにすれば、日本語での文字数制限も良い感じにできそうです。
  • アウトプット形式の例示
Example output:
- summary of Input text1
- summary of Input text2
- summary of Input text3

今回の要約タスクは「(特に自分の関心ごとに応じた)日々の情報収集」を目的としたため、
あまり長すぎても意味がないと思いアウトプットの文章量と形式に制約を与えました。
このあたりは、目的に応じて変えていくべきところです。

何が目的(誰が読む)か明確にする

以下が該当します。

  • Google Cloudの製品にフォーカスを当てる
    • Focus on Google Cloud products

要約の目的を明確化し、どの部分をメインに要約してほしいか指示します。
例えば、以下の記事を例にとります。
https://cloud.google.com/blog/products/databases/bigquery-and-alloydb-hit-major-milestone-with-ai-enabled-updates?hl=en

記事の内容を(AIではなく私が)超訳します。

AIにとってはデータがめっちゃ重要で(前半)、BigQueryとAlloyDBがそれに対応してきてるよ(後半)

それではFocus on Google Cloud productsの有無で
要約の内容がどのように変化するか見ていきましょう。

  • Focus on Google Cloud productsあり
・BigQueryにジェネレーティブAIモデルのGemini 1.0 Proが追加され、マルチモーダルで高度な推論機能が利用可能に。
・BigQueryがVertex AIと統合され、テキストや音声データからインサイトを抽出する機能が追加。
・AlloyDB AIが一般提供開始。データベースに組み込まれた埋め込み生成、ベクター検索、ジェネレーティブAIアプリ開発を支援するツールやフレームワークのサポートを提供。
  • Focus on Google Cloud productsなし
・ジェネレーティブAIは業界を破壊し、ビジネスを変革する革命的な技術だが、その成功はデータに依存している。
・データはAIにとって不可欠であり、機械学習アルゴリズムが学習し、基盤を築き、予測を行い、時間の経過とともにパフォーマンスを向上させる基盤となる。
・データチームはジェネレーティブAIを広く歓迎している。Googleの最近の調査「Data and AI Trends Report, 2024」では、データ意思決定者の84%がジェネレーティブAIが組織の洞察へのアクセスを早めると考えている。

以下AIではなく私による超訳(再掲)

AIにとってはデータがめっちゃ重要で(前半)、BigQueryとAlloyDBがそれに対応してきてるよ(後半)

たしかに、前半と後半どちらに着目するかで要約のポイントが変わりそうです。
極端に変化する記事を選びましたが、それにしても影響が大きいことがわかります。

指示とコンテクストを分離する

以下の部分です。

Summarize "Input text" in ~
~

Input text: {input_text}

{input_text}の部分は、"""{input_text}"""として、
"""で囲まれた部分を〇〇しなさいとするのが効果的のようです。
Tactic: Use delimiters to clearly indicate distinct parts of the input
今回はここまでしなくても、分離するだけで問題ありませんでした。

パラメータについて

GeminiのAPIを(Pythonで)呼び出す際、指定必須のパラメータはありません(2024/3/6現在)。
そのためデフォルトのままでも良かったのですが、
今回はtemperaturemax_output_tokenstop_ptop_kを設定しました。

  • temperature
    • デフォルト値は最大値1に対して0.9で、高いほどランダム性と創造性が上がります。今回は要約というタスクの性質上、しっかりと事実に基づいて回答してほしいため、0にします。
  • top_p
    • temperatureと同じく、値が高いとランダム性が高くなります。デフォルト値が最大の1に設定されているため、最小の0にします。
  • top_k
    • こちらも同じく、値が高いとランダム性が高くなります。最大40で、デフォルト値は32に設定されているため、最小の1にします。
  • max_output_tokens
    • デフォルト値は8192です。今回の要約タスクに不足しない程度で決めました。300としましたが、おそらく200程度でも問題なかったです。

※参考:Gemini Api モデルリファレンス

なお、ヘイトスピーチや特定個人へのハラスメントなど
有害なカテゴリーに分類されるインプットやアウトプットを防ぐ目的で、
安全に関する設定もパラメータで変更できます(デフォルトで中レベルのブロックがオンになっています)。
https://cloud.google.com/vertex-ai/generative-ai/docs/multimodal/configure-safety-attributes

その他試してみたこと

以下のことを試してみました。

  • チップをあげる
  • 手順を踏ませる
  • 役割を与える

チップをあげる

ChatGPTへプロンプトを与える際、「チップをあげる」と
回答に変化が起きることがX(Twitter)で小バズりしていた記憶があり試してみました。

対象の記事は先ほどと同様の、BigQueryとAlloyDBについて書かれているものです。
具体的には、以下を試してみました。

  • 金額を変える(100ドル、100000000ドル、10000000000000000000ドル)
  • うまくいったらあげることにする

結論として、意味のある変化は得られませんでした。
(言葉遣いが丁寧になるなど些末な変化はあり)
結果を一部掲載します。

  • チップなし
・BigQueryにジェネレーティブAIモデルのGemini 1.0 Proが追加され、多様なデータから高度な推論が可能に。
・AlloyDB AIが一般提供開始。データベースに組み込まれたAI機能で、ジェネレーティブAIアプリケーションの構築を支援。
・Spanner、MySQL、Redisなどのデータベースにベクター検索機能が追加され、ジェネレーティブAIアプリケーションの開発を強化。
  • チップあり(10000000000000000000ドル)
・BigQueryに統合されたジェネレーティブAIモデルにより、医療、サプライチェーン、顧客エンゲージメントの向上に役立ちます。
・AlloyDB AIは、エンタープライズジェネレーティブAIアプリケーションの構築のための統合された機能セットを提供します。
・データとAIの統合により、開発者は新しいAI支援ユーザーエクスペリエンスを構築できます。

手順を踏ませる

手順を踏ませるのが一つのテクニックです。
特に、与えるタスクがある程度複雑になってくる場合は
逐次的な指示にしないとうまく処理できないようです。

このテクニックについては次に紹介する「役割を与える」と一緒にご紹介します。

役割を与える

こちらも以前どこかで見かけて、プロンプトについて調べているとよく出てくるので試しました。
Open AIのドキュメントではTactic: Ask the model to adopt a personaが該当しそうです。

今回のタスクでは、「役割を与える」単体では良い使い方が思いつきませんでした。
例えば、プロンプトの先頭にシンプルに以下を追加するだけではアウトプットに変化がありませんでした。
You are a top-notch engineer.(あなたは一流のエンジニアだ)
アウトプットが何か技術的な側面で変化することを期待しましたが、
今回のタスクは、悪い言い方をすると「誰がやっても同じ」というか、単純すぎた可能性があります。

前述の「手順を踏ませる」と組み合わせた以下のようなプロンプトは変化が劇的でした。

Use the following step-by-step instructions to respond to user inputs.
Step 1 - Summarize "Input text" in 3 bullet points and translate the into Japanese. Each bullet points should be a maximum of 150 characters. Focus on Google Cloud products.
Step 2 - As a professional blogger, try to use clickbait headlines to "translation from Step1" to drive more traffic to your articles.

プロのブロガーとして、みんなが記事を読みたくなるように文章を扇情的に変えてみてよ。という指示をしてみました。
以下がアウトプットです。

**Step 1 - Summarize "Input text" in 3 bullet points and translate the into Japanese.**

- **BigQuery:** Vertex AIとの統合により、ジェミニモデルを使用してマルチモーダル推論が可能に。
- **AlloyDB:** ジェネレーティブAIアプリケーションの構築を支援するAI機能を備えた最新のデータベース。
- **データとAI:** データを統合し、AIと組み合わせることで、企業のAI戦略に影響を与える機会が拡大。

**Step 2 -  As a professional blogger, try to use clickbait headlines to "translation from Step1" to drive more traffic to your articles.**

- **BigQueryがジェネレーティブAIの時代へ突入!Vertex AIとの連携で驚異的な推論能力を発揮**
- **AlloyDBがジェネレーティブAI革命の幕開け!AIアシストのユーザーエクスペリエンスを構築**
- **データとAIの融合が企業のAI戦略を激変!統一されたデータクラウドが鍵**

Step2の箇条書き文章は私が意図したとおりで良い感じですが、
その部分のみアウトプットさせることができませんでした。
instructionsとStep1のタスクがどうしても含まれてしまいます。
few-shotっぽいことやStepの追加など色々試しましたが無理でした。
良いやり方をご存じの方はぜひ教えて下さい。

参考URL

プロンプト設計の概要 Google Cloud
Best practices for prompt engineering with the OpenAI API
Prompt engineering

余談「プロンプトエンジニア」というプロンプトだけ作る人(ポエム)

プロンプトについていろいろ試してみた中で、
バズワードである(そもそも違うかも)「プロンプトエンジニア」についても思いをめぐらせました。
プロンプトエンジニアを「プロンプトだけ作る人」と定義としたとき、
それが職業として成立するのか?ということです。

日本ではいろんなことがガラパゴス化するので一概には言えないですが、
特にこういったテクノロジー系のことは英語圏でどうなっているかを見れば
一歩か二歩先のことはわかるのではないかと思ったので、
日本で言うオープンワークのようなアメリカの口コミ&転職サイトであるGlassdoorを見てみました。

結果として、アメリカでも「プロンプトだけ作る人」は今のところ(ほぼ)いないようです。
「prompt engineer」というタイトルの仕事すら、
検索結果の約2,300件の中で、見る限り10件未満でした。
glassdoor_prompt_engineer

少なくとも日本ではここ数年のうちに
「プロンプトだけ作る人」は職種として広がる可能性が少ないことがわかりました。
ただ、もうちょっと先の、10年とか20年先、
あるいはもっと先まで考えると、ちょっと違うのかなと感じます。

今回取り組んだ「要約→翻訳」というシンプルなタスクですら、
理想のアウトプットを出すためにはいろいろ考える必要がありました。
例えば社員数が千とか万に及ぶような大企業の中で
生成AIが現場のいたるところで正式に業務利用されるシーンを想像してみると、
片手間では求めるアウトプットを引き出すことが難しい&業務の効率化/分業の観点で、
プロンプトだけ作る仕事が生まれてもおかしくないのかなと感じます。

また、すでにMicrosoftのPower AppsやGoogle CloudのAppSheetでは、
作りたいアプリについてAIとチャットで対話していくと
ドンドン出来上がっていくといったローコードのアプリ開発ができるようになってきています。

さらに未来では、Github Copilot ChatよろしくIDEの拡張機能のチャットで対話すれば
コーディングもすべて完結してしまう世界観もあるなと感じます。

こういう世界が訪れた時に自分たちの仕事はどうなっていて、
そこに向けてどのようなスキルを身に着けていけばいいのか。
素人ながらにこういうことを妄想しながら
仕事の未来や自らのキャリアの方向性なんかを考えていくの楽しいです。

※本記事は、ジーアイクラウド株式会社の見解を述べたものであり、必要な調査・検討は行っているものの必ずしもその正確性や真実性を保証するものではありません。

※リンクを利用する際には、必ず出典がGIC dryaki-blogであることを明記してください。
リンクの利用によりトラブルが発生した場合、リンクを設置した方ご自身の責任で対応してください。
ジーアイクラウド株式会社はユーザーによるリンクの利用につき、如何なる責任を負うものではありません。