5
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

機微情報OK!Open Notebookの仕組みと構築手順 - NotebookLM相当をローカルで実現

Posted at

はじめに

GMOコネクトの永田です。

「NotebookLMは便利だけど、機微な情報を扱えない...」

そんな悩みを持つ方に朗報です。NotebookLM相当の機能を完全ローカル環境で実現するOSSプロジェクト「Open Notebook」があります。

本記事では、Github Copilotと共にOpen Notebookの内部実装を調査し、以下を明らかにします:

  • どのLLMモデルをどう使い分けているか
  • なぜローカル環境でも高速に動作するのか
  • ChatとAskの処理フローの違い

ollama環境での実際の構築手順も含め、技術的な仕組みを詳しく解説します。

最初にまとめ

  • Open NotebookはNotebookLMのOSS代替として、完全ローカル環境で動作可能
  • 3種類のモデル設定(Chat、Transformation、Embedding)が必要だが、ollamaには2種類のLLMで済む(ChatとTransformationは共有可能)
  • Insightsは元ソースをSPRで圧縮要約したもので、Chatの高速化に貢献
  • ChatとAskの使い分けが重要:Chatは軽量・高速、Askは高精度だがローカルLLMには負荷が高い
  • 機微情報を扱う業務では、ローカルLLM(ollama)との組み合わせで完全プライベートな環境を構築できる

Open Notebookとは

Open Notebookの概要

公式ページはこちらです。

A private, multi-model, 100% local, full-featured alternative to Notebook LM

って、めっちゃNotebook LMを意識していますね。

githubの説明から比較表を日本語にして転記します。(これが一番分かりやすかった)

🆚 Open Notebook vs Google Notebook LM 比較表

特徴 (Feature) Open Notebook Google Notebook LM メリット (Advantage)
プライバシーと制御 セルフホスト、データは自分のもの Googleクラウドのみ 完全なデータ主権
AIプロバイダーの選択 16以上のプロバイダー (OpenAI, Anthropic, Ollama, LM Studio等) Googleモデルのみ 柔軟性とコストの最適化
Podcastの話者 カスタムプロファイルで1〜4人 2人のみ 圧倒的な柔軟性
コンテキスト制御 3段階の詳細なレベル設定 すべてかゼロか (All-or-nothing) プライバシーとパフォーマンスの調整
コンテンツ変換 カスタムおよび組み込み機能 限定的なオプション 無制限の処理能力
APIアクセス フルREST API APIなし 完全な自動化
デプロイ方法 Docker、クラウド、またはローカル Googleホストのみ どこにでもデプロイ可能
引用 (Citations) ソースを伴う包括的な引用 基本的な参照のみ 研究の完全性
カスタマイズ性 オープンソース、完全にカスタマイズ可能 クローズドなシステム 無限の拡張性
コスト AI使用料のみ支払い 月額サブスクリプション + 使用料 透明性が高く管理可能なコスト

Ollama などのローカルLLMと組み合わせて、完全ローカルなNotebook環境を作れるのが、一番のメリットですね。
機微な情報なので、ってことでNotebookLMを初めとしたクラウドSaaSが使えない業務もまだまだあるので、これは期待できます😊

Open Notebook + ollama環境の構築

さて、調査にあたってまずはローカルでOpen Notebookを準備します。

試した環境は以下です。

  • Apple M4 Max 36GB, macOS 26.1
  • docker + docker-composeインストール済み

ollamaのインストールとモデルの取得

ollamaのインストールと起動自体はbrewでさくっと終わるので説明は省略します。

Open Notebookでは、3種類のデフォルトモデル設定(Chat Model、Transformation Model、Embedding Model)が必要です。
しかし、ollamaに登録するLLMモデルは2種類で十分です。なぜなら、ChatとTransformationは同じLanguage Modelを使い回せるためです。

ollamaでのそれぞれのお勧めは、公式のgitに記載がありますので参考にしてください。

今回、私は以下の2種類のLLMモデルをollamaにダウンロードしました。

ollamaに登録するLLM モデル名 Open Notebookでの用途
Language Model gpt-oss:20b Chat Model + Transformation Model として利用
Embedding Model mxbai-embed-large Embedding Model として利用

curl http://localhost:11434/api/tags でモデル一覧が取得できれば、ollamaの準備は完了です。
( ollama の待受けを 127.0.0.1:11434 ではなく 0.0.0.0:11434 のように全許可にする必要があるという解説もありましたが、私の環境では 127.0.0.1 のデフォルトのままで動作しました。)

Open Notebookのdocker-compose起動

公式gitにdocker-compose yamlが用意されていますが、git cloneしてbuildする必要はないので、dockerhub公開されているイメージを使うように少し変更します。

修正後のdocker-compose.yml

services:
  open_notebook_single:
    image: lfnovo/open_notebook:v1-latest-single
    ports:
      - "8502:8502"  # Next.js Frontend
      - "5055:5055"  # REST API
    env_file:
      - ./docker.env
    volumes:
      - ./notebook_data:/app/data          # Application data
      - ./surreal_single_data:/mydata      # SurrealDB data
    restart: always

また環境変数ファイルも最低限の内容で準備します。

docker.env

# use ollama
OLLAMA_API_BASE=http://host.docker.internal:11434

# Long timeouts for Ollama (large models take time)
API_CLIENT_TIMEOUT=600
ESPERANTO_LLM_TIMEOUT=300

# DATABASE CONFIGURATION
SURREAL_URL=ws://localhost:8000/rpc
SURREAL_USER=root
SURREAL_PASSWORD=root
SURREAL_NAMESPACE=open_notebook
SURREAL_DATABASE=local
  • OLLAMA_API_BASEhost.docker.internal とすることで、docker host(=macOS)のollamaに接続できます。( localhost だとdocker container内になり接続できません。)
  • ローカルLLMのレスポンスはまだ良くないので、タイムアウトを延ばしています
  • その他は公式のQuickStartにおおよそ沿っています

Open Notebookの起動

普通にdocker-compose を起動( docker compose up -d )すれば大丈夫です。
その後、ブラウザで http://localhost:8502/ を開くとアクセス可能です。

Open NotebookのModelsと機能の関係

Open Notebookで利用するModels

最初に起動した時、Open Notebookで利用するモデルの選択が必要です。
左メニューのMANAGE --> Modelsで設定が可能です。

最初これをみた時、それぞれ何に使うんだろう?と不明だったのが、今回の調査の動機の1つでもあります。

用語の整理:

  • AI Provider: LLMの提供元(今回はollamaのみを使用)
  • LLMモデル: ollamaに登録した具体的なモデル(gpt-oss:20b、mxbai-embed-large)
  • モデル種別: Open Notebookでの役割(Chat、Transformation、Embedding)

スクリーンショット 2025-12-19 15.35.41.png

画面を見ると分かる通り、必須項目が赤字の*になっており、Chat Model、Transformation Model、Embedding Modelの3つのデフォルト設定が必要です。

その下に、Language Models(Chat, transformations, and text generation)とEmbedding Models(Semantic search and vector embeddings)があり、ここでAI Providerとモデルを登録します。今回はollamaのみを使用し、以下のように設定しました:

  • Language Models: ollama の gpt-oss:20b を登録
  • Embedding Models: ollama の mxbai-embed-large を登録

登録したLanguage Modelは、Chat ModelとTransformation Modelの両方で選択できます。つまり、1つのLLMモデルを2つの役割で使い回せるため、ollamaに登録するLLMは2種類で済むわけです。

(正確には、Text-to-Speechと、Speech-to-Textもありますが、今回はスコープ外)

ということで、Chat Model、Transformation Model、Embedding Modelがどこで使われているか、Github Copilotと一緒に調査した結果がこちらです。

モデル種別 主な役割・利用機能 代表プロンプト
Chat(※1) ノート/ソースチャットの応答生成 prompts/chat.jinja, prompts/source_chat.jinja
Transformation 変換・抽出・ソース取り込み時のInsights(洞察、要約といった意味)生成 migrations/5.surrealql(Analyze Paper / Key Insights / Dense Summary / ほか)(※2)
Embedding ソース取り込み時のベクトル化、Ask/Searchでの動的ベクター検索時

(※1) 一定以上のトークン長(約105,000以上)の場合、自動で Large Context Model に切替え

(※2) Transformationはソースの取り込みでも使われますが、利用者が任意のカスタムプロンプトを追加してソースの要約(Insights)としても利用可能(設定画面は以下)

スクリーンショット 2025-12-19 15.51.20.png

Model単位で、ざっくりと役割分担が理解できたところで、Open Notebookの主要な機能単位で、Modelがどう使われているか見ていきます。

Open Notebook機能単位でのModel利用状況

調査結果をサマリーでまとめると、こんな感じです。

機能 使用モデル 処理フロー プロンプト コンテキスト取得 特徴
ソース取り込み Transformation + Embedding ソース追加 → Transformation適用(Dense SummaryでInsights作成)+ ベクトル化 migrations/5.surrealql のDense Summaryなど 複数変換の並列実行可能、保存時に自動ベクトル化
Chat with Source Chat ソース選択 → コンテキスト生成 → Chat応答 prompts/source_chat.jinja 事前構築(ベクトル検索なし) ソース特定の引用指示
Chat with Notebook Chat ユーザー入力 → コンテキスト生成(複数ソース) → Chat応答 prompts/chat.jinja 事前構築(ベクトル検索なし) 過去会話履歴を考慮、複数ソースの統合
Ask & Search Chat + Embedding Stage 1: 検索戦略生成 → Stage 2: ベクトル検索&並列回答 → Stage 3: 最終統合 prompts/ask/entry.jinja, prompts/ask/query_process.jinja, prompts/ask/final_answer.jinja 動的ベクトル検索(実行時) 3段階フロー、並列処理、厳密な引用管理

Notebookでのチャットの回答で、ベクトル検索をしているのかと想像していましたが、事前に要約された「インサイト」を使っている点は調査してみて初めて知りました。

いくつかの機能について、実際の画面を見ながら確認してみます。

ソース取り込み

Create -> Sourceで作成が可能です。もしくはNotebookのAdd New Sourceからでも追加が可能です。

スクリーンショット 2025-12-19 16.02.40.png

URL Link or ファイルアップロード or テキスト貼り付け、が選べます。

ファイルアップロードは以下の拡張子に対応しているようです。

Select multiple files to batch import. Supported: Documents (PDF, DOC, DOCX, PPT, XLS, EPUB, TXT, MD), Media (MP4, MP3, WAV, M4A), Images (JPG, PNG), Archives (ZIP)

スクリーンショット 2025-12-19 16.05.41.png

次に紐付け先のNotebookを選択できます。これは後でも紐つけや解除が可能です。1つのソースを複数のNotebookで共通化できる点は、NotebookLMと比べて、少し便利かも?と思った点です。

スクリーンショット 2025-12-19 16.04.31.png

最後にTransformationとEmbeddingが出てきて、先ほどのサマリーの通りのモデルが使われていそうなことが確認できました。

せっかくなので、デフォルトのDense Summaryのpromptを眺めてみます。

Sparse Priming Representation (SPR) がやりたいことのポイントですね。

SPRの詳細は解説記事をみてください。元のソースの文脈を維持しつつ最小限のフレーズで表現することを目指しているようです。

さて、ソースの取り込みが終わると以下のように表示され、Insights 1件とEmbeddingが行われていることが確認できます。1つのソースに対して、複数のInsightsが紐づけられるのは、NotebookLMには無い概念ですね。

スクリーンショット 2025-12-19 17.07.30.png

ソースをクリックすると詳細画面が表示され、ここに取り込んだコンテンツや生成したInsightsが参照できます。
また、ここから該当ソースに対して、直接Chatもできます。

スクリーンショット 2025-12-19 16.49.43.png

Insightsは後でも追加できます。

スクリーンショット 2025-12-19 16.49.22.png

作成されたDense Summaryを見てみましょう。

スクリーンショット 2025-12-19 16.51.43.png

元にしたページが以下なのですが、かなりぎゅっと要約されているのが分かると思います。

Chat with Notebook

次に、今回のメイン機能のNotebookを見ていきます。

スクリーンショット 2025-12-19 17.12.50.png

一番左のソースで、情報元を選択可能です。また、ソース毎に青やオレンジのアイコンが見えますが、これはLLMのコンテキストへのソースの渡し方を示しています。

  • 青いアイコン --> コンテンツをそのまま利用
  • オレンジのアイコン --> Insightsの内容を利用(デフォルト)
  • 灰色のアイコン --> 対象外

ソースの状態によってLLMのコンテキストへの渡し方をユーザーが選べるのもNotebookLMには無い観点です。
とは言え、コンテンツが長いとそもそも入りきらなかったり、処理に時間がかかるので、元ソースの状態によって検討は必要そうです。

一番左のところで、チャットで質問などが可能です。

今回は2つのソースを入れた状態で、以下のpromptで聞いてみます。

以下を簡潔にまとめる

(1) gpt-4oと比べたllm-jp-3.1-13b-instruct4の特徴
(2) instruct4の特徴

回答がMarkdownのrawなのはちょっと見辛いですね・・・

スクリーンショット 2025-12-19 17.33.18.png

以下、回答内容そのまま転記したものです。


(1) llm‑jp‑3.1‑13b‑instruct4 と GPT‑4o との比較

項目 llm‑jp‑3.1‑13b‑instruct4 GPT‑4o(OpenAI)
モデル規模 13 billion パラメータ、40 層、hidden size 5120 約 175 billion パラメータ(推定)
トークナイザー Unigram‑byte fallback(SentencePiece から派生) GPT‑4o は OpenAI 独自の Byte‑Pair‑Encoding など
トレーニングデータ 2.5 T トークン(日本語・英語・コード・中国語・韓国語)
→ 2.1 T は事前学習、400 B は指示‑応答ペア(SFT)
主にインターネット・書籍・対話データの混合、数百 T トークン
指示学習 ① SFT(日本語・英語の 20+ データセット)
② DPO(Qwen‑2.5‑32B‑Instruct での採点)
内部の指示最適化(RLHF)を実施
多様性・安全性 ① Safety score 4.17、Acceptance 82.4 %、Violation 12.2 %(AnswerCarefully‑Eval)
② DPO で安全データを含める
公式評価なし(OpenAI が独自に検証)
パフォーマンス MT Bench: 日本語 7.37、英語 7.01(GPT‑4o‑2024‑08‑06 と同等) GPT‑4o のベンチマークスコアは公開されていないが、実務で優れた応答を示す
ライセンス Apache‑2.0 Proprietary(商用ライセンス)
利用コスト オープンソースで自前ホスト可 API 利用料金が発生

Source: llm‑jp‑3.1‑13b‑instruct4 のドキュメント(source:q52al36byl2u21n4n9xg)


(2) instruct4 の主な特徴

項目 内容
モデルアーキテクチャ Transformer‑based causal LM, 13 billion パラメータ、40 層、40 attention heads、4096‑token コンテキストウィンドウ
モジュール化 8‑expert Mixture‑of‑Experts (MoE) で 73 billion パラメータ(2 active experts per step)
トークナイザー llm‑jp‑tokenizer‑v3.0 の Unigram‑byte fallback
トレーニングパイプライン 1. Pre‑training: 2.1 T トークン
2. Mid‑training: 400 B instruction‑response ペア(SFT)
3. Post‑training: SFT + DPO(Qwen‑2.5‑32B‑Instruct で採点)
SFT データセット 20+ 日本語/英語のデータセット(例: ichikara‑instruction‑004‑002, AnswerCarefully, wizardlm8x22b‑logical‑math‑coding‑sft‑ja など)
DPO 手法 ① 生成した複数応答を採点
② 高スコアを Positive、低スコアを Negative として再学習
③ 2 階段目で安全データを組み込み
評価 MT Bench(GPT‑4o‑2024‑08‑06)と同等のスコア
AnswerCarefully‑Eval で高い安全性と受理率
ライセンス・利用 Apache‑2.0 でオープンソース。Python で簡単にロードできる(例: transformers.AutoModelForCausalLM
推奨環境 torch≥2.3.0, transformers≥4.40.1, tokenizers≥0.19.1, accelerate≥0.29.3, flash‑attn≥2.5.8

Source: llm‑jp‑3.1‑13b‑instruct4 のドキュメント(source:q52al36byl2u21n4n9xg)

これらの点が、llm‑jp‑3.1‑13b‑instruct4 と GPT‑4o との違い、そして instruct4 の特徴です。


ちゃんとソースを元に回答してくれていそうですね!

Ask & SearchのAsk(beta)

最後にAsk(beta)を見てみましょう。

スクリーンショット 2025-12-19 17.41.54.png

モデル選択に、Strategy、Answer、Finalと3つあり、複数のプロセスに分けて処理が行われていそうなのが分かります。

さて結果をChatと比較してみましょうと思いましたが、Processing your question... のまま処理が終わりません。
MacbookProのgpt-oss:20bには荷が重たかったかもしれません😇

ので、とりあえずソースコードから処理シーケンスをCopilotと追ってみました。

Askの処理シーケンス

特性:

  • 3段階フロー: 戦略策定(entry.jinja) → Query処理(query_process.jinja) → 最終統合(final_answer.jinja)
  • 動的ベクトル検索: 実行時に質問に応じてvector_search()を実行
  • 複数LLM呼び出し: Strategy生成(1回)+ 並列Answer生成(N回)+ 統合(1回)
  • 並列処理: 複数search termへの答え生成は並列実行可能

うーん、MacbookPro程度のローカルLLMでは、きつそうな処理ですね。
クリスマスプレゼントに DGX Spark を期待するしかありません😊

Ask機能がローカルLLMで重い理由とChatとの使い分け

Ask機能の3段階フローは、質問内容に応じて動的にベクトル検索を行うため、Chatよりも高精度な回答が期待できます。しかし、その分処理負荷も大きくなります:

  • Chat: LLM呼び出し1回、事前構築されたコンテキストを利用(軽量・高速)
  • Ask: LLM呼び出し1+N+1回(Strategy生成 + N個の並列Answer生成 + 最終統合)+ ベクトル検索

今回のローカル環境(gpt-oss:20b)では、この複数回のLLM呼び出しが処理時間の限界を超えてしまったようです。

使い分けの指針:

  • Chat: Notebook内の既知のソースから会話形式で情報を引き出したい時
  • Ask: 広範囲なソースから特定の情報を検索・抽出したい時(OpenAI/Anthropic等のクラウドLLM推奨)

まとめ

  • Open NotebookはNotebookLMのOSS代替として、完全ローカル環境で動作可能
  • 3種類のモデル設定(Chat、Transformation、Embedding)が必要だが、ollamaには2種類のLLMで済む(ChatとTransformationは共有可能)
  • Insightsは元ソースをSPRで圧縮要約したもので、Chatの高速化に貢献
  • ChatとAskの使い分けが重要:Chatは軽量・高速、Askは高精度だがローカルLLMには負荷が高い
  • 機微情報を扱う業務では、ローカルLLM(ollama)との組み合わせで完全プライベートな環境を構築できる

最後に、GMOコネクトではサービス開発支援や技術支援をはじめ、幅広い支援を行っておりますので、何かありましたらお気軽にお問合せください。

お問合せ: https://gmo-connect.jp/contactus/

5
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?