最近は LLM を使って色々実験しており、その中でも Dify をよく使っています。今回は Dify を使った小ネタを紹介します。
Dify は、カスタマイズ可能な AI ワークフロー・チャットボット・エージェントをノーコードで作成できるプラットフォームです。作成したワークフローはブラウザや Chrome 拡張機能、API 経由で実行できます。一方、Obsidian は拡張性の高い markdown ベースのノートアプリケーションとして知られています。
今回はこれらのツールを連携させ、以下の機能を実現しました。
- Dify を利用して、指定した URL の記事を自動的に要約する
- Obsidian から Dify の要約機能を API 経由で呼び出し、結果をノートとして保存する
私は Obsidian にさまざまなメモやログを蓄積しており、日々気になった Web 上の記事もメモと共に Obsidian に保存し、ナレッジベースとして活用しています。
1 年ほど前から ChatGPT でも Web 記事の内容を読んで返答できるようになったので、普段でも要約をまとめてもらってノートにコピペしていましたが、その作業を自動化して一発で Obsidian のノートに保存できないかと考えていました。それが Dify と Obsidian の組み合わせで実現できました。
Dify と Obsidian の組み合わせを紹介する記事となるとかなりニッチな領域なんですが、両者とも拡張性が高いため、さまざまな用途に活用できると思います。例えば Dify の API アクセスを活用すると、Dify だけでは機能が足りない時に Zapier から API アクセスする形で補うなども可能です。
以下のセクションでは、Dify でのワークフロー作成から Obsidian での実装まで、具体的な手順を解説していきます。
動作イメージ
実際の動作イメージは以下の通りです:
- コマンドパレットから「Templater: Create new note from template」を選択
- テンプレート「url-summary」を選択
- 要約・保存したい記事の URL を入力
- 数秒待つと、要約されたノートが自動的に保存される
ノートとして保存した後は、LLM の要約結果を必要に応じて調整できます。私は Evergreen Notes の思想を取り入れて情報整理をしており、ここで既存の他のノートへのリンクを貼るようにしています。
この仕組みはスマホ版の Obsidian でも問題なく動作するため、出先などでも記事を簡単に保存できるのが便利です。
Dify での要約ワークフロー作成
Dify を使って、URL から記事を要約するワークフローを作成します。以下がワークフローの概要です。
このワークフローは以下のノードで構成されています:
- 開始ノード:URL を入力として受け取ります。
- JinaReader ツール:入力された URL の内容を読み取ります。
- JSON Parse ツール:JSON 文字列から任意のフィールドを取り出すツールです。ここでは JinaReader の出力から記事のタイトルを取り出します。
- LLM ノード(GPT-4o):記事の内容を要約します。要約は日本語で、主な議論点と結論を含む 3 行以内の箇条書きで生成されます。
- 終了ノード:要約内容(content)とタイトル(title)を出力します。
このワークフローを自分の Dify アカウントで再現したい方は、以下の DSL をコピーの上インポートしてください。
ワークフローの DSL
ワークフローを作成したら、API キーを取得します。この API キーは後で Obsidian から要約機能を呼び出す際に使用します。
次のセクションでは、この Dify ワークフローを Obsidian から呼び出す方法について説明します。
Obsidian から API 呼び出しとノート保存の実装
Obsidian から Dify の API を呼び出し、生成された要約をノートとして保存する機能を実装します。この実装には Obsidian の Templater プラグイン を使用します。Templater プラグインをインストールし、有効化してください。
1. API 呼び出し用 JavaScript ファイルの作成
Dify の API を呼び出すための JavaScript 関数を記述したファイルを作成します。以下の内容で getSummaryFromUrl.js
というファイルを作成し、Obsidian の vault の適切な場所(自分は templater-scripts
フォルダにしています)に保存します。
[DifyのAPIキーを貼り付け]
の部分を、先ほど取得した Dify の API キーに置き換えてください。
response_mode: "streaming"
を指定することで、Server-Sent Events(SSE)形式でレスポンスが返却されます。これにより、要約の生成過程をリアルタイムで取得し、ノートに反映することが可能になります。
今回は 「text_chunk
イベントであれば要約の生成結果だと見なして保存」としていますが、ワークフローで利用する LLM が複数の場合は困るかもしれません。 text_chunk
イベントのレスポンスにはどのノードで実行されたかという情報が含まれていないためです。
もし困った場合は無理にリアルタイムで更新せずに、 node_finished
イベントで最終結果を取り出す形でも実現できます。
2. テンプレートファイルの作成
次に、ノートの作成を行うテンプレートファイルを作成します。以下の内容で url-summary.md
というファイルを作成し、テンプレートフォルダに保存します。(自分は templater
フォルダにしています。)
3. Templater の設定
Templater の設定で、テンプレートフォルダと getSummaryFromUrl.js
を保存したスクリプトフォルダのパスを指定してください。
これで設定は完了です。コマンドパレットを開き「Templater: Create new note from template」を実行すると、記事要約を含めてノートに保存されました!
おわりに
今回は Dify の API アクセスの実践例として、Obsidian からワークフローを呼び出して結果をノートに保存する方法を紹介しました。
今回はある程度シンプルなワークフローでしたが、カスタマイズすることで単なる記事要約に限らず様々な用途に使えるかと思います。
余談ですが、最近はノーコードで実現可能なことは可能な限りそちらに寄せる方が構築スピードや試行錯誤のしやすさから良いと考え、Dify や Zapier を試している面もあります。しかしプログラミングはどうしても楽しいので、結局この記事の例でもコーディングしてしまいました。うまくバランスを取って両方利活用していきたいですね。