「社内マニュアルがどこに書いてあるか分からない」という業務上の悩みは、多くの企業で共通の課題でございます。本記事では、社内文書を Claude と組み合わせた対話可能な検索ツール(RAG)として構築する最短手順を、実装コード付きで解説いたします。
この記事でわかること
- RAG(検索拡張生成)の基本構成
- Embedding モデルの選定と費用感
- ベクトルDB の選択肢
- Claude API での回答生成の実装
- 本番運用のための機能(更新自動化、検索精度モニタリング)
目次
- 社内ナレッジ検索の基本構成(RAG)
- STEP 1: 文書の準備と分割
- STEP 2: Embedding と ベクトルDB
- STEP 3: Claude での回答生成
- STEP 4: チャットUI
- 本番運用の機能拡張
- コスト感とまとめ
社内ナレッジ検索の基本構成(RAG)
RAG(Retrieval-Augmented Generation)は、次の流れで動作します。
- 事前準備: 社内文書を分割してベクトル化(Embedding)し、ベクトルDB に保存
- 検索時: ユーザーの質問を Embedding 化し、ベクトルDB から関連文書を上位N件取得
- 生成時: 取得した文書を参考資料として Claude に投入し、回答を生成
「Claude が事前にすべての社内文書を学習していなくても、検索結果を参考に正確に回答できる」のが RAG の本質的価値です。
STEP 1: 文書の準備と分割
対象文書の整理
初期データとして、次のような社内文書を対象に整備します。
- 業務マニュアル(PDF / Word / Markdown)
- 就業規則・社内規程
- 製品仕様書
- FAQ・過去の問い合わせ対応記録
- 研修資料
文書の分割(チャンク化)
各文書を 500〜1,500 文字程度の「チャンク」に分割します。あまり長すぎるとベクトル検索の精度が落ち、短すぎると文脈が失われます。
def chunk_text(text, chunk_size=800, overlap=100):
chunks = []
start = 0
while start < len(text):
end = min(start + chunk_size, len(text))
chunks.append(text[start:end])
start += chunk_size - overlap
return chunks
段落境界・見出しを意識した分割が望ましいため、Markdown 形式に変換してから見出し単位で分割する方法も実用的です。
STEP 2: Embedding と ベクトルDB
Embedding モデルの選定
| モデル | 料金 | 特徴 |
|---|---|---|
| OpenAI text-embedding-3-large | $0.13/MTok | 高精度、多言語対応 |
| OpenAI text-embedding-3-small | $0.02/MTok | 低コスト、十分実用 |
| Cohere embed-multilingual-v3 | $0.10/MTok | 多言語強い |
| ローカル: multilingual-e5-large | 無料 | 自社サーバー運用 |
中小企業の社内ナレッジ用途では、OpenAI text-embedding-3-small が費用対効果良好な選択肢でございます。
ベクトルDB の選択肢
- Chroma: ローカル運用、軽量、PoC向き
- Qdrant: Docker で簡単デプロイ、本番対応
- Pinecone: SaaS、月額従量、運用負担最小
- Weaviate: オープンソース+SaaS、機能豊富
- pgvector (PostgreSQL拡張): 既存DB活用、運用シンプル
PoC 段階では Chroma で十分、本番運用は規模に応じて Qdrant や pgvectorを選択するのが現実的です。
Embedding 生成とDB登録の実装例
from openai import OpenAI
import chromadb
oai = OpenAI()
db_client = chromadb.PersistentClient(path="./vectordb")
collection = db_client.get_or_create_collection("company_docs")
def embed_and_store(doc_id, text):
chunks = chunk_text(text)
for i, chunk in enumerate(chunks):
emb = oai.embeddings.create(
model="text-embedding-3-small",
input=chunk
).data[0].embedding
collection.add(
ids=[f"{doc_id}-{i}"],
embeddings=[emb],
documents=[chunk],
metadatas=[{"doc_id": doc_id, "chunk_index": i}]
)
STEP 3: Claude での回答生成
ユーザーの質問を受けたら、ベクトル検索 → 関連文書取得 → Claude へ参考資料として投入する流れを実装します。
import anthropic
claude = anthropic.Anthropic()
def answer_with_rag(question, top_k=5):
# 質問を Embedding 化
q_emb = oai.embeddings.create(
model="text-embedding-3-small",
input=question
).data[0].embedding
# ベクトル検索
results = collection.query(
query_embeddings=[q_emb],
n_results=top_k
)
# 参考資料として整形
context = "\n\n".join([
f"【参考{i+1}】\n{doc}"
for i, doc in enumerate(results['documents'][0])
])
# Claude で回答生成
response = claude.messages.create(
model="claude-sonnet-4-6",
max_tokens=2000,
system=f"""あなたは社内のドキュメント検索アシスタントです。
以下の社内文書を参考に、ユーザーの質問に正確に答えてください。
参考資料にない情報については「該当する記述が見つかりませんでした」と返答してください。
{context}""",
messages=[{"role": "user", "content": question}]
)
return response.content[0].text
「参考資料にない情報は答えない」とシステムプロンプトで明示することで、ハルシネーション(事実に基づかない作話)を大幅に抑制できます。
STEP 4: チャットUI
UI 部分は、用途に応じて次の選択肢があります。
- Streamlit / Gradio: 最短2時間で Web UI を構築
- Next.js + Tailwind: 本格的な業務システム向け
- Slack ChatBot: 別記事「Slack ChatBot 実装例」参照
- Teams ChatBot: Microsoft 365 環境向け
PoC では Streamlit で素早く UI を作り、効果検証後に本番 UI を作り込むのが効率的です。
本番運用の機能拡張
① 文書の自動更新
社内文書は更新されるため、ベクトルDB も同期して更新する必要があります。Google Drive や SharePoint と連携し、ファイル更新を検知して自動的に再ベクトル化する仕組みを組み込みます。
② アクセス権限の反映
部署別・役職別に閲覧権限がある文書は、ベクトルDB のメタデータに権限情報を持たせ、検索時にフィルターをかけます。「人事資料は人事部のみ」といった制御が必須でございます。
③ 引用元の表示
回答時に「どの文書のどの部分を参照したか」を明示することで、ユーザーが原文を確認できる構成にします。信頼性向上に直結します。
④ 検索精度のモニタリング
ユーザーから「この回答は役立った/役立たなかった」のフィードバックを収集し、検索精度を継続的に改善します。
コスト感とまとめ
| 項目 | コスト目安 |
|---|---|
| PoC 実装(基本構成) | 50〜120万円 |
| 本番実装(権限制御・自動更新含む) | 200〜500万円 |
| 月額 Embedding コスト(初期登録) | 5,000〜30,000円 |
| 月額 Claude API コスト(月3,000件の質問想定) | 5,000〜20,000円 |
| 月額 ベクトルDB(SaaS の場合) | 0〜10,000円 |
社内ナレッジ検索ツールは、業務効率化の効果が体感しやすく、導入後の従業員からの評価が高い領域でございます。「マニュアルを探す時間」を毎日10〜30分削減できる効果が見込めます。
Claude Code を使えば、PoC は1〜2週間で構築可能。最初は1部署・1業務に絞って試し、効果検証後に全社展開する進め方が現実的です。社内ナレッジ検索ツールの構築をご検討中でしたら、ぜひお気軽にご相談くださいませ。