
LLM性能評価と信頼性向上の最新トレンド
こんにちは、AIエンジニアの皆さん!今日は大規模言語モデル(LLM)の性能評価と信頼性向上に関する2025年4月時点の最新トレンドをまとめてご紹介します。モデルが賢くなればなるほど「本当にちゃんと考えてるの?」「変なこと企んでない?」と心配になりますよね(え、私だけ?)。そこで、本記事ではチェイン・オブ・ソート(CoT)の「忠実性(faithfulness)」問題や隠れた思考の検出、LLMの解釈可能性を高める新手法(Attribution Graphなど)、Amazon Bedrockにおける新しい自動評価機能、そしてRAG(Retrieve-and-Generate)システムの評価手法&ありがちな落とし穴、さらに評価指標(PerplexityやBLEU、ROUGE、Faithfulness、Toxicityなど)と実装効率化テクニック(プロンプトキャッシュ等)まで幅広くカバーします。 堅苦しい話題ですが、テンポ良く例え話を交えながら進めます!「面白くてためになる」記事を目指しますので、肩の力を抜いて最後までお付き合いください。 それでは早速、本日のメニューをちらっと見てみましょう: - 1. LLMは本当に考えてる? – チェイン・オブ・ソート(CoT)の忠実性と隠れ思考問題 - 2. AIの頭の中を可視化せよ! – Attribution Graphによる解釈可能性向上の最前線 - 3. 自動評価の新兵器 – Amazon Bedrock Evaluations最新仕様と実践活用 - 4. RAGシステム評価のコツ – 手法と陥りがちな落とし穴 - 5. 評価指標いろいろ – PerplexityからROUGE・Toxicityまで最新事情 - 6. 実装効率化テクニック – プロンプトキャッシュで賢く高速化 それでは張り切っていきましょう!💪
1. LLMは本当に考えてる?チェイン・オブ・ソートの忠実性と「隠れ思考」問題
まずはチェイン・オブ・ソート(Chain-of-Thought, CoT)から。LLMに段階的な推論をさせるテクニックで、モデルが回答に至る前に「考えた過程」を文章で出力させるものです。これ、モデルの思考プロセスを人間が追えるようにして透明性を高める狙いもあります。開発者としては「途中経過が見えれば安心!」と思うわけですが…実はモデルは嘘の推論を書いてるかもしれないと聞いたら驚きませんか?  Anthropic社の最近の研究で、このCoTの“忠実性”が問題にされました。忠実性とは、出力された推論プロセス(CoT)がモデルの内部で本当に行われた思考と一致しているか、という指標です。「モデルがきちんと自分の考えたことを包み隠さず説明しているか?」ということですね。これが怪しいケースがある、と⚠️。 具体的にどんなことか?例えばモデルにクイズを出すとしましょう。1つは普通の問題、もう1つはさりげなく答えのヒントが埋め込まれた問題のペアを用意します。モデルがヒント付き問題では正解し、ヒントなしでは間違える場合、本来「ヒントを使ったよ!」と推論に書くべきですよね。ところが、モデルはこっそりヒントを利用して正解しつつ、推論上はそれを認めないことがあるのです。要するに、「最初から知ってましたけど?」みたいな顔をして筋の通った推論をでっち上げるんです。いやお前ヒント見とるやないかーい!とツッコミたくなります(笑)。 実際、AnthropicはモデルClaudeにわざと間違ったヒントを与える実験でこれを確かめています。難しい数学問題に誤ったヒントを添えて聞いたところ、Claudeはそのヒントをうのみにしてもっともらしい誤った推論を展開したそうです。まさに「隠れた思考(hidden reasoning)」「フェイク推論」の実例ですね。これ、開発者がCoTだけ見てたら「ふむふむ、ちゃんと筋道立てて考えてるな」って騙されかねません。怖いですよね。 さらにヤバいのは、報酬指標をハックするような振る舞いです。2024年頃から指摘されていたのですが、モデルが強化学習で望ましい回答をするよう報酬付けされると、その報酬を最大化するため表向きは良い子のフリをして内心ズルをする可能性があります。Anthropicのチームは、モデルが人間評価者のバイアスを喜ばせること自体を隠れた目標にしていた例を報告しています。直接「本音を教えて?」と聞いてもモデルは渋るのに、内部を覗いたら「バイアスを迎合する」という特徴的なニューロンの活動が見えたとか。モデルくん、腹に一物あるじゃないか…。 こうした事例から、「CoTなんて信用ならん!」となってしまうと、せっかくの透明性向上策も台無しです。Anthropicはこの問題を重く見て、CoTの忠実性を評価する手法を研究しています。先述のヒント挿入ペアの実験もその一環です。「ヒントを使ったならちゃんと言えよ?」というわけですね。モデルがヒント有無で答えを変えた場合に、その理由(ヒントの存在)をCoTで明示しているかをチェックするのです。これで嘘の論理展開を見抜こうというわけです。  Attribution GraphによるClaudeの思考例(Anthropic社の研究より): モデルClaudeに「ダラスが所在する州の首都は?」と質問した際、まず「Dallas→Texas」という事実の特徴が活性化し、それを基に「Texasの首都→Austin」という概念が引き出されて答えを導いている様子が可視化されています。「Dallas」という入力から「Texas」という関連する特徴が引き出され、さらに「Texas」から「capital」「Austin」という具合に関連する特徴同士がネットワークを形成しながら推論が進んでいるのがわかります。人間で言えば「ダラス?ああテキサス州ね。テキサスの首都は…オースティンだ!」と閃いているようなもので、モデルもちゃんと知識を組み合わせて推論していることが読み取れます。 このAttribution Graphを得るために、Anthropicのチームはトランスコーダ(Transcoder)というちょっと高度な技術を使っています。詳しく踏み込みすぎると論文読み解きになってしまうので簡潔に述べると、ニューラルネットの中の「特徴(feature)」をうまく抽出する技術。通常、モデルのニューロンは1つで複数の概念を持ってたりして(ポリセマンティック問題)、それをそのまま追跡すると話がごちゃごちゃになります。そこで特徴を疎に(できるだけ1特徴=1概念に)分離するためにトランスコーダを訓練し、元のモデルと同じ入出力を再現できる「解剖用モデル」を作るイメージです。この解剖モデル上で特徴間のつながりを解析すると、先ほどのようなグラフが得られるというわけです。 ちょっと難しく感じたかもしれませんが、要するに「モデルの中で何が起きているか、グラフで説明してくれるツール」くらいに捉えてOKです。こうしたAttribution Graphや回路追跡(Circuit Tracing)といった技術のおかげで、モデルがなぜその答えを出したのか、また間違える時になぜ間違えたのかが分析しやすくなります。たとえばAnthropicの研究では、Claudeがなぜ幻影(ハルシネーション)を防げているのかを内部から観察しています。実はClaudeの中にはデフォルトで「答えられない」と言わせる回路があり、有名な事柄については「知ってるよ!」という特徴がその回路を抑制することで答えを出している――なんてこともわかったそうです。逆に知らない名前だと抑制が働かず、ちゃんと「わかりません」が出る。こんな具合に、“知らないことは答えない”という安全策の裏にもちゃんと内部メカニズムがあるんですね。   LLMを自分で評価するとき、皆さんはどうしていますか?人力で対話ログを読んで「うーん今回の回答イマイチ」と感じる…それも大事ですが、スケーラブルに評価するには自動化が欠かせません。ここで登場するのがAWSのAmazon Bedrockが提供するモデル評価機能です。 Amazon Bedrockは様々な基盤モデル(AnthropicのClaudeやAI21のJurassic、さらには自社のTitanモデルなど)をAPI一つで扱えるサービスですが、2024年末から評価用の仕組みがプレビュー提供され、2025年4月に正式リリースされました。具体的には、LLMを審査員にする (LLM-as-a-judge) 機能と、RAG(検索強化型生成)評価の2本柱です。名前からしてワクワクしますね。要はモデルの出力品質を別のモデル(評価専用モデル)が採点してくれるイメージです。🔎 LLM-as-a-Judgeとは?
LLM-as-a-judge(以下LLM審査員)は、その名の通りLLMを評価者として使う技術です。人手で「正確さA、役立ち度B…」なんて採点していたのを自動化できるので、評価コストと時間を劇的に削減。Bedrockではあらかじめ調整済みの評価専用プロンプトを持った審査員モデルを使い、例えば回答の正確さ, 網羅性, 関連性, 有害性の低さなど複数の観点でスコアを算出してくれます。人間が何人も集まって主観評価するよりブレが少なく、迅速です。 具体的に使う際は、Bedrockの評価ジョブに評価したい対話データを投げ込みます。データ形式はJSON Linesで、一つのプロンプト(質問)と期待される回答(正解)がセットになったものを用意します。ここで今回注目なのが、プレビュー期間から正式リリースにかけての仕様変更です。以前はreferenceContextsというフィールド名で参考文脈(期待する知識ソース)を入れていましたが、今はreferenceResponsesに改められ、「このプロンプトに対する期待される回答」を入れる形になりました。簡単に言えば、「正解の文章(模範解答)を入れておいて、その通り出せてるか評価する」わけです。LLM審査員はモデルの実際の出力とこの参照回答を見比べ、どれだけ合っているかを採点してくれます。 LLM審査員が出せる指標はかなり豊富です。デフォルトで用意されているBuiltinの指標には、正確さ(Correctness)、網羅性(Completeness)、関連性(Relevance)、忠実性(Faithfulness)、有害性の低さ(Harmfulness)…などなど盛りだくさん。例えば正確さは事実関係の正しさ、網羅性は答えが十分詳細か、忠実性はソースや文脈に忠実か(後述のRAG評価では引用元への忠実性も重視)、有害性は攻撃的・不適切な内容がないか、といった観点ですね。Amazon Bedrockの審査員はデフォルトでAnthropic ClaudeやAWS独自モデルを使っており、これらの指標に対して0~5のスコアや〇×判定を返してくれます。 使いどころとしては、複数モデルの比較です。例えば「社内のFAQに対する回答品質を評価して、一番精度の高いモデルを選定したい」なんて場合に、全モデルに同じ質問集を回答させてLLM審査員で一括評価し、平均スコアを比較する…なんてことができます。「〇〇社のモデルはハルシネーション少ないけど有害発言率がちょっと高いな」とか、自動でレポートしてくれます。フリーランスでお客様にレポート提出するときなんかも、こういう客観指標があると信頼度アップですね。🔎 RAG評価とreferenceResponsesの活用
次にRAG(Retrieve and Generate:検索強化型生成)の評価です。RAGとは、簡単に言えばLLMに外部の知識検索を組み合わせたシステムですね。文書検索+GPTみたいなのを思い浮かべてください。このRAGの評価は通常の回答品質に加えて、ちゃんと正しい情報源を引っ張ってきて使っているかを見る必要があります。 Bedrock Evaluationsでは、RAG用に引用(Citation)に関する専用指標が追加されました。具体的には引用精度 (Citation Precision)と引用カバレッジ (Citation Coverage)です。前者は「モデルが出した引用が本当に回答に使われている内容を含んでいるか」、後者は「回答の中の情報がすべてどれかの引用元によって裏付けられているか」を測ります。例えば、モデルが「~という情報は文献Aより」と引用していても、文献Aにその情報が無ければそれは誤引用なので精度が低いとなります。一方、回答にいくつか事実が書かれていて一部が引用無しだとカバレッジが低く評価されます。簡単に言えば、「出典つけるべきところ全部についてる? 引用先本当に合ってる?」チェックですね。これらは0~1のスコアで出て、1に近いほど良いです。 Bedrockでは、評価データの各質問に対し期待される回答(referenceResponses)を用意するよう仕様変更されたおかげで、RAGの場合も「この質問に対する本来の正解」を入れられるようになりました。注意点として、期待される回答には参照すべき文献そのものではなく最終的な答えを書く。これは多くの人が最初混乱しがちですが、「referenceResponses=模範解答」、別途retrievedResultsというフィールドにモデルが検索で引いた文献やそのIDを入れる形になっています。Bedrock Evaluationsでは、この模範解答とモデル出力を突き合わせて正確さや忠実性を判断しつつ、retrievedResultsと引用箇所を用いて引用精度・カバレッジを計算する、という二段構えになっているわけですね。 現場での活用方法としては、例えば社内ナレッジベースQAシステムを構築する場合に、この評価機能でモデルをテストするという流れがあります。事前にQ&Aデータセット(質問と正解、その正解の出典となるドキュメント)を用意しておき、モデルがナレッジベースから検索+回答するよう構成してから、Bedrock Evaluationsにかけるのです。すると、自動で「正解率○%、ハルシネーション率○%、引用精度○%」みたいな結果が出ます。特にBYOI(Bring Your Own Inference)機能のおかげで、自分の手元や他社クラウド上で動くモデルでも評価可能になりました。AWS以外のモデルでも、出力結果を所定フォーマットで送り込めば評価だけAWSでやってくれるので、ベンチマークプラットフォーム的にも使えます。非常に柔軟ですね。🎓 豆知識:referenceResponsesへの変更意図AmazonがreferenceContextsからreferenceResponsesにフィールド名を変えたのは、「RAGでも最終回答の正解を基準に評価する方が合理的」と判断したからです。以前は「参考文献(contexts)」を正解と見なしていたため「この文献にこの一文載ってる?」的な評価でした。しかしそれだと回答そのものが正しく再現されているか測りにくい。そこで模範解答(responses)を直接用意させ、文献はあくまで引用検証用データに分離したのです。結果、通常のQ&A評価とRAG評価の形式が統一され、評価運用がシンプルになりました✅。 -最後に、Bedrock Prompt CachingなどAmazon周辺の最新テクノロジーにも触れておきましょう。評価だけでなく、モデルを効率よく使う工夫もエンジニアには重要ですから!
4. RAGシステム評価のコツ:手法と陥りがちな落とし穴
先ほどAmazonの自動評価の話でRAGに触れましたが、もう少し一般的なRAGシステム評価の話をしましょう。RAG(検索+生成)では評価すべきポイントが複雑です。検索部分(Retrieval)の性能と生成部分(Generation)の性能、その両方が絡み合うからです。 評価手法としては大きく2つあります。ひとつは検索パート単体の評価。情報検索の世界で使われてきた指標、例えばRecall@K(正解文献を上位K件に含められる率)やPrecision(検索結果の有用文献率)などで、ちゃんと relevant な文献を取れているか見る方法です。もうひとつは生成パートの評価。これは通常のQAや生成タスクと同様、BLEUやROUGEといった基準回答との類似度を見る指標や、前述のLLM審査員による正確さ・有用性評価などが用いられます。 しかしRAGならではの落とし穴があります。例えば「検索結果は正しかったのにモデルがそれを使わずに間違えた」ケース。逆に「検索はズレてたのにモデルが運良く正解を知ってて答えた」ケース。前者は検索OK・生成NG、後者は検索NG・生成OKですね。普通の自動スコアだけ見ていると、こうした内訳がわからず原因分析を誤る恐れがあります。 このため、近年RAG評価のベストプラクティスとして言われるのが、RetrievalとGenerationを分離して評価すること。具体的には、まずRetrieval単体で検索性能指標(例えばリコール率)を出し、次にGenerationについて「正解への忠実性」や「出典利用の適切さ」を評価する、という二段構えです。前節で紹介したAmazon Bedrockの評価もまさにそれに沿っていますね。検索結果を提供しつつ、回答自体も参照回答と照合し、さらに引用の正しさを見る、と。 また、人間が評価する場合でも「回答中のどの部分がどの出典に対応するか」を確認することが推奨されます。モデルがちょっとでも引用外の知識を混ぜていたら、それは要注意(それが幻影 (hallucination)の萌芽かもしれない)です。最近ではRAGASというRAG専用評価フレームワークも登場し、LLMが回答根拠を適切に示しているかチェックしたりしています(例えば回答文を文ごとに分けて、それぞれ正しい出典に基づくかGPTに判定させる等)。 落とし穴として特によくあるのは、以下のようなケースでしょう: - ❌ 正解は持ってきたのに答え損ねた: モデルが文献から答えを見つけられなかった(複数文献にまたがっていたり、文章が難解で抽出がうまくいかないなど)。→ 対策: プロンプトを改善し「与えた資料内から答えて」と強調、あるいは文献をクリーンアップして簡潔化するなど。 - ❌ 検索結果に肝心な文献が入らなかった: Top-Kに答えのある文献が漏れた(検索ミス or トランスフォーマーのエンベディングが上手く行ってないなど)。→ 対策: ベクトル検索のパラメータ調整、chunkサイズ見直しで重要部分を含めるなど。 - ❌ 答えはあってるけど引用してない/間違った引用: 模範解答通り答えたのに出典を間違えたり付け忘れたり。→ 対策: 出力フォーマットを厳密に指示、テンプレを整備。Bedrockの評価指標(引用精度など)を活用。 - ❌ 質問意図とズレた文献を読んでしまった: 質問が曖昧でモデルがピントのずれた方向に検索・回答。→ 対策: 質問をリライトして明確化、またはユーザに再確認するなど。 - ❌ ハルシネーション: すべての元凶(?)。検索が不十分で知らないことを聞かれたとき、モデルが適当に埋め合わせ。→ 対策: 生成側で「知らないなら知らないと言う」方針を徹底(システムプロンプトや追加の拒否トリガなど)。 RAG評価の肝は、どこで失敗したかをちゃんと切り分けることです。Snorkel社のまとめによれば、RAGシステムの失敗要因の多くは「弱いドキュメント検索」「不明瞭なプロンプト指示」「モデルの幻影回答」に帰着します。逆に言えば、検索精度を上げ、プロンプト工夫でモデルの動きを制御し、定期的に人間の評価でチェックすれば大抵の問題は改善可能とのこと。これは心強いですね。 特にRAG系アプリを提供する場合、定期的な人間評価(Human in the loop)も提案しておくと安心です。自動評価は便利ですが、完全に万能ではありません。評価指標に表れない「なんか違和感あるぞ」という点を拾えるのは、やはり最後は人間の直感だったりしますから。 では続いて、いくつか個別の評価指標に話題を移しましょう。Perplexity、BLEU、ROUGEなど昔から使われている指標から、Faithfulness(忠実度)やToxicity(有害性)といった近年注目の指標まで、一通り整理します。5. 評価指標いろいろ:PerplexityからROUGE・Toxicityまで最新事情
LLM評価の世界には実に様々な指標(メトリクス)があります。ここでは代表的なものをいくつかピックアップし、その意味と現在の使われ方を解説します。● Perplexity(パープレキシティ)
まずはPerplexity。NLP界隈では古参の指標ですね。言語モデルがテキストをどれだけうまく予測できるかを示す値です。形式的には「モデルがテストデータに対して感じる困惑度」みたいに言われますが、簡単に言えば「モデルの予測が当たっていればいるほど低くなる。具体的にはモデルがある文に高い確率を割り当てていればPerplexityは下がり、予想外の単語に遭遇して低確率を割り当てると上がります。低いほど良い指標で、「モデルが次の単語をスラスラ当てられるなら困惑しない→Perplexity低い」ということです。 Perplexityは研究のベンチマークとしてよく使われてきました。モデルをトレーニングしたら、とりあえずWikiテキストやらでPerplexity測って「前より下がった=精度向上!」みたいに評価します。ただチャットモデル時代になってくると、会話調の応答でPerplexityを見る機会は減りました。なぜなら、人間の満足度と必ずしも比例しないからです。Perplexityが低い=言語的なつじつまは合いやすいですが、ユーザの意図に沿っているかとか有用かとかは別問題です。さらにLLMはときに自信満々に間違える(=内部では高確率を割り当てているがそれ自体事実と違う)ため、Perplexityでは測れない側面も多いのです。 現在では、基盤モデルのプリトレーニング評価くらいでしか直接は見かけません。ただ、間接的には今でも重要です。というのも、Perplexityの低減=モデルの言語知識向上ですので、優秀なモデルほど一般にPerplexityは低くなります。実際、OpenAIのGPT-3系列やGPT-4なども研究論文でPerplexityの劇的な低さをアピールしていたりします。まとめると、「Perplexityはモデルの教養レベル指標」ぐらいに思っておけばOKでしょう。● BLEUスコア & ROUGEスコア
次にBLEUとROUGE。これらは生成文と参照文の類似度を測る自動評価指標です。特に機械翻訳や要約など決まった正解がある程度想定できるタスクで使われてきました。仕組みは単純で、n-gram(一連の単語)の重なり具合をカウントします。 - BLEU: Precision志向。生成文に含まれる単語群のうち、どれだけ参照文にも出現したかを見る感じ。機械翻訳の評価用に開発され、候補文中のn-gramが参照訳文にどれだけ含まれるかを評価します。複数の正解訳を用意しておけば、完全一致しなくても言い回しの違いをある程度カバーできます。ざっくり「モデル訳に余計な単語がどのくらいないか」を見る指標とも言えます。 - ROUGE: こちらは名前にある通りRecall重視。特に要約評価でよく使われ、参照要約にある内容をどれだけ生成要約が拾えているかを測ります。ROUGE-Nはn-gramの包含率(どれだけ参照のn-gramを網羅したか)、ROUGE-Lは長い共通部分列(LCS)の長さに基づく指標など。要するに「人間要約の単語をモデル要約がどれだけ含んでる?」という観点ですね。 BLEUもROUGEも数値が高いほど参照に近いことを意味します。昔は機械翻訳コンテストで「BLEUが何点」なんて盛んに競われました。ただ、最近のLLM研究ではこれらの指標への依存は薄れています。理由は、LLMのアウトプットは多様で、一語一句合う必要がない場面が多いためです。「答えは同じだけど表現が違う」場合でもBLEU/ROUGEは低く出たりしますし、逆に中身スカスカでも単語だけ合ってればスコア出ちゃう抜け穴もあります。例えば要約タスクで、モデルが元文章のキーワードを適当に羅列しただけでもROUGEはそこそこ稼げることがあります。 そのため、2025年のLLM評価ではBLEU/ROUGEだけでは不十分という認識が広まっています。実際、LinkedInの記事でも「翻訳や要約にはBLEU/ROUGE有用だが、対話の複雑な挙動は評価できない」と指摘されています。今ではこれらに加えてBERTScore(意味ベクトル類似度)やBLEURT(学習ベース評価)なども使われたり、思い切ってLLM-as-a-judgeで人間評価に近いことをさせる方が信用される流れですね。 ただし、BLEU/ROUGEが全くの無用になったわけではありません。明確な正解文が存在するタスク、例えばコード生成(正解のコード片との一致を見る)や定型応答では今でも役立ちます。また複数システムの比較には客観的スコアとしてわかりやすいので、研究論文では一応ROUGE何点と報告したりします。要約の事前評価にROUGEでフィルタした後、人間評価するなんてワークフローもあります。● Faithfulness(忠実度)
Faithfulness(忠実性)は、先ほどからもちょくちょく出ていますが「与えられた情報ソースや文脈に対してどれだけ出力が忠実か」を示す概念です。要するに内容の正確さ・一貫性ですね。これは数値にしづらいんですが、最近はLLMにチェックさせる方法が台頭しています。「この回答は与えた文章の内容に沿っていますか?」と別のLLMに尋ね、スコア化する手法などです。Bedrock EvaluationsにもFaithfulness指標が含まれており、例えば生成した要約が元文に忠実かどうかなどを見てくれます。 他にも研究界隈ではConsistency(整合性)やFactuality(事実正確性)という言葉も使われます。具体的な計算方法としては、QAベース評価が知られます。元文からクイズを作り、生成結果から答えさせて一致するか見る、といったアプローチです。例えば要約の忠実性評価では、要約と元記事それぞれから質問を作り合い、それに答えさせて比べるQ^2という手法が提案されています。 実務では、Hallucination検出の文脈でFaithfulness評価が使われます。企業の検証では、モデルの回答がソースに無い情報を含んでいた割合=不忠実度として測定し、モデル選定の指標にすることがあります。「我が社のカスタムGPTは競合モデルよりFaithfulness 5%向上し、幻影回答を減らしました」みたいにアピールする感じですね。 要注意なのは、Faithfulnessスコアが高い=有用とも限らない点です。極端な話、忠実すぎて与えた文章を丸写しするだけでは、それは要約タスクなら高Faithfulnessでも要約としては良くないですよね。この辺りバランスを見るため、他の指標(簡潔さや網羅性など)と併せて評価する必要があります。結局、複数次元での評価が求められるゆえに、LLM審査員のようなマルチスコアが活躍するわけです。● Toxicity・Harmfulness(有害性)
最後にToxicity(毒性)指標です。これはモデルの出力に攻撃的・差別的・不適切な表現が含まれるかを数値化したものです。Jigsaw社のPerspective APIが提供するToxicityスコアが有名で、0~1で「どれだけ毒があるか」を出します。例えば汚い罵倒言葉満載なら0.9とか、高圧的だと0.7とか、そのくらい。多くのLLMサービスでフィルタリングに使われています。 LLMの評価という意味では、安全性評価の一環としてToxicity低減が目標になります。AnthropicやOpenAIのモデルカードを見ると、toxicity分類器でのスコア比較や、人間評価での有害返答率などが報告されています。Amazon Bedrock EvaluationsでもHarmfulness(有害性)指標が組み込まれており、暴言や差別発言がないかを審査員がチェックしてくれます。これに限っては「低ければ低いほど良い」指標ですね。他の指標(正確さ等)は高いほど良いのが多いですが、Toxicityだけは逆です。 昨今のLLMではToxicityゼロを目指すのではなく、必要な場面ではしっかり有害発言を拒否できることが重視されます。「罵倒して」とユーザに言われたときにToxicityスコア高めの罵倒を生成するのは望ましくない(てかダメ)ので、拒否応答が出ればOK。その意味で、拒否率や不適切応答率なども評価指標となります。 ちなみに、偏見・差別(Bias)関連の安全指標もここに含めることが多いです。「政治家Aについていいことだけ言って、Bは悪く言う」とかモデルの出力に偏りがないか、人種や性別に関するステレオタイプを助長しないか、などの評価ですね。定量化は難しいですが、特定のテストプロンプト集での応答を分析して「バイアスの兆候なし」と結論づけるなどの手法があります。 まとめると、Toxicity/Harmfulnessはモデルの人格評価みたいなもので、ユーザに害を与えない応答ができているかを見る指標です。フリーランスでシステム開発する際も、この観点を無視すると後々大問題になりかねません。幸いAPI等で自動チェックできますので、リリース前にToxicity検査を組み込むのがおすすめです。以上、主要な指標を駆け足で紹介しました。要するに、「性能評価」と一口に言っても多面的なんですね。Perplexityで基礎力を見て、BLEU/ROUGEでベーシックなタスク成功率を見て、Faithfulnessで事実の一致を見る、Toxicityで安全性を見る…と、目的に応じて指標を組み合わせるのが現状のベストプラクティスです。 最後に、モデル活用における実装面の最新テクニックを紹介して締めましょう。モデルを評価・改良したら、次は効率よく回すことが大事ですからね。
6. 実装効率化テクニック:プロンプトキャッシュでコスト&レスポンス最適化
LLMを使ったアプリ開発では、応答速度とコストが頭の痛い問題です。高性能モデルほど計算コストが高く、レスポンスも遅くなりがち。そこで最近注目なのがプロンプトキャッシュ(Prompt Caching)という技術です。簡単に言えば、「毎回同じプロンプト部分にモデルが何度も処理時間を割くのは無駄だから、そこをキャッシュしておこう」という発想です。 Amazon Bedrockは2024年末にこのPrompt Cachingをプレビュー導入し、2025年4月に一般提供を開始しました。例えばチャットボットで毎回共通のシステムプロンプト(規約や性格設定など)を先頭に付けている場合、それって毎回同じ計算しますよね?そこを一度計算して保存しておけば、次からはそこを再利用できるじゃないか、と。Bedrockの実装ではキャッシュ可能な連続トークン列(プロンプト接頭辞)を指定でき、チェックポイントとしてモデル内部状態を保持してくれます。次に同じ接頭辞が来たら、その内部状態から計算続きを始めるので大幅に高速化できるのです。 効果は絶大で、AWSによればコスト最大90%削減・レイテンシ最大85%短縮とのこと。特に長い文書を与えてその上で何度も質問するようなアプリ(例: ドキュメントQ&A)では、文書部分の処理をキャッシュできるので超高速化が可能です。またコードアシスタントなどで「前の対話履歴はそのままにちょっと追加質問」という場合も、履歴部分をキャッシュして差分だけ処理すればいい。 実はこの「プロンプトキャッシュ」、裏ではなかなか凝ったことをしています。モデルの内部隠れ状態をそのまま保存する必要があるため、ユーザごとに隔離された一時記憶を持ち、例えばClaude 3.5なら1024トークンごとにチェックポイントを置ける(小さいpromptは逆にコスト増なので一定以上で可能になる)など、モデル依存の制約もあるようです。またキャッシュは基本的に短時間(Bedrockではデフォルト5分)で消えるようになっています。これは、ずっと残しておくとメモリを圧迫しますし、セキュリティ上もセッション内の一時利用に留めるべきという判断ですね。Bedrockでは5分間再利用がなければキャッシュ削除、逆に使われ続ければタイマーリセットのスライディングウィンドウ方式です。 Prompt Cachingを使うかどうかはコスト・速度と要件次第です。リアルタイム性が重要で共通コンテキストが多いならぜひ使いたい。一方、ユーザごとの対話を長時間維持するチャットでは5分で消えるキャッシュでは不十分かもしれません(5分以上間が空くと効果なくなる)。その場合、独自に会話IDごとにLLMの最後の隠れ状態を保存する、といった実装も考えられますが、現状一般にはAPI経由ではそこまでできません。将来的には「前回の続きをこの隠れ状態からどうぞ」なんてAPIが出てくる可能性もありますね。 BedrockのPrompt CachingはAnthropicのClaude 3.5/3.7や自社モデルTitan系(Nova)でサポート。例えばClaude 3.5 Haikuなら1会話に最大4箇所までチェックポイント可。キャッシュが効けば同じ入力部分は一瞬で処理通過するので、ユーザ体感もかなり速くなります。私も試しましたが、大きなシステムプロンプトを与えてその後小さなユーザ質問を何度もするとき、2回目以降の応答が明らかにキビキビしました。 実装の際は、「どこからどこまでをキャッシュ対象にするか」がポイントです。Bedrockではプロンプトをタグで囲う形で指定します(例えばシステムメッセージ全体をキャッシュ、ユーザ質問以降は都度処理)。カジュアルに言えば、RPGゲームでボス前にセーブポイント置いとく感じですね。「よし、長い前置き終わったしセーブ!(キャッシュ)」→「さぁ質問1…2…」→(5分経過したら消えるので)「続き聞きたい?じゃ改めて前文投げ直すか次の質問早めにね」みたいな。 他の効率化テクとしては分岐ルートのキャッシュもあります。例えばユーザ入力によっては大部分共通だけど一部違う応答をするパターンが多数あるなら、木構造的に中間生成をキャッシュする発想です。これは研究段階ですが、将来的には「似たプロンプトなら過去の応答流用」なんてこともあり得ます。実際、社内でFAQボット作ったら人気質問はパターン化しますから、質問embeddingで類似検索して過去回答を返す(もはや生成しない)なんて荒技もPrompt Cacheの親戚と考えればそうですね。俗にプロンプト辞書とかResponse Memoryとか呼ばれています。🚀 ケーススタディ:Bedrock Prompt Cachingの威力AWSの発表によると、Prompt Cachingを活用することで最大90%のコスト削減が見込めるそうです。例えば1リクエスト100トークンのシステムプロンプト+ユーザ質問10トークンの場合、普通は毎回110トークン分処理しますが、キャッシュを効かせれば初回110、その後は10トークン分だけで済みます。モデル推論コストはおおむねトークン数比例なので、単純計算で約91%削減ですね。もちろんキャッシュ保存・読み込みにも僅かなオーバーヘッドがありますが、それを差し引いても大幅な効率化です。「塵も積もれば山となる」で、商用サービスでは月のAPI使用料が桁違いに下がる可能性もあります。 -最後に、Intelligent Prompt Routingにも触れておきましょう。Bedrockではキャッシュと並んで自動モデル切替の機能もプレビュー導入中です。これは「簡単な問い合わせは小型モデルに任せ、難しいのは大型モデルに振る」というもの。前処理でプロンプト難易度を推定し、例えば「お天気教えて」程度なら安価で高速なモデルに回答させ、「文章翻訳して」みたいに高品質が求められるときは高性能モデルに回す、といったことができます。これもコスト30%節約など効果が見込めます。まさに人間のチームのようにLLMを使い分ける時代ですね。