🙌

はじめてのRAG - 仕組みを浅く理解する

に公開

はじめに

みなさんはAI使いこなしてますか?
zennやQiitaやXにはAIを使いこなしてバリバリ開発してる人がたくさんいますが、実はうまく使いこなせてない・・と思ってる人もいるんじゃないかと思います。

わたしもその一人で、主にコード生成に利用しているだけでした。
(しかもコード生成もうまくいかないことが多々。。プロジェクト固有のルールとか無視しがちですよね、AIって!)
もっと使いこなせるようになりたい!と思って、初めてのAIアプリを作りました。

RAG(Retrieval-Augmented Generation)と呼ばれる仕組みを使ったこのアプリは、LLMが知らない固有の情報(プロジェクト仕様書など)を参照させて、質問に回答させるものです。

RAGって何・・?という状態から、アプリを作ってAIの仕組みを浅く理解するまでの記録です。

わたしと同じく、AIは使ってるけど使いこなせてない、仕組みも知らない・・という方にも

  • 意外と簡単に作れる
  • 仕組みもそんなに難しくない

と思ってもらえると嬉しいです!

AIの活用レベル

先日こんな記事をみました。

DeNA「AIを使いこなす社員」の評価基準、現時点の“答え”とは?

この中には、DeNA社内でのAI使いこなしレベルが書いてあります。

うまく使いこなせてないんじゃないか、という漠然とした不安が、明確にレベル分けされることで足りない部分を認識できました。
あ、わたしLevel3だな。じゃあレベルを上げるにはどうしたらいいのか?

さっそくChatGPTに聞く

  • わたし:「この画像(DeNAの使いこなしレベルのスクショ)で、Level4になるにはどうしたらいいと思う?」
  • ChatGPT:「AIのアプリ作るといいよ〜」
  • わたし:「どんなアプリ作ったらいい?1週間ぐらいでできるやつがいいな」
  • ChatGPT:「社内のドキュメント検索AIはどう?議事録とかPDFを読み込ませて、自然言語で質問すると答えてくれるやつだよ」
  • わたし:そうだ、今のプロジェクトの仕様書は大量のパワポになってて、目的の情報に辿り着くのが大変なんだった。 これいいかも。

ということではじめてのAIアプリを開発してみました。

アプリすぐできた

最初から自分でコードを書くつもりはなく、全部そのままChatGPTにお願いしました。
4、5時間で完成しました・・!

ChatGPTにpythonを使うといいよ、と言われたのでpythonを使ってます。ちなみにわたしはpythonはほとんど書けません。

AIは新しいものを作るのが得意

AIは新しいものを作るのが得意です。
既存のプロジェクトをそのお作法に合わせてエンハンスするのはまだ苦手なところがあります。
(gpt-5でここがかなりやりやすくなった気がしてます。ありがたい!)

一方で、今回のように新しいアプリを1から作るのが得意なので、お願いするとサクッと作ってくれます。

RAGのしくみを浅く解説

正直まだRAGについて全然わかってません。わかってないなりに、浅く解説します。
これをキッカケに本読もうと思います・・!

①まず検索用の素材をjsonにする

質問&回答に使いたい内容が書かれたパワポを取り込み、jsonに変換します。
これは特にAIは必要なく、pythonのライブラリpython-pptxを使ってます。

▪️何のため?
LLMは社内資料を知らないため、検索用に扱いやすい形に変換します。

②チャンクに分割する

AIに読み込ませやすいように、jsonにした素材をひとかたまりの「チャンク」に分けます。
ここもAIはまだ使いません。

▪️何のため?
LLMは1度にあつかえる文字量に限りがあります。
資料全体を渡すことはできないので、ある程度のまとまったかたまり(1000文字程度)に分けます。

▪️ポイント
機械的にチャンクに分けるため、意味のあるかたまりがちょうどチャンクの境界で分割されてしまう場合があります。
そのため、チャンク同士にはオーバーラップ(=重なり)を持たせて、意味が分断しないようにします。

③埋め込み&インデックス

やっとAIが登場します。チャンクをOpenAIのAPIに渡して、ベクトル化します。
意味が近いテキストを高速に探すための索引を作るイメージです。

▪️何のため?
ユーザーの質問に関連があるかどうか?をベクトルの近さで判断するためです。
ただし、ベクトルの距離の近さは関連度にすぎません。まず距離で候補を集めるために使います。

④検索 → 回答生成(RAGの中核)

ユーザーの質問をベクトル化し、近いチャンク=関連度の高いチャンクを検索します。

その後、再ランカ(質問×候補をペアで読むモデル)でペアの関連度をスコア化し、関連度の高い上位数件だけをコンテキストとしてLLMに渡します。

LLMはこのコンテキストを受け取って、回答を生成します。

まとめ

アプリを作ってみると、こんな仕組みになってたのか!と理解できて楽しいです。

意外と簡単なので興味を持った方はぜひ作ってみてください。

Discussion