RAG とは何か、そしてすべての開発者が RAG を知っておくべき理由
I 大規模言語モデル (LLM) 彼らは私たちが人と交流する方法に革命をもたらしました しかし、彼らは根本的な問題に苦しんでいます。 静的、 トレーニング時にフリーズしました。 LLM にドキュメントについて問い合わせる場合 内部的には、製品や更新されたデータに関して、答えは一般的なもの、発明されたもの、または単純なものになります。 間違っています。この現象はと呼ばれます 幻覚.
検索拡張生成 (RAG) 力を組み合わせることでこの問題を解決します 情報検索システムの精度で LLM を生成します。依存する代わりに RAG はモデル メモリのみにアクセスし、まずナレッジ ベースで関連ドキュメントを検索します。 モデルが正確なデータベースの回答を生成するためのコンテキストを提供します。
このシリーズの最初の記事では Web 開発者のための AI、RAGを探索します それが何であるか、どのように機能するか、いつ使用するか、いつ使用を避けるべきかについて詳しく説明します。最後にあなたは1つを手に入れます RAG アーキテクチャをしっかりと理解すると、次の記事で RAG アーキテクチャを実装する準備が整います。
シリーズ概要
| # | アイテム | 集中 |
|---|---|---|
| 1 | あなたはここにいます - RAGとは何ですか | 基礎と建築 |
| 2 | TypeScript と LangChain.js を使用した RAG | 実用化 |
| 3 | Web 開発用のベクター データベース | ストレージと類似性検索 |
| 4 | OpenAI と Anthropic API | LLM の統合 |
| 5 | オラマとLLMローカル | オンプレミスモデル |
| 6 | 微調整と RAG の比較 | いつ何を使うか |
| 7 | AI エージェント: アーキテクチャ | 自律システム |
| 8 | CI/CD パイプラインにおける AI | DevOpsの自動化 |
何を学ぶか
- RAG とは何ですか? RAG でどのような問題が解決されますか
- RAG (検索 + 生成) システムの完全なアーキテクチャ
- 埋め込みと類似性検索の仕組み
- ドキュメントを準備するためのチャンク化戦略
- RAGと微調整の違い
- 実際の使用例: チャットボット、セマンティック検索、Q&A
- RAG の制限と RAG を使用してはいけない場合
1. 問題: LLM と静的知識
会社のカスタマー サポート用にチャットボットを構築したいと想像してください。あなたは何千ものものを持っています ドキュメント ページ、FAQ、技術マニュアル、解決済みのチケット。 GPT-4 や Claude などの LLM を使用します。 しかし、結果は残念なものでした。モデルは製品を認識しておらず、存在しない機能を発明してしまいました。 そして、絶対的な確実性を持って間違った手順を提供します。
LLM の 3 つの基本的な問題
| 問題 | 説明 | インパクト |
|---|---|---|
| 知識の遮断 | モデルはトレーニング データのみを知っています | あなたの独自データについては何も知りません |
| 幻覚 | もっともらしいが誤った答えを生成する | 信頼性の高い不正確な情報 |
| 引用なし | 彼は情報源を明らかにできない | 正確性を検証できません |
これらの問題は、プロンプトを改善するだけで解決されるわけではありません。実際のデータが必要です。 更新され、ドメインに固有のものになります。そしてそれはまさにRAGがやっていることなのです。
2. RAG とは: 検索拡張生成
ラグ これは、2 つの異なるフェーズを組み合わせたアーキテクチャです。 検索 ナレッジベースからの関連文書の(検索)は、 世代 (世代) それらの文書に基づいて回答します。この用語は2020年に研究者によって導入されました Meta AI による論文「知識集約型 NLP タスクのための検索拡張生成」。
このアイデアはシンプルですが強力です。モデルに応答の生成を要求する前に、 ユーザーの質問に最も関連するドキュメントを検索し、プロンプトに挿入します。 追加のコンテキストとして。モデルはすべてを「記憶」する必要はなくなり、ただ推論するだけで済みます。 提供された情報について。
LLM TRADIZIONALE:
Domanda utente --> [LLM] --> Risposta (basata solo su training data)
^-- Rischio allucinazione alto
RAG:
Domanda utente --> [Retrieval] --> Documenti rilevanti
|
v
Domanda + Documenti --> [LLM] --> Risposta (basata su dati reali)
^-- Rischio allucinazione basso
実践的なアナロジー
RAG を 1 つとして考える オープンブック試験中の学生。従来のLLM 彼は暗記しなければならない学生です。彼は多くのことを知っていますが、混乱したり、発明したりすることがあります。 RAG を使用すると、学生は解答する前にノートや本を参照できます。 具体的な情報源に基づいているため、答えはより正確になります。
3. RAG システムの完全なアーキテクチャ
RAG システムは 2 つの主要なパイプラインで構成されます。 インデックス作成パイプライン (オフライン、1 回限り、または定期的に実行されます) クエリパイプライン (ユーザーの質問ごとにリアルタイムで実行されます)。
3.1 インデックス作成パイプライン (オフライン)
このフェーズでは、調査用の文書を準備します。手順は次のとおりです。
[Documenti Sorgente]
|
v
[1. Document Loader] -- Carica PDF, HTML, Markdown, CSV, database
|
v
[2. Text Splitter] --- Divide in chunk di dimensione gestibile
|
v
[3. Embedding Model] - Trasforma ogni chunk in un vettore numerico
|
v
[4. Vector Store] ---- Salva i vettori in un database vettoriale
3.2 クエリ パイプライン (オンライン)
このフェーズでは、ユーザーの要求をリアルタイムで処理します。
[Domanda Utente]
|
v
[1. Embedding Model] --- Stessa funzione usata nell'indicizzazione
|
v
[2. Similarity Search] - Cerca i chunk più simili nel vector store
|
v
[3. Context Assembly] -- Assembla i chunk trovati in un contesto
|
v
[4. Prompt Template] --- "Rispondi alla domanda basandoti su: [contesto]"
|
v
[5. LLM Generation] --- Genera la risposta finale
|
v
[Risposta con Citazioni]
埋め込みの一貫性に注意してください
それを使用することが不可欠です 同じ埋め込みモデル 両方の段階で クエリフェーズよりもインデックスを作成します。異なるモデルを使用すると、ベクトルは一致しません。 比較可能な場合、類似性検索は正しく機能しません。
4. 埋め込み: RAG の核心
Gli 埋め込み それらは、キャプチャしたテキストの数値表現 (ベクトル) です。 意味論的な意味。同様の意味を持つ 2 つの文には、「近い」ベクトルが含まれます。 たとえ全く違う言葉を使っていたとしても、多次元空間。
Frase: "Il gatto dorme sul divano"
Embedding: [0.23, -0.45, 0.67, 0.12, -0.89, ...] // vettore a 1536 dimensioni
Frase: "Il felino riposa sul sofa"
Embedding: [0.22, -0.44, 0.68, 0.11, -0.88, ...] // vettore molto simile!
Frase: "Il prezzo dell'oro sale"
Embedding: [-0.56, 0.78, -0.12, 0.91, 0.34, ...] // vettore molto diverso
人気の埋め込みテンプレート
| モデル | 寸法 | プロバイダー | 料金 |
|---|---|---|---|
text-embedding-3-small |
1536年 | OpenAI | $0.02 / 100万トークン |
text-embedding-3-large |
3072 | OpenAI | $0.13 / 100万トークン |
voyage-3 |
1024 | 航海AI | $0.06 / 100万トークン |
all-MiniLM-L6-v2 |
384 | ハグフェイス(無料) | 無料(自己ホスト型) |
nomic-embed-text |
768 | オラマ (地元) | 無料(ローカル) |
La コサイン類似度 最も一般的な指標は 埋め込みを比較します。 2 つのベクトル間の角度を測定します。値 1.0 はベクトルを示します。 同一、0.0 は関係がないことを示し、-1.0 は反対の意味を示します。
function cosineSimilarity(a: number[], b: number[]): number {
if (a.length !== b.length) {
throw new Error('I vettori devono avere la stessa lunghezza');
}
let dotProduct = 0;
let normA = 0;
let normB = 0;
for (let i = 0; i < a.length; i++) {
dotProduct += a[i] * b[i];
normA += a[i] * a[i];
normB += b[i] * b[i];
}
return dotProduct / (Math.sqrt(normA) * Math.sqrt(normB));
}
// Esempio d'uso
const embedding1 = [0.23, -0.45, 0.67, 0.12];
const embedding2 = [0.22, -0.44, 0.68, 0.11];
const similarity = cosineSimilarity(embedding1, embedding2);
console.log(similarity); // ~0.999 - molto simili!
5. チャンク戦略
Il チャンク化 文書を断片に分割するプロセスです 管理可能なサイズの(チャンク)。このフェーズは非常に重要です。大きすぎるチャンクは分散します。 つまり、チャンクが小さすぎるとコンテキストが失われます。
主要なチャンク化パラメータ
- チャンクサイズ: 各フラグメントの最大サイズ (文字またはトークン単位)。通常は 500 ~ 2000 文字
- チャンクのオーバーラップ: 連続するチャンク間のオーバーラップ (チャンク サイズの 10 ~ 20%)。コンセプトを中途半端にカットしないようにする
- 区切り文字: カットした方がよいポイント(段落、文章、タイトル)
FIXED SIZE CHUNKING:
Testo: "AAAA|BBBB|CCCC|DDDD" (ogni | = taglio ogni N caratteri)
Pro: Semplice e veloce
Contro: Può tagliare a meta frasi e concetti
RECURSIVE CHARACTER SPLITTING:
Testo diviso per: "\n\n" -> "\n" -> "." -> " " -> ""
Pro: Rispetta la struttura del testo
Contro: Chunk di dimensioni variabili
SEMANTIC CHUNKING:
Usa embeddings per trovare i "punti di rottura" semantici
Pro: Chunk coerenti semanticamente
Contro: Più lento e costoso (richiede embeddings)
DOCUMENT-AWARE CHUNKING:
Rispetta la struttura del documento (titoli, sezioni, tabelle)
Pro: Mantiene il contesto strutturale
Contro: Richiede parsing specifico per formato
Documento originale (600 caratteri):
"Angular è un framework TypeScript per applicazioni web.
Supporta il rendering lato server (SSR) per migliorare
le performance. I componenti standalone eliminano la
necessità di NgModule. I Signals offrono reattività
fine-grained senza Zone.js."
Con chunk_size=200, overlap=50:
Chunk 1: "Angular è un framework TypeScript per applicazioni web.
Supporta il rendering lato server (SSR) per migliorare
le performance."
Chunk 2: "per migliorare le performance. I componenti standalone
eliminano la necessità di NgModule."
Chunk 3: "eliminano la necessità di NgModule. I Signals offrono
reattività fine-grained senza Zone.js."
チャンキングでよくある間違い
- チャンクが大きすぎます (トークンが 4000 を超える): モデルはコンテキストの一部を無視するか、トークンの制限を超える可能性があります
- チャンクが小さすぎる (<100 トークン): 文脈の喪失、断片的な回答
- ゼロオーバーラップ: コンセプトは半減、回収は不完全
- メタデータを無視する: 文書のタイトル、作成者、日付などの情報の損失
6. RAG と微調整: いつ何を使用するか
最も一般的な質問の 1 つは、「RAG を使用するべきですか、それともモデルを微調整するべきですか?」です。 答えは、追加したい知識の種類とそれをどのように使用するかによって異なります。
RAG と Fine-Tuning - 詳細な比較
| 待ってます | ラグ | 微調整 |
|---|---|---|
| 知識の種類 | 特定の事実、データ、文書 | スタイル、形式、動作 |
| アップデート | インスタント(ドキュメントの更新) | 再トレーニングが必要 |
| 初期費用 | 低 (インフラストラクチャ + 組み込み) | 高 (GPU、ラベル付きデータ、時間) |
| クエリあたりのコスト | 中(検索+生成) | 低 (世代のみ) |
| トレーサビリティ | 高 (出典を引用できます) | なし(統合知識) |
| 幻覚 | 削減(コンテキスト内の実際のデータ) | 可能(学んだ知識) |
| データのスケーラビリティ | 数百万の文書 | トレーニングセットによる制限 |
| 複雑 | メディア (パイプライン + ベクター DB) | 高 (トレーニング、評価、導入) |
実践的なルール
アメリカ合衆国 ラグ モデルに特定の情報を「認識」させたい場合 (ドキュメント、FAQ、マニュアル)。アメリカ合衆国 微調整 モデルが欲しいとき 特定の方法(口調、形式、応答スタイル)で「振る舞う」。多くの場合、 2 つのアプローチを組み合わせると最良の結果が得られます。
7. RAG の実際の使用例
RAG は単なる理論ではなく、私たちが毎日使用する多くの製品の基礎です。 ここでは、最も一般的な使用例と、RAG でそれらを実現する方法を示します。
7.1 企業チャットボット
最も一般的な使用例。に基づいて顧客の質問に答えるチャットボット 会社の実際の文書: マニュアル、FAQ、解決済みのチケット、内部ポリシー。
// Pseudocodice di un chatbot RAG
async function handleUserQuery(query: string): Promise<string> {
// 1. Cerca documenti rilevanti
const relevantDocs = await vectorStore.similaritySearch(query, 5);
// 2. Costruisci il contesto
const context = relevantDocs
.map(doc => `[Fonte: ${doc.metadata.source}]\n${doc.pageContent}`)
.join('\n\n');
// 3. Genera la risposta con contesto
const response = await llm.invoke(`
Sei un assistente del supporto clienti.
Rispondi SOLO basandoti sulle informazioni fornite.
Se non trovi la risposta nei documenti, dillo esplicitamente.
DOCUMENTI DI RIFERIMENTO:
${context}
DOMANDA DEL CLIENTE:
${query}
RISPOSTA:
`);
return response;
}
7.2 セマンティック検索
従来のキーワードベースの検索とは異なり、RAG によるセマンティック検索 が含まれます 意味 クエリの。 「パスワードをリセットする方法」の検索結果 文書には「資格情報の回復手順」と書かれていますが。
7.3 文書に関するQ&A
ユーザーは、大規模なドキュメントのコレクションについて自然言語で質問できるようになります。 法的契約、技術文書、科学論文、社内知識ベース。
7.4 コードアシスタント
特定のコードベースを認識するコード アシスタント。ソースコードのインデックスを作成し、 コンテキストに応じた提案を提供するための API ドキュメント、コメント、テスト。
ユースケースの比較
| 使用事例 | データソース | 更新頻度 | 複雑 |
|---|---|---|---|
| チャットボットのサポート | FAQ、マニュアル、チケット | 毎週 | 平均 |
| セマンティック検索 | 製品カタログ・記事 | 毎日 | 低い |
| Q&A資料 | PDF、契約書、報告書 | オンデマンド | 平均 |
| コードアシスタント | ソースコード、APIドキュメント | コミットごとに | 高い |
8. 完全な RAG パイプラインの構造
技術的な選択肢とともに、パイプラインの各コンポーネントを詳しく見てみましょう 導入時に直面することになります。
+------------------+--------------------------------------------+
| Componente | Opzioni Tecnologiche |
+------------------+--------------------------------------------+
| Document Loader | LangChain loaders, Unstructured, custom |
| Text Splitter | RecursiveCharacter, Semantic, Markdown |
| Embedding Model | OpenAI, Voyage, HuggingFace, Ollama |
| Vector Store | Pinecone, Chroma, Weaviate, pgvector |
| Retriever | Similarity, MMR, Self-Query, Ensemble |
| Prompt Template | LangChain templates, custom |
| LLM | GPT-4, Claude, Llama, Mistral |
| Post-processing | Citation extraction, confidence scoring |
+------------------+--------------------------------------------+
8.1 ドキュメントローダー
ドキュメント ローダーは、さまざまなソースからテキストを抽出します。抽出の品質 回答の質に直接影響します。
Formato | Loader Consigliato | Note
-----------------+---------------------------+---------------------------
PDF | PDFLoader, PyPDFLoader | Attenzione a tabelle/immagini
HTML/Web | CheerioWebBaseLoader | Rimuove tag, estrae testo
Markdown | MarkdownTextSplitter | Preserva la struttura
CSV/Excel | CSVLoader | Una riga = un documento
JSON | JSONLoader | Configura il percorso dati
Database SQL | Custom loader | Query -> documenti
Confluence/Notion| API-based loader | Richiede autenticazione
Codice sorgente | TextLoader + filtri | Splitta per funzione/classe
8.2 レトリバー: 類似性を超えた検索
レトリバーは、最も類似したチャンクを見つけるだけではありません。高度な戦略があります 回復の質を向上させるため。
検索戦略
- 類似性検索: 最も高い類似性スコアを持つ k 個のチャンク。シンプルだが効果的
- MMR (最大周辺関連性): 関連性と多様性のバランスを保ちます。互いに類似しすぎるチャンクを避ける
- セルフクエリ: モデルは質問からフィルターを抽出します (例: 「2024 年の文書」は日付でフィルターされます)
- アンサンブル: 複数の取得結果 (キーワード + セマンティクスなど) を組み合わせて、より適切な範囲をカバーします
- 親文書: 関連するチャンクを取得しますが、完全なコンテキストの親ドキュメントを返します。
9. RAG の制限と使用できない場合
RAG は魔法のソリューションではありません。他のアーキテクチャと同様に、注意しなければならない制限があります。 採用する前に。
RAG が正しい選択ではない場合
- 複雑な推論: RAG は推論ではなく事実を提供します。複数ステップの分析または複雑な論理推論の場合、モデルには独自の機能が必要です
- 構造化データ: SQL の集計、計算、テーブル間の結合が必要な場合は、RAG ではなくリレーショナル データベースを使用してください。
- 超高速のリアルタイム応答: 取得パイプラインによりレイテンシー (100 ~ 500 ミリ秒) が追加されます。 50 ミリ秒未満の応答が必要な場合は、キャッシュを検討してください
- 知識ベースが小さすぎます: ドキュメントが少ない (10 ページ未満) ため、検索することなくすべてをプロンプトに収めることができます。
- 非常に動的なデータ: データが毎秒変化する場合 (株式市場の価格など)、RAG の更新速度が十分ではありません。
よくある問題と解決策
| 問題 | 原因 | 解決 |
|---|---|---|
| 無関係な回答 | チャンク化が大きすぎる | チャンクサイズを減らし、オーバーラップを増やす |
| 彼は「分からない」と答えることが多すぎる | 取得が制限されすぎている | k (結果の数) を増やし、MMR を使用します |
| 持続する幻覚 | 不十分または曖昧なコンテキスト | プロンプトを改善し、明示的な指示を追加します |
| 高い遅延 | コンテキスト内のチャンクが多すぎます | k を減らし、再ランキングを使用する |
| 高コスト | クエリごとのトークンが多すぎます | チャンクを圧縮し、より安価なモデルを使用する |
10. RAG の評価指標
RAG システムが正常に動作しているかどうかを知るには、それを測定する必要があります。主な指標は次のとおりです。
RAGメトリクス
| メトリック | 測定内容 | ターゲット |
|---|---|---|
| コンテキストの関連性 | 取得した書類は申請に関連していますか? | > 0.8 |
| 忠実 | 回答は提供された文書に基づいていますか? | > 0.9 |
| 回答の関連性 | 答えは質問に関連していますか? | > 0.85 |
| レイテンシ | 応答までの合計時間 | < 3 秒 |
| 幻覚率 | 文書によって裏付けられていない主張の割合 | < 5% |
Tool di Valutazione:
- RAGAS (Retrieval Augmented Generation Assessment)
- LangSmith (by LangChain) - tracing e valutazione
- Phoenix (by Arize) - osservabilità LLM
- DeepEval - framework di testing per LLM
- TruLens - valutazione feedback-driven
Metriche Composite:
RAG Score = (Context Relevance + Faithfulness + Answer Relevance) / 3
次のステップ
この記事では、RAG とは何なのか、どのように機能するのか、RAG についてしっかりと理解できました。 アーキテクチャの主要なコンポーネントと、それをいつ使用するか (または使用しないか)。役割を理解したね 埋め込み、チャンキング戦略、評価指標の基礎。
Nel 次の記事 理論から実践へ、そして実装していきます を使用した完全な RAG システム TypeScript と LangChain.js、ベクトル付き 実店舗と記憶を備えた会話型インターフェース。
追加リソース
- オリジナルのRAG用紙: 「知識集約型 NLP タスクのための検索拡張生成」 (Lewis et al.、2020)
- LangChain.js ドキュメント: TypeScript での実装に関する公式ドキュメント
- OpenAI クックブック: OpenAI API を使用した RAG の実践例
- 松ぼっくり学習センター: ベクトル データベースと埋め込みに関するガイド
- ラガス: RAG システムを評価するためのオープンソース フレームワーク







