はじめに
「Notionにまとめた技術メモ、LLMに全部覚えさせたい…!」
IT研修の講師をしていると、Notionにナレッジがどんどん溜まっていきます。コマンド早見表、トラブルシュート集、研修で使ったたとえ話…。これをローカルLLMに読み込ませれば、自分専用のAIアシスタントが作れます。
この記事では、Notion DatabaseからデータをエクスポートしてOllamaのローカルLLMに読み込ませるまでの手順を、テンプレート付きで解説します。
全体の流れ
Notion Database → Python(API) → JSONL → Ollama Modelfile → ローカルLLM
3ステップで完成します:
- Notionにナレッジ用DBを作る
- PythonスクリプトでJSONLにエクスポート
- OllamaのModelfileに組み込んで起動
Step 1: Notion Databaseのテンプレート設計
なぜDB設計が大事?
LLMに読み込ませるとき、「タイトルと本文だけ」だと検索性が落ちます。メタデータ(カテゴリ・タグ・レベル)を付けておくと、RAG構成にしたときの精度がグッと上がります。
推奨プロパティ一覧
| プロパティ名 | 型 | 用途 |
|---|---|---|
| タイトル | タイトル | ナレッジの名前 |
| カテゴリ | セレクト | Linux / Python / Java 等 |
| タグ | マルチセレクト | 初心者向け / LPIC / コマンド集 等 |
| コンテンツ | リッチテキスト | 本文(ページ本文でもOK) |
| 要約 | リッチテキスト | 3行要約(RAG検索用) |
| ソース | セレクト | 自作記事 / 公式ドキュメント 等 |
| 対象レベル | セレクト | 入門 / 基礎 / 応用 / 実務 |
| 更新日 | 日付 | 最終更新日 |
| LLM取込済 | チェックボックス | エクスポート管理用 |
ポイント:「要約」プロパティが重要
RAG(検索拡張生成)を使う場合、全文ではなく要約でヒットさせてから本文を参照する方式が効果的です。3行程度の要約を入れておくと、チャンク検索の精度が上がります。
Step 2: Notion APIでエクスポート
事前準備
- Notion Integrations でインテグレーションを作成
- トークンを取得
- 対象DBに「接続」を追加
pip install notion-client
export NOTION_TOKEN="secret_xxxxx"
export NOTION_DATABASE_ID="your-database-id"
エクスポートスクリプトの要点
from notion_client import Client
import json
notion = Client(auth=os.environ["NOTION_TOKEN"])
# DB全件取得(ページネーション対応)
results = []
has_more = True
start_cursor = None
while has_more:
response = notion.databases.query(
database_id=DATABASE_ID,
start_cursor=start_cursor,
)
results.extend(response["results"])
has_more = response.get("has_more", False)
start_cursor = response.get("next_cursor")
取得したデータは、LLMが読みやすい形式に整形してJSONLに書き出します。
doc = {
"title": title,
"metadata": {"category": category, "tags": tags, "level": level},
"summary": summary,
"content": content,
"formatted_text": f"# {title}\nカテゴリ: {category}\n\n{content}"
}
f.write(json.dumps(doc, ensure_ascii=False) + "\n")
出力されるJSONL例
{"title": "chmod コマンド早見表", "metadata": {"category": "Linux", "tags": ["初心者向け", "LPIC"]}, "summary": "chmodはパーミッション変更コマンド...", "content": "## chmod とは\n...", "formatted_text": "# chmod コマンド早見表\n..."}
Step 3: Ollamaに読み込ませる
方法A: Modelfileのsystemプロンプトに埋め込む(お手軽)
ナレッジ量が少ない場合(目安:コンテキスト長に収まる範囲)はこれが一番簡単です。
FROM llama3.2
SYSTEM """
あなたはIT研修のアシスタントです。
以下のナレッジベースを参照して質問に回答してください。
# chmod コマンド早見表
カテゴリ: Linux | レベル: 入門
## chmod とは
ファイルやディレクトリのパーミッションを変更するコマンド。
...(ナレッジ全文)...
"""
PARAMETER temperature 0.3
PARAMETER num_ctx 8192
ollama create my-it-tutor -f Modelfile
ollama run my-it-tutor
方法B: RAG構成にする(本格運用向け)
ナレッジが多い場合は、ベクトルDBと組み合わせます。
JSONL → Embedding → ChromaDB → 質問時に類似検索 → LLMに注入
import chromadb
client = chromadb.Client()
collection = client.create_collection("knowledge")
# JONLからドキュメントを登録
with open("knowledge_base.jsonl") as f:
for i, line in enumerate(f):
doc = json.loads(line)
collection.add(
documents=[doc["formatted_text"]],
metadatas=[doc["metadata"]],
ids=[doc["id"]]
)
# 質問時に検索して上位をコンテキストに
results = collection.query(query_texts=["chmodの使い方"], n_results=3)
context = "\n---\n".join(results["documents"][0])
使い方の選択ガイド
| 状況 | おすすめ方法 |
|---|---|
| ナレッジ50件以下 | 方法A(systemプロンプト埋め込み) |
| ナレッジ50件以上 | 方法B(RAG + ChromaDB) |
| 研修中にリアルタイムで使いたい | 方法A(レスポンスが速い) |
| チーム全員で使いたい | 方法B + API化 |
テンプレートファイル
今回のテンプレートとスクリプトはGitHub(またはこの記事の末尾)に置いています:
-
notion_db_template.json— Notion DBスキーマ+サンプルデータ -
notion_to_llm.py— エクスポート&Modelfile生成スクリプト
実際に使ってみた感想
研修中に「このコマンドなんだっけ?」と聞かれたとき、自分のナレッジを覚えたLLMに聞くと自分の言葉遣い・たとえ話で返ってくるのが良いです。「うさうさラーメン店」の例え話もちゃんと再現してくれます。
まとめ
- Notion DBはメタデータをしっかり設計するのがコツ
- 少量ならsystemプロンプト埋め込みで十分動く
- 大量ならChromaDB等でRAG構成にする
- ローカルLLMなので情報漏洩の心配なし、研修現場でも安心
自分だけのナレッジを覚えたAIアシスタント、ぜひ試してみてください!