トップ/ コラム/ RAGを用いた社内ナレッジ活用法

RAGを用いた社内ナレッジ活用法
構築手順・ツール選定・精度向上のポイント

「ChatGPTに社内の規程を聞いても間違った答えが返ってくる」「マニュアルが大量にあるが、必要な情報を探すのに時間がかかる」——この問題を解決するのがRAG(Retrieval-Augmented Generation)です。本記事では、RAGの仕組みから実装ステップ、ツール選定まで実務ベースで解説します。

RAGとは何か|LLMの限界を補う仕組み

通常のLLM(GPT-4やGeminiなど)は、学習データが古い・自社の情報を知らない・回答が不正確になるという問題を抱えています。たとえば「弊社の有給申請の手続きは?」と聞いても、正確な社内規程に基づいた回答は返ってきません。

RAGはこの問題を「検索して読んでから回答する」方式で解決します。ユーザーの質問に対して、まず社内ドキュメントから関連する情報をベクトル検索で取り出し、それをLLMへのプロンプトに添付して回答を生成します。

💡
RAGの流れ(4ステップ)

① ユーザーが質問 → ② 社内ドキュメントから関連情報を検索(ベクトル検索)→ ③ 検索結果をプロンプトに追加 → ④ LLMが「検索結果を根拠に」回答を生成

RAGのアーキテクチャ

RAGは大きく2つのフェーズに分かれます。

フェーズ1:インデクシング(事前処理)

  1. ドキュメント収集:社内マニュアル・規程・提案書などをPDF/Word/テキスト形式で収集
  2. チャンキング:ドキュメントを適切なサイズ(500〜1000トークン)に分割
  3. Embedding(ベクトル化):各チャンクをEmbeddingモデルで数値ベクトルに変換
  4. ベクトルDBへの格納:ベクトルをデータベースに保存

フェーズ2:クエリ時(リアルタイム処理)

  1. 質問のベクトル化:ユーザーの質問文をEmbeddingで変換
  2. 類似検索:ベクトルDBで類似度の高いチャンクを取得(Top-K)
  3. プロンプト構築:検索結果 + 質問文 + システムプロンプトを組み合わせ
  4. LLM呼び出し:構築したプロンプトでGPT-4/Gemini等を呼び出し、回答を生成

ツール選定|シンプルさ vs カスタマイズ性

ツール難易度特徴おすすめ対象
Vertex AI SearchGoogle Cloud上でGUIから設定。コード不要でRAGを構築できる非エンジニアチーム・小規模実証実験
Azure AI Search + OpenAI低〜中Azureポータルで設定。Office 365連携が強力Microsoft環境の企業
LangChain + PineconePythonで柔軟に実装。ベクトルDB分離で大規模対応エンジニアチームによる本格実装
LlamaIndexドキュメント処理・インデクシングが強力。複雑な検索に対応精度重視のカスタマイズ実装
Dify / FlowiseGUI操作でRAGパイプラインを構築。オープンソースプロトタイプ・小規模社内ツール

実装ステップ(LangChain + OpenAI 例)

ここではPythonとLangChainを使ったシンプルなRAG実装例を示します。

Step 1:ドキュメントの読み込みとチャンキング

from langchain.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter

# PDFを読み込む
loader = PyPDFLoader("社内規程.pdf")
documents = loader.load()

# チャンクに分割(500文字ずつ、100文字のオーバーラップ)
splitter = RecursiveCharacterTextSplitter(
    chunk_size=500,
    chunk_overlap=100
)
chunks = splitter.split_documents(documents)

Step 2:ベクトル化とベクトルDB格納

from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma

# OpenAIのEmbeddingモデルでベクトル化
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")

# Chromaベクトルストアに保存
vectorstore = Chroma.from_documents(
    documents=chunks,
    embedding=embeddings,
    persist_directory="./db"
)
vectorstore.persist()

Step 3:RAGチェーンの構築と質問応答

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

# 検索器(Top 3件を取得)
retriever = vectorstore.as_retriever(search_kwargs={"k": 3})

# RAGチェーン構築
qa_chain = RetrievalQA.from_chain_type(
    llm=ChatOpenAI(model="gpt-4o", temperature=0),
    chain_type="stuff",
    retriever=retriever,
    return_source_documents=True
)

# 質問する
result = qa_chain("有給申請の手続きを教えてください")
print(result["result"])

精度向上のポイント

1. チャンクサイズの最適化

チャンクが小さすぎると文脈が失われ、大きすぎると検索精度が低下します。500〜800トークン(日本語で約1,000〜1,600文字)が一般的な目安です。ドキュメントの種類(FAQ形式 vs 長文規程)によって調整してください。

2. メタデータの活用

チャンクにドキュメント名・更新日・部署などのメタデータを付与することで、検索精度と出典表示の精度が向上します。

3. ハイブリッド検索の導入

ベクトル検索(意味的類似)と全文検索(キーワード一致)を組み合わせるハイブリッド検索が効果的です。Azure AI SearchやWeaviateがネイティブサポートしています。

⚠️
よくある失敗パターン

・インデクシング後にドキュメントを更新しても、ベクトルDBを再構築しないと古い情報が残る
・チャンク境界で文章が途切れ、意味が通じない回答が生成される
・システムプロンプトで「必ず検索結果のみに基づいて回答すること」を指示しないとLLMが知識から推測して回答する

実際の活用事例

  • 社内問い合わせBot:HR・総務・法務への質問をSlack/TeamsのBot経由で自動回答
  • 営業ナレッジベース:過去の提案書・成功事例から類似案件を検索して参照
  • カスタマーサポート自動化:製品マニュアル・FAQをRAG化し、問い合わせに自動回答
  • コード検索・ドキュメント化:社内のコードベースをRAG化し、仕様を自然言語で検索

まとめ

RAGは「LLMに自社情報を覚えさせる」最も実用的なアプローチです。まずはDifyやVertex AI Searchで小規模なPoC(概念実証)を行い、精度と効果を確認してから本格導入することをお勧めします。sinkaではRAG構築の要件定義から実装・運用まで一貫してサポートしています。

RAG・AIシステム構築のご相談はお気軽に

PoC設計から本格実装まで、sinkaがワンストップでサポートします。