「Notionに全部書いてあるのに誰も使っていない」問題

Notionをナレッジベースとして使っている会社は多い。しかし「検索が弱くて目的のページが見つからない」という声は絶えない。ページが増えれば増えるほど、キーワード検索の精度が追いつかなくなる。

RAG(Retrieval Augmented Generation)を使えば、「Notionの社内ドキュメントに対してAIが自然な質問文で検索し、要約して回答する」システムが作れる。2年前なら専門エンジニアが必要だったが、今は最小構成なら非エンジニアでも半日で動かせるレベルになっている。

RAGの仕組みを最小限で理解する

RAGは「文書を事前にベクトル(数値)化してデータベースに保存しておき、質問が来たら関連する文書を取り出してAIに渡す」という仕組みだ。

流れを簡単に書くと:

  1. Notionのドキュメントを取り出す
  2. 文書をチャンク(小さな塊)に分割する
  3. チャンクをベクトル化してDBに保存する
  4. ユーザーが質問する
  5. 質問をベクトル化して、近いチャンクを検索する
  6. 関連チャンクをClaudeに渡して回答させる

ここで使うツールは:

  • Notion API(ドキュメント取得)
  • Chroma または Supabase(ベクトルDB)
  • Claude API(回答生成)
  • LangChain または LlamaIndex(処理をつなぐフレームワーク)

Step 1:Notionからデータを取り出す

NotionのAPIを使ってページを取得する。Notion側で「Integration」を作成してAPIキーを発行し、対象のデータベースやページにそのIntegrationをconnectする。

Pythonでの取得例:

from notion_client import Client

client = Client(auth="your_notion_api_key")

# データベースのページを全取得
response = client.databases.query(database_id="your_database_id")

pages = response["results"]

取得したページのコンテンツはBlockオブジェクトで返ってくる。それをテキストとして抽出して、次のステップに渡す。

Step 2:ベクトルDBに格納する

Chromaを使う場合、ローカルで動かせるため初期コストが安い。本番運用ではSupabase(pgvector)に移行する方が管理がシンプルだ。

import chromadb
from anthropic import Anthropic

client = chromadb.Client()
collection = client.create_collection("internal_docs")

# ドキュメントを追加(ここでembeddingを生成)
collection.add(
    documents=["ドキュメントのテキスト"],
    ids=["doc_id_1"]
)

Embedding(ベクトル化)にはOpenAIのEmbedding APIかVoyage AIが実績が多い。Claudeはembeddingに対応していないため、この部分だけ別のAPIを使う構成が一般的だ。コストを抑えたい場合はVoyage AI(Claude向けに最適化されているとされる)が選択肢になる。

Step 3:Claudeで回答生成する

質問に対して関連チャンクを取り出し、Claudeに渡す部分の実装例:

import anthropic

client = anthropic.Anthropic(api_key="your_api_key")

def answer_question(question: str, retrieved_docs: list[str]) -> str:
    context = "\n\n".join(retrieved_docs)
    
    message = client.messages.create(
        model="claude-opus-4-5",
        max_tokens=1024,
        messages=[
            {
                "role": "user",
                "content": f"""以下の社内ドキュメントを参考に質問に答えてください。

ドキュメント:
{context}

質問:{question}

ドキュメントに情報がない場合はその旨を伝えてください。"""
            }
        ]
    )
    
    return message.content[0].text

この形で実装すると、ClaudeはNotionのドキュメントを参照して回答を生成する。「〇〇のプロジェクトの顧客担当は誰ですか」「有給休暇の申請手順を教えてください」といった社内QAに答えられるようになる。

最小構成で動かすためのポイント

チャンクサイズは200〜500トークンが目安

チャンクが大きすぎると検索精度が下がり、小さすぎると文脈が途切れる。200〜500トークン(日本語なら400〜1000文字程度)で分割して試してみるのが出発点として適切だ。

最初はデータ量を絞る

全Notionをいきなり入れるのではなく、「よく参照する10〜20ページ」に限定してまず動かす。動作確認ができてから範囲を広げていくのが失敗しにくいアプローチだ。

回答の精度チェックを定期的に行う

RAGは「誰も気づかないうちに誤答している」リスクがある。週に1回程度、想定問答を用意して精度確認のルーティンを作ることを推奨する。

士業・中小企業への応用

弁護士・税理士事務所では、過去の回答例・契約書テンプレート・法律解説文をRAG化すると、スタッフが過去事例を即座に参照できるようになる。新入スタッフが「前にどういう対応をしたか」を聞ける仕組みは、実質的なナレッジ継承になる。

まとめ

社内ドキュメントのRAGシステムは「Notion API→ベクトルDB(Chroma/Supabase)→Claude API」の3要素で最小構成が作れる。全体の実装は半日〜1日程度。まず10〜20ページの小さな範囲で試して、精度を確認してから拡張していくのが現実的なアプローチだ。「誰も使っていないNotion」を「全員が毎日参照するナレッジベース」に変える手段として、今最もコスパが高い方法のひとつだ。