プロンプトエンジニアリング、RAG、ファインチューニング、の違いを直感的に理解しよう
はじめに
みなさんこんにちは!こーちと申します。
最近は生成AI周りの勉強をしてまして、そもそもの仕組みの構造的な部分と、実際にコードを書いてプロダクトを作ってみる、という2つのアプローチで勉強をしています。
今日はコードというよりは、日本語で構造を説明していこうと思います。
以前Googleの「生成AIリーダー」という資格をとったことがあり、
この内容と、その後に調べたことをまとめていこうと思います。
ファインチューニング、RAG、プロンプトエンジニアリングを直感的に理解しよう
それぞれ言葉自体は聞いたことがあるかもしれません。
この3つはそもそも何かというと、「LLMに対して自分が求めている答えを出させるための手法」になります。
プロンプトエンジニアリング→RAG→ファインチューニングの順番でより深い部分に関わってきます。
僕がしっくりきたイメージとして、LLMくんが試験を受けているところをイメージしてください。

試験問題(人間からの指示)に対して、必死に求められている答えを回答しようと頑張っています。
(実際は確率的に正しそうな単語を順番に出しているだけなんですが、擬人化した方がわかりやすいのでね!)
このLLMくんがうまく回答できるように手助けする方法として「プロンプトエンジニアリング」「RAG」「ファインチューニング」の3つがあります。
プロンプトエンジニアリング
ChatGPTのようなLLMを利用した生成AIは入力文(プロンプト)に対して回答を生成します。
この入力文を工夫するのがプロンプトエンジニアリングですね。皆さんが普段から何気なくやっていることだと思います。
プロンプトエンジニアリングを例えるなら、 試験の問題文を工夫して、答えやすいように誘導してあげる というイメージです。
例えば、数学の問題で、(1)が簡単な問題で、(2)の問題のための誘導問題になっているパターンとかありますよね?
イメージとしては似ていて、
- あなたはコーチングのコーチです。
- 回答結果はMarkdown形式で出してください。
- 100文字程度で要約してください
など、こちらが求めるようなアウトプットになるように誘導してあげる手法です。
RAG(Retrieval Augmented Generation)
RAGはLLMに対して外部の知識を与え、そこを検索(Retrieve)して拡張された(Augmented)回答を生成してもらうやり方です。
例えるならば 試験中に専門書を渡して「これを参考にして問題解いていいよ」ってカンニングさせてあげるようなイメージです。
どんな時に使われるかというと、1. 独自のデータが必要なとき 2. 最新の情報が必要なとき などが挙げられます。
LLM、例えばGPT-5などは、さまざまな情報を事前学習されていますが(pre-trained)、公開されていない自社サービスの細かい仕様や、自分のローカルの日記の内容はもちろん知りません。
また、ナレッジカットオフと言われるのですが、事前学習したタイミングよりも後に追加された情報についても知りません。
こういう場合では、事前の知識だけでなく、追加で外部の知識を与える必要があります。
自社サービスなどの個別の知識が必要な時
例えば、自社サービスについてGPTに何かを聞きたいとき、GPTに背景情報を渡さなくては答えられませんよね。
そういう時は、例えばNotionやMTG議事録などを外部情報をとしてLLMに渡すことで、LLMはその情報を参照できるようになります。
実装のフローではこのような形になっています。
- 外部情報を数値化して保存(これをEmbeddingと言います)
- 入力に対して類似している外部情報を検索
- 外部情報をコンテキストとしてLLMが回答を生成する
わかりやすい例で言えば、カスタマーサポートの自動化などがありますね。
例えば、自社サービスの問い合わせ窓口に、「パスワードを再発行したい」という質問が来たとします。
この時に自社のNotionなどの外部情報にアクセスし「パスワードを忘れた時の処理」「パスワード再発行のやり方」などの関連情報をとってきます。
そして、取得した情報を踏まえた上で、適切な回答を生成できるというわけです。
ChatGPTの検索モードもRAGに近い考え方
また、ChatGPTの「検索モード」では同じような処理が行われています。ユーザーのプロンプトに対して検索クエリをいくつか出してBingなどで検索をかけます。
そこで得られた情報も踏まえて、回答を生成してくれる仕組みになっています。
RAGは事前にベクトル化されてVectorDBに保存された情報から検索することを指します。なので、ChatGPTの検索モードのように、毎回情報を取得する仕組みはRAGではなくSAG(Search-Augmented Generation)と言います。
RAGはベクトル化された情報を検索する「意味ベース」の検索に対して、SAGは言語で検索する「単語ベース」の検索という違いがあります。
このあたりもぜひ別の記事で解説したいです。
ファインチューニング
これが一番大掛かりなプロセスです。今までは回答を生成するタイミングで試験問題を工夫したり、カンペをあげたりしていましたが、このプロセスでは 事前に特定の分野をちゃんと勉強してもらって、脳に刻ませてから試験に臨んでもらう という手法になっています。
まさにイメージの通りですが、一番大掛かりで時間がかかるしコストもかかります。また、事前に勉強してもらうプロセスなので、RAGのように気軽に更新するということができません。
ただ、その分RAGよりも多くの知識を埋め込むことができ、プロンプトに依存せずに一貫した出力をさせることもできます。
RAGは「日本の首都ってどこ?手元のカンペ見てみるか。ああ、東京なんだ」のように、毎回カンペを参照しています。
それに対してファインチューニングは「日本の首都?それは勉強してあるぞ!東京だ!」と自分で理解しているんですね。(日本の首都はファインチューニングで教えるまでもないと思いますが、あくまで例です!)
実装としては、Google Vertex AIなどのMLOps(機械学習の運用管理)プラットフォームを使うことで、ゼロから自前でやらなくても、GUI上でデータの学習、デプロイなどを完結させることができます。
ここでも使われる事例を見てみましょう。
一貫した人格を持たせたい時
ゲームのキャラクターなど、口調や設定に一貫性を持たせたい場合です。
プロンプトで「年齢は28歳、東京出身で、ワクワクという言葉をよく使う…」などを指定しなくても、LLMを学習し直すことで一貫したキャラクターとして振る舞わせることができます。
専用ドメインの深い知識が必要な時
例えば、弁護士や医者が使うLLMなどを想像してみましょう。GPT-5などの汎用モデルは世の中のこと全般を広く学習していますが、特定の分野の知識ではまだまだ学習が足りてない部分があるかもしれません。
このような場合は、医学や法律の情報を与えてモデル全体を再学習させることで「医療に強いLLM」「法律に強いLLM」などを作り出すことができます。
まとめ
RAGとかファインチューニングって、概念としては理解できますが、手触り感がそこまで持てないですよね。
今回は概念的なそれぞれの説明をしてきましたが、今後は「自分で最小RAGを実装してみる」など実際にコードを書いて動かした結果を踏まえた記事を書いていきたいと思っております!
記事を公開したらXで公開すると思うので、ぜひフォローしてください〜!
Discussion