Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
1年前の日記を要約するツールをローカルLLM&自作MCPサーバーで作った話
Search
soukouki
May 10, 2025
Technology
0
30
1年前の日記を要約するツールをローカルLLM&自作MCPサーバーで作った話
2025-05-10 Zli 大LT 2025 春で発表したスライドです。
soukouki
May 10, 2025
Tweet
Share
More Decks by soukouki
See All by soukouki
自作Cコンパイラ 8時間の奮闘
soukouki
0
1.3k
定理証明支援系Coq(セキュリティキャンプLT会)
soukouki
1
170
Coqで選択公理を形式化してみた
soukouki
0
360
「プログラミング」と「数学」の関係 〜カリー・ハワード同系対応と定理証明支援系Coq〜
soukouki
1
230
型クラスと依存型のカルパッチョ、代数的構造を添えて
soukouki
2
550
Coqのコントリビューターになった話
soukouki
0
200
次に流行る※プログラミング言語「Lean」
soukouki
3
1.9k
証明しながらプログラミング! - タクティックによるCoqプログラミング
soukouki
0
310
帰納型とパターンマッチングの紹介
soukouki
0
180
Other Decks in Technology
See All in Technology
単一Gitリポジトリから独立しました
lycorptech_jp
PRO
0
130
“⾞が通れるほど⼤きな”セキュリティーホールを抑えながらログインしたい
taiseiue
0
160
やさしいClaude Code入門
minorun365
PRO
34
26k
AIの電力問題を概観する
rmaruy
1
220
継続戦闘能⼒
sansantech
PRO
0
220
会社員しながら本を書いてきた知見の共有
sat
PRO
3
690
人とAIとの共創を夢見た2か月 #共創AIミートアップ / Co-Creation with Keito-chan
kondoyuko
1
720
AIとSREの未来 / AI and SRE
ymotongpoo
2
1.5k
從開發到架構設計的可觀測性實踐
philipz
0
120
Digitization部 紹介資料
sansan33
PRO
1
3.8k
CloudBruteによる外部からのS3バケットの探索・公開の発見について / 20250605 Kumiko Hennmi
shift_evolve
3
220
うちの会社の評判は?SNSの投稿分析にAIを使ってみた
doumae
0
350
Featured
See All Featured
Imperfection Machines: The Place of Print at Facebook
scottboms
267
13k
VelocityConf: Rendering Performance Case Studies
addyosmani
329
24k
Producing Creativity
orderedlist
PRO
346
40k
jQuery: Nuts, Bolts and Bling
dougneiner
63
7.8k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
180
53k
BBQ
matthewcrist
88
9.7k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
29
1.7k
How to Ace a Technical Interview
jacobian
276
23k
Fashionably flexible responsive web design (full day workshop)
malarkey
407
66k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
30
2.4k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Java REST API Framework Comparison - PWX 2021
mraible
31
8.6k
Transcript
1 年前の日記を要約するツールをローカル LLM& 自作MCP サーバーで作った話 Zli「大LT 2025 春」 2025-05-10 風邪を引きました。
スライドが25枚あるので巻きでいきます。 1
自己紹介 sou7といいます 学部5年生です 好きな言語はRubyと Rocq ActivityPub/Misskey : @
[email protected]
Twitter: @sou7_
_ _ Obsidian: ob.sou7.io 2
みなさまに大切なお知らせがあります 3
みんな大好きCoq の 4
名前がRocq に変わりました 5
Obsidian で日記を毎日書き始めてから約1 年 => 去年の日記をいい感じに振り返られるようにしたい!! 6
ちょうどよい存在感 簡単に実現する案として、次の2つを考えました。 1年前の日記へのリンクを自動生成する。 => リンクがあるだけだと、結局開くのが面倒で見返さなくなって しまいます。 1年前の日記を埋め込む。 Obsidianにはノートを埋め込む機能があり、去年の日記の内容を今 の日記に展開して埋め込むことが出来ます。 しかし、埋め込むと画面上での扱いが大きすぎて、逆に不便になっ
てしまいます。 7
良い解決策はないかな・・・ そうだ、LLMを使おう! 8
LLM を使って要約するシステムを作る案 1年前の日記を1行に要約することで、 リンクを開きにいかなくても1年前に何をしていたかを振り返ら れる。 埋め込みほど画面スペースを取らない。 と、いい事ずくめです! 9
ノートを読み込ませ るために 最初に考えたシステムは、 LLMに直接去年の日記を渡し て、要約するというものでし た。しかし、日記には埋め込 みリンクを使って違う記事を 参照していることがあり、去 年の日付のノートを直接渡す だけではうまく要約できませ
ん。 10
MCP そこでfjm2uくんに相談したところ、MCPというものを教えてもらい ました。 MCPはModel Context Protocolの略で、LLMと外部のデータやツール を連携させるためのプロトコルです。MCPを使うことで、LLMが自律 的に必要な情報を取得してくれます。 これを使ってObsidianのノートを読み込ませることにしました。 11
どこでLLM を動かすのか OpenAIやGemini, Cloudeに課金するのは面倒くさい。手元で動かせ ればいいなぁ・・・どこかにLLMを動かせるだけのGPUは無いかな ぁ・・・ 自宅にPCはあるけれど、NvidiaのGPUは高くて買ってない し・・・。 12
あった! 自宅PCにはRyzen 5 8600GというCPUを載せています。これには iGPU(CPUに内蔵されたGPU)が搭載されています。 GPU分の価格は6000円程度で、GPUとしては破格の安さです。 13
LLM を動かすための環境を整える またfjm2uくんに相談したところ、ローカルLLMを実用的に動かすた めには高いレイヤのAPIを使うと便利と教えてもらい、LM Studioを 使うことになりました。 先にOllamaの環境を整えて動かしてみたのですが、ローカルLLMとして高性能なPhi-4を使ってMCPを呼び出そうとすると、エラーが出てしまいました。どうやらOllamaを 使ってMCPを呼び出すには特定のモデルしか使えないようで、Phi-4はその対象外でした。 そのため、LM Studioを使うことになりました。
14
ローカルLLM の宿命 ローカルLLMとクラウドのLLMの一番大きな違いはパラメータ数で す。パラメータ数が多いほどLLMは賢くなり、少ないほど頭が悪くな ります。 ChatGPT, Gemini, Claudeのような商用のモデルは、大きなパラメー タ数のモデルを、データセンターの高性能なGPUでぶん回していま す。
それに対して、ローカルLLMは家庭用の貧弱なGPUで動かすため、 VRAM(GPU内で利用できるメモリ)の容量による制約を受けます。 今回使うiGPUでは、システムメモリの一部をVRAMとして使うことになります。設定できる中で最大の16GBを割り当てています。VRAM容量を16GB積んだGPUというと、 RTX 4060Ti 16GBやRTX 5060などになります。5060だと8万以上するので、大分高いです。もちろん今回使う760Mより何倍も性能は高いですが... 15
パラメータ数が少ないと起きること プロンプトで与えた手順を守れない。 「日本語で説明してください」と言っても英語で説明してくる。 ひどいときにはJSONで説明してくる。 「 read ツールで LLM を読み込んでください」と書くと LLM
とい うツールを呼び出そうとしてエラーが出る。 MCPツールを(そもそも)呼び出せない。 これらに対処しながらプロンプト(モデルへ命令を与える文章)を調整 する必要があります。 16
既存のMCP サーバーではうまく動かない Obsidianを読み込むための既存のMCPサーバーでは、以下の問題が ありました。 コマンドが多く、貧弱なGPUではコマンドの読み込みに時間がか かってしまう。 ノートを開くための手順が複雑で、手順通り開けない。 ツールに余計なオプションがあり、うまく指定できない。 => ローカルLLMに特化したMCPサーバーも自作したほうが良さそ
う。 17
MCP サーバー自作 MCPサーバーはたいていPythonかTypeScriptで書かれていますが、 諸事情によりRubyで書くことにしました。幸運にも mcp-rb という MCPサーバーを書くためのライブラリがありました。 今回のために作成した obsidian_fetch というMCPサーバーは、gem
として公開しています。皆さん使ってみてください。 18
プロンプトの与え方 普通のLLMの呼び出しでは、最初に全ての手順を与えることが多いで す。しかし、パラメータ数の小さい今回のモデルでは、手順を無視し てしまいます。 そこで、手順を分けたうえで、LLMの呼び出しを複数回のターンに分 けることにしました。チャット形式と同じように、AIとの過去のやり 取りをスレッドに保存し、手順を分けて与えることにしました。 ここで言っている「スレッド」というのは、LLM用語のスレッドを指します。例えばチャットアプリのスレッドと同じ概念だと思うと良いです 19
ターンの分け方( メインフェイズ) 次の3つのターンに分けてLLMを呼び出しています。 ターン1でObsidianから情報を収集 ターン2で長めの要約 ターン3で短めの要約(この短い要約を今回使用します) 今回の用途で難しい点として、1年前の日記が存在しない日の処理があります。この場合、前後の日付の日記から当日に何があったのかを推測する必要があります。この処理 はハルシネーションを起こしやすく、何度も対応策を考えることになりました。 20
頓珍漢な要約 しかし、これだけやってもLLMは頓珍漢な要約をしてくることがあり ます。 全然違う記事を要約してくる 違う日付の日記を要約してくる 違う日のイベントをその日に起きたと言い張る 「これは例です」って書いたやつに引っ張られて謎のイベントを 生成する 要約を諦める 21
LLM に出力をチェックさせる もう一度LLMを呼び出して、要約をチェックさせることにしました。 しかし、単純に同じスレッドでもう一度質問をすると、1度ハルシネ ーション(起きていないことを起きたと言い張ること)を起こしたLLM は、ハルシネーションの内容を真実だと思い込んでしまいます。 そこで、異なるスレッドで要約をチェックさせることにしました。 異なるスレッドで実行するだけだと、異なるページに書いてある情報を素に書いた部分でチェックに失敗することがあります。そのため、出典となった記事のリストを、メイ ンスレッドで生成してテストスレッドで読み込むようにしました。この記事のリストについても、記事のリストに対して説明を加えると、加えた説明でハルシネーションが続 いてしまうこともあり、単なるリストで渡すようにしています。
22
デモ 去年の5月10日の日記はこちらです。3つの記事へのリンクだけが書 いてありました。 [[コンピュータ言語論]] [[1000時間の法則]] [[温泉を探せるサイト]] 23
要約結果 長い要約 - コンピュータ言語論に関する学習と評価が中心でした。 - 高階関数やオブジェクト指向などを深く理解し、形式的意味論の重要性を学びました。 - 構文解析やプロトタイプベース言語についても触れられ、それがオブジェクト指向の理解に役立ちました。 - ランダムアクセスマシンを用いた形式的意味論の例や最小不動点、ホーアの論理の導入も行われています。
短い要約 コンピュータ言語論と形式的意味論を学ぶ中心の一日でした。 評価 : 80点くらい (コンピュータ言語論のどの分野をこの日に学んだのかまで書いてほ しかった) 24
まとめ 1年前の日記を要約するツールを作りました。 MCPを使うことで、LLMとObsidianを連携させることができま した。 ローカルLLMを使うことで、クラウドサービスに依存せずにLLM を使うことができました。 ローカルで気軽に動かせるモデル(今回使ったのはPhi-4)は、そん な頭が良くはないです。(と言っても1年前のChatGPTの無料版く らいは賢い) プロンプトエンジニアリングが大変でした。
25