ローカルLLMを業務で活用する際、大きな課題となるのが「社内固有の情報に対応できない」という点です。LLMは膨大なデータで事前学習されていますが、自社の規程、マニュアル、過去の報告書といった社内文書の内容は当然ながら知りません。
この課題を解決するのがRAG(Retrieval-Augmented Generation:検索拡張生成)という技術です。本記事では、ローカルLLMとRAGを組み合わせて、社内文書に基づいた正確な回答を生成するシステムの構築方法を、中小企業のIT担当者向けに解説します。
RAG(検索拡張生成)とは何か
RAGは、LLMが回答を生成する際に外部の知識ソース(文書データベースなど)を検索し、その結果を参考にして回答を生成する手法です。2020年にMeta(旧Facebook)の研究チームによって提案され、現在はLLM活用の主要技術のひとつとなっています。
RAGが解決する3つの課題
RAGは、LLMが抱える以下の課題を効果的に解決します。
- ハルシネーション(幻覚)の抑制:根拠となる文書を参照して回答するため、もっともらしいが誤った情報の生成を防げる
- 最新情報への対応:LLMの学習データに含まれない最新の社内情報にも対応可能
- 社内固有の知識の活用:自社の製品情報、業務手順、規程など、一般的なLLMでは回答できない質問に対応
RAGの処理フロー
RAGは以下の3つのステップで動作します。
- インデキシング(事前準備):社内文書をチャンク(小さな断片)に分割し、各チャンクをベクトル(数値の配列)に変換してデータベースに格納する
- 検索(Retrieval):ユーザーの質問をベクトル化し、データベースから意味的に関連性の高いチャンクを検索する
- 生成(Generation):検索で取得したチャンクをLLMのプロンプトに含め、文書の内容に基づいた回答を生成する
この仕組みにより、LLMは自身の学習データだけでなく、リアルタイムで参照した文書に基づいて回答できるようになります。
ローカルRAGシステムの構成要素
ローカル環境でRAGシステムを構築するために必要なコンポーネントを解説します。
必要なコンポーネント一覧
| コンポーネント | 役割 | 推奨ツール |
|---|---|---|
| LLMモデル | 回答の生成 | Qwen 3、Gemma 3など |
| 推論エンジン | LLMの実行 | Ollama |
| 埋め込みモデル | テキストのベクトル化 | nomic-embed-text、mxbai-embed-large |
| ベクトルデータベース | ベクトルの保存と検索 | ChromaDB、Qdrant、FAISS |
| RAGフレームワーク | 各コンポーネントの連携 | LlamaIndex、LangChain |
| UI | ユーザーインターフェース | Open WebUI |
埋め込みモデルとは
RAGで重要な役割を果たすのが「埋め込みモデル(Embedding Model)」です。これはテキストを数百〜数千次元のベクトル(数値の配列)に変換するモデルで、意味の近いテキスト同士が近いベクトルになるよう学習されています。
Ollamaでは埋め込みモデルもローカルで実行でき、テキストデータを社外に送信する必要がありません。
# Ollamaで埋め込みモデルをダウンロード
ollama pull nomic-embed-text
方法1:Open WebUIのRAG機能を使う(最も簡単)
Open WebUIにはRAG機能が組み込まれており、追加のプログラミングなしでRAGを利用できます。中小企業で最初にRAGを試す場合はこの方法が最もおすすめです。
セットアップ手順
Step 1:OllamaとOpen WebUIの準備
Ollamaのインストールとモデルのダウンロードが完了していることを前提とします。まだの方はOllamaのセットアップガイドを参照してください。
# LLMモデルのダウンロード(日本語対応モデル推奨)
ollama pull qwen3:7b
# 埋め込みモデルのダウンロード
ollama pull nomic-embed-text
Step 2:Open WebUIの起動
# Dockerを使ってOpen WebUIを起動
docker run -d -p 3000:8080 \
--add-host=host.docker.internal:host-gateway \
-v open-webui:/app/backend/data \
--name open-webui \
--restart always \
ghcr.io/open-webui/open-webui:main
Step 3:RAG用の設定
Open WebUIの管理画面(Settings > Documents)で、以下を設定します。
- Embedding Model:nomic-embed-textを選択
- Chunk Size:500〜1000(文書の性質に応じて調整)
- Chunk Overlap:100〜200(チャンク間の重複部分)
Step 4:文書のアップロード
Open WebUIのDocumentsセクションから、社内文書をアップロードします。対応フォーマットは以下の通りです。
- PDF(社内規程、マニュアルなど)
- テキストファイル(.txt)
- Markdownファイル(.md)
- Word文書(.docx)
Step 5:RAGを使った質問
チャット画面で「#」を入力すると、アップロードした文書の一覧が表示されます。参照したい文書を選択してから質問を入力すると、その文書の内容に基づいた回答が生成されます。
方法2:LlamaIndexで本格的なRAGを構築する
Open WebUIのRAG機能では対応しきれない高度な要件がある場合、Pythonのフレームワーク「LlamaIndex」を使って独自のRAGシステムを構築できます。
LlamaIndexの基本構成
# 必要なパッケージのインストール
pip install llama-index llama-index-llms-ollama llama-index-embeddings-ollama chromadb
以下は、Ollamaと連携した基本的なRAGシステムのコード例です。
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
from llama_index.llms.ollama import Ollama
from llama_index.embeddings.ollama import OllamaEmbedding
# Ollamaの設定
llm = Ollama(model="qwen3:7b", request_timeout=120.0)
embed_model = OllamaEmbedding(model_name="nomic-embed-text")
# 社内文書の読み込み(./documents/ フォルダに格納)
documents = SimpleDirectoryReader("./documents/").load_data()
# インデックスの作成
index = VectorStoreIndex.from_documents(
documents,
embed_model=embed_model
)
# クエリエンジンの作成
query_engine = index.as_query_engine(llm=llm)
# 質問の実行
response = query_engine.query("有給休暇の申請方法を教えてください")
print(response)
LlamaIndexの利点
- 柔軟なカスタマイズ:チャンクサイズ、検索方式、プロンプトなどを細かく調整可能
- 多様なデータソース対応:Webページ、データベース、APIなど多様なソースからデータを取得可能
- 高度な検索手法:ハイブリッド検索(ベクトル検索+キーワード検索の組み合わせ)などが利用可能
- 再ランキング:検索結果の関連度を再評価して、回答品質を向上できる
RAGの品質を高めるチューニングのポイント
RAGシステムの回答品質は、各種パラメータの調整によって大きく変わります。実践的なチューニングのポイントを紹介します。
チャンク分割の最適化
文書をどの単位で分割するかは、回答品質に直結します。
- チャンクサイズが小さすぎる場合:文脈が失われ、断片的な情報しか取得できない
- チャンクサイズが大きすぎる場合:関連性の低い情報も多く含まれ、LLMが混乱する
- 推奨値:日本語文書の場合、500〜1000文字程度が一般的に良い結果を得やすい
また、見出しや段落単位でチャンクを区切る「セマンティックチャンキング」も効果的です。業務マニュアルのようにセクションが明確に分かれている文書では、この手法が特に有効です。
検索精度の改善
- Top-Kの調整:検索で取得するチャンクの数を調整する。多すぎるとノイズが増え、少なすぎると情報不足になる。3〜5件が目安
- ハイブリッド検索:ベクトル検索(意味的な類似度)とキーワード検索(完全一致)を組み合わせて精度を向上
- メタデータフィルタリング:文書のカテゴリや作成日時をメタデータとして付与し、検索時にフィルタリングする
プロンプトの工夫
RAGでLLMに渡すプロンプトの設計も回答品質に大きく影響します。
以下の参考情報に基づいて、ユーザーの質問に正確に回答してください。
参考情報に記載されていない内容については「この情報は社内文書に記載がありません」と回答してください。
回答の根拠となる参考情報の箇所を明示してください。
【参考情報】
{context}
【ユーザーの質問】
{query}
このように「参考情報にない場合は回答しない」と明示することで、ハルシネーション(幻覚)を抑制できます。
ローカルRAGに適したモデルの選び方
RAGの効果を最大化するには、LLMモデルと埋め込みモデルの両方を適切に選択することが重要です。
LLMモデルの選択
RAG用途では、以下の能力が重要です。
- 指示追従能力:「参考情報に基づいて回答せよ」という指示に正確に従えること
- 長文コンテキストの処理能力:複数のチャンクを含む長いプロンプトを適切に処理できること
- 日本語の理解・生成能力:社内文書が日本語であれば、日本語性能の高いモデルが必須
おすすめはQwen 3 7B〜14Bです。日本語性能が高く、指示追従能力にも優れています。Gemma 3 12Bもバランスの良い選択肢です。
埋め込みモデルの選択
埋め込みモデルは検索精度に直結します。Ollamaで利用できるおすすめモデルを紹介します。
| モデル | 次元数 | 特徴 |
|---|---|---|
| nomic-embed-text | 768 | 軽量でバランスが良い。最初の選択肢として推奨 |
| mxbai-embed-large | 1024 | 高精度。より高い検索品質が必要な場合に |
| snowflake-arctic-embed | 1024 | 多言語対応に優れる |
日本語文書を扱う場合は、多言語対応の埋め込みモデルを選択することで検索精度が向上します。
実用的なRAG活用シーン
中小企業でのRAGの活用シーンを具体的に紹介します。
社内規程・マニュアルの検索
就業規則、経費精算ルール、セキュリティポリシーなどの社内規程をRAGに取り込み、社内チャットボットから検索・回答できるようにします。「出張時の宿泊費の上限はいくらですか?」といった質問に、規程の該当箇所を根拠として回答できます。
技術文書・ナレッジベースの活用
過去のトラブルシューティング記録、技術メモ、設計文書などをRAGに組み込むことで、新しい問題に対して過去の知見を活用した回答を得られます。ベテラン社員の暗黙知を組織の知的資産として活用できるようになります。
顧客対応の支援
製品カタログ、FAQ、過去の問い合わせ対応履歴をRAGに取り込み、顧客からの問い合わせに対する回答案を生成できます。導入事例でも紹介した通り、回答品質の向上と対応時間の短縮を同時に実現できます。
まとめ:RAGでローカルLLMの実用性を飛躍的に高める
RAGは、ローカルLLMを「汎用的なAIアシスタント」から「自社の業務に特化した知識システム」へと進化させる技術です。重要なポイントをまとめます。
- RAGにより、LLMが学習していない社内固有の情報に基づいた回答が可能になる
- ハルシネーションを抑制し、根拠のある信頼性の高い回答を生成できる
- Open WebUIの内蔵RAG機能を使えば、プログラミング不要で導入可能
- LlamaIndexを使えば、より高度なカスタマイズが可能
- すべての処理がローカルで完結するため、機密文書も安心して利用できる
まずはOpen WebUIの文書アップロード機能からRAGを体験し、効果を確認した上で段階的にシステムを拡充していくことをおすすめします。社内チャットボットと組み合わせることで、社内の問い合わせ対応を大きく効率化できるでしょう。ローカルLLMの仕組みを理解しておくと、チューニングの際にも役立ちます。
関連記事
Claude CodeでREST API開発|設計からテストまでAI駆動で高速構築
Claude Codeでコードレビュー|AIを活用した品質チェックとレビュー効率化
Claude Codeのコンテキスト管理術|大規模プロジェクトで精度を維持する方法
Claude Codeのカスタムスラッシュコマンド作成ガイド|独自ワークフローの自動化
Claude Codeでデータベース移行・マイグレーション|安全なスキーマ変更の実践
Claude Codeでデバッグを効率化|バグ修正・エラー解析の実践テクニック
Claude Codeでドキュメント自動生成|README・API仕様書・技術文書の効率的な作り方
Claude Codeでエラーハンドリング実装|堅牢なアプリケーションを構築するパターン集