RAGの基本と初心者向けツールの選び方(2026年4月時点)
RAG(Retrieval Augmented Generation)は、大規模言語モデル(LLM)が学習していない最新情報や社内ドキュメントなど、特定の知識源に基づいた応答を生成するための強力なフレームワークです。LLMの「幻覚」(事実に基づかない情報生成)を抑制し、応答の根拠を明確にする上で不可欠な技術となっています。
初心者がRAGシステムを構築する際、複雑な要素技術を個別に扱うのは大変です。そこで、開発を効率化するためのフレームワークの利用が推奨されます。2026年4月現在、特に人気が高いのはLlamaIndexとLangChainです。
| フレームワーク | 特徴 | 初心者向け度 | 主な利用シーン |
|---|---|---|---|
| LlamaIndex | データ連携とインデックス作成に強み。Retrieverの選択肢が豊富。 | 高 | 既存データからのQ&A、知識ベース構築 |
| LangChain | エージェント、チェーン、ツール連携など機能が豊富。モジュール性が高い。 | 中〜高 | 複雑なワークフロー、エージェントシステム |
どちらもPythonライブラリであり、基本的なRAGパイプライン(データの読み込み、チャンキング、埋め込み、ベクトル検索、LLM連携)を一貫して扱えます。本記事では、汎用性の高いアプローチで手順を解説します。
埋め込みモデルとベクトルデータベースの選定
RAGシステムにおいて、テキストを数値ベクトルに変換する埋め込みモデル(Embedding Model)と、そのベクトルを格納・検索するベクトルデータベース(Vector Database)は核心的なコンポーネントです。
- 埋め込みモデル:
* OpenAI text-embedding-ada-002: 広く使われており、コストパフォーマンスに優れています。料金は$0.0001/1Kトークン(2026年4月時点)。
* Cohere Embed v3: 異なる言語対応や高精度が求められる場合に選択肢となります。
* OSSモデル: Hugging Faceなどで公開されている多様なオープンソースモデルも利用可能です。利用料はかかりませんが、自分でホスティングする必要があります。
- ベクトルデータベース:
* ChromaDB: ローカル環境でのテストや小規模なアプリケーションに最適。完全に無料で利用できます。
* Pinecone: 大規模なRAGシステムに適したマネージドサービス。無料枠(1Mベクトルまで)があり、Proプランは月額$70から(2026年4月時点)利用可能です。
* Weaviate / Qdrant: OSSとしても利用でき、セルフホストまたはクラウド版も提供されています。
💡 ポイント: 初心者はまずChromaDBとOpenAIの
text-embedding-ada-002の組み合わせから始めるのが最も手軽です。
RAG構築のステップバイステップ手順
ここでは、特定のフレームワークに依存しない、RAG構築の普遍的な手順を解説します。
ステップ1: データの準備と読み込み
RAGの質は、インデックス化するデータの質に大きく依存します。
1. データ収集: 対象となるドキュメント(PDF、Markdown、Webページ、CSV、Notionページなど)を準備します。
2. データクレンジング: 不要なメタデータ、改行、特殊文字、広告などを削除し、データのノイズを減らします。これはRAGの精度に直結するため、非常に重要な工程です。
3. データローダーの利用: LlamaIndexやLangChainは、多様なデータソースからデータを読み込むための専用ローダーを提供しています。
`python
# 例: LlamaIndexのPDFローダー
from llama_index.readers.file import SimpleDirectoryReader
documents = SimpleDirectoryReader(input_dir="./data").load_data()
`
ステップ2: チャンキングと埋め込み(Embedding)
生のドキュメントはLLMの入力として長すぎる場合が多いため、意味のある単位に分割し、ベクトル化します。
1. チャンキング(Chunking): ドキュメントを、意味が保たれるように小さな塊(チャンク)に分割します。チャンクサイズとオーバーラップは、RAGの性能に影響を与える重要なパラメータです。
* 一般的な設定: チャンクサイズ512トークン、オーバーラップ50トークン。
* 戦略: セマンティックチャンキング(意味の区切りで分割)、再帰的チャンキングなど。
> ⚠️ 注意: チャンクが長すぎるとLLMのコンテキストウィンドウに収まらない、または不要な情報が増える。短すぎると文脈が失われる可能性があります。試行錯誤が必要です。
2. 埋め込み(Embedding): 各チャンクを埋め込みモデルに入力し、高次元の数値ベクトルに変換します。このベクトルが、セマンティックな類似度検索に使われます。
`python
# 例: LangChainでのチャンキングと埋め込み
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_openai import OpenAIEmbeddings
text_splitter = RecursiveCharacterTextSplitter(chunk_size=512, chunk_overlap=50)
chunks = text_splitter.split_documents(documents)
embedding_model = OpenAIEmbeddings(model="text-embedding-ada-002")
# chunksに対する埋め込みは通常、次のステップでベクトルDBに格納する際にまとめて行われます
`
ステップ3: ベクトルストアへのインデックス作成
生成されたチャンクと埋め込みベクトルをベクトルデータベースに格納し、検索可能なインデックスを構築します。
1. ベクトルデータベースの初期化: 選択したベクトルデータベース(ChromaDB, Pineconeなど)を初期化します。
2. データ格納: 各チャンク(元のテキスト)と、それに対応する埋め込みベクトルをデータベースに挿入します。この際、チャンクに関連するメタデータ(ファイル名、ページ番号など)も一緒に格納すると、検索結果のフィルタリングや提示に役立ちます。
`python
# 例: ChromaDBへのデータ格納
from langchain_vectorstores import Chroma
vectorstore = Chroma.from_documents(
chunks,
embedding_model,
persist_directory="./chroma_db" # ローカル保存する場合
)
`
ステップ4: クエリと応答生成
ユーザーからのクエリを受け取り、関連ドキュメントを検索し、LLMにコンテキストとして渡して応答を生成します。
1. クエリの埋め込み: ユーザーの質問(クエリ)も、同じ埋め込みモデルでベクトルに変換します。
2. 類似度検索(Retrieval): クエリのベクトルと、ベクトルデータベースに格納されたチャンクのベクトルとの類似度を計算し、最も類似度が高い(関連性の高い)上位N個のチャンクを検索します。
3. プロンプト構築: 検索で得られた関連チャンクを、LLMに渡すプロンプトに組み込みます。この際、指示(質問に答えてください、根拠を述べてくださいなど)も明確に含めます。
4. LLMによる応答生成(Generation): 構築したプロンプトをLLM(例: GPT-4o, Claude 3 Opus)に渡し、最終的な応答を生成させます。
* GPT-4oの料金は、入力トークンあたり$5.00/1M、出力トークンあたり$15.00/1M(2026年4月時点)です。
`python
# 例: LangChainでのRAGチェーン実行
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough
retriever = vectorstore.as_retriever()
llm = ChatOpenAI(model="gpt-4o")
template = """You are an assistant for question-answering tasks.
Use the following pieces of retrieved context to answer the question.
If you don't know the answer, just say that you don't know.
Question: {question}
Context: {context}
Answer:"""
prompt = ChatPromptTemplate.from_template(template)
rag_chain = (
{"context": retriever, "question": RunnablePassthrough()}
| prompt
| llm
| StrOutputParser()
)
response = rag_chain.invoke("RAGとは何ですか?")
print(response)
`
RAGシステムを評価と改善のポイント
RAGシステムの性能は、構築して終わりではありません。継続的な評価と改善が重要です。
- 評価指標: RAGの評価には、以下の要素が考慮されます。
* 忠実性(Faithfulness): LLMの出力が、与えられたコンテキスト(検索されたチャンク)に基づいて正確であるか。
* 関連性(Relevance): 検索されたチャンクが、ユーザーの質問にどれだけ関連しているか。
* 回答の適切性(Answer Relevance): LLMの最終回答が、ユーザーの質問にどれだけ的確に答えているか。
* コンテキストリコール(Context Recall): 必要な情報がコンテキストに含まれていたか。
- 評価ツール: Ragasのようなライブラリは、これらの評価指標を自動的に算出するのに役立ちます。少量の手動評価と組み合わせることで、システムの弱点を特定できます。
- 改善のポイント:
* チャンキング戦略の最適化: 異なるチャンクサイズやオーバーラップ、チャンキング手法を試す。
* リトリーバーの強化:
* Reranking: 検索で得られた上位N個のチャンクを、別のモデルで再度順位付けし、より関連性の高いチャンクを選び出す。
* Hybrid Search: ベクトル検索(セマンティック)とキーワード検索(語彙)を組み合わせる。
* Query Transformation: ユーザーの質問をLLMでリライトし、より検索に適した形にする。
* プロンプトエンジニアリング: LLMへの指示をより明確にし、期待する応答形式を誘導する。
* データの更新: 定期的に新しい情報をRAGシステムにインデックス化する。
これらのステップとポイントを踏むことで、初心者でも効果的なRAGシステムを構築し、運用していくことが可能です。