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
6
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
160
Coqで選択公理を形式化してみた
soukouki
0
350
「プログラミング」と「数学」の関係 〜カリー・ハワード同系対応と定理証明支援系Coq〜
soukouki
1
220
型クラスと依存型のカルパッチョ、代数的構造を添えて
soukouki
2
540
Coqのコントリビューターになった話
soukouki
0
190
次に流行る※プログラミング言語「Lean」
soukouki
3
1.9k
証明しながらプログラミング! - タクティックによるCoqプログラミング
soukouki
0
310
帰納型とパターンマッチングの紹介
soukouki
0
170
Other Decks in Technology
See All in Technology
Part1 GitHubってなんだろう?その2
tomokusaba
2
810
人間性を捧げる生成AI時代の技術選定
yo4raw
1
780
20250514 1Passwordを使い倒す道場 vol.1
east_takumi
0
130
テストコードにはテストの意図を込めよう(2025年版) #retechtalk / Put the intent of the test 2025
nihonbuson
PRO
10
1.8k
試作とデモンストレーション / Prototyping and Demonstrations
ks91
PRO
0
140
Amplifyとゼロからはじめた AIコーディング。失敗と気づき
mkdev10
1
150
Next.jsと状態管理のプラクティス
uhyo
6
2.3k
AI駆動で進化する開発プロセス ~クラスメソッドでの実践と成功事例~ / aidd-in-classmethod
tomoki10
1
1.2k
続・やっぱり余白が大切だった話
kakehashi
PRO
4
360
LangfuseではじめるAIアプリのLLMトレーシング
codenote
0
190
Terraform にコントリビュートしていたら Azure のコストをやらかした話 / How I Messed Up Azure Costs While Contributing to Terraform
nnstt1
1
540
ソフトウェアテスト 最初の一歩 〜テスト設計技法をワークで体験しながら学ぶ〜 #JaSSTTokyo / SoftwareTestingFirstStep
nihonbuson
PRO
2
190
Featured
See All Featured
YesSQL, Process and Tooling at Scale
rocio
172
14k
Designing Experiences People Love
moore
142
24k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
5
580
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
3.8k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.6k
Java REST API Framework Comparison - PWX 2021
mraible
31
8.6k
The Invisible Side of Design
smashingmag
299
50k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
41
2.3k
Balancing Empowerment & Direction
lara
0
21
GraphQLとの向き合い方2022年版
quramy
46
14k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
10
800
How STYLIGHT went responsive
nonsquared
100
5.5k
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