実践プロンプト工学

# これは何？

ソフトウェア開発に携わる一個人である著者の頭の中で起きた幻覚(Hallucination)を書き起こしたテキストであり、プロンプトエンジニアリングに関する怪文書です。

数年後の工学の教科書の体で、個人的な知識を含む様々な仮説の確証が取れたつもりになって色々な知識を書き連ねています。言語化してみるとこれが著者の幻覚の正体であり、怪文書ポイントです。

プロンプト工学なんて学問を推進しているケースは未だ(恐らく)存在せず、これはソフトウェア工学のアナロジーでプロンプトエンジニアリングの解釈を試みることで社会的意義がないかと探る遊びによって得られた産物です。**ほとんどすべてが妄想**だと理解した上で、**誤字脱字誤解などは容赦しながら**お読みください。

ただし一部は実在するプロンプトエンジニアリングの役立つ情報へのリンクが含まれます。
一方で、真に経験的で裏の取れていない知見もありますので、時と場合によっては役立つかもしれないし役立たないかもしれません。
それはそうと実務では皆さん上手いことやっていきましょう。

ちなみに一部のLLM出力を明記した箇所を除き、全文Human-writing、NoGPTです。念のため。（念のため？）

# プロンプト工学とは

プロンプト工学とは、一般に「プロンプトエンジニアリング」とも呼ばれ、近年急速に普及している「自然言語モデル(Language Model)」について「その振る舞いを安全に制御する方法(プロンプト、あるいは単に入力)に関する体系的な知識と方法」および「それらを導くための科学的手法」を扱う学問分野のことである。

プロンプト工学では、様々な自然言語処理と言語モデルを用いた高度なシステム化および開発を目的として、情報工学やソフトウェアエンジニアリングの関連分野から発展独立する形で構成されている。特に、後述する「プロンプト」の記述に関する設計や実装に関する知識と方法を体系的に扱うものである。
またその技術要素や構成から、知識体系の大部分がソフトウェア工学の知識や方法と共通し、加えて深層学習の分野に大きく依存している。
プロンプト工学を学ぶ上で効率的な学習のためには、情報工学やソフトウェア開発、深層学習に関する前提知識を持つことが望ましい。

なお、世間一般に用いられる「プロンプトエンジニアリング」という言葉は「産業や工業」といった文脈によらない広範な知識体系と実践によって構成されていることに注意されたい。
しかし、ここではまず幅広い産業での安全な活用を主目的として、ソフトウェア工学の知識や技法を応用する形でプロンプト工学としての知識体系を構築することを目指している。

以後あくまで工学として進めるが、プロンプトが日常的かつ臨機応変な個人利用も想定されることも踏まえ、将来一般向けの情報発信として簡便な技法の発展や再構成が期待されることを明記しておく。

## 名称について

「プロンプト工学」の想定活用対象は、プロンプト「工学」の名称にある通り、工業分野、特にシステム化などを行うソフトウェア産業の従事者や同分野の学習者が対象である。

しかし近年の技術動向やサービス開発の傾向を見ると、ソフトウェア開発などに限らない一般利用者にまで対象を広げる事も検討の余地がある。この場合、学習者の範囲拡大に応じて「プロンプト工学」ではなく「プロンプト学」の名称を用いる方がより適切となる可能性がある。

また、本分野が「プロンプト工学」である理由は、「プロンプトエンジニアリング」（英語: Prompt Engineering）の「Engineering」を日本語に直訳しただけである。
英語の「Engineering」は、日本語では「工学」と訳すことが多いのである。一般に「技術・テクニック」と解釈されることもあるが、本文書を読むすべてのエンジニアはぜひこの事実を覚えておき、日々の雑談や仕事に活かしてもらいたい。

## 自然言語モデルとは何か

自然言語モデル(LM)とは、会話や文書などの自然言語処理の分野において使用される機械学習モデルおよびプログラムのことを指す。これらのモデルは主に機械学習や深層学習の技術を元に大量のテキストデータを使用してトレーニングされており、自然言語の理解や生成といったタスクが実行できるように設計されている。

多くの自然言語モデル(LM)は、その巨大なパラメータと豊富な学習データに基づいて、文章の分類、翻訳、生成、要約、質問応答などの様々な自然言語処理タスクにおいて高い性能を発揮することが確認されている。
実用面で広く扱われる自然言語モデルには BERT（Bidirectional Encoder Representations from Transformers）などがあり、汎用的な対話型アプリケーションの実用例として GPT（Generative Pre-trained Transformer）などのモデルが知られている。
特にGPTモデルなど、数百億規模の大規模なパラメーターを持つ高度なテキスト生成に特化したモデルはLLMと呼ばれ、その高機能性から特別に分類される傾向がある。

プロンプト工学では、これらのモデルの振る舞いを適切に制御し、安全かつ効果的に利用するための知識と技術を扱う。

注: 以後、広い範囲の言語モデルは Language Model から LM 、大規模言語モデルは Large-scale Language Model から LLM と略すこととする。

## プロンプトとは何か

「プロンプト」とは、英語で「Prompt」と表記され、「即座の」という意味の形容詞であり、「刺激する」「鼓舞する」「(仕向けて)～させる」という意味の動詞であり、同時に「せりふ」を意味する名詞でもある。
コンピューターの文脈では、「何かの指示を待つ際に表示される記号」を意味する。
そして本プロンプト工学においては、「LMやLLMへの入力テキスト」である。

また、プロンプトはそのテキストの形態として「文字列」などと呼ばれるが、これは人間にとっての理解と表現であり、自然言語モデルにとってはその限りではない。より厳密には「トークン」という文字をいくつか束ねた要素があり、この「トークンを複数並べたもの」が自然言語モデルに解釈される「プロンプト」である。

多くの一般利用者が直接LLMとの対話を行う状況では、モデルに対する入力として、プロンプトを毎回考えて任意の自然文を書くことになる。プロンプト工学では、こういった入力とモデルの相互作用をシステム的に扱い、より効果的かつ効率的で安全な振る舞いを実現する記述を目指す。

プロンプト工学では、これらプロンプトに関する要素を具体的にし、それと関係づけられる品質特性や設計プロセスなどの体系的な知識を構築することで、同時に自然言語モデルを制御するため役立つ様々な再現性のある技法を取り扱う。
また同時にプロンプトで実現する機能や目的についてもまとめ、応用範囲を広げるとともに一部の法規制などの制約についても取り扱う。

# プロンプトの品質特性

まずプロンプトの設計と実装に入る前に、主な開発対象となるプロンプトの良し悪しに関する判断基準を定義する。
これに従ってプロンプトを改善したり、システムとして出荷する際の判定基準となる定量的または定性的なメトリクスを体系化するものである。

一般的なプロンプトの良し悪しは、ソフトウェア工学を応用することで「品質」という基準によってフレームワーク的に考えることができる。
またこれらの品質は、プロンプトを扱うユーザーやシステムによって様々な観点から評価される。

高品質なプロンプトを設計実装するためには、これらの品質特性を十分に理解し、開発の様々なフェーズで考慮することが重要となる。

## 具体的な品質特性

以下は、国際的なソフトウェア品質評価基準の1つとして用いられていた ISO/IEC 9126 の大分類を元にプロンプトが備える品質特性を再解釈するものである。

ただし、ここに挙げる品質特性は現時点での解釈例でしかなく、今後の研究や調査によってより適切な分類に変更される可能性がある事に注意されたい。

ISO/IEC 9126: https://ja.wikipedia.org/wiki/ISO/IEC_9126

1. 機能性
   - プロンプトを定められた要件で実行したとき、要求されている仕様を満たす能力のこと
   - 具体的には、出力が要求した内容を含むこと、内容や出力形式が期待通りであること、などがある
   - より詳細には、網羅性や多様性が要件通りであること、ビジネス向けや教育向けのトーンを適切に反映していること、といった出力の評価観点により細分化される
2. 信頼性
   - プロンプトを様々な条件で動作させたとき、意図しない動作を起こさず機能を提供し続ける能力のこと
   - 具体的には、目的と異なる振る舞いをさせるInjection、Hijacking、Jailbreakなどの対策、実装されたプロンプトやその他入力を出力させるなどの情報流出に対する耐性、幻覚(Halucination)の問題を防ぐ対策などの観点がある
3. 使用性
   - プロンプトの利用と運用に関する適切な制限、スムーズに利用できる性質のこと
   - 具体的には、プロンプトの利用者が説明や制限を受けずに使える「入力の自由度の高さ」「可変部の利用可能トークン数の多さ」、また「出力の扱いやすさ」などがある
4. 効率性
   - 与えられた制約の元でプロンプトを実行したとき、適切な性能を発揮する能力のこと
   - 具体的には、消費トークン数、出力サイズ、推論(計算)の速度、実行費用、実行(呼び出し)回数などが実行コストや費用の面で効率的であること
5. 保守性
   - プロンプトの具体性や理解しやすさ、書き換えやすさのこと
   - 具体的には、プロンプトを記述する言語が利用者や開発チームにとって適切か、適切に構造化されているか、書き換えの影響が限定されるか、明快な単語や指示を用いているかなどの観点がある
6. 移植性
   - プロンプトが様々な種類のモデルで機能性や信頼性を発揮できること
   - 具体的に移植性が求められる状況として、コストダウンや提供ライフサイクル(サービス上の提供停止、倫理的問題あるいは法的規制による突然の供給停止)、権利の関係で異なるモデルに乗せ換える、モデルのバージョンアップが必要、といった状況に備えるため、意思決定の面で重要度が高い観点となる


# プロンプト実行のシステム的概念

具体的なプロンプトの設計と実装に向けて、プロンプトを実行するシステムを含んだ包括的な構成要素の分類と整理を行っておく。

これらはプロンプト工学において、より的確な出力を得たり、様々な品質を改善したりといった活動のために理解が推奨される概念である。
また、実用上の問題が起きたときに適切に原因を切り分け、対策を立案したり取捨選択するための指針としても活用が期待される。


## プロンプトを実行するシステムの構成

プロンプトを用いるシステムは、プロンプトを実行するLM/LLM等を含む「実行システム」、LM/LLMの振る舞いを制御するための「プロンプト」と「パラメーター」、また「実行システム」と「プロンプト」を制御する「制御アプリケーション」という構成要素からなる。

「制御アプリケーション」は、ユーザーからの入力を受け取り、プロンプトを構成するなどして実行システムに入力として渡し、実行システムの出力を加工してユーザーに返す、という一連の計算処理を担う。この時、制御アプリケーションは外部システムとのやり取りも行うことがあるほか、実行システムそのものを外部に持つ場合もある。

ユーザーとの相互作用、外部システムとの相互作用を考慮して、これらをシステム構成概念図として書き起こすと以下のようになる。

![システム図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11612/b936e051-7ba5-356f-e05d-26fe208fa1e3.png)

ユーザーがLLMと純粋に対話を楽しむようなシステムを構築する場合、ユーザーは「外部プロンプト」を作り、それを制御アプリケーションに渡し、それが実行システムに渡され、その結果がユーザーにフィードバックされるという流れと言える。
また、それぞれの構成要素は実際のシステムとして構築するときには存在しない場合もあることに注意されたい。

### 実行システム

実行システムの内部構造は、大まかに以下の構成となっている。

- 実行システム
    - 言語モデル
        - トークナイザー
        - 計算モデル
            - ニューラルネットワークなどに代表される計算を担うソフトウェア
    - モデル制御ソフトウェア

「言語モデル」は、これまでに説明したLM/LLMのことである。プロンプトによって振る舞いを変え、様々な処理を行う実行システムの主要な要素である。
「モデル制御ソフトウェア」は、言語モデルの実行にあたり「最大長制限」や「ストップワード」などのパラメーターに基づく言語モデルの制御を行う要素である。安全面に関して論じる場合、言語モデルが無限に計算してしまうなどの暴走状態になることが無いように積極的に停止するなどの役割を持つ。

更に言語モデルは、内部的に「トークナイザー」(英語: Tokenizer)と「計算モデル」に分けて考えることができる。
「トークナイザー」は、プロンプトを解析し、トークンに分割するなどして、計算モデルに解釈可能な形式に変換するソフトウェア実装である。
「計算モデル」は、トークン列を得て、それに基づき計算処理を行うソフトウェア実装である。自然言語モデルを扱う場合、この計算モデルはニューラルネットワークなどのソフトウェア実装である。

多くの一般ユーザーは、この「実行システム」のことを「LLM」として呼称することがあるかもしれないが、ソフトウェア実装的な観点からは「言語モデル」と「モデル制御ソフトウェア」は別のものと解されるため、このような分類になっている。（Pythonなどの実装例を考えれば、推論のためのライブラリ実装がストップワード実装などを担っていることがわかる）

実行システムそのものを作ることは多くなく、これは各メーカーのAPI実装として提供されるものを使うことも多い。もちろんOSSモデルをシステムローカルで実行することもある。

### プロンプト

システム概念におけるプロンプトは、実行システムに対する入力の1つであり、ソフトウェアにおける具体例としてはほとんどの場合が単なる文字列である。そして、実行システムのうち言語モデルにとっては「トークンの列」である。

概念上は、ユーザーが直接記述して入力するようなもの「外部プロンプト」、システムが用意している固定プロンプトやプロンプトテンプレートを「内部プロンプト」と呼んで区別する。

システムの安全を考える上で、外部プロンプトは実行システムの振る舞いを変えることから、できるだけ局所的に用いるべきである。
同時に、脆弱性によって「プロンプトが流出した」などと言われるのは、この「内部プロンプト」がユーザーの目に触れることとして理解される。

### パラメーター

システム概念における「パラメーター」は、実行システムに対する入力の1つである。
具体的には「温度」「Top-p」「N-Best」、「トークン数制限値」「ストップワード」などがある。

実行システムの振る舞いを変えるために用いられるものであり、実行システムの出力結果に大きく作用する。
個々のモデル実装にも関係するため、ここでは割愛する。

### 制御アプリケーション

制御アプリケーションは、プロンプトとパラメーターを実行システムに渡すなどの様々な処理を行うソフトウェア実装である。

一例としては、単純なチャットを行うWebアプリケーションの場合、ユーザーから受け取ったプロンプトを実行システムに渡して結果を返す、という処理を行っている「Webアプリケーションのサーバー実装」が該当する。

ユーザーから呼び出され、実行システムを複数回呼び出してから結果を統合して返すなど、その制御フローの主体を担うものがこの制御アプリケーションである。

工学的な安全性の面からは、この制御アプリケーションの振る舞いとして、無限ループやスタックオーバーフローなど、基本的な振る舞いに関する品質保証が特に重要である。
たとえば、LM/LLMの結果を解釈して振る舞いを変えるようなフィードバック機構を持つことは推奨されず、必要であれば別のリミッター(実行回数制限やサイズ制限など)と併用することが重要である。

### 実行システムの機能

プロンプト工学では、プロンプトの実行する基盤として、LM/LLMおよびそれを稼働するためのソフトウェアを「実行システム」として考える。この実行システムが持つ特性について整理することにより、的確な実行計画や期待する品質を実現することにつながる。

実行システムの持つ機能は、大きな分類として、LM/LLMがプロンプトを解釈実行する上で、言語モデルの持つ「実行機能」と、モデル制御ソフトウェアの持つ「制御機能」に分類される。

プロンプトの設計と実装においては特に「実行機能」についての理解が必要であるが、制御に関連する「制御機能」についても理解することで様々な応用の観点が得られるはずである。

#### 言語モデルの持つ実行機能

プロンプト工学で対象となるLM/LLMは、自然言語モデルとしてほとんどのモデルが類似の機能特性を発揮するため、多くの利用者はこの機能特性が発揮されるようにプロンプトを記述する。
この機能特性をより具体的にし、以下に名称分類したものを総称して言語モデルの「実行機能」という。

ここでは、特によく用いられる機能特性を中心に、その機能特性が由来する要素によって名称付けしたものをいくつか示す。
具体的には「Completion機能」と「Instruct機能」と「創発によるサブ機能」の3つである。

##### Completion機能

Completion(補完)機能は、LMの計算モデル構造とその学習過程により獲得される「トークンの予測分類」に関する機能である。

これはLMの学習時に「入力から何らかのトークンを予測する」というタスクを課すことで得られる。特に生成モデルでは多くの場合で「入力に対して、実現可能性の高い後続テキストを生成する機能」と説明されることがある機能のことを指す。
またBERTなどの一部の言語モデルでは、MASKトークンにより隠されたワードを予測することによって類似の機能が獲得されうることは特筆に値するであろう。

非常に多くの言語モデルがその構造や学習過程から必然的にこのCompletion機能を獲得しており、最もモデルの目的に忠実で基礎的な機能であると言える。

##### Instruct機能

Instruct(指示)機能は、LLMの学習過程により獲得される「プロンプト中に書かれた指示に従う」という機能である。
より具体的には「要約してください」などの指示語に沿って振る舞う、「？」などの疑問符に応じて回答する、といった対話的な指示を遂行する機能群からなる。

一部のLLMでは、通常のCompletionを目的とした学習が終わったあとに「ファインチューニング」(好ましい性質を持つように微調整すること)という追加の学習を行うことによってこの機能(の大部分)が獲得される。GPT-3.5やGPT-4、その他一部のOSSモデルもこのInstructに関するチューニングを行うことで期待する指示を遂行する機能を獲得したとされる。
なお、このファインチューニングの目的は、広義には「AIアラインメント」（英語: AI Alignment）と呼ばれる分野に基づいている。「AIアラインメント」は、言語モデルに限らないAI全般の安全性向上や価値観調整を目的とした技術分野である。これらの詳細は直接の機能とは異なる観点であるためここでは割愛する。

このInstruct機能を実現する具体的なチューニングの方法としては、人間のフィードバックによる強化学習(Reinforcement Learning of Human Feedback, RLHF)などが知られている。これらの具体的な手法は深層学習の分野に深く踏み込む必要があるため詳細は割愛するが、Instruct機能を求めている場合、モデル選定の時点でこれらの学習有無に着目することは重要な観点となる。

このInstruct機能もLLMの中では比較的多くのモデルが獲得している機能であるが、学習のためのデータセットが自明でなかったり追加の学習に多額の費用がかかったりことなどの理由から、すべてのモデルが持つわけではないことに注意が必要である。

加えて注意すべき点として、多くの悪意のある使用者によって悪用される機能もこのInstruct機能である。
たとえばプロンプトインジェクションと呼ばれる脆弱性では、このInstruct機能に元々与えられたプロンプトよりも強力な指示を与えることで誤動作させる手法と解釈できる。

将来的には、Instruct機能をCompletion機能で代替する技法を開発するなどの取り組みから、品質面ではプロンプトの移植性を改善したりインジェクション対策を含む信頼性の向上が期待される。これによって、安価で高速なモデルへの乗り換えが促進されたり、同時に運用時推論コストの削減やInstructの学習コストが削減されたりするなどで環境負荷を改善することにもつながると期待できる。

##### 創発によるサブ機能

創発によるサブ機能は、モデルの構造や規模、学習データや学習方法に由来する上記に分類されない不確定な機能群である。
具体例としては、Zero-Shot推論（学習データ上に存在しないはずの情報の関連付け）、プログラムのソースコードやコマンドに対する疑似的な実行結果の表示などがある。
扱うモデルによって、これらが可能かどうか、という観点で評価することが重要である。

またこれらは経験的に知られているだけの内容が多く、獲得された過程や性質、機能としての限界はほとんどの場合明らかではない。
それ故に、工学的な面からは安全性に配慮する場合、これらの機能を積極的に活用することは推奨されない。

個々のモデルに対する調査が必要となるが、これらの経験的な振る舞いを調査して体系化することには移植性などの観点から大きな意義がある。

今後の具体的な調査研究によってその性質や限界が明らかになれば、それらを活用してより信頼性の高いプロンプトを書くことができ、具体的な応用範囲も更に広がると期待される。

##### 補足：機能の誘導

プロンプトが実行システムにこれらの実行機能を発揮するように影響を与えることを機能の「誘導」と呼ぶ。
用法としては「プロンプトの末尾に見出し要素を置くことは、Completion機能を誘導する」などとなる。

プログラミングの文脈では、「機能を呼び出す」などの言い方で特定の記述が確定的な処理実行を意味するが、プロンプトと実行システムの関係においてはそうではない。「呼び出す」や「命令」といった解釈は妥当ではないため注意すべきである。
これは「この単語を書けばおそらく実行されるだろう」や「指示を繰り返すことで確実性が増すだろう」といった解釈があり、これは後述の技法の理解を助ける面もある。

これらの状況から、プロンプト工学においては、機能を発揮させることを「方向性を示す」という意味から「誘導」という言葉が割り当てられている。


#### 制御機能

制御機能とは、モデル制御ソフトウェアの持つ機能のことを指す。

具体的にはプロンプトを実行する際のパラメーターとしてある「Top-p」「N-Best」、「出力トークン数制限」「ストップワード」などを使った、LM/LLMの振る舞いや制限に関する制御のソフトウェア実装である。

様々な機能があるが、安全性のためには特に出力トークン数の制限やストップワードの必要性を考慮すべきである。
Few-Shotの分類予測を用いるのであれば、その出力トークン数制限は1トークンで良い場合もある。

その他、用例や詳細は個々のモデルやソフトウェアとしての実装に踏み込む必要があるため、ここでは割愛する。

## プロンプト要素

ここでは、プロンプトにおける様々な要素と実装に関する理論的な概念を整理しておく。
高品質なプロンプトを開発するにあたり、これらの概念を理解しておくことは開発者のスキルを考える上で重要である。

### プロンプトモデル

システムの実行内容に関する部分をプロンプト(入力)と出力に分け、それらに含まれる様々な要素を分類整理することで、安全で効率的な実装が可能となる。
この考え方と分類整理の例を「プロンプトモデル」と呼ぶ。


以下は、入力と出力をそのテキストとしての側面から「意味」と「表現（構文、形態）」の2つの観点で整理分類した「基本プロンプトモデル」である。
注意としては、このプロンプトモデルは単一のテキストを扱う前提としている。実装上はChatAPIと呼ばれる対話を想定した呼び出しの方法があるが、そのシーケンスを扱うことは目的としていない。Chat APIの場合、個々のメッセージに相当する単一のプロンプトを解釈するためのモデルと解釈できる。

今後より効果的なプロンプトモデルの開発には、言語学や文学、論理学など様々な知見が活用可能であり今後の研究が期待される。
特に近年では[応用言語学](https://ja.wikipedia.org/wiki/%E5%BF%9C%E7%94%A8%E8%A8%80%E8%AA%9E%E5%AD%A6)や[文体論](https://ja.wikipedia.org/wiki/%E6%96%87%E4%BD%93%E8%AB%96)といった研究分野もあり、これらとの関連性は非常に強いものと考えられる。

#### 入力(プロンプト)

プロンプトにおける入力の「意味」は、プロンプトの設計上「特定の機能を誘導すること」を目的としているかどうか、という観点から2種に分類できる。
表現は、実行システムの特性を考慮して文字の観点が必要であること、また品質への影響度を考慮して3分類している。

- 意味
    - 機能誘導
        - Completion機能を誘導する要素
            - プロンプト末尾に現れる「見出し」などが該当する
        - Instruct機能を誘導する要素
            - 「要約してください」などの依頼、命令、指示に相当する語句が該当する
            - 制約・条件付け(制限の指示、トーンの指示など)
        - サブ機能を誘導する要素
            - (現段階で明確に影響が示唆されるものは無いため要調査)
    - 参照情報
        - 特定の機能から参照されうるが、それ自体は機能の誘導を目的としない要素
            - 出力形式の例
            - Few-Shot推論に使う応答の例
            - 処理に有効な外部知識、現在日時、最新情報など
            - 処理の方向や強度を制御するパラメーター類
            - 状態オブジェクトや機能オブジェクトの定義
- 表現
    - 文字・トークン
        - 実行システムにおけるトークナイザーで扱える文字種にする必要がある
    - 言語(英語や日本語)
        - 語彙
            - 語彙の変更による強度調整など
            - 一部文化的背景の指示となるため、参照情報や構文に制約を与えうることに注意が必要
    - 構文・形態
        - 自然文か、JSONなどの構造化データか
        - 語彙の位置
        - 文節の区切り、段落の区切り
        - カッコや"""などを用いた囲み表現
        - 箇条書き、番号付きリスト
        - 見出しやセクションの構成、アウトライン

また、意味と表現は、それぞれ幅広い品質に影響を与えうる理解が必要である。


#### 出力

プロンプトが出力する内容についても安全性や倫理的な観点から分類整理が必要な要素が存在する。

- 意味
    - モデル知識
        - LM/LLMが入力から反射的に出力している「入力に含まれない内容」
        - 事実確認(ファクトチェック)や真偽判断が必要となるほか個人情報に類するものが含まれる要素であり、安全性の観点からこれは含まない設計が望ましい
        - これらを減らすことに、より高い信頼性が得られる
    - 推論結果
        - 誘導知識などによって埋め込まれた例示などの「入力に含まれる内容」
        - 比較的検証の必要性が低い要素であるが、妥当性については精査すべき内容
- 表現
    - 文字・トークン
        - 実行システムにおけるトークナイザーで扱える文字種にする必要がある
    - 言語(英語や日本語)
    - 構文・形態
        - 「構造化データ」(箇条書き、JSONなど)であるか、「非構造化データ」(自然文など)であるか
            - 構造化データか非構造化データかどちらか選択すべきであり、部分的に構造化するなどの「混在制御」は信頼性の面から回避が推奨される
            - ただし、箇条書きなど比較的単純なものは部分埋め込みが可能な場合も多いため、利用するモデル機能を考慮して必要に応じて検証することが望ましい
        - トーン
            - 出力の要旨を変えずに変更可能な文体などの要素。主に利用者の状態(年齢など)を踏まえた使用性(理解性)に寄与する

## プロンプト実装

これは、プロンプトを書くための言語的な知識および技法に関する範囲である。

システム概念上の「実行システム」は、扱うLM/LLMを「プロンプトを読み込んで実行するシステム」とみなすものであり、実用上は何らかのソフトウェア実装やAPIを指していた。

これに対してプロンプトとパラメーターを組み合わせて入力することを前提に、ここではプロンプトの記述に関する技術を「実装技術」として細分化する。

### 実装技術

プロンプトを記述するためには、広範な「実装技術」および「応用論理」、達成に必要となる「入力データ」の理解が必要である。

「実装技術」とは、プロンプトを記述する際の言語スキルと様々な技法のことである。日本語や英語などの入力となるテキストを誤解なく記述し、言語に関連する文化や言語的性質に基づく言語スキルが必要であるほか、場合によっては実行システムに合わせた方言的記述が求められる可能性もある。

「応用論理」とは、システムの品質向上に寄与する、モデルによらない概念や普遍的な技法・テクニックのことである。例としては、連鎖思考(Chain of Thought、CoT)、Self-Consistency、Least-to-Most、Groundingなど、非常に多岐にわたる論理的かつ言語的な応用が可能な知識群を指す。

「入力データ」とは、最終的な結果を推論するために必要となる情報のことである。たとえば「明日の日付」を推論するためには、「現在の日付」が入力として必要であり、この必要な情報が入力データとして扱われることとなる。特に「プロンプトテンプレート」と呼ばれる穴開き型のプロンプトを開発する場合、この入力パラメーターがどのような文字列であるかを定義し、脆弱性などの問題を起こすことがないか十分に理解することが重要となる。

通常のソフトウェアが実行環境(OSやハードウェア)の制約を受けるように、プロンプトもモデルが持つ機能の範囲で設計されなければならず、同時に様々な目的を達成するためには実装技術や応用論理を適切に運用し、入出力の設計と共に品質特性を改善する取り組みが必要となる。

#### 技法

プロンプトでは、そのプロンプトモデルに応じて、様々な側面に対する改善・調整のための技法が存在する。

プロンプトの品質を上げて安全に実行するために、以下のような技法が用いられる場合がある。

- 命令の繰り返し
  - Instruct機能を誘導する要素を繰り返すことで機能性と信頼性に寄与する。指示機能が働かないことで機能性が低い場合は、これを用いることで改善する可能性がある。
  - https://learn.microsoft.com/ja-jp/azure/cognitive-services/openai/concepts/advanced-prompt-engineering?pivots=programming-language-chat-completions#repeat-instructions-at-the-end
- 明確な構文
  - 構文を明確にすることで、LM/LLMとして内部の情報参照性が上がり、機能性や信頼性に寄与する。機能性が満たされない場合や、期待する応用論理が働かない場合に構文を見直すことが有効な場合がある。
  - https://learn.microsoft.com/ja-jp/azure/cognitive-services/openai/concepts/advanced-prompt-engineering?pivots=programming-language-chat-completions#add-clear-syntax
- 代替パス
  - 目的の指示が実行できないような入力を得た場合、不適切な動作の防止のための代替パスを設定することで信頼性に寄与する。Positive/Negativeの2択ではなくNeutralを設ける、QA問題に対して「?/わからない」といった分類を追加することで代替パスの指定になり、予期しない動作を防止できる。
  - https://learn.microsoft.com/ja-jp/azure/cognitive-services/openai/concepts/prompt-engineering#best-practices
- 出力構造の指示
  - 内容を指示するよりも、出力形式を指定することで信頼性が高い振る舞いを示すことがある。
  - https://learn.microsoft.com/ja-jp/azure/cognitive-services/openai/concepts/advanced-prompt-engineering?pivots=programming-language-chat-completions#specifying-the-output-structure
- 出力の事前処理
  - 期待する出力の先頭をあらかじめプロンプトに含めておくことで、出力形式の指示を強化する技法である。これによって機能性や信頼性を向上できる。またこれは出力形式の指示(Instruct)をCompletion機能によって補うものと解釈ができる。モデルの持つ異なる機能領域を組み合わせることで、より高い信頼性を実現できる。
  - https://learn.microsoft.com/ja-jp/azure/cognitive-services/openai/concepts/advanced-prompt-engineering?pivots=programming-language-chat-completions#prime-the-output

なお、「明確な文法」は、言語的な文節の利用や項目単位のオンオフによる構造化技法が含まれる。

### 応用論理

応用論理は、システムの品質向上に寄与する、モデルによらない概念や普遍的な技法・テクニックのことである。
これも実装技法の一種として分類できるが、ここでは他分野からの応用可能性が非常に高いなどの性質から独立した概念として扱っている。

応用論理技術には、連鎖思考(Chain of Thought, CoT)、自己整合性(Self-Consistency)、知識生成(Knowledge Generation)、根拠付け(Grounding)、構造化、アフォーダンスなどがある。

応用論理が必要とされる主な動機は2つであり、「機能要件を満たすために、問題を言語モデルで扱えるように変換すること」と「品質を改善するために、推論過程や出力を工夫改善すること」である。
品質改善に寄与し、論理的かつ言語的な応用が可能な知識群として理解されたい。

またこれらは他の分野で既に知られている思考法やソフトウェア開発の概念が応用される範囲であり、積極的な研究と調査が期待される範囲である。
近年は情報発信のしやすさなどから適切な評価がされないまま公開、応用されるケースが後を絶たない。工学的には安全性のために評価基準の開発や再現性に関する追試評価が求められる。

具体的な例については情報があるため以下を参考のこと。

連鎖思考法: https://www.promptingguide.ai/jp/techniques/cot
自己整合性: https://www.promptingguide.ai/jp/techniques/consistency
知識生成: https://www.promptingguide.ai/jp/techniques/knowledge
根拠付け: https://learn.microsoft.com/ja-jp/azure/cognitive-services/openai/concepts/advanced-prompt-engineering?pivots=programming-language-chat-completions#provide-grounding-context
構造化: https://learn.microsoft.com/ja-jp/azure/cognitive-services/openai/concepts/advanced-prompt-engineering?pivots=programming-language-chat-completions#add-clear-syntax
アフォーダンス: https://learn.microsoft.com/ja-jp/azure/cognitive-services/openai/concepts/advanced-prompt-engineering?pivots=programming-language-chat-completions#use-of-affordances


# プロンプト開発プロセス

ソフトウェア開発の一分野として、プロンプトの開発についても類似の開発プロセスが推奨される。
ここでは開発プロセスを定義する上で、開発フェーズと重要な成果物について整理する。

## 開発におけるフェーズ

ソフトウェア開発のプロセスと同様に、工業的な開発プロセスは以下のフェーズからなる。

1. 要件定義
   - プロンプトを利用するユーザー、プロンプトが提供する機能、スコープ、守るべき制約、セキュリティなどを定義する
   - この時点で利用可能なLM/LLMが明示される場合もある
2. 概念実証
   - 達成したい機能が実現可能かどうか、適切なLM/LLMを調査することで技術選定と実現可否の判断を行う
3. リスク分析
   - LM/LLMが期待する機能を発揮しないなどのリスクを評価し、必要に応じて対策を計画する
   - 具体的には、倫理的な問題発生への対策と対応計画、脆弱性発覚時の措置計画などがある
4. 基本設計
   - 達成したい機能について、実際のアプリケーションとの連携や必要な入力について具体的に定義する
   - 具体的には、ユーザーの操作手順を明らかにすること、具体的な出力形式を定めることなどがある
5. 詳細設計
   - 達成したい機能をどのように実現するか、利用するモデル機能や応用論理の適用方法を定義する
   - 外部アプリケーションとの連携など、従来のソフトウェア開発と同様の連携について定義する
6. 実装
   - 基本設計や詳細設計を踏まえ、具体的な表現を決定してプロンプトとして定義する
7. 単体検査
   - 実装したプロンプトを実行し、期待される機能性などの品質が満たされていることを確認する
8. 結合検査
   - 実装したプロンプトをアプリケーションに組み込み、入力と出力がプロンプトに正しく適用され適切に動作することを確認する
9. 総合検査
   - 実装されたアプリケーションを元に、要件を満たすことをより広範な観点から確認する
1. 配布
   - アプリケーションまたはプロンプトを公開・配布する
1. 運用・監視
   - プロンプトが期待する機能を発揮しているか、また安全性や倫理的に関する問題が発生していないか、主にリスク分析時の計画に基づき監視する
1. 保守
   - プロンプトが適切に動作していない状況があれば、その原因を特定し、設計や実装、検査などの工程を実行することにより対策を講じる
   - 問題を分析し、リスク分析や各設計フェーズにおける問題点を改善するための計画を行う

ここで従来のシステム開発と異なる点として、概念実証やリスク分析のステップを明確化することが挙げられる。
これらは、プロンプト開発において実行システムの特性が多くの場合に未知の領域を含むこと、新しいLM/LLMのリリース頻度が従来のシステムとは大きく異なる、多くの開発者が専門的な知識を持たずシステム開発の延長として取り組むなどの状況から、それらの不確実性を考慮し安全性を確保するうえで重要と考えられるためである。

### テスト観点

工学的な安全性の保障については、これまでの分類概念と上記プロセスに従って開発することで、様々な観点からの検査による品質保証が可能となる。
またより具体的には、以下のような効果が期待できる。

1. プロンプトがどのような機能を提供するのか、という設計時の情報から、プロンプトの振舞いに対する検査項目を整理することができる
2. 概念分類における「実行システム」「実装技術」「入力データ」の観点より、どの部分を検査するのかが整理できる
3. 設計情報と概念分類を組み合わせ、既存の品質保証に基づく網羅的検査の概念や直交表などの技法を応用出来る可能性がある


今後、行われるプロンプトの検査では、これまでの大多数のシステムと異なる点として、非決定的な振舞い(ランダム性)を有む「温度」などの概念に注意が必要である。
概念分類上は「実行システム」に属するポイントであるが、ブレインストーミングなどの多様な回答を期待する場合は、その機能性を保証する上で特別な指標の開発を求められる可能性がある。

現時点では人間の主観による評価が主であることは大きな課題であり、今後産業標準となりうる多様性の指標(Mertics)の開発が望まれる。


## 開発プロセスにおける成果物

工学的なプロンプト開発の成果物は大きく3種類ある。

- ソフトウェア開発プロセスと同様の各フェーズにおける様々な「文書」
    - 設計書や検査および品質に関わる報告書
    - プロンプトの利用方法を示すドキュメント
- 成果物としての「プロンプト」として以下のいずれか
    - 具体的な入力である「プロンプトのテキスト」
    - 穴埋めが必要な「テンプレート型のプロンプト」および「入力パラメーター」
- プロンプトを生成する外部システムあるいはソースコード
    - DSLなどによるプロンプト生成の仕組みを持つ場合、その生成過程を担う実体が開発プロセスの管理対象となる


## 「機能指向」のプロンプト設計原則

ここまでのモデルの持つ機能分類や開発プロセスから、プロンプト開発を工学的で再現性あるものにするために「機能指向設計」の原則がある。

この原則は、以下の2つの内容を必ず明示することで、プロンプトを設計や効果を評価し、再現性や移植性を高めることを目的としている。

1. システムとしての「振る舞い」を機能として定義する
2. 振る舞い実現のために「依存しているモデル機能」を理解して明示する

これらが明らかになっていない場合、「システムは目的を達成できるのか？」「なぜ機能性が保証されるのか？」「移植候補のモデルは何か？」といった目的実現やリスク分析に関わる議論が困難になるという問題が起こり得る。

これらの適切な開発プロセスと原則を遵守することで、安全なプロンプト開発が行えるようになる。


# プロンプト設計と実装の実践

ここまでの品質定義、構成概念、プロセス定義を踏まえ、実際に設計と実装の例を示す。

まず題材となる状況として以下に例を挙げる。
ここでは簡単のため、概念実証とリスク分析は省略し、要望から要件と基本設計を行う。

要望:
- プロンプトの利用者は、様々な科学分野に興味がある「個人」である（プロンプトをChatGPTに入力したりして使う想定）
- 興味対象の学術分野を知るために、入力に基づきその分野が扱う主要なトピックをいくつか提示してほしい

要件:
- 成果物
    - 以下の機能を満たすプロンプトテンプレートを開発する
        - このプロンプトは、任意の学術分野の名称を入力することで、その分野で扱うトピックとそれぞれの簡単な説明が 5 個得られる
        - このプロンプトは、結果の説明をより興味を惹くようなトーンで説明する。ただし機能性は一般に評価困難であるため、簡便なオンオフを可能とし、効果保証は行わない。
        - 提供成果物はプロンプトテンプレートのみであり、サービスや専用UIなどは開発しない
    - ユーザーは日本人であり、プロンプトも日本語で記述する
- スコープ
    - プロンプトの実行モデル(実行システム)としては、GPT-3.5またはGPT-4とする
        - 同プロンプトを他のモデルで実行する必要がある場合は開発元に確認する
        - 移植を検討する場合も、Completion機能とInstruct機能を備えているモデルを最低要件とする
- 利用法・制約
    - ユーザーは、テンプレートに既存の学術分野の名前のみを入力して実行する。このとき余計な文字の入力は行わない。
        - 例: 医学、歴史学、経営学、社会学、天文学、地理学
    - 出力の大部分がモデル知識で構成されるが、その真偽についてはユーザーの責任とする
    - 成果物のプロンプトテンプレートを異なる要件で動作させる場合は別開発として対応する

基本設計:
- プロンプトの内容と表現
    - 内容
        - トピックの名称と概要の説明を含める
        - トーンの指定を制約として反映可能にする
    - 表現
        - 出力形式を箇条書きとする
- プロンプトの入出力
    - 入力は、ユーザーの入力した学術分野の名前
    - 出力は、箇条書きのテキスト。また、一度のプロンプト実行で得られるようにする

## 基礎的な実現の例

ここでは基礎的で簡単な方法として、単純な指示機能のみを用いた実現例を示す。

自然文として特筆すべきことがないが、詳細設計を以下の通りとして実装する。

### 詳細設計

#### 内容

Instruct機能を用いて以下の内容を指示する。

- 対象の学術分野：ユーザー入力を用いる
- 学術分野で扱う「主要なトピック」と「簡単な説明」の箇条書きで「リスト化」する
- リスト要素は5つとすること
- 説明は興味を惹くトーンであること

#### 表現

日本語および自然文を用いる。
オンオフを可能とするために、文節の区切りを利用する。

### 実装

以上の詳細設計を踏まえ、順に指示語を並べることでプロンプトを記述する。

```
{{ 対象の学術分野 }}について、その分野で扱う主要なトピックとそれぞれの簡単な説明を5つ箇条書きでリスト化してください。説明は興味を惹くようなトーンにしてください。
```

プロンプトをレビューする際には、品質特性を踏まえた評価を行うことで継続的な記録を残したり議論することができる。

### 検査

実行システム:
- 実行システムは、ChatGPTの GPT-3.5 と GPT-4(簡単化のためここでは省略) を用いる。
- 温度などのパラメーターは、ChatGPTの内部パラメーターをそのまま用いる

また、総合検査的な観点として、要件定義から以下の検査項目が考えられる。

1. トピックの名称と説明が5つ得られるか
2. 簡便なオンオフ機能を提供しているか、オンオフが可能か

#### 出力例

__GPT-3.5 トーン指定あり 学術分野: 医学__

```
1. 遺伝子療法: 遺伝子療法は、人間の遺伝子を修正し、疾患の治療や予防に役立つ革新的な手法です。これにより、遺伝子の異常を修復し、将来的には遺伝子由来の疾患を根本的に解決する可能性があります。イメージしてみてください！未来の医療では、私たちは個々の遺伝子をカスタマイズして、健康な人生を送ることができるかもしれません。

2. 免疫療法: 免疫療法は、体内の免疫システムを活性化または調整することで、がんや自己免疫疾患などの疾患を治療する方法です。この治療法は、従来のがん治療法に比べて副作用が少なく、持続的な効果が期待できるとされています。もうすぐ、私たちは自身の免疫システムを活用して、がんと闘うことができるようになるかもしれません。

3. 統合医療: 統合医療は、従来の医療と代替医療を組み合わせるアプローチです。これにより、患者の体と心の両面にアプローチし、病気や痛みの原因を根本的に理解しようとします。統合医療は、ホリスティックなアプローチを取ることで、患者の総合的な健康を促進する可能性があります。想像してみてください！医師と代替療法の専門家が協力して、あなたの健康を最適化するための個別の治療計画を作成してくれる光景を。

4. 神経科学: 神経科学は、脳や神経系の機能や障害について研究する分野です。私たちはまだ脳の多くの謎を解き明かす必要がありますが、神経科学の進歩により、認知機能の向上や神経変性疾患の治療法の開発が期待されています。私たちは将来、脳の奥深い部分に入り込んで、意識や思考のメカニズムを解明することができるかもしれません。

5. 遠隔医療: 遠隔医療は、技術の進歩により、患者と医師が物理的に同じ場所にいなくても医療サービスを提供できるようになったものです。テレビデオ会議やモバイルアプリケーションを使用して、医師とリアルタイムでコミュニケーションすることができます。これにより、地理的な制約や交通の問題を克服し、医療のアクセス性を向上させることができます。将来的には、自宅から診療を受けることが一般的になり、医療がますます便利になるでしょう！
```

__GPT-3.5 トーン指定なし 学術分野: 医学__

```
1. 解剖学: 解剖学は人体の内部構造を研究する医学の分野です。身体の臓器、組織、骨格などの構造や相互関係を調べ、その理解を通じて疾患や損傷の診断と治療に役立てます。

2. 生理学: 生理学は生物学の一分野であり、生物の機能や生命現象を研究します。人体の器官や細胞の機能、代謝、神経伝達、循環系、消化系などのプロセスを理解することで、病態生理学や治療法の開発に貢献します。

3. 病理学: 病理学は疾患の原因や進行メカニズムを研究する医学の分野です。病理学者は組織や細胞の異常を調べ、病理組織学や分子病理学の手法を用いて病気の診断や治療法の開発に関与します。

4. 薬理学: 薬理学は薬物の作用や効果を研究する科学です。薬物が体内でどのように働き、生体系に影響を与えるかを理解することで、新しい薬の開発や既存の薬の最適な使用方法を探求します。

5. 臨床医学: 臨床医学は医師が患者を診断し治療する実践的な医学の分野です。臨床医学では、症状や身体所見を評価し、適切な検査を行って診断を立て、治療計画を立案します。臨床医学は一般的な医療診断や治療に関する知識を提供し、さまざまな専門分野に分かれて深化しています。
```

##### 結果

| 実行条件 | 機能 | 結果 |
|:--|:--|:--|
| GPT-3.5 トーン指定あり 医学 | リスト項目数が5つである | ○ |
| GPT-3.5 トーン指定あり 医学 | トーンが反映されている | ○ |
| GPT-3.5 トーン指定なし 医学 | リスト項目数が5つである | ○ |

## 実装パターン

### RELIC(レリック)パターン
出典: https://www3.nhk.or.jp/news/html/20230518/k10014071011000.html

RELIC(レリック)パターンとは、プロンプトの内容に下記の項目を含めることで適切に振る舞いが制御できるというプロンプトデザインのパターンである。
プロンプトに含める以下5つの要素の頭文字を取ることから RELIC と名付けられており、これはランス・ヤンク氏によって広められている。

- 役割(Role)
    - 役職を与えること
- 除外(Exclusion)
    - 含んで欲しくない情報をあらかじめ伝えること
- 制限(Length)
    - 何文字以内で回答して欲しいか長さを設定すること
- 洞察・実例(Inspiration)
    - URLなどを入力してAIに実例を示すこと
- 状況(Context)
    - 質問の意図や背景を明確にすること

なおこれは、基本プロンプトモデルの「内容」について、処理や誘導知識を包括的に記述できるパターンとして有効である。
一方で、どのように「表現」するかについては触れられておらず、具体的な設計のためには補うべき点も多数存在する事に注意が必要である。
RELICという順番で記述されているが、この順番で表現することの有効性は特に示されていない。読みやすさや覚えやすさを重視したものと思われる。

#### 詳細設計

- 内容
    - 役割(Role)
        - トーンと知識の誘導を目的として、「大学教授」を設定する
    - 除外(Exclusion)
        - 特になし
    - 制限(Length)
        - リスト項目が5個であることを明示する
        - (文章としての長さを指定することが望ましい)
    - 洞察・実例
        - 特になし
    - 状況(Context)
        - 要望から、ユーザーの状況や興味について記載し、誘導知識として用いる
- 表現
    - 省略

#### 実装

```
あなたは「{{ ユーザー入力 }}」を研究している大学教授です。

様々な科学分野に興味のある聴衆に向けて、トピックとその簡単な説明を行います。
あなたが研究している興味深いトピックを5個箇条書きでリスト化してください。
```

#### 検査

この結果の確認と設計の遵守状況、品質評価は読者に任せる。


### 深津式汎用プロンプト
出典: https://www.youtube.com/live/ReoJcerYtuI?feature=share&t=2640

深津式汎用プロンプトとは、以下のテキストからなるプロンプトのテンプレートである。
深津 貴之氏(note@ https://note.com/fladdict) によって開発された。

__例__

```
# 命令書:
あなたは、プロの編集者です。
以下の制約条件と入力文をもとに、最高の要約を出力してください。

# 制約条件:
- 文字数は300文字ていど。
- 小学生にもわかりやすく。
- 重要なキーワードを取り残さない。
- 文章を簡潔に。

# 入力文:
＜ここに文章を入力＞

# 出力文:
```

このパターンは具体的なテンプレートとして提供されており、プロンプトモデルにおける「内容」と「表現」を網羅的に扱うテンプレートである。
特に構文が明確であることから高い使用性を備え、箇条書きなどの参照性が高い構文によって信頼性を高めているパターンと言える。

また「# 出力文:」が「出力の事前処理(後述)」としてモデルのCompletion機能を誘発させている可能性が高く、予期しない振る舞いを避ける意味で信頼性の向上に寄与しているほか、余計な出力を減らすなどの効率性にも寄与していると考えられる。

このテンプレートはInstruct機能を前提としているため、それらを備えないCompletion機能モデルへの移植は困難になる可能性が高いことに注意が必要である。


# プロンプト理論

プロンプトの記述には理論的な側面があり、これを研究することで様々な技法として具体化できる。
これは深層学習の分野でモデルの機構を学ぶことで得られる知識であったり、従来から別分野で知られている論理性を応用するものも多い。

その中でも特に工学的な面から重要となる「プロンプト理論」として、重要な技法を具体例と共に示す。

## Instruct-Completion変換

プロンプトの設計では、ある目的とする振舞いに対し、それを実現する手段であるモデル機能を選択して適用する必要がある。

多くの目的は、実装の容易さなどの観点から「Instruct機能」によって実現すると考えられるが、実用上はモデル機能の制限や運用コスト削減などの観点から実現が難しくなることがある。
そういった場合に、この「Instruct-Completion変換」を用いることで、振舞いに必要となる機能を「Instruct機能」から「Completion機能」に変換できる場合がある。

この変換によって、Instruct機能を持つモデルでのみ使えていたプロンプトが、Instruct機能を持たない単なるCompletion機能モデルへ移植可能になるなどの可能性がある。極論すれば、GPTモデル向けのプロンプトもBERTで同様の機能性が達成できるかもしれない。

この変換が成立するためには様々な条件が必要となるが、ここではInstruct機能を用いて実現する「内容の指示」および「出力形式の指示」をCompletion機能で実現する例と、その変換が成立する背景の仮説について以下に示す。

### 具体例

要件・設計:
- ソフトウェア脆弱性のリスクについて出力する
- 出力の際の表現として、「脆弱性とは」「具体的なリスク項目」「対策の例」をこの順番で出力する


__Instruct機能による実現__
```
ソフトウェア脆弱性について、そのリスクを「脆弱性とは」「具体的なリスク項目」「対策の例」をこの順番の通りの順番で出力してください。
```

__Completion機能による実現__
```
概要:
ソフトウェア脆弱性について、そのリスクを以下の通り報告する。

目次:
1. 脆弱性とは
2. 具体的なリスク項目
3. 対策の例

### 1. 脆弱性とは

```

このInstruct-Completion変換の例は、「これから行う処理」を「過去に行われた事実報告」という体裁に変換することで、様々な指示を単なるCompletion機能で実現しようとするものである。

品質上の解釈を行えば、これは「移植性」を改善するために、「効率性」と「保守性」を下げるようなトレードオフの関係にあると理解できる。

### 変換できる背景と仮説

これが実現できる背景としては、テキスト形式の学習データが「報告書」の体裁を含んでいたり、広範なドキュメントに「目次」が含まれることが要因として考えられる。
また、目次は実際のコンテンツの前に配置され、見出しと同じテキスト要素が含まれることから、事前に目次を配置することで「出力の構文制御」に使う「参照情報」として活用される。

この変換可否を確かめるには、モデルの学習データにどのようなテキストが含まれていたか調査することが有効である。
また、このような報告書形式のテキストを含めることで、Instruct-Completion変換の実現可能性が高いモデルの構築も期待される。
特にOSSモデルの開発では、こういった変換理論を考慮することで、学習データの公開や改善の取り組みも今後重要な価値となってくるであろう。

### 変換の重要性

このInstruct-Completion変換は、様々な視点から意義がある。

- LM/LLMといったモデルを開発する人々にとっては、学習データを工夫することで、Instruct機能実現のための追加学習コストを削減することにつながる。
- LM/LLMといったモデルを利用してシステム化を担当する開発者にとっては、より安価なモデルの利用や推論コストの低いモデルの採用、移植性の改善によるリスク対策などが図れる。
- 社会的には、これらの変換技法を調査体系化することで開発を促進・効率化するほか、計算資源の利用効率化から環境負荷を抑えることにもつながる。

## 影響作用分析

影響作用分析とは、「プロンプトに含まれるテキスト要素」が「設計上のどの機能に対して作用しているか」と「出力のどの部分に影響しているか」を詳細に分析することで出力の信頼性を改善する取り組みである。

結果の構文に対して複数のテキスト要素が作用するほど信頼性が高い、また複数の機能(Instruct機能とCompletion機能を組み合わせるなど)を活用するほど信頼性が高い、といった分析を行うことができる。

プロンプトの開発プロセスにもある基本設計や詳細設計の段階で行われ、プロンプトの機能がテキストのどの要素に誘発されているかといった実現方法の分析や、適切な誘導方法の解明と利用、改善につながるため重要な分析である。

## ほか

// 疲れました。またどこかで

# リスク分析

AI技術としてリスク分析を行うことで、LM/LLMを扱う上で発生する不確実性を減らし、安全なプロンプト開発につなげることが重要である。

AI技術として様々なリスクがあるが、システム開発の際に考慮すべき観点として以下のようなものがある。
ただし、これらのリスクに限らず、今後様々な観点から継続的に評価することが望ましい。

1. 脆弱性
   - 意図しない動作をするリスクとその影響分析
   - 問題発生時の稼働停止および改善手順の計画
2. 安全性
   - 社会的または倫理的な問題発生のリスクとその影響分析
   - 問題発生時の稼働停止および改善手順の計画
3. 法規制
   - システムを利用可能とする国や地域における法規制に関する調査分析
4. 提供リスク
   - 使用モデルやサービスの提供停止リスクの分析
   - 代替モデルの調査と更新手順に関する計画

特に、問題発生時の稼働停止に関する計画、また保守改善手順の計画は事前に行うべきポイントである。


## 脆弱性リスク

// プロンプトの活用は幅広い利用者が想定されることもあり、一般公開に向く内容ではないと考えられるため割愛

## 安全性リスク

モデルにデータ保護や権利、倫理的問題が見つかるなどした場合、緊急性の高い対策が求められる可能性がある。

この際考慮すべき点として、その対応フェーズの順に「調査」「対策」「報告」「監視」の観点がある。

## 法規制

システムを提供する国や地域によっては、システムの提供する機能を制限している場合があるため注意が必要である。

特にEUの規制についてはその内容が明らかになってきており、これを参考として分析することで予防的な措置が行える。
https://www.europarl.europa.eu/news/en/press-room/20230505IPR84904/ai-act-a-step-closer-to-the-first-rules-on-artificial-intelligence

この規制案はいくつかハイリスクAIとして例を挙げているが、プロンプト工学の文脈ではたとえば以下のようなリスクについて考慮が必要である。

- 予測警察システム (位置情報、または過去の犯罪行為に基づくプロファイリング)
    - 特定の個人に対する予測分析への応用、またプロンプトのGroundingなどの技法を用いて埋め込む情報の設計次第では、これらの規制に抵触するリスクがあるため注意が必要である。
- 法執行機関、国境管理、職場、教育機関における感情認識システム
    - Few-Shotによるテキスト感情分析(ポジティブ・ネガティブ分析)などがLLMの利用例として挙げられることがある。これらの手法を職場のレポートや教育機関に適用すると規制に抵触するリスクがあるため注意が必要である。

上記に限らず様々な観点からリスク分析を行うことが望ましい。
また今後各国で様々な法規制が行われる見込みであり、継続的な調査と分析が必要であることに注意されたい。

## 提供リスク

LM/LLMの利用に際しては、特定の企業のサービスを利用する、OSSモデルの利用する、あるいは自社開発するなど様々な選択肢がある。

OSSや自社開発であれば、自身でメンテナンスが可能であることから提供停止のリスクは低い。
特定の企業のサービスを利用する場合、将来どの程度提供されるのか、その間のバージョンアップや提供のライフサイクルがどうなっているかは重要な分析ポイントである。

これに加え、利用者からどのようなモデルを利用しているか、情報提供を求められるといった可能性も考えられる。
倫理的な問題を抱えるモデルを活用していないか、あるいは権利を侵害することがないか、自社の情報漏洩が起きないか、といった観点から十分な分析が求められる。

# おわりに

ここまで、深層学習やプロンプトにまつわる工学分野の体系的な知識と方法についてまとめた。

様々な品質や構成概念、設計などのプロセスを守ることで安全なプロンプト開発ができることと思う。
社会的、また環境的な価値の面、安全性や倫理的な注意に気を配りながら、より工業的な取り組みによる技術発展が促進されることを期待したい。

以上、「プロンプトエンジニアリングってこういうことですか？」でした。