本文へ移動

ホーム / ML / 第2部 機械学習の基礎

第2部 機械学習の基礎・第4章

LLM と生成 AI のアプリ

★★★ 必須12トピック・面接 6問

LLM をサービスに組み込むための技術を押さえる。

ひとことで

質問に関係する文書を検索して LLM に渡し、根拠のある回答をさせる。検索の質が答えの質を決める。

RAG(Retrieval-Augmented Generation、検索拡張生成)は、質問に関係する文書を先に検索し、それを LLM に「この資料をもとに答えて」と渡す方法です。LLM が学習していない社内の情報や新しい情報でも答えられ、根拠の文書を示せます。逆に言えば、正しい文書が検索で見つからなければ、どんなに良い LLM でも正しく答えられません。

準備で文書を検索できる形にし、質問のたびに探して LLM に渡す準備(最初と、文書が変わったとき)文書PDF・Wiki などチャンクに分割見出しで区切る埋め込みベクトルにするベクトル DB索引に保存質問のたび質問検索意味+キーワード再ランキング上位を並べ直すLLM資料をもとに回答回答引用元つき答えの質は、正しいチャンクが検索の上位に入るかでほぼ決まる
RAG の流れ

基本の流れ:

[準備] 文書 → チャンクに分割 → 埋め込み(ベクトル化)→ ベクトル DB に保存
[質問] 質問 → 埋め込み → 似たチャンクを検索 → 再ランキング → 上位を LLM に渡して回答
段階詳しくは
文書をチャンクに分けるチャンク分割
埋め込みとベクトル検索埋め込みとベクトル検索
キーワード検索との組み合わせ・並べ直しハイブリッド検索と再ランキング
評価LLM アプリの評価

生成の側:プロンプトで「資料にないことは分からないと答える」「根拠の文書を示す」と指示し、引用元を画面に出します。これでハルシネーション(もっともらしい作り話)を減らし、利用者が確かめられるようにします。

よくある失敗:表や PDF の段組みが崩れたまま取り込んでいる、古い版と新しい版の文書が両方ヒットする、質問が短すぎて検索が外れる。回答を直す前に、まず「正しいチャンクが上位に入っているか」を確かめます。

面接ではこう答える

RAG は、質問に関係する文書を先に検索して、それを LLM に渡して答えさせる方法です。LLM が知らない社内の情報や新しい情報でも答えられ、根拠の文書を示せるのが利点です。流れは、文書をチャンクに分けて埋め込みにしてベクトル DB に入れておき、質問が来たら似たチャンクを検索し、再ランキングして上位を LLM に渡します。正しい文書が検索で見つからなければ正しく答えられないので、改善はまず検索の質から見ます。

別のページで開く →

DBラボを読み込んでいます…

4.2チャンク分割

用語★★★ 必須
ひとことで

文書を検索の単位に切ること。大きさ・切る場所・重なり・見出しの付け方で検索の質が変わる。

チャンクは、文書を検索の単位に切ったものです。チャンクの切り方で、検索で見つかるかどうかが大きく変わります。

見出し・段落で切り、前後を少し重ね、チャンクに見出しを付ける文書:第1章 返品の条件 / 第2章 返金の方法 / 第3章 送料 …[返品の条件]本文…[返金の方法]本文…[送料]本文…重なり(オーバーラップ)で、境目で文脈が切れるのを防ぐ
チャンク分割:見出しで切り、少し重ねる
決めること目安・考え方
大きさ数百〜1000トークン程度から試す。短すぎると文脈が切れ、長すぎると関係ない部分が混ざって似ている度合いがぼやける
切る場所見出し・段落・箇条書きの区切りで切る。文の途中では切らない
重なり前後を 1〜2割ほど重ねて、境目で情報が切れるのを防ぐ
付け足す情報文書名・見出し・更新日をチャンクの先頭やメタデータに付ける。検索でも絞り込みでも効く
表・PDF段組みや表が崩れていないかを取り込みの後に目で確かめる。表は行ごとに文章にする方法もある

正解は文書の種類で違うので、いくつかの切り方で Recall@K(正しいチャンクが上位 K 件に入る割合)を比べて決めます。切り方を変えたら、埋め込みも作り直します。

面接ではこう答える

チャンク分割は、RAG で文書を検索の単位に切る作業です。短すぎると文脈が切れ、長すぎると関係ない内容が混ざって検索がぼやけるので、数百から千トークン程度で、見出しや段落の区切りで切り、前後を少し重ねます。チャンクに文書名や見出しを付けると検索しやすくなります。最終的には、いくつかの切り方で正しいチャンクが上位に入る割合を比べて決めます。

ひとことで

文章などを、意味が近いほど距離が近くなる数の列(ベクトル)に変えたもの。近いベクトルを探すのがベクトル検索。

埋め込み(embedding)は、文章を「意味が近いほど近くなる」数の列(ベクトル)に変えたものです。質問とチャンクを同じモデルで埋め込み、質問に近いチャンクを探すのがベクトル検索です。言い回しが違っても意味が近ければ見つかるのが強みです。

意味が近い文章ほど、ベクトルの空間で近くに並ぶ送料について会社の沿革返品の条件返金の方法採用情報質問:返品したい埋め込み文章 → 数百〜数千次元の数の列似ている度合いコサイン類似度・内積近似の索引(ANN)HNSW など。速さと漏れの交換
埋め込みとベクトル検索(2次元にしたイメージ)
決めること考え方
埋め込みのモデル日本語に強いものを選ぶ。自分の文書と質問で Recall@K を比べて決める。モデルを変えたら全部作り直す(混ぜない)
似ている度合いコサイン類似度か内積。モデルの説明に合わせる
索引件数が多いと全件と比べるのは遅いので、近似の索引(HNSW・IVF など)を使う。速いが、少し取りこぼすことがある
保存先専用のベクトル DB、または pgvector で PostgreSQL の中に置く。件数が数百万程度までなら既存の DB で足りることも多い
権限利用者が見られない文書は、検索の段階でメタデータの条件で除く

埋め込みは推薦(似た商品)・重複の検出・分類の特徴量にも使えます。下の DB ラボで、pgvector を使った近いもの探しを試せます。

面接ではこう答える

埋め込みは、文章や商品を、意味が近いほど近くなるベクトルに変えたものです。質問とチャンクを同じモデルで埋め込み、コサイン類似度などで近いものを探すのがベクトル検索で、言い回しが違っても意味が近ければ見つかります。件数が多いと全件と比べるのは遅いので、HNSW のような近似の索引を使い、速さと取りこぼしの少なさを調整します。埋め込みのモデルを変えたら全件を作り直す必要があります。

別のページで開く →

DBラボを読み込んでいます…

ひとことで

ベクトル検索とキーワード検索を組み合わせて候補を拾い、精度の高いモデルで並べ直す2段構えの検索。

ベクトル検索は意味の近さに強い一方、型番・人名・エラーコードのような固有の文字列は苦手です。そこで、キーワード検索(BM25:単語の出現の多さと珍しさで点数を付ける方法)と組み合わせるのがハイブリッド検索です。

広く速く拾ってから、精度の高いモデルで並べ直すベクトル検索意味が近いものキーワード検索BM25:型番・人名順位で混ぜるRRF など・約50件再ランキング質問と一緒に読む上位5件程度検索は速さ重視、再ランキングは精度重視。LLM に渡すのは少数に絞る
ハイブリッド検索と再ランキングの2段構え
段やること注意点
候補を拾うベクトル検索とキーワード検索で、それぞれ上位 数十件を取る取りこぼさないことを優先する
混ぜる2つの結果を順位で混ぜる。RRF(各結果の順位の逆数を足し合わせる方法)がよく使われる点数の尺度が違うので、点数をそのまま足さない
再ランキング質問と文書を一緒に読むモデル(クロスエンコーダーなど)で候補を並べ直す精度は高いが重いので、候補を数十件に絞ってから使う
渡す上位 5件程度を LLM に渡す多く渡すと費用が増え、関係ない内容に引っぱられる

改善の効果は、評価データの Recall@K や NDCG で、ベクトル検索だけの場合と比べて確かめます。

面接ではこう答える

ハイブリッド検索は、意味の近さに強いベクトル検索と、型番や人名のような固有の文字列に強い BM25 などのキーワード検索を組み合わせる方法です。2つの結果は点数の尺度が違うので、RRF のように順位で混ぜます。そのうえで、質問と文書を一緒に読む再ランキングのモデルで候補を並べ直し、上位の数件だけを LLM に渡します。検索は速さ、再ランキングは精度、と役割を分けるのがポイントです。

ひとことで

LLM への指示の文章。役割・ルール・例・データ・出力形式に分けて組み立て、評価で比べながら直す。

LLM の振る舞いを変える一番手軽な方法がプロンプトです。思いつきで書き足していくと、どこが効いているか分からなくなるので、部品に分けて組み立て、評価データで比べながら直すのが基本です。

プロンプトは、決まった部分と毎回変わる部分を分けて組み立てる役割と目的あなたは社内ヘルプデスクの担当です指示とルール資料にないことは「分かりません」と答える例(few-shot)入力と理想の出力を2〜3組データ<資料> 検索したチャンク </資料> + 質問出力の形式JSON の形(スキーマ)を指定して検証する上の3つは毎回同じ(キャッシュしやすい)。データだけが毎回変わる
プロンプトの組み立て
こつ理由
外から来た文章は区切り(タグなど)で囲み、「データ」として渡す指示と取り違えにくくし、プロンプトインジェクションを減らす
良い例・悪い例を数件見せる(few-shot)言葉で説明するより形式や判断の基準が伝わりやすい
出力は JSON などの決まった形にし、受け取った側で検証するプログラムで扱え、壊れた出力を検知できる。構造化出力の機能があれば使う
温度(ランダムさ)は、抽出・分類なら低くする同じ入力で答えがぶれにくくなる
プロンプトもコードとして版を管理する変えた前後を評価で比べ、戻せるようにする

面接ではこう答える

プロンプトは、役割、ルール、数件の例、毎回変わるデータ、出力の形式に分けて組み立てます。外から来た文章はタグなどで区切ってデータとして渡し、出力は JSON のような決まった形にして受け取った側で検証します。抽出や分類のように答えが決まる作業は温度を下げてぶれを減らします。プロンプトもコードと同じように版を管理し、変えるたびに評価データで点数を比べます。

ひとことで

知識を足すなら RAG、話し方や形式を合わせるならファインチューニング。まずプロンプトで十分か確かめる。

LLM の振る舞いを変える方法は、手軽な順に「プロンプトの工夫 → RAG → ファインチューニング(追加学習)」です。まずプロンプトと数件の例(few-shot)で十分かを確かめるのが原則で、それで足りない部分だけ次に進みます。

手軽な順に試し、足りない部分だけ次に進むプロンプト数時間で試せるRAG知識を足す・更新しやすいファインチューニング形式・口調・安く速く手軽・安いデータと手間が要る
手軽な順に試す
やりたいこと向いている方法理由
社内文書・最新の情報で答えさせたいRAG文書を差し替えるだけで更新でき、根拠も示せる。学習で知識を入れると更新しにくく、間違いも直しにくい
出力の形式・口調・書き方を安定させたいまずプロンプト、だめならファインチューニング例をたくさん見せて「型」を覚えさせるのは学習が得意
特定の分類・抽出を安く速く大量にこなしたい小さいモデルのファインチューニング大きいモデルの出力を教師にして、小さいモデルに覚えさせるとコストが下がる
少し試したい・データがまだないプロンプト数時間で試せる。評価データを作る間の基準にもなる

注意点:ファインチューニングには、質の良い学習データ(数百〜数千件の入力と理想の出力の組)と、学習の前後を比べる評価データが必要です。学習で元の能力の一部を忘れることがあるので、狙った以外の能力も評価します。使うモデルのライセンスと、API の場合は利用規約で学習が許されているかを確認します。

面接ではこう答える

LLM の振る舞いを変える方法は、手軽な順にプロンプト、RAG、ファインチューニングです。社内文書や最新の情報で答えさせたいなら、文書を差し替えるだけで更新でき根拠も示せる RAG が向いています。出力の形式や口調を安定させたい、特定の分類や抽出を小さいモデルで安く速くこなしたい、という場合はファインチューニングが向きます。どちらの場合も、まずプロンプトで十分かを評価データで確かめてから進みます。

4.7LoRA と QLoRA

用語★★☆ 重要
ひとことで

元の重みを固定し、小さな追加の行列だけを学習するファインチューニングの方法。必要な GPU メモリが大きく減る。

LoRA:元の重みは固定し、小さな2つの行列だけを学習して足し合わせる入力元の重み W(固定)d × d の大きな行列A(学習)d → rB(学習)r → d+出力r(ランク)は小さい値(例:8 や 16)。学習する量はごく一部で、追加分は用途ごとに付け替えられる
LoRA の仕組み

LoRA など:LLM の全部の重みを学習し直すのは、GPU のメモリも時間も大量に必要です。LoRA(Low-Rank Adaptation)は、元の重みは固定したまま、小さな追加の行列だけを学習する方法で、学習する重みの数が元のごく一部になります(LoRA の論文の GPT-3 の例では、学習する数が約1万分の1、GPU のメモリが約3分の1)。必要な GPU が減り、追加分のファイルも小さいので、用途ごとに付け替えられます。元のモデルを4ビットなどに量子化してから LoRA で学習する QLoRA もあります。

面接ではこう答える

LoRA は、LLM の元の重みは固定したまま、各層に小さな低ランクの行列を足して、それだけを学習する方法です。学習する重みの数が元のごく一部になるので、必要な GPU メモリと時間が大きく減り、追加分のファイルも小さいので用途ごとに付け替えられます。元のモデルを4ビットなどに量子化してから LoRA で学習する QLoRA を使うと、さらに少ないメモリで学習できます。

4.8LLM アプリの評価

用語★★★ 必須
ひとことで

正解が1つでないので、評価データ・LLM による採点・人の確認を組み合わせる。

LLM アプリは、同じ質問でも答え方がいくつもあり、「正解と完全に一致するか」では測れません。そのため、評価データ・自動の採点・人の確認を組み合わせます。評価の仕組みがないと、プロンプトやモデルを変えたときに「良くなった気がする」で判断することになり、どこかが静かに悪くなっても気づけません。

安く確実なものから順に重ね、人の確認は抜き取りでルール・コード形式・必須の語・分類の正解全件に安くLLM による採点正確さ・根拠に沿っているか基準を具体的に書く人の確認抜き取りで新しい失敗を見つける採点の基準を見直す評価データ:実際のよくある質問・難しい質問・答えのない質問・意地悪な入力模範回答より「含むべき事実」「言ってはいけないこと」「根拠の文書」を付けると採点しやすい
LLM アプリの評価の3つの層

評価データの作り方:

  • 実際の利用から集める:本番やテスト利用のログから、よくある質問・難しい質問・失敗した質問を拾います。まず 50〜200件でも十分役に立ちます。
  • 期待する答えか、採点の基準を付ける:模範回答そのものより、「必ず含むべき事実」「言ってはいけないこと」「根拠にすべき文書」を書くほうが採点しやすいです。
  • 種類をそろえる:答えのない質問(「分かりません」が正解)、意地悪な入力、長い入力も入れます。
  • LLM で質問を作って水増しすることもできますが、人が目を通して、実際の利用と似ているかを確かめます。
採点の方法向いているもの注意点
ルール・コード形式(JSON として正しいか)・必須の語が入っているか・分類の正解安く確実。まずここで測れるものは測る
LLM による採点(LLM-as-a-judge)正確さ・根拠に沿っているか・丁寧さ採点の基準を具体的に書く。長い答えを好む・自分の出力を甘く採点する傾向がある。人の採点と一致するかを一部で確かめる
人の確認最終的な品質・新しい種類の失敗高いので抜き取りで。採点の基準を作り直す材料にする

面接ではこう答える

LLM アプリは正解が1つに決まらないので、評価データ、自動の採点、人の確認を組み合わせて評価します。評価データは実際の利用ログから、よくある質問、難しい質問、答えのない質問を集め、含むべき事実や根拠の文書を付けます。採点は、形式のようにコードで判定できるものはコードで、正確さや根拠への忠実さは LLM に採点させ、その採点が人の判断と一致するかを一部で確かめます。

ひとことで

プロンプト・モデル・検索の設定を変えるたびに、同じ評価データで自動の評価を流し、悪くなった項目を確かめてから出すこと。

評価データを回帰テストとして、変更のたびに流す変更プロンプト・モデル・検索評価データで採点ルール・LLM・人前回と比べる下がった項目を見る判定出す/止める本番新しい失敗を見つける見つけた失敗を評価データに足す
回帰テストとしての評価

回帰テストとしての評価:評価データは、普通のソフトウェアのテストと同じように使います。プロンプト・モデル・検索の設定・チャンクの切り方を変えるたびに、CI などで評価を流し、点数が前回より下がった項目を確認してから出します。モデルの提供元が版を更新したときも同じです。本番で見つかった失敗は評価データに足し、同じ失敗を二度出さないようにします。LLM の出力はばらつくので、温度を下げる・数回流して平均を見る、などで比較を安定させます。

RAG では、検索(正しい文書が上位にあるか:Recall@K)と生成(渡した文書に沿って正しく答えたか)を分けて採点すると、どちらを直せばよいか分かります。

面接ではこう答える

評価データは普通のソフトウェアのテストと同じように使います。プロンプト、モデル、検索の設定、チャンクの切り方を変えるたびに CI などで評価を流し、点数が下がった項目を確認してから出します。提供元がモデルの版を更新したときも同じです。RAG では検索と生成を分けて採点すると、どちらを直せばよいか分かります。本番で見つかった失敗は評価データに足して、同じ失敗を二度出さないようにします。

ひとことで

プロンプトインジェクション・情報漏えい・ハルシネーションへの対策と、トークンのコスト管理。

LLM アプリには、普通の Web アプリにない危険があります。代表的なものと対策です。

LLM がだまされても大きな被害にならないよう、何段かで守る入力入力のチェック攻撃・不適切検索権限で絞るLLM権限は最小出力のチェック形式・個人情報送金・削除など人が確認する外から来た文章(入力・検索した文書)は「データ」として区切って渡すどの段も完全ではないので、重ねて使う
ガードレールを重ねる
危険対策(ガードレール)
プロンプトインジェクション:入力や検索した文書に「前の指示を無視して…」と書かれ、従ってしまう外から来た文章は「データ」として区切って渡す。LLM に渡す権限(実行できる操作・読めるデータ)を必要最小限にする。送金・削除などは人の確認を挟む
情報漏えい:見せてはいけない文書や個人情報が答えに出る検索の段階で利用者の権限で絞る(プロンプトで「見せるな」と頼るのは不十分)。ログに個人情報を残さない・マスクする
ハルシネーション:もっともらしい誤りRAG で根拠を渡し、引用を示す。分からないときは分からないと答えさせる。重要な用途では人が確かめる
不適切な出力入力と出力の両方を分類器やルールで確認する。出力の形式を JSON などで決めて検証する

どの対策も完全ではないので、「LLM がだまされても大きな被害にならない設計」にしておくのが基本です。

面接ではこう答える

LLM アプリには、プロンプトインジェクション、情報漏えい、ハルシネーション、不適切な出力といった危険があります。プロンプトインジェクションは、入力や検索した文書に書かれた指示に LLM が従ってしまうことで、外から来た文章をデータとして区切る、LLM に渡す権限を最小限にする、取り消せない操作には人の確認を挟む、で守ります。情報漏えいは、プロンプトで頼るのではなく、検索の段階で利用者の権限で絞ります。どの対策も完全ではないので、だまされても大きな被害にならない設計を基本にします。

4.11LLM のコスト管理

用語★★★ 必須
ひとことで

LLM の料金は入力と出力のトークン数で決まる。モデルの使い分け・キャッシュ・トークン削減・上限で管理する。

費用 =(入力トークン × 単価 + 出力トークン × 単価)× 回数モデルを使い分ける簡単な処理は小さくキャッシュ同じ答え・同じ先頭部分トークンを減らす渡す文書・履歴・上限見える化と上限機能別の費用・回数制限まず機能ごと・利用者ごとのトークン数を記録し、どこが高いかを測ってから手を打つ
LLM の費用の式と、下げるつまみ

コストの管理:料金は、おおむね「入力トークン数+出力トークン数(出力のほうが単価が高いことが多い)」で決まります。

  • モデルの使い分け:分類・抽出・言い換えのような簡単な処理は小さく安いモデル、難しい推論だけ大きいモデルにします。最初に小さいモデルで振り分けるルーティングも使えます。
  • キャッシュ:同じ質問への答えを保存して使い回します。毎回同じ長いシステムプロンプトを送る場合は、提供元のプロンプトキャッシュ(毎回同じ先頭部分の処理を使い回し、その分の料金と待ち時間を下げる仕組み)が使えるか確認します。対象になる最小の長さ・保存される時間・割引の率は提供元ごとに違うので、それぞれの説明を確かめます。
  • トークンを減らす:渡す文書を必要な分だけにする、会話の履歴を要約する、出力の上限(max tokens)を決める。
  • 見える化:機能ごと・利用者ごとのトークン数と費用を記録し、1日の上限やレート制限を設けます。ループするエージェントは、呼び出し回数の上限を必ず付けます。

面接ではこう答える

LLM の料金は、おおむね入力と出力のトークン数に単価を掛けたもので、出力のほうが単価が高いことが多いです。下げる方法は、簡単な処理を小さいモデルに回す使い分け、同じ答えやプロンプトの先頭部分のキャッシュ、渡す文書や会話の履歴を減らすこと、出力の上限の設定です。そのうえで、機能ごとや利用者ごとの費用を記録し、1日の上限や回数の制限を設けます。ループするエージェントには呼び出し回数の上限を必ず付けます。

ひとことで

LLM がツール(検索・DB・API)の呼び出しを選び、アプリが実行した結果を見て次を考える、をくり返す仕組み。

LLM に「使える道具(ツール)」の名前と引数の形を教えておくと、LLM は必要に応じて「この引数でこのツールを呼んで」と返します。アプリがそれを実行して結果を返し、LLM が続きを考えます。これを何度もくり返して作業を進める仕組みをエージェントと呼びます。

LLM は「どのツールをどう呼ぶか」を提案し、実行はアプリが行う利用者依頼LLMツールと引数を選ぶアプリがツールを実行検索・DB・API(権限は最小)呼び出し結果終わるまでくり返す(回数の上限を必ず付ける)取り消せない操作送金・削除は人が確認
ツール呼び出しのループ(実行するのはアプリ側)
設計の要点理由
ツールの権限を最小にする(読むだけ・自分のデータだけ)LLM がだまされても被害を小さくする
取り消せない操作は人の確認を挟む誤った引数や意図しない実行を止める
くり返しの回数・時間・費用に上限を付けるループが止まらず費用が膨らむのを防ぐ
ツールの入力を検証するLLM の出した引数をそのまま信じない
途中の手順をすべて記録するどこで間違えたかを後から追えるようにし、評価データにも使う

評価は、最終の答えだけでなく、正しいツールを正しい順で呼んだか、無駄な呼び出しがないかも見ます。まずは手順が決まった処理(固定のワークフロー)で足りないかを考え、本当に判断が必要な部分だけエージェントにするのが安全です。

面接ではこう答える

エージェントは、LLM に使えるツールの名前と引数の形を教えておき、LLM が選んだツールをアプリが実行して結果を返す、というくり返しで作業を進める仕組みです。実行するのはアプリ側なので、ツールの権限を最小にし、引数を検証し、取り消せない操作には人の確認を挟みます。くり返しの回数や費用には上限を付け、途中の手順を記録して評価にも使います。手順が決まった処理なら、固定のワークフローのほうが安全で安いことも多いです。

この章のまとめ

🖨 まとめシート(印刷・PDF)
  • プロンプト・RAG・ファインチューニングの使い分け
  • LLM のアプリの評価・安全性・コスト
  • RAG(検索と組み合わせる)の全体像:質問に関係する文書を検索して LLM に渡し、根拠のある回答をさせる。検索の質が答えの質を決める。
  • チャンク分割:文書を検索の単位に切ること。大きさ・切る場所・重なり・見出しの付け方で検索の質が変わる。
  • 埋め込みとベクトル検索:文章などを、意味が近いほど距離が近くなる数の列(ベクトル)に変えたもの。近いベクトルを探すのがベクトル検索。
  • ハイブリッド検索と再ランキング:ベクトル検索とキーワード検索を組み合わせて候補を拾い、精度の高いモデルで並べ直す2段構えの検索。
  • プロンプトの設計と構造化出力:LLM への指示の文章。役割・ルール・例・データ・出力形式に分けて組み立て、評価で比べながら直す。
  • ファインチューニングとの使い分け:知識を足すなら RAG、話し方や形式を合わせるならファインチューニング。まずプロンプトで十分か確かめる。
  • LoRA と QLoRA:元の重みを固定し、小さな追加の行列だけを学習するファインチューニングの方法。必要な GPU メモリが大きく減る。
  • LLM アプリの評価:正解が1つでないので、評価データ・LLM による採点・人の確認を組み合わせる。
  • 評価を回帰テストとして回す:プロンプト・モデル・検索の設定を変えるたびに、同じ評価データで自動の評価を流し、悪くなった項目を確かめてから出すこと。
  • 安全性とガードレール:プロンプトインジェクション・情報漏えい・ハルシネーションへの対策と、トークンのコスト管理。
  • LLM のコスト管理:LLM の料金は入力と出力のトークン数で決まる。モデルの使い分け・キャッシュ・トークン削減・上限で管理する。
  • ツール呼び出しとエージェント:LLM がツール(検索・DB・API)の呼び出しを選び、アプリが実行した結果を見て次を考える、をくり返す仕組み。

この章のクイズ

面接ではこう聞かれる

まず答えを見ずに声に出して答え、そのあと開いて比べる。

Q1RAG の回答の質が悪いとき、どこを改善しますか?

模範回答

まず、検索と生成のどちらが悪いのかを分けて調べます。評価データの質問ごとに、正解の根拠になる文書が検索の上位に入っているか(Recall@K)を見ます。入っていなければ検索の問題で、チャンクの大きさや区切り方、見出しの付け方、埋め込みのモデル、固有名詞が多ければキーワード検索との併用、上位候補の再ランキングを順に試します。そもそも文書が正しく取り込めていない(表や PDF が崩れている)こともよくあります。

正しい文書が渡っているのに答えが悪いなら生成の問題で、プロンプトの指示、渡す件数や順番、モデルの選び方を見直します。どちらも、変更のたびに同じ評価データで点数を比べて、良くなったことを確かめてから出します。

深掘りされたら

  • 検索の評価用に、正解の文書をどうやって用意しますか?

見られているポイント検索(チャンク・埋め込み・再ランク)と生成を分けて評価

Q2チャンクの大きさは、どう決めますか?

模範回答

決まった正解はないので、評価データで比べて決めます。出発点としては、数百〜1000トークン程度で、見出しや段落の区切りで切り、前後を少し重ねます。短すぎると答えに必要な文脈が切れ、長すぎると関係のない部分が混ざって、検索の精度も LLM の答えも悪くなりやすいです。

文書の種類でも変えます。FAQ なら1問1答で1チャンク、マニュアルなら節ごと、表は行を崩さないように切ります。チャンクに文書名や見出しを付けておくと、検索で見つけやすくなります。

深掘りされたら

  • チャンクを小さく検索して、大きく渡す方法を知っていますか?

見られているポイント評価で決める・短すぎと長すぎの問題・文書に合わせた切り方

Q3プロンプトインジェクションとは何ですか?どう守りますか?

模範回答

入力や、検索で取ってきた文書・Web ページの中に「前の指示を無視して〇〇せよ」のような文が入っていて、LLM がそれに従ってしまう攻撃です。LLM は指示とデータを厳密には区別できないので、完全に防ぐ方法はまだありません。

そのため、だまされても被害が小さい設計にします。LLM に渡す権限(実行できる操作・読めるデータ)を最小にする、送金や削除のような重要な操作は人の確認を挟む、見せてはいけない文書は検索の段階で利用者の権限で除く、外から来た文章はデータとして区切って渡す、入力と出力を検査する、を重ねます。

深掘りされたら

  • ツールを呼べるエージェントでは、何に気をつけますか?

見られているポイント完全には防げない前提・権限の最小化・人の確認・多層の対策

Q4LLM の出力が評価のたびに変わります。どう評価を安定させますか?

模範回答

まず、温度などの設定を下げてばらつきを減らし、プロンプトとモデルの版を固定します。そのうえで、同じ評価データを数回流して平均とばらつきを見ます。改善の幅がばらつきより小さければ、改善したとは言いません。

採点の側も安定させます。形式や必須の語のように、ルールで確かめられるものはルールで採点し、LLM による採点は基準を具体的に書いて、人の採点と一致するかを一部で確かめます。評価データの件数が少なすぎると結果が揺れるので、重要な種類の質問は十分な件数を入れます。

深掘りされたら

  • LLM による採点が信頼できるかを、どう確かめますか?

見られているポイント設定の固定・複数回の実行・ルールの採点と LLM の採点の使い分け

Q5LLM アプリのコストが予算を超えそうです。どう下げますか?

模範回答

まず、機能ごと・利用者ごとにトークン数と費用を記録して、どこで使っているかを見ます。多くの場合、長い入力(大量の文書や会話の履歴)か、高いモデルを使う回数が原因です。

対策は、簡単な処理を小さく安いモデルに回す、渡す文書を必要な分だけにする・履歴を要約する、同じ質問の答えや共通のプロンプトをキャッシュする、出力の上限を決める、などです。エージェントのように何度も呼び出す仕組みには、回数の上限を付けます。どの変更も、評価データで品質が落ちていないかを確かめてから出します。

深掘りされたら

  • 小さいモデルに切り替えてよいかは、どう判断しますか?

見られているポイントまず計測・入力の量とモデルの選び方・品質の確認

Q6RAG で「資料にない」ことを LLM がそれらしく答えてしまいます。どうしますか?

模範回答

ハルシネーションです。まず、そのとき検索で何が渡っていたかを確かめます。関係のない文書しか渡っていないのに答えているなら、プロンプトで「資料に書かれていないことは、分からないと答える」と指示し、答えに根拠の文書を引用させます。引用できない答えは出さない、という後処理も使えます。

評価データに「答えのない質問」を入れて、正しく「分からない」と言えるかを測り、変更のたびに確かめます。検索のスコアが低いときは、LLM に渡す前に「該当する資料が見つかりませんでした」と返す方法もあります。

深掘りされたら

  • 引用が正しいかを、どう自動で確かめますか?

見られているポイント検索の結果の確認・プロンプトと引用・答えのない質問の評価