数式とソース表示には以下のライブラリを使用しています。

KaTeX ver.${katex.version}

tingle.js ver.${tingleVersion}

CtxMenu ver.${ctxMenuVersion}

👉はてなブログでの使用方法(基本、拡張) `); let contextMenu = CtxMenu(".katex"); contextMenu.addItem("Show TeX Commands", e => { let an = e.getElementsByTagName("annotation"); let text = an.length > 0 ? an[0].textContent : "???"; modal.getContent().firstChild.value = unescapeHTML(text.trim()); modal.open(); }); contextMenu.addItem("Show MathML Code", e => { let mathml = e.getElementsByClassName("katex-mathml"); modal.getContent().firstChild.value = mathml.length > 0 ? mathml[0].innerHTML : "???"; modal.open(); }); contextMenu.addSeperator(); contextMenu.addItem("About", () => about.open()); }); document.write('


🌟この記事は数式に KaTeX を使用しています。👉使用方法(基本、拡張)'); } function unescapeHTML(s) { return s .replace(/</g, "<").replace(/>/g, ">").replace(/&/g, "&") .replace(/&#x([0-9a-fA-F]+);/g, (_, p1) => String.fromCharCode(parseInt(p1, 16))); }

【お知らせ】プログラミング記事の投稿はQiitaに移行しました。

Obsidian の Local GPT プラグインで Ollama を利用

Obsidian から Ollama を利用できる Local GPT プラグインを紹介します。

更新履歴:

  • 2024.12.07: 推奨埋め込みモデルを BGE-M3 に変更

目次

概要

Obsidianは、知識管理のための Markdown エディタです。入力は WYSIWYG 化されてはいませんが、レンダリングはインラインで行われます。

obsidian.md

Obsidian の商用利用にはライセンス契約が必要です。詳細は以下を参照してください。

publish.obsidian.md

Local GPT は、編集中のテキスト内に LLM の生成結果を取り込むことができるプラグインです。Ollama にも対応しています。

github.com

モデル

Ollama をインストールして、利用するモデルをご用意ください。実用的な速度で利用できるかどうかは環境によって異なるため、いくつか試して最適なモデルを選ぶ必要があります。

モデルのサイズは B という単位によるパラメーター数で表されます。1B は 10 億パラメーターです。パラメーター数が大きくなるほど良い回答が得られますが、処理速度が遅くなり、必要なメモリ量も増大します。

目安として、VRAM を 12GB 積んだグラフィックボードがあれば 8B が快適に動きますが、それ以上のサイズは 16GB 以上が必要となります。そのようなグラフィックボードがない環境では、2B モデルを推奨します。

M1 以降の Mac はメインメモリを VRAM として利用する UMA アーキテクチャのため、算定方法が異なります。目安として、メモリ 16GB では 8B、それよりサイズの大きいモデルでは 32GB 以上が必要となります。

実際に試して、使用感が良好だったモデルを紹介します。モデルのダウンロードに必要なコマンドを付記します。

  • Aya Expanse: 商用利用不可。使用感が良好で、32B は GPT-3.5 と同等かそれ以上。
    32B: ollama pull hf.co/bartowski/aya-expanse-32b-GGUF:IQ2_S
    8B: ollama pull aya-expanse
    ※ モデルのライセンスは Obsidian のライセンスとは別です。商用利用には開発元の Cohere 社に問い合わせて、契約が必要です。(非商用なら不要)

  • Tanuki-8B-dpo-v1.0: 商用利用可。日本で開発されたモデルで、自然な日本語を生成。トークナイザーに制限があり、全角英数字や半角カナの入力は不可。👉参照
    8B: ollama pull 7shi/tanuki-dpo-v1.0

  • Gemma 2 Baku 2B: 商用利用可。Google 社が開発したモデルを rinna 社が日本語継続事前学習。
    2B: ollama pull lucas2024/gemma-2-baku-2b-it:q8_0
    ※ オリジナルの Gemma 2 には 9B と 27B もありますが、日本語で利用するには Local GPT のプロンプトを日本語化する必要があるため、本記事では割愛します。

埋め込みモデル

RAG 機能を利用するには埋め込みモデルが必要です。

日本語を含む多言語対応の BGE-M3 を推奨します。

ollama pull bge-m3

Local GPT のインストール

Obsidian と Ollama は既にインストールされていることを前提として、本記事では Local GPT プラグインのインストール手順を解説します。

左のサイドパネルが折りたたまれている場合、展開します。

左のサイドパネルの下部にある歯車アイコンをクリックします。

「コミュニティプラグイン」を選択して、無効化されていれば有効化します。

「閲覧」をクリックします。

「gpt」で検索して、Local GPT を選択します。

プラグインをインストールして有効化し、オプションを開きます。

Selected AI provider で Ollama を選択して、使用するモデルを選択します。

「コミュニティプラグイン」を選択して、Local GPT の ⊕ マークをクリックします。

「Local GPT: Show context menu」に適当なショートカットを割り当てます。(以下のスクリーンショットでは Cursor エディタを意識して Ctrl+K としています)

以上でプラグインの準備は完了です。

使用方法

Local GPT はチャット欄が分離されておらず、テキスト内で直接 AI による文章を生成するように設計されています。

使用するには、まずテキストを選択し(未選択の場合については後述)、設定したショートカットキー(例:Ctrl+K)を押してコンテキストメニューを表示します。このメニューから、目的に応じた適切なアクションを選択することで、選択箇所の直後に AI がテキストを生成します。

※ 選択箇所にリンクが含まれる場合、特別な処理が行われます。詳細は後述します。

標準アクション

Local GPT は以下の標準アクションを提供します。

  • ✨ General help(汎用支援)
    選択したテキストの文脈に沿って新しい内容を生成します。もっとも基本的なアクションで、選択部分をプロンプトとして LLM に投げかける機能だと考えれば良いでしょう。

  • ✍️ Continue writing(文章の継続)
    選択したテキストの続きを書きます。選択部分もリライトされるため、箇条書きから文章を書き起こすのにも利用できます。

  • 🍭 Summarize(要約作成)
    文章の主要なポイントを抽出し、要約を作成します。長い論文や報告書を手早く理解したい場合に便利です。

  • 📖 Fix spelling and grammar(文法修正)
    スペルと文法のチェックを行い、修正案を提示します。単なる誤字脱字の指摘だけでなく、より自然な表現への改善提案も行います。
    ※ 英語での利用を想定しており、日本語では正確な結果が得られません。

  • ✅ Find action items(タスク抽出)
    テキストからタスクを抽出し、チェックボックス形式で整理します。会議ノートやプロジェクト文書から、アクションアイテムを効率的に見つけ出すのに役立ちます。

  • 🧠 New System Prompt(プロンプト作成)
    カスタムプロンプトを作成し、AIの動作をカスタマイズできます。特定の目的や要件に応じて、AIの応答方法を調整したい場合に使用します。

カスタムアクション

Local GPTの機能は、カスタムアクションを追加することで拡張できます。

例として、英語に翻訳するカスタムアクションの登録方法を説明します。

Local GPT の設定を開いて、Add new manually をクリックします。

Action name に「英語に翻訳」、Prompt に以下を記入します。

Output only the result, without any explanation.
Translate into English.

Save をクリックすれば、コンテキストメニューに追加されます。

※ プロンプトは日本語で書いても構いません。この例では結果が英語で出力されるため、日本語に引きずられないように英語で書きました。逆に、日本語に翻訳する場合は、日本語でプロンプトを書いても問題ないでしょう。

メニュー内の位置を変えるには、設定の最後の方にある Change order を使用します。

コンテキスト生成の仕組み

Local GPT は、選択範囲の有無によって挙動が変わります。

選択範囲がある場合:選択されたテキスト範囲がコンテキスト(文脈)として LLM に渡されます。選択範囲内に含まれる [[リンク]] が RAG 機能(後述)によって参照され、追加のコンテキストとして利用されます。これにより、焦点を絞った的確な応答を得ることができ、狭い範囲の詳細な分析や、特定のセクションに関する質問に適しています。

選択範囲がない場合:現在開いているファイル全体が分析対象となります。ファイル内のすべての [[リンク]] が RAG 機能によって分析され、コンテキストとして利用されます。これにより、より広い範囲の情報を考慮した包括的な応答が得られます。文書全体の要約や、広い文脈を必要とする質問に適していますが、処理時間が長くなる可能性があります。

RAG 機能

RAG(Retrieval-Augmented Generation)は、LLMの応答生成時にデータベースから関連情報を取り出して参照する仕組みです。例えば「猫の名前は?」という質問に対して、データベースから「タマ」という情報を検索して回答に活用します。

Local GPTでは、Markdownファイル内の [[リンク]] で参照された文書がデータベースとして機能し、質問に関連する情報を自動的に検索して回答に活用します。

※ 文章はベクトルに変換され、データベースに保存されます。変換をベクトル化、検索をベクトル検索と呼びます。

例を示します。

猫の名前は?
[[データ]]

このテキストを選択してアクションを指示すれば、参照先の「データ」ファイルを参照して、猫の名前が書かれている(とベクトル検索により判断された)箇所がコンテキストとして LLM に渡されます。それにより、別ファイルに書かれている猫の名前を回答することができます。

RAG 機能のパフォーマンスを最適化するために、効果的なキャッシュ機能(ベクトル DB)を備えています。リンク先の文書は自動的にベクトル化され、一度処理した文書は2回目以降の処理が高速化されます。文書が更新された場合は自動的にキャッシュが更新されます。

※ 埋め込みモデルが指定されていなければ、RAG 機能は利用できないため、リンクによる追加のコンテキストは生成されません。

コンテキストウィンドウの管理

モデルがコンテキストを処理するためのワークエリアをコンテキストウィンドウと呼びます。

Local GPT はコンテキストウィンドウのサイズを動的に調整します。4,096 トークンを超えると自動的にコンテキストウィンドウを拡張し、この際にモデルのリロードが発生します。拡張後に実行するアクションが、コンテキストウィンドウの 1/4 以下に収まる場合は縮小され、この時もリロードが発生します。

コンテキストウィンドウの拡張はメモリ使用量を増大させるため、このように拡張は一時的な処理として設計されています。コンテキストウィンドウのサイズが頻繁に変動するような操作を行うと、リロードのオーバーヘッドが大きくなるため注意が必要です。

効果的な活用方法

特定の段落やセクションに関連する応答が欲しい場合は、その部分を選択して実行することで、焦点を絞った応答を得ることができます。文書全体の文脈を踏まえた応答が欲しい場合は選択せずに実行しますが、文書サイズによってはコンテキストの拡張が行われるため、時間が掛かります。

重要な参考情報は [[リンク]] で明示的に参照することで、より関連性の高い応答を得ることができます。PDFファイルへのリンクも同様に機能するため、論文や報告書の参照も可能となっています。

技術的背景

※ このセクションは作者の説明に基づきます。

github.com

多くのローカル LLM は公称のコンテキストウィンドウのサイズに関わらず、実質的には 8,192 トークン程度までしか効果的に処理できないという制約があります。大量の文書をコンテキストとして与えることは、かえって応答の質を低下させる可能性があります。

この制約に対応するため、Local GPT は明示的なリンクのみを参照する設計を採用しています。これにより、関連性の高い情報に焦点を当て、選択的なコンテキスト収集によってトークン数を効率的に使用します。Local GPTの設計思想は「より多くのコンテキスト」ではなく「より適切なコンテキスト」を重視することにあります。

この設計は、ユーザーの使用体験に影響を与えます。[[リンク]] の使用は明確な意図の表明となり、参照情報を明示的に指定できます。また、選択範囲の指定により、必要な情報のみを処理することで、全体的な処理速度も向上します。