基礎について prompting
LLMに質問するには、自分のプロジェクトも普段のやり方も知らない同僚に仕事を説明するつもりで、必要な内容をすべて含む指示を書いてください。具体的なタスク、役立つ背景情報、明確に区切った処理対象のデータ、期待する回答形式を示します。その指示は、チャット画面、コマンドライン、APIのいずれからでも送信できます。モデルは意図も形式も察してはくれません。書かれていないことはすべて、モデルがその場で補うことになります。
このガイドでは、まずタイトルの問いに答え、その後、プロンプトの構造、最も時間を浪費するミス、ほぼすべてのモデルで有効なテクニック、そして小型のローカルモデルで何が変わるかを詳しく説明します。これらの原則は、Anthropicのプロンプトエンジニアリングに関する公式ドキュメントと、Ollamaの公式ドキュメントに基づいています。
#LLMに質問する方法:3つの方法、1つのルール
言語モデルは、与えられたテキストの続きを生成します。そのため、出力はほぼ全面的に、何を入力するかに左右されます。Anthropicのドキュメントでは、どのモデルにも役立つ鉄則が示されています。タスクを知らない同僚にプロンプトを見せ、その指示に従って実行してもらいましょう。同僚が戸惑うなら、モデルも同じように戸惑います。また、曖昧な指示からモデルが意図を推測するのを期待するのではなく、どの程度力を入れて取り組んでほしいかも含め、求める内容を明示することを推奨しています。この鉄則は、手元のコンピューターで動く80億パラメータのモデルにも、最先端のモデルにも同じように当てはまります。パラメータ、量子化、モデルの選択も重要ですが、曖昧なプロンプトでは、どのモデルも力を発揮できません。
#ローカルモデルに質問を送る3つの方法
お使いのマシンで、プライベートかつ無料のChatGPTを1時間で構築 — LM Studio、Ollama、Open WebUI、ご自身のドキュメント、クラウド不要。
- 永久に利用できるオンラインスペース
- PDF + ファイル
- 30日間返金対応
- チャットインターフェース
- Open WebUI、LM Studio、Jan:入力するとモデルが応答し、履歴は保持されます。始めるための最もシンプルな方法です。
- コマンドライン
- ollama run suivi du nom du modèle ouvre une session interactive dans le terminal. Pratique pour des essais rapides.
- API
- アプリケーションはローカルサーバーにHTTPリクエストを送信し、JSON形式の応答を受信します。これはスクリプトや自動化のための方法です。
ロールが system のメッセージは常に適用される基本方針を定め、ロールが user のメッセージには依頼内容を入れます。システムプロンプトのガイドでは、そこに何を書くかを詳しく説明しています。どの方法を使っても、回答の質はメッセージの内容に左右されます。
#良いプロンプトの構造:役割、タスク、コンテキスト、フォーマット
多くのガイドでは、役割、タスク、コンテキスト、形式の4要素を押さえています。これは規格ではなく、覚えやすくするための整理法です。具体的に指示する、コンテキストを与える、構造化する、形式を指定する、必要に応じて役割を与えるというドキュメントの推奨事項とも重なります。Anthropicのドキュメントでは、システムメッセージで役割を1文指定するだけでも、トーンや振る舞いを方向づけられるとしています。
- 役割
- モデルの役割を示す一文です。例えば「あなたは厳格なフランス語の校正者です」。これで調整するのは文体であり、知能ではありません。
- タスク
- 何をするかを示す動詞は、できるだけ具体的にします。「形容詞を使わず、事実に基づく5つの箇条書きで要約してください」は、単に「要約してください」とするよりも効果的です。
- コンテキスト
- 処理するデータおよび要望の理由。制約の理由を説明することで、モデルは適切に一般化できます。
- フォーマット
- 長さ、構造、言語、トーン。これらの詳細がなければ、モデルは自身で選択します。
上記の例で契約書を囲むタグは、単なる飾りではありません。ドキュメントによると、XMLタグは、モデルが指示、コンテキスト、例、可変の入力を曖昧さなく区別するのに役立ちます。一貫性があり、内容を表す名前を選び、どのプロンプトでも同じ区切りを使ってください。
#最も時間を無駄にするミス
| エラー | 症状 | 修正 |
|---|---|---|
| キーワードだけの指示(「要約 契約 リスク」) | モデルには、それが質問なのか命令なのか分かりません | 動詞を含む完全な文を書く |
| 指示に混在したデータ | モデルはあなたの指示の一部をコンテンツとして処理します | データをタグで囲む |
| 暗黙の期待 | 長さ、言語、口調が想定と異なる | 長さ、言語、トーンを記述 |
| 禁止事項だけを指示する(「Markdownを使わないで」) | モデルが実際に実行する内容 | 望むことを言葉にする:「段落にまとめた文章で回答してください」 |
| 構造のない長いプロンプト | 無視された指示 | 手順に番号を付け、ブロックを分ける |
| 理由のない制約 | 不適切なアプリケーションの使用 | 理由を説明する:「このテキストは声に出して読み上げられる」 |
Anthropicのドキュメントでは、モデルに「何をすべきか」を指示するべきであり、「何をすべきでないか」を指示すべきではないと述べており、例えば「Markdownを使用しない」という指示を、「望ましいフォーマットの説明」や「自然な文章の段落」に置き換えることを例として挙げています。また、指示の理由を明記することを推奨しており、モデルはその理由から一般ルールを抽出し、単なる禁止命令ではなく理解を深めます。
#ほぼすべてのモデルで効果を発揮する技術
#例を示す
Anthropicのドキュメントによると、例示はフォーマット、トーン、構造を導く最も信頼できる方法の一つです。一般的に、3から5つの例が最も良い結果をもたらしますが、それらが関連性を持ち、多様(境界ケースを含む)であり、指示と誤解されないようタグで囲まれていることが条件です。分類、抽出、またはフォーマット変更には特に効果的です。
#推論するよう求める
論理問題、計算、コードでは、結論を出す前に手順を示すようモデルに求めると、回答は長くなりますが、結果が改善することがよくあります。一部のローカルモデルは、自動的にこれを行います。Ollamaのドキュメントによると、推論モデルは最終回答とは別にthinkingフィールドを返し、その内容を読んだり、表示したり、非表示にしたりできます。それ以外のモデルには、次の一文で十分です。「推論を順を追って説明してから、最終回答を示してください」。
#長いドキュメントを配置する
Anthropicのドキュメントでは、20,000トークンを超える入力の場合、長い文書を質問より前のプロンプト冒頭に置き、質問を最後に書くことを推奨しています。同社のテストによると、これにより回答の品質が最大30%向上する可能性があり、特に複数の文書を含む入力で効果があるとされています。この結果はClaudeモデルでのテストに基づくものです。ご自身のテキストを使って、ローカルモデルでも確認してください。
#回答を検証してもらう
モデルに、各主張の根拠となる箇所を提供したテキストから引用し、見つからない場合は「未検証」と書くよう指示してください。この指示でハルシネーションがなくなるわけではありませんが、誤りを見つけやすくなります。ハルシネーションに関するガイドでは、この方法の限界を詳しく説明しています。
#実際のケース:曖昧な指示から使えるプロンプトへの変換
典型的な依頼を考えてみましょう。会議の議事録を貼り付けて、「要約して」と入力します。モデルには、誰に向けた要約なのか、何行程度を求めているのか、決定事項やタスクを列挙する必要があるのか、どの言語で回答すべきなのかが分かりません。そのため、長さもまちまちな一般的な文章が出力され、後で手作業で修正することになります。
| 項目 | 曖昧な依頼文 | 具体化した依頼 |
|---|---|---|
| タスク | 要約して | この報告書を五つの箇条書きで要約してください |
| 対象者 | 未指定 | 出席しなかったディレクターに対して |
| 期待されるコンテンツ | 未指定 | 決定事項を先に、次に担当者と日付を添えたアクション項目 |
| フォーマット | 自由 | 箇条書き、1項目1文、最大20語 |
| Garde-fou | なし | 日付または担当者の情報がない場合は、勝手に補わず「未指定」と記載する |
最後の行は、ローカルモデルを使う場合に最も役立ちます。情報が足りないときにどう応答すればよいかを明示すると、モデルが情報を作り上げることを減らせます。追加する内容はそれぞれ一文で済み、それらを組み合わせることで、手直しが必要な結果を実用的な結果に変えられます。プロンプトを確定する前に、異なる3件の記録で試し直してください。1つの例でしかうまくいかないプロンプトは、安定性に欠けます。その後、最もよかった版をテキストファイルに保存してください。そのまま再利用すれば、どんな言い回しの工夫よりも時間を節約でき、同じ指示で2つのモデルを比較することもできます。
#出力フォーマットを指定する
回答をプログラムで読み取る必要がある場合、単に「JSONで回答してください」と指示するだけでは、十分でないことがあります。Ollama は構造化出力に対応しています。リクエストの format フィールドにJSONスキーマを渡すと、回答はそのスキーマに従うよう制約されます。ドキュメントでは、回答の形式を明確にするためにプロンプトにもスキーマを含めること、結果の再現性を高めるために温度を下げること(たとえば0に設定)、そして検証時に再利用できるようPydanticやZodでスキーマを定義することを推奨しています。構造化出力は、OpenAI互換APIでも response_format を使って利用できます。Ollama のクラウドモデルでは利用できません。
#ゼロからやり直さずに改善を重ねる
不完全な回答は、新しいプロンプトよりも、ターゲットを絞った指示で修正するのが効果的です。何が問題で、何を期待しているかを伝えましょう。「最大12語の3つの箇条書きでやり直して」「より直接的なトーンで、敬語なしで」「最も具体的な3つのリスクを追加して」などです。ターンが進むにつれて結果が悪化する場合、多くの場合は履歴がコンテキストウィンドウを埋め尽くしているためです。要約を付けてやり直してください。
#ローカルモデルによる変化
- より明確な指示
- 小規模なモデルは、明示されていないことを補うのがあまり得意ではありません。自明に思えることも含めて、すべて書いてください。
- デフォルトでコンテキストが切り詰められます
- VRAMが24 GiB未満の場合、Ollamaの初期コンテキスト長は約4,000トークンです。長文を貼り付けると、途中で切り捨てられることがあります。プロンプトが原因だと考える前に、コンテキストウィンドウを広げてください。
- 推論モデル
- 回答する前に推論するため、回答が出るまでに時間がかかり、推論用のトークンも消費します。
- フランス語の精度がより不安定
- 小型モデルは、性・数などの文法的一致を誤ることが多くなります。校正の指示を追加するか、より大きなモデルを選んでください。
- 温度
- 低めの設定(0〜0.3)は情報の抽出やJSON出力に、より高めの設定は文章作成に適しています。パラメータのガイドを参照してください。
#プロンプト送信前のチェックリスト
- 一つの文に、一つの動詞
- タスクは、具体的な行動を示す動詞を使って、完結した指示として表現します。
- 分離されたデータ
- 処理対象のテキストはタグで囲み、指示文とは決して混在させません。
- テキスト形式
- 長さ、構造、言語、トーンが明記されています。
- 情報が不足している場合の対応を明示
- 情報が足りないときに何と答えればよいか、モデルが分かるようになります。
- 一つまたは二つの例
- 抽出や分類では、1つの例が10回の説明に匹敵します。
- コンテキストウィンドウを確認済み
- プロンプトと期待される応答は割り当てられたコンテキスト内に収まります。
LLMに効果的に質問するにはどうすればよいですか?+
プロンプトを長くすると、より良い回答が得られますか?+
プロンプトに「あなたは専門家です」と書くべきですか?+
ローカルモデルで信頼できるJSON形式の応答を得るには、どうすればよいですか?+
ローカルモデルがプロンプトの一部を無視する理由は?+
システムプロンプトとユーザープロンプトの違いは?+
#さらに詳しく
- システムプロンプトの習得
- 温度、top-p、top-k:パラメータ
- コンテキストウィンドウを理解する
- OllamaでのFunction callingとJSON出力
- ハルシネーションを抑える方法
- ローカル環境での初めての会話
ご意見、誤りのご指摘、補足はありますか?ぜひお知らせください。皆さんにとってより良いガイドにするために役立ちます。