【プロンプトで激変する】AIへの「お願いの仕方」で結果が全然変わった話

どうも!RAG開発中であるITエンジニアのオロポンです!

最近どこの企業でも生成AI利活用が盛んに行われていますね!
しかし、皆様の中で実際にAI使ってみたけど、「なんか思ってたアウトプットと違う…」って経験ありませんか?

実はそれ、AIの性能の問題じゃないことが多いんです。 プロンプト(AIへの指示文)を変えるだけで、結果がガラッと変わるんですよね!

今日は、オロポンが社内ノウハウのRAG構築で実際にハマったこと、そこから学んだ「プロンプトの書き方」について話したいと思います!

社内ドキュメントがカオスすぎて、LLMに整理させることにした

現在、社内ドキュメントを使ったRAG(社内知識をAIに持たせる仕組み)システムを作ろうとしているのですが、ドキュメントをかき集めてみたら…想像以上のカオスが(T . T)

  • ファイル名の命名規則がない
  • 2008年の稟議書と2024年の仕様書が同じフォルダに共存
  • 営業資料なのか経営企画のレポートなのか、ファイル名だけでは全く判別できない

これをそのまま処理してRAGを構築しても検索精度が出るはずがない!ということで、軽量LLMにドキュメント前半部分を読ませて、部署名・文書種別・作成年などのメタデータを自動抽出させる作戦に出ました。

「役割とルールだけ渡せばOKでしょ」→ 甘かった(^^;)

最初に書いたプロンプトは至ってシンプルなもの。LLMに与える役割と抽出項目を書いて、「JSON形式で返してね」と指示しただけです。

#プロンプトイメージ
あなたは社内ドキュメントのメタデータを抽出するアシスタントです。
以下のドキュメントを読んで、次の情報をJSON形式で返してください。

- document_type: ドキュメントの種類(例:議事録、仕様書、報告書など)
- department: 作成部署
- estimated_year: 作成年(推定)

ドキュメント:
{document_content}

「これでもある程度いけるでしょ!」と思ってたんですが、動かしてみると2つの問題が…

問題① 出力の表現がバラバラ 
同じ仕様書なのに「仕様書」「技術仕様」「Technical Spec」と毎回違う表現が返ってくる。もしくは、ドキュメント内に記載はあるのに何も抽出できなかったり…
こんなんですと、RAG構築して「仕様書」で検索しても「Technical Spec」や抽出できなかったドキュメントがヒットしないので、メタデータとして使い物にならないですよね(T_T)

問題② 再現性が低い 
同じファイルを何度流しても、結果が微妙に変わる。department が「システム部」になったり「情報システム部」になったり「IT部門」になったり…。

どちらもAIの出力結果には、あるあるな問題ですよね。
オロポンも「どう直せばいいんだ!?」って、しばらく頭を抱えていました(^_^;)

解決策は「制約」と「例示」

ネットで情報収集したり、AI相手にディスカッションした末に辿り着いた答えが「制約」「例示」でした!

① 選択肢を制約として明示する 
例えば、document_typeに使っていい値をリストで指定してあげる。

#プロンプトイメージ
- document_type: ドキュメントの種類
  ※必ず以下から選択:議事録 / 仕様書 / 報告書 / 提案書 / マニュアル / その他

これだけで「仕様書」だったり「Technical Spec」みたいな表記揺れや自由表現が大幅に抑えられます。

② 期待する出力のサンプルをプロンプトに直接書く 
百聞は一見にしかずって言いますが、AIに対しても全く同じです。実際のドキュメント内容を人間が分析して、「こういう入力のときはこう返してね」という例を見せてあげるだけで、出力の”型”が一気に安定します。

#プロンプトイメージ
【出力例】

入力:
「2023年10月 第3回プロジェクト定例会議 議事録
出席者:田中(営業部)、鈴木(開発部)…」

出力:
{
  "document_type": "議事録",
  "department": "営業部,開発部",
  "year": 2023
}

この2つの内容をプロンプトに加えることで軽量LLMの動作が安定したため、安心してメタデータ抽出を丸投げできるようになりました(^o^)

「たったこれだけで!?」って思うかもしれないですが、LLMの動き方を考えると意外と納得できる話なんです

なぜ「制約」と「例示」でここまで変わるの?

LLMは、ざっくり言うと「次にくる言葉を予測する」仕組みです。
大量のテキストから文脈を読んで、「この流れならこういう言葉が来るはず」と推論して出力しているんですね。

制約(選択肢の指定) があると…

LLM
LLM

テキストの中に「Technical Spec」と記載がある。
document_typeは、「Technical Spec」だろう。
でも、リストの選択肢にはないから、リストの中で一番意味が近い「仕様書」と出力!

と出力の範囲を絞ることができます。自由に表現を選ばせると毎回ブレるのが、選択肢を明示することでピタッと安定するんです!

例示(出力サンプル) があると…

LLM
LLM

テキストの中に「出席者:田中(営業部)、鈴木(開発部)」と記載がある。
色んな部署の人が出席してるから、departmentは「複数部署」?
でも、今回みたいな入力に対して、全部署名を抽出するように例示がある。
なら、「営業部,開発部」と出力!

とLLMが出力の”型”をより具体的に掴めるようになります!

人間でも、「プレゼンは簡潔にまとめてください」と言われるより「こういうスライドのイメージです」と見本を見せてもらったほうが断然わかりやすいですよね?AIも全く同じなんです。

ちなみにこの具体例を実際にプロンプトに書く手法ですが、Few-shot Prompting(フューショット・プロンプティング) 呼ばれている様なので、もっと詳しく知りたい方は調べてみてください!

まとめ:「AIが使いづらい」と感じたら、まずプロンプトを見直してみよう!

今回の経験で改めて実感したのが、プロンプトはAIが考えるための文脈を設計するものということです。

「役割の説明」「抽出ルール」だけでは出力が安定しなかったのが、「出力例の提示」を加えてはじめて安定した出力をしてくれる様になりました!

「AIを使ってみたけど、思ってたのと違う結果が返ってくる…」という方は、ぜひこの2つを試してみてください!

  • 出力の選択肢を制約として明示する
  • 期待する出力や禁止する出力の例を1〜3個、プロンプトに記載する

同じAIでも、プロンプト次第でまったく別の挙動をします。 「このAIモデル使えないな」と嘆く前に、まず「お願いの仕方」を変えてみてください!

高性能モデルの利用はコストが上がってしまいますが、プロンプトを変えるコストはほぼゼロです!

でもリターンは思った以上に大きいので、ぜひ皆さんの用途にあったプロンプトを準備してみましょう!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA