グーグルが注目するプロンプトエンジニアリング技術

同じ大規模言語モデル(LLM)でも、プロンプトの精度によってアウトプットの内容や精度は大きく変わる。プロンプトエンジニアリングの重要性が注目されている所以だ。プロンプトエンジニアリングの最新技術として関心を集めているのが、10億ドル規模の評価額を持つAIスタートアップCharacter.aiが開発し、その後グーグルに買収された「Prompt Poet」だ。

Prompt Poetは、LLMの応答を最適化するための高度なプロンプト作成を、ユーザーフレンドリーな低コードテンプレートシステムで簡素化するツール。Character.aiは、LLMに性格を吹き込み、任意のキャラクターを演じさせるプラットフォームを開発してきた。これに伴い、同社は日々数十億のプロンプトを構築する必要があった。効率的に高精度のプロンプトを大量に作成するために生まれたのが、Prompt Poetということだ。

Prompt Poetが注目される理由を知るには、まず従来のプロンプトアプローチを理解する必要がある。

従来のプロンプトアプローチでは、Pythonのf文字列(f-strings)やその周辺のラッパーが業界標準として使用されてきた。f文字列とは、文字列内に変数や式を直接埋め込むことができるPythonの機能。たとえば、ユーザーの名前を含むメッセージを作成する場合、以下のように書ける:

#######python
name = “太郎”
message = f”こんにちは、{name}さん!”
# 結果: “こんにちは、太郎さん!”
#######

この方法は、シンプルなプロンプトを作成する際には非常に便利だ。しかし、複雑なプロンプトを作成する場合、f文字列は急速に複雑になる。ユーザーの過去の対話履歴、現在の文脈、特定のキャラクターの設定、そしてシステム指示を組み合わせた複雑なプロンプトを作成する場合を考えてみたい:

#######python
prompt = f”””システム: あなたは{character_name}です。以下の指示に従ってください。

指示: {system_instructions}

ユーザーの過去の対話:
{‘\n’.join([f’- {msg}’ for msg in user_history])}

現在の文脈: {current_context}

ユーザー: {user_query}

{character_name}:”””
#######

このようなコードは、文字列の連結や条件分岐が増えるにつれて急速に複雑化し、可読性が低下。さらに、プロンプトの構造を変更する際には、コード全体を大幅に書き換える必要も出てくる。プロンプト生成ロジックとデータ処理ロジックが混在することも複雑化を招く要因となる。これらは特にプログラミングの経験が少ない人やプロンプトデザイナーにとって大きな障壁となってしまうため、避けるべきものとなる。

Prompt Poetの核心とは

上記のf文字列を使った従来のプロンプトアプローチは、Prompt Poetを使うと以下のように変更することができる。


#######YAML
– name: system_instruction
  role: system
  content: |

    あなたは{{ character_name }}です。以下の指示に従ってください。
    指示: {{ system_instructions }}

– name: user_history
  role: system
  content: |
    ユーザーの過去の対話:
    {% for msg in user_history %}
    – {{ msg }}
    {% endfor %}

– name: current_context
  role: system
  content: |
    現在の文脈: {{ current_context }}

– name: user_query
  role: user
  content: |
    {{ user_query }}

– name: character_response
  role: assistant
  content: |
    {{ character_name }}:
#######

このPrompt Poetアプローチは、従来のf文字列を使用した方法と比較して、多くの利点をもたらす。まず、プロンプトの各部分が明確に分離され、構造化されていることが大きな特徴だ。これにより、プロンプトの構成要素を簡単に理解し、修正することが可能となる。YAMLの構造を採用することで、プロンプトの各部分が視覚的に区別しやすく、特に非技術者にとって理解しやすい形式となっている。

さらに、Jinja2のテンプレート機能を使用することで、条件分岐や繰り返し処理を簡単に組み込むことができる柔軟性も備えている。たとえば、user_historyの部分では、forループを使用してメッセージを列挙している。前述した通りf文字列では、プロンプト生成ロジックとデータ処理ロジックが混在してしまうため、複雑になりがちな処理となる。

各部分に名前が付けられているという特徴も重要だ。これにより、他のプロンプトテンプレートでこれらの部分を再利用したり、参照したりすることが容易になる。また、プロンプトの構造を変更する必要がある場合、関連する部分のみを修正すればよく、全体の構造を大幅に変更する必要がないため、保守性も高い。

さらに、各セクションにroleを指定することで、システム指示、ユーザー入力、AIの応答などの役割が明確になる。これは、複雑な対話システムを設計する際に特に有用だ。

Prompt Poetの強み、YAMLとJinja2を活用した構造

Prompt Poetの強みは、YAMLとJinja2という2つの技術を巧みに組み合わせた点にある。これらは一見難しそうに見えるが、実際はかなりシンプルなものだ。

まず、YAMLは「構造化されたデータを書くための方法」と考えるとわかりやすい。買い物リストを作るときを想像すると、普通なら、以下のようにただ項目を列挙するだけかもしれない。

通常の買い物リスト

買い物リスト:
– 牛乳
– パン
– 卵
– りんご
– 洗剤

しかし、YAMLを使うと、それぞれの項目にカテゴリーをつけたり、数量を指定したりすることが簡単にできるのだ。情報を整理して書くための「フォーマット」とも言える。

YAMLを使った構造化された買い物リスト

買い物リスト:
  食料品:
    乳製品:
      – 商品: 牛乳
        数量: 1
        単位: リットル
    パン類:
      – 商品: 食パン
        数量: 1
        種類: 全粒粉
    卵:
      – 商品: 卵
        数量: 1
        単位: パック
        備考: 有機卵を選ぶ
    果物:
      – 商品: りんご
        数量: 5
        単位: 個
        種類: ふじ
  日用品:
    洗剤:
      – 商品: 洗濯洗剤
        数量: 1
        種類: 液体
        サイズ: 1リットル

一方、Jinja2は「テンプレートを作るための道具」と考えることができる。たとえば、年賀状を大量に作る時のことを考えてみてほしい。基本的な文面は同じだが、宛名や一部の文章を変えたいことがある。Jinja2は、そういった「穴埋め」や「条件に応じた文章の変更」を可能にするもので、1つの雛形から多様なバリエーションを生み出せるツールとなる。

Jinja2を使用した基本的な年賀状のテンプレート事例

謹賀新年

{{ recipient_name }} 様

旧年中は大変お世話になりました。
本年もどうぞよろしくお願いいたします。

令和{{ japanese_year }}年 元旦

{{ sender_name }}

※このテンプレートでは、{{ }} で囲まれた部分が変数となっており、実際に使用する際にこれらの変数に値が代入される

Prompt Poetは、これらの技術を組み合わせることで、複雑なAIとのプロンプトを簡単に作れるようにしている。もう一度、事例を用いて解説したい。たとえば、顧客対応AIを作るケースの場合、Pythonのみの既存アプローチと、YAMLとJinja2を活用したPrompt Poetのアプローチでは以下のような違いが出る。

従来の方法では、このようにプロンプトを書く必要がある:

#######python
prompt = f”””
あなたは{shop_name}の接客AIです。
お客様の名前は{customer_name}です。
最近の購入履歴: {‘, ‘.join(purchase_history)}
お客様の質問: {customer_question}
丁寧に回答してください。
“””
#######

これに対し、Prompt Poet(YAMLとJinja2)を使うと、このように書ける:

#######yaml
– name: system_instruction
  content: |
    あなたは{{ shop_name }}の接客AIです。
    お客様の名前は{{ customer_name }}です。

– name: purchase_history
  content: |
    最近の購入履歴:
    {% for item in purchase_history %}
    – {{ item }}
    {% endfor %}

– name: customer_question
  content: |
    お客様の質問: {{ customer_question }}
    丁寧に回答してください。
#######

何度か見てきたようにPrompt Poetのコードの方が構造化されて、見やすくなっているはず。このような構造化により、プロンプトの作成や編集が格段に簡単になる。プログラミングの専門知識がなくても、各部分が何を意味しているかが分かりやすく、必要な箇所を変更するのも容易だ。また、一度作ったテンプレートの一部を他のプロンプトで再利用することも簡単になる。

こうした特徴により、Prompt Poetは複雑なAIシステムの設計を、より多くの人々が参加できる創造的な作業に変えている。プログラマーだけでなく、マーケターや顧客サービス担当者など、様々な専門家がAIシステムの改善に直接貢献できるようになることが期待される。

プロンプトエンジニアリング技術の向上により、AIモデルの精度はどのように変わるのか、さらなる発展に期待したい。

文:細谷元(Livit