RAG(検索拡張生成)とは?仕組み・活用事例・導入方法をわかりやすく解説

what-is-rag Uncategorized

RAG(検索拡張生成)とは

RAG(Retrieval-Augmented Generation、検索拡張生成)とは、LLM(大規模言語モデル)の弱点を補う技術です。ChatGPTなどのLLMは、学習データの知識しか持たないため、最新情報や社内ドキュメントには答えられません。

RAGは、外部データベースから関連情報を検索し、それをLLMに渡すことで、正確で最新の回答を生成する仕組みです。

RAGの基本的な流れ

ユーザーの質問
    ↓
①ベクトル化(Embedding)
    ↓
②関連情報を検索(Retrieval)
    ↓
③検索結果をLLMに渡す
    ↓
④LLMが回答生成(Generation)

従来のLLMとの違い

項目 従来のLLM RAG活用
情報源 学習データのみ 学習データ + 外部データベース
最新情報 対応できない 対応可能
社内情報 対応できない 対応可能
ハルシネーション 発生しやすい 大幅に減少
コスト 低い 中程度(ベクトルDB費用)

RAGが必要な理由

LLMの3つの限界

1. 学習データの期限

ChatGPT-3.5の学習データは2021年9月まで。それ以降の情報には答えられません。

例:
– ユーザー: 「2024年の東京オリンピックの結果は?」
– ChatGPT: 「申し訳ございませんが、私の学習データは2021年9月までです」

RAGを使えば、最新ニュースデータベースから情報を取得して回答できます。

2. 社内・非公開情報への非対応

LLMは公開データで学習されるため、社内マニュアルや社内FAQには答えられません。

例:
– ユーザー: 「経費精算の申請方法は?」
– ChatGPT: 「一般的な方法は…」(自社の手順ではない)

RAGを使えば、社内ドキュメントから情報を取得して回答できます。

3. ハルシネーション(幻覚)

LLMは知らない情報について、もっともらしい嘘を生成することがあります。

RAGを使えば、検索結果に基づいて回答するため、ハルシネーションを大幅に減らせます。

RAGの仕組み(技術的な詳細)

ステップ1: データの準備とベクトル化

1-1. ドキュメントの分割

長いドキュメントを適切なサイズ(チャンク)に分割します。

# LangChainの例
from langchain.text_splitter import RecursiveCharacterTextSplitter

text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=1000,  # 1チャンク1000文字
    chunk_overlap=200  # 前後で200文字重複
)

chunks = text_splitter.split_documents(documents)

1-2. ベクトル化(Embedding)

各チャンクを数値ベクトルに変換します。

from langchain.embeddings import OpenAIEmbeddings

embeddings = OpenAIEmbeddings()
vectors = embeddings.embed_documents([chunk.page_content for chunk in chunks])

ステップ2: ベクトルデータベースに保存

ベクトル化したデータをベクトルデータベースに保存します。

ベクトルDB 特徴
Pinecone クラウド・高速・有料
Chroma オープンソース・無料・ローカル
Weaviate オープンソース・高機能
FAISS Meta製・ローカル・軽量
from langchain.vectorstores import Chroma

vectorstore = Chroma.from_documents(
    documents=chunks,
    embedding=embeddings
)

ステップ3: 類似検索(Retrieval)

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

# ユーザーの質問
query = "経費精算の申請方法は?"

# 類似度の高い上位3件を取得
docs = vectorstore.similarity_search(query, k=3)

ステップ4: LLMで回答生成(Generation)

検索結果をLLMに渡し、回答を生成します。

from langchain.chains import RetrievalQA
from langchain.chat_models import ChatOpenAI

llm = ChatOpenAI(model="gpt-3.5-turbo")

qa_chain = RetrievalQA.from_chain_type(
    llm=llm,
    retriever=vectorstore.as_retriever()
)

answer = qa_chain.run(query)

RAGの活用事例

1. 社内ナレッジベース検索

課題: 社内マニュアルが膨大で、必要な情報を探すのに時間がかかる

RAG活用:
– 社内マニュアル・FAQ・社内wikiをベクトル化
– 社員が自然言語で質問すると、関連情報を検索して回答

効果:
– 検索時間70%削減
– 問い合わせ対応50%削減

2. カスタマーサポートチャットボット

課題: FAQは充実しているが、ユーザーが自分で探すのが面倒

RAG活用:
– FAQ・製品マニュアルをベクトル化
– チャットボットがユーザーの質問に応じて、関連FAQを検索して回答

効果:
– 問い合わせ対応時間50%削減
– 顧客満足度20%向上

3. 企業レポート・論文検索

課題: 膨大な論文・レポートから必要な情報を探すのが困難

RAG活用:
– 論文・レポートをベクトル化
– 研究者が自然言語で質問すると、関連論文を検索して要約

効果:
– 文献調査時間80%削減
– 関連研究の発見率向上

4. 法律・規制情報検索

課題: 法律文書は膨大で、該当条文を探すのが困難

RAG活用:
– 法律条文・判例をベクトル化
– 弁護士が質問すると、関連条文を検索して提示

効果:
– リサーチ時間60%削減
– 見落としリスク減少

RAGを導入する方法

ノーコードツール(プログラミング不要)

ツール 難易度 料金 特徴
Dify ★☆☆ 無料〜$59/月 ノーコードでRAG構築可能
Notion AI ★☆☆ $10/月 Notionデータを検索対象に
ChatGPT Plus(Code Interpreter) ★☆☆ $20/月 PDFアップロードで簡易RAG

ローコード(LangChain活用)

必要なスキル

  • Python基礎
  • API連携の基本知識

最小構成のコード

from langchain.document_loaders import DirectoryLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.chains import RetrievalQA
from langchain.chat_models import ChatOpenAI

# 1. ドキュメント読み込み
loader = DirectoryLoader("./docs", glob="**/*.txt")
documents = loader.load()

# 2. チャンクに分割
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
chunks = text_splitter.split_documents(documents)

# 3. ベクトル化&保存
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_documents(chunks, embeddings)

# 4. RAGチェーン構築
llm = ChatOpenAI(model="gpt-3.5-turbo")
qa_chain = RetrievalQA.from_chain_type(
    llm=llm,
    retriever=vectorstore.as_retriever()
)

# 5. 質問
answer = qa_chain.run("経費精算の方法は?")
print(answer)

フルスタック開発(本格運用)

技術スタック例

フロントエンド: React
バックエンド: Python + FastAPI + LangChain
ベクトルDB: Pinecone
LLM: ChatGPT API / Claude API
デプロイ: Vercel(フロント)+ Render(バックエンド)

RAGのコスト

月間コスト例(中小企業向け)

項目 サービス 月額費用
LLM API OpenAI GPT-3.5 $10〜100
Embedding API OpenAI Embeddings $5〜20
ベクトルDB Pinecone $70〜
合計 $85〜200

コスト削減のポイント

  • ローカルベクトルDB: Chroma、FAISSなら無料
  • キャッシュ活用: 同じ質問には過去の回答を再利用
  • チャンクサイズ最適化: 大きすぎるとコスト増、小さすぎると精度低下

RAGの課題と対策

課題1: 検索精度の問題

問題: 関連性の低い情報が検索されることがある

対策:
– ハイブリッド検索(ベクトル検索 + キーワード検索)
– メタデータフィルタリング(日付、カテゴリで絞り込み)
– リランキング(検索結果を再評価)

課題2: チャンクサイズの最適化

問題: チャンクが大きすぎると関連性が低下、小さすぎると文脈が失われる

対策:
– 文書の種類に応じてチャンクサイズを調整
– 一般的には500〜1500文字が推奨

課題3: コスト増加

問題: ベクトルDB・API費用が増加する

対策:
– ローカルベクトルDB(Chroma、FAISS)を使用
– キャッシュ活用で重複リクエストを削減

よくある質問

Q1. RAGとファインチューニングの違いは?

RAG: 外部データを検索してLLMに渡す。データ更新が容易。
ファインチューニング: LLMのモデル自体を再学習。データ更新には再学習が必要。

一般的には、RAGのほうがコストが低く、柔軟性が高いため推奨されます。

Q2. RAGは日本語に対応している?

はい、対応しています。OpenAI EmbeddingsやCohereなど、日本語対応のEmbeddingモデルを使えばOKです。

Q3. RAGの精度を上げるには?

以下の方法が有効です。
– ハイブリッド検索(ベクトル + キーワード)
– リランキング(検索結果を再評価)
– メタデータ活用(日付、カテゴリでフィルタリング)

Q4. ノーコードでRAGを構築できる?

はい、Difyなどのノーコードツールを使えば、プログラミング不要でRAGを構築できます。

関連記事


まとめ:RAGでLLMの可能性が広がる

RAG(検索拡張生成)は、LLMの弱点を補う重要な技術です。

  • 最新情報に対応: 学習データの期限を超えた情報も提供可能
  • 社内情報に対応: 社内マニュアル・FAQをLLMで活用
  • ハルシネーション削減: 検索結果に基づく回答で正確性向上

ノーコードツール(Dify)なら、プログラミング不要で今すぐRAGを試せます。まずは無料で始めてみませんか?

【PR】

AIスキルを本格的に学びたい方には、以下のスクールがおすすめです。

DMM WEBCAMP

  • 転職成功率98.8%、転職できなければ全額返金
  • 給付金活用で実質18万円〜で受講可能
  • RAG・LangChainを含む実践カリキュラム

DMM WEBCAMP 無料カウンセリングに申し込む

デイトラ

  • 業界最安級の99,800円〜
  • 1日1題の明確なカリキュラムで迷わず学習
  • 副業と並行して学べる

デイトラで学習を始める(業界最安級99,800円〜)


出典:
– LangChain公式ドキュメント
– OpenAI Embeddings API
– Pinecone公式サイト
– Dify公式サイト

コメント