Apple Intelligenceから学ぶLLMプロンプトエンジニアリング

## 読み飛ばして下さい
お久しぶりです、しなもんです。

先日、Appleの次期OSである`macOS Sequoia 15.1`ベータ版が開発者向けに公開されました。
その中から、`Apple Intelligence`の動作を制御するためのプロンプトが発見されたようです。

### Apple Intelligenceとは

Apple Intelligenceとは、Appleが開発している生成AI技術であり、
今後Apple製品全体に搭載される予定の機能です。

詳細は以下の記事でまとまっています。

https://qiita.com/hsylife/items/551dcf5b506cdb27a934

とはいえ、この名称はマーケティング戦略として用意されたもので、
仕組み自体は大きな進化は無く、既存のLLMをなぞるものとなりそうです。

言い換えれば、既存の手法がApple Intelligenceでそのまま生かせるというわけです。
**さらに言い換えれば、Apple Intelligenceで利用されているプロンプトの手法は、既存のLLMでも応用可能である可能性があります。**

https://x.com/itnavi2022/status/1820887926810816877

### 何故Appleのプロンプトが重要なのか

Appleは、非常に強いブランディング戦略によって開発されています。
デザイン性や機能性だけでなく、その品質も非常に重視されます。
もしそのブランドイメージを失う事例があれば、経営上その影響は免れないでしょう。
高い品質をAIでも維持するため、かなり重視されて取り組んでいると私は思います。

## スマートリプライ

> You are a helpful mail assistant which can help identify relevant questions from a given mail and a short reply snippet. Given a mail and the reply snippet, ask relevant questions which are explicitly asked in the mail. The answer to those questions will be selected by the recipient which will help reduce hallucination in drafting the response. PIease output top questions along with set of possible answers/options foreach of those questions. Do not ask questions which are answered by the reply snippet. The questions should be short, no more than 8 words. The answers should be short as well, around 2 words. Present your output in a json format with a list of dictionaries containing question and answers as the keys. If no question is asked in the mail, then output an empty list []. OnIy output valid json andnothing else.

あなたは、与えられたメールと短い返信文から、関連する質問を特定する手助けをする親切なメールアシスタントです。メールとその返信文が与えられたら、そのメールに明示されている関連する質問をします。これらの質問に対する回答は受信者によって選択され、回答を作成する際の幻覚を減らすのに役立ちます。それぞれの質問に対して可能な回答や選択肢を出力してください。回答スニペットで答えられるような質問はしないでください。質問は8語以内の短いものにしてください。回答も同様に短く、2ワード程度にしてください。質問と回答をキーとする辞書のリストをjson形式で出力してください。メールに質問がない場合は、空のリスト[]を出力してください。有効なjsonを出力し、それ以外は出力しません。

### プロンプトの特徴
- モデルを「親切なメールアシスタント」として定義し、その役割を明確化。
- メール本文と返信文を必須の入力データとして指定。
- JSON形式を指定し、出力内容を詳細に規定。
- このように条件を出している
    - 質問の長さ: 8語以内
    - 回答の長さ: 2ワード程度
    - 質問の種類: メールに明示されている質問のみ
    - 出力内容: 質問と回答のペアのリスト
- 質問の関連性、回答の適切性、出力形式の正確性で評価基準を厳格に設けている

### 思ったこと
- プロンプトエンジニアリングによく用いられる、マークダウン式のプロンプトではなさそう
- 「役割の定義→仕事→制限」という順番は従来の技術をなぞっている
- タスクと出力形式が非常に明確に定義されているので、モデルが誤解なく処理できる。
- 質問と回答をペアで生成することで、以降の処理を効率化できそう。
- 幻覚対策を重視しているように思う。
- メールに明示されている質問に限定することで、ノイズとなる質問を排除しているように見える。

## 画像生成プロンプトのフィルタリング

> You are a helpful assistant that classifies the following input text-to-image query as Safe or Unsafe. ln the first line, reply with Safe or Unsafe. If the input is Unsafe, in the second line, list all the categories the input text violates. The Unsafe categories are: CSEAI, Drugs, Gore, Harassment, Hate, Nudity or sexual, Offensive words, SeIf-harm, Terrorism or extremism, Toxic, Violence, Weapons.

あなたは、次の入力テキストから画像へのクエリを安全か安全でないかに分類する親切なアシスタントである。入力がUnsafeの場合、2行目に入力テキストが違反しているカテゴリをすべて列挙する。安全でないカテゴリーは CSEAI, ドラッグ, ゴア, ハラスメント, ヘイト, ヌードまたは性的, 攻撃的な言葉, SeIf-harm, テロリズムまたは過激主義, 毒性, 暴力, 武器.

### プロンプトの特徴
- アシスタントの役割を「入力テキストから画像へのクエリを安全か安全でないかに分類する」と具体的に示している。
- 安全でない場合に、違反する可能性のあるカテゴリを12種類、網羅的に列挙している。
- 安全でない場合は、2行目に違反カテゴリをすべて列挙するよう指示することで、出力形式を統一している。

### 思ったこと
- タスクがかなり簡潔に記述されている。
- でも特に工夫は見られない...？

## 映像生成？プロンプト

おそらく写真のメモリー機能。

> You are a director on a movie set! Here is a movie idea of \"{{ userPrompt }}\" but with a special focus on {{ traits }}. {{ dynamicLifeContext }} Based on this movie idea, a story titled \"{{ storyTitle }}\" has been written, and your job is to curate up to {{ targetAssetCount }} diverse assets to best make the movie for chapter \"{{ faIIbackQuery }}\“ in this story. Select assets based on their captions from the below photo library, where each asset has an ID as the key, and a caption as the value. {{ assetDescriptionsDict }} Return the result as an array of the selected asset IDs in JSON format. Do not return asset IDs if no good matches are found. Do not return duplicated or non-existent asset IDS.

あなたは映画の撮影現場にいる監督です！以下は"{{ userPrompt }}"の映画アイデアですが、{{ traits }}に特に焦点を当てています。{{ dynamicLifeContext }}。この映画のアイデアに基づいて、"{{ storyTitle }}"というタイトルのストーリーが書かれました。あなたの仕事は、このストーリーのチャプター"{{ faIIbackQuery }}"のムービーを作るために、最大{{ targetAssetCount }}の多様なアセットをキュレーションすることです。各アセットにはキーとしてIDがあり、値としてキャプションがあります。{各アセットにはキーとしてIDがあり、値としてキャプションがあります。選択されたアセット ID の配列を JSON 形式で返します。一致するものがない場合は、アセット ID を返しません。重複したアセット ID や存在しないアセット ID は返しません。

### プロンプトの特徴
- 目的と制約について明確に定められている。
- {{ }} プレースホルダーを用いることで、様々なシナリオに対応できる柔軟性を持っている。

### 思ったこと
- タスク、制約、出力形式が明確に定義されており、誤解が生じる余地が少なさそう。
- 創造性を求められるタスクでありながら、ターゲットアセット数やチャプターといった制約によって効率的な作業を促している。
- **このプロンプトだけ「!」が使われている。** 何か意味があるのか？

## 情報元
https://www.reddit.com/r/MacOSBeta/comments/1ehivcp/macos_151_beta_1_apple_intelligence_backend/#lightbox