DeepSeek RAG ナレッジベース構築チュートリアル
ゼロから始める、DeepSeek と LangChain を使ったエンタープライズ向けナレッジベースQ&Aシステム。ドキュメントの読み込み、ベクトル埋め込み、セマンティック検索、ソース引用付きのインテリジェントQ&A、完全なコードですぐに学べます。
学習を始めるRAGとは何か、なぜ必要なのか?
RAG(Retrieval-Augmented Generation、検索拡張生成)は、大規模モデルがプライベートな知識に回答するための核となる技術です。RAGがなければ、大規模モデルはトレーニングデータ内のコンテンツにしか回答できません。RAGがあれば、大規模モデルはあなたのドキュメント、データベース、知識ベースに基づいて正確に回答できます。
RAG原理の概要
RAGの仕組みを理解することは、高品質な知識ベースを構築するための前提条件です。RAGは、検索(Retrieval)、拡張(Augmented)、生成(Generation)の3つの中核的な段階で構成されています。
RAGの3つの中核的な段階
| Retrieval(検索) | ユーザーの質問をベクトルに変換し、ベクトルデータベース内で最も関連性の高いドキュメントチャンクを見つけます。これはRAGの「検索」段階です。 |
| Augmented(拡張) | 検索されたドキュメントチャンクをコンテキストとしてプロンプトに連結します。これはRAGの「知識注入」段階です。 |
| Generation(生成) | DeepSeekモデルは拡張されたプロンプトに基づいて回答を生成します。これはRAGの「出力」段階です。 |
RAGアーキテクチャのフロー
完全なRAGアーキテクチャは、オフライン段階とオンライン段階の2つに分かれます。
オフライン段階(知識ベース構築):
- ドキュメントの読み込み:PDF、TXT、Markdown、Webページなど、さまざまなドキュメントを読み取ります。
- テキスト分割:長いドキュメントを適切なサイズのテキストチャンクに分割します。
- ベクトル埋め込み:テキストチャンクをベクトル表現に変換します。
- ベクトルストレージ:ベクトルをChromaDBなどのベクトルデータベースに保存します。
オンライン段階(Q&A):
- ユーザーの質問:ユーザーの入力質問を受け取ります。
- ベクトル検索:質問をベクトルに変換し、データベース内で最も類似したテキストチャンクを見つけます。
- コンテキスト連結:検索結果をコンテキストとして使用し、拡張プロンプトを構築します。
- モデル生成:DeepSeekは拡張プロンプトに基づいて回答を生成し、ソースの引用を含めます。
RAG vs ファインチューニング
| 比較項目 | RAG | ファインチューニング |
|---|---|---|
| 知識の更新 | リアルタイム更新。ドキュメントの追加・削除が即座に反映されます。 | 再トレーニングが必要で、サイクルが長い。 |
| コスト | 低い。ベクトルデータベースのみで済みます。 | 高い。GPUトレーニングリソースが必要です。 |
| 解釈可能性 | 特定のドキュメントにトレース可能です。 | ブラックボックスで、知識の出所を追跡するのが難しい。 |
| 適用シナリオ | 知識ベースQ&A、ドキュメント検索、カスタマーサービスシステム。 | スタイル模倣、特定分野の用語、指示追従 |
ほとんどの企業シナリオでは、RAGとファインチューニングの組み合わせを推奨します:動的な知識にはRAG、モデルの動作最適化にはファインチューニングを使用します。モデルの詳細については、DeepSeekモデルアーキテクチャ解説をご覧ください。
環境準備
必要なPython依存パッケージをインストールします。以下のコマンドで、RAG開発に必要なすべてのライブラリを一度にインストールできます。
コア依存関係のインストール
DeepSeek API設定
RAGシステムは生成モデルとしてDeepSeek APIを使用します。APIキーを保存する環境変数を設定します:
注意
Ollamaを使用してローカルにデプロイしたDeepSeekモデルを使用する場合、APIキーは不要で、APIベースURLをhttp://localhost:11434/v1に指定するだけです。詳細はDeepSeekローカルデプロイチュートリアルをご覧ください。
ドキュメント読み込み
LangChain は、PDF、TXT、Markdown、Web ページ、CSV など、さまざまな形式をサポートする豊富なドキュメントローダーを提供しています。ドキュメントの形式に合ったローダーを選択してください。
PDF ドキュメントの読み込み
TXT と Markdown の読み込み
Web ページの読み込み
Unstructured を使用した汎用ドキュメントの読み込み
Unstructured は、PDF、Word、PPT、Excel、HTML、画像など 20 以上の形式をサポートする強力なドキュメント解析ライブラリです。複雑なドキュメントシナリオに推奨されます:
テキスト分割
テキスト分割はRAGの品質にとって重要なステップです。分割が大きすぎると検索が不正確になり、小さすぎるとコンテキストが失われます。LangChainのRecursiveCharacterTextSplitterが最も推奨されるテキスト分割器です。
RecursiveCharacterTextSplitterの主要パラメータ
| パラメータ | 説明 | 推奨値 |
|---|---|---|
| chunk_size | 各テキストチャンクの最大文字数 | 500-1000 |
| chunk_overlap | 隣接するチャンク間の重複文字数 | 50-200 |
| separators | 分割優先順位:最初に段落、次に文、最後に文字 | デフォルトで良い |
テキスト分割コード
テキスト分割のベストプラクティス
- chunk_sizeはコンテンツタイプに応じて調整:技術文書は500-800、長文記事は800-1200、FAQ類は300-500
- chunk_overlapは省略しない:重複により重要な情報が境界で分割されるのを防ぎます。chunk_sizeの10%-20%を推奨
- メタデータを保持:分割時にドキュメントの出典やページ番号などのメタデータを保持し、後でトレーサビリティを確保
- 中国語の分割:separatorsに中国語の句読点(。!?)を追加し、意味的な境界で分割する
- 先にロードしてから分割:完全なドキュメントをロードしてから一括分割し、繰り返しのロードと分割を避ける
テキスト分割のベストプラクティス
- chunk_sizeはコンテンツタイプに応じて調整:技術文書は500-800、長文記事は800-1200、FAQ類は300-500
- chunk_overlapは省略しない:重複により重要な情報が境界で分割されるのを防ぎます。chunk_sizeの10%-20%を推奨
- メタデータを保持:分割時にドキュメントの出典やページ番号などのメタデータを保持し、後でトレーサビリティを確保
- 中国語の分割:separatorsに中国語の句読点(。!?)を追加し、意味的な境界で分割する
- 先にロードしてから分割:完全なドキュメントをロードしてから一括分割し、繰り返しのロードと分割を避ける
ベクトル埋め込み
ベクトル埋め込みは、テキストを高次元ベクトル(数値の配列)に変換するプロセスです。意味的に類似したテキストは、そのベクトルが空間内で近くなります。これはRAG検索の核となる数学的基盤です。
埋め込みモデルの選択
| モデル名 | 次元 | 中国語サポート | モデルサイズ | 推奨シナリオ |
|---|---|---|---|---|
| BAAI/bge-large-zh-v1.5 | 1024 | 非常に良い | 1.3GB | 中国語ドキュメントに最適 |
| BAAI/bge-small-zh-v1.5 | 512 | 非常に良い | 96MB | 軽量中国語 |
| sentence-transformers/all-MiniLM-L6-v2 | 384 | 普通 | 80MB | 英語中心 |
| shibing624/text2vec-base-chinese | 768 | 非常に良い | 400MB | 中国語セマンティックマッチング |
ベクトル埋め込みコード
埋め込みモデル選択の推奨事項
中国語ドキュメントにはBGEシリーズのモデルを強くお勧めします。中国語の意味理解において、一般的な英語モデルよりも明らかに優れています。ローカル展開にはHuggingFaceEmbeddingsを使用して読み込むことで、API費用はかかりません。最高のパフォーマンスと安定性を追求する場合は、クラウドベースの埋め込みAPIを使用できます。
ベクトルデータベース — ChromaDB
ChromaDB は、LLM アプリケーション向けに設計された軽量なオープンソースのベクトルデータベースです。独立したサーバーは不要で、データはローカルファイルに保存されるため、小規模から中規模の RAG アプリケーションに最適です。
ベクトルデータベースの作成と保存
既存のベクトルデータベースをロード
類似度検索
他のベクトルデータベースオプション
- FAISS: Meta がオープンソース化したベクトルインデックスライブラリ。純粋なインメモリ演算で、検索速度が非常に速く、数百万件のデータに適しています。
- Milvus: エンタープライズ向け分散ベクトルデータベース。10億件規模のベクトルをサポートし、大規模な本番環境に適しています。
- Weaviate: オープンソースのベクトルデータベース。ベクトル化とハイブリッド検索を内蔵し、GraphQL API をサポートしています。
- Pinecone: 商用ベクトルデータベースサービス。運用不要で、インフラ管理を避けたいチームに適しています。
- Qdrant: Rust で書かれた高性能ベクトルデータベース。フィルタリングとグループ検索をサポートしています。
検索チェーンの構築
ベクトル検索とDeepSeekモデルを接続し、完全なRAG QAチェーンを構築します。LangChainのRetrievalQAチェーンは、検索から生成までの全プロセスをカプセル化します。
RetrievalQAチェーンの構築
QAテスト
chain_typeパラメータの説明
| タイプ | 説明 | 適用シナリオ |
|---|---|---|
| stuff | すべての検索結果を一度にプロンプトに入れる | ドキュメントが少ない場合(k <= 4)、最も一般的 |
| map_reduce | 各ドキュメントを個別に要約し、その後要約を結合する | ドキュメントが多く長い場合、全体の理解が必要 |
| refine | ドキュメントごとに回答を反復的に改善する | 高品質な回答が必要で、遅延を気にしない場合 |
| map_rerank | 各ドキュメントにスコアを付け、最高スコアの回答を選択する | 特定のドキュメントを正確にマッチングする必要がある場合 |
ソース引用付きQ&A
RAGの核となる利点の1つはトレーサビリティです。各回答は具体的なドキュメントソースに遡ることができ、ユーザーは情報の正確性を検証できます。以下では、UIでソース引用付きのQ&A結果を表示する方法を示します。
ソース引用のフォーマット
プロンプトでのソース引用の形式
プロンプトで、引用時にソース番号を明記するようにモデルに要求すると、トレーサビリティを効果的に向上させることができます:
Web Q&A APIの構築
FastAPIを使用してRAGシステムをWeb APIとしてラップします:
高度なRAGテクニック
基本的なRAGで80%のシナリオを解決できますが、複雑なシナリオではより高度な検索戦略が必要です。以下のテクニックは、RAGシステムの回答品質を大幅に向上させるのに役立ちます。
マルチクエリ検索(Multi-Query Retrieval)
大規模言語モデルを使用してユーザーの質問を自動的に異なる角度から複数のクエリに書き換え、それぞれ検索して結果を統合し、再現率を向上させます:
親ドキュメント検索器(Parent Document Retriever)
検索には小さなテキストチャンクを使用し(精度を向上)、返却には大きなテキストチャンクを使用します(コンテキストを保持)。小さなチャンクでコンテキストが失われる問題を解決します:
コンテキスト圧縮(Contextual Compression)
ドキュメントを取得した後、圧縮器を使用して質問に最も関連する部分を抽出し、冗長な情報を除去します:
リランキング(Re-ranking)
まずベクトル検索で候補ドキュメントを取得し、次にリランキングモデルで候補ドキュメントを再ランク付けし、検索精度を大幅に向上させます:
高度なテクニックのまとめ
| テクニック | 解決する問題 | コスト |
|---|---|---|
| マルチクエリ検索 | ユーザーの質問の表現が不正確で検索に失敗する | 追加のLLM呼び出し |
| 親ドキュメント検索 | 小さなチャンクでコンテキストが失われる | ストレージが2倍 |
| コンテキスト圧縮 | 検索結果に無関係な内容が多く含まれる | 追加のLLM呼び出し |
| 再ランキング | ベクトル検索の精度が不十分 | 追加のモデル推論 |
完全な実践プロジェクト
これまでのすべてのステップを統合して、完全なドキュメントQ&Aシステムを構築します:PDFフォルダの読み込み、ベクトルデータベースの作成、対話型Q&A、ソース引用付きの出力。
完全なコード:deepseek_rag.py
プロジェクトの実行
Difyとの統合
コードを書きたくない場合は、DifyプラットフォームがビジュアルなRAGナレッジベース機能を提供します。上記のRAGコンセプトをDifyに適用すれば、コーディングなしでエンタープライズレベルのナレッジベースQ&Aシステムを構築できます。
DifyでのRAG対応関係
| RAG段階 | コード実装 | Difyの対応機能 |
|---|---|---|
| ドキュメント読み込み | PyPDFLoader / TextLoader | ナレッジベース → ドキュメントアップロード(PDF/Word/TXT/Web対応) |
| テキスト分割 | RecursiveCharacterTextSplitter | ナレッジベース → チャンク設定(チャンク長とオーバーラップをカスタマイズ) |
| ベクトル埋め込み | HuggingFaceEmbeddings | モデルプロバイダー → 埋め込みモデル設定 |
| ベクトルストレージ | ChromaDB | Dify組み込みベクトルデータベース(Qdrant/Weaviate/ChromaDB) |
| 検索 | vectorstore.similarity_search() | ナレッジベース → リコール設定(TopK、スコアしきい値) |
| 生成 | ChatOpenAI + RetrievalQA | アプリケーションオーケストレーション → DeepSeekモデル + ナレッジベースノードを追加 |
Dify設定手順
- Difyをデプロイ:Docker Composeを使用してワンクリックデプロイ(詳細はDeepSeekエコシステムツールのDifyセクションを参照)
- モデルを設定:「設定 → モデルプロバイダー」でDeepSeekを追加(OpenAI-API互換方式)
- ナレッジベースを作成:ドキュメントをアップロードし、チャンクパラメータを設定(chunk_size 500, chunk_overlap 100)
- アプリケーションを構築:「チャットアプリ」または「エージェント」を作成し、オーケストレーションキャンバスにナレッジベースノードを追加
- 公開して使用:ワンクリックでWebアプリまたはAPIとして公開、既存システムへの埋め込みをサポート
Difyの利点
- ビジュアル操作、コーディング不要
- 組み込みベクトルデータベース、インデックスを自動管理
- ハイブリッド検索をサポート(ベクトル検索 + キーワード検索)
- 引用トレーサビリティを内蔵、回答の出典を自動的に注釈
- 会話ログと分析、Q&Aパフォーマンスを継続的に最適化
- ワンクリックでAPIとして公開、ビジネスシステムへの統合が容易
Difyの活用術とDeepSeek統合ソリューションの詳細は、DeepSeekエコシステムツールとDeepSeek導入チュートリアルをご覧ください。
DeepSeek RAGナレッジベースFAQ
DeepSeek 関連チュートリアル
DeepSeek モデルの使用方法、デプロイ、エコシステムツールを深く学びます。
DeepSeek モデルの使い方
4つの使用方法、ゼロから始める入門チュートリアル。
DeepSeek デプロイチュートリアル
Ollama、Docker、vLLM、K8s でのデプロイ方法。
DeepSeek エコシステムツール
WebUI、IDE プラグイン、Agent フレームワーク、RAG プラットフォーム。
DeepSeek モデルアーキテクチャ
技術アーキテクチャ、Benchmark、選定比較。
DeepSeek オープンソースモデル
6シリーズ、20以上のモデルの完全カタログ。
DeepSeek モデルのダウンロード
Ollama、Hugging Face、GitHub でのダウンロードガイド。