MCP サーバについて学ぶ一環として、FastMCP を使って「LLM に自分の理解を伝えるためのローカル向け MCP サーバ」を作りました。手動で登録した文章を Faiss でベクトル検索するだけなので (つまり、簡易な RAG です)、とりわけ技術的な含蓄はないし、コンセプトとしても色々なところで既にありそうですが、考えたことの記録を書きます。
※ この記事を書いている時点のリビジョンにリンクしています。
※ Python 環境及び文章をベクトル化できるだけのマシンスペックが必要です。
使い方
詳細は README にあります。
- TOML ファイルに自分が「何を」「こう理解した」を色々登録しておきます。
- 対話型 AI (私の場合は Claude CLI) に MCP サーバを登録します (初回のみ)。
- 対話型 AI に、「かずさは事前学習について何を知っていますか?」などと話しかけると、登録しておいた理解 (「かずさの記憶」) から検索してくれます。
なお、リポジトリのサンプルではエンティティ (理解の対象) として学術文献を想定していますが、登録時の必須項目は「タイトル」と「理解」だけなので、エンティティは何でも構いません。また、名前の「かずさ」は環境変数で変更できます。
今のところ以下のツールがあります。
以下のように使用されます。
> かずさは事前学習について何を知っていますか?
● かずさの記憶から「事前学習」に関する文献を検索してみます。
● kazusa - search_references (MCP)(query: "事前学習", top_k: 10)
⎿ {
"result": [
{
… +46 lines (ctrl+o to expand)
● かずさは事前学習に関連する以下の文献を記憶しています:
主要な文献
1. BERT: Pre-training of Deep Bidirectional Transformers (2018)
- Transformerの事前学習手法
- 文章A + 文章Bを入力とした事前学習を行う
- https://arxiv.org/abs/1810.04805
(略)
かずさの記憶では、BERTの事前学習手法が最も関連性が高い文献として検索されています。
コンセプト
対話型 AI はお願いすれば情報源を提示してくれると思います。ただ、「A は B ですか?」などと質問したときに提示してくれる情報源がずれていることもあります (例えば記事の一部を切り取って「この記事にそう書かれています」というが記事の結論は違っていたり、ひどいときは記事内に「A は B である」という主張がそもそもなかったり)。また、情報源が初見の長い記事なんかだと、中身を確認するのも大変です。これでは楽になっていません。
なので、「自分がかつて理解したことがあること」だけから検索することもできるようにしたいです。これなら真偽の確認コストは低いです。「自分の理解なら覚えているのでは」という方もいるかもしれませんが、何せ世の中は目まぐるしく、先月に見知ったことを忘れていることもあるので、これでも価値があります (決して老化による物忘れではありません)。
また、特に専門知識がある方は、AI との対話で出発点がずれることもあると思います (既知のことを説明されたり、ひどいときは巷に流布する不正確な説明をされたり)。そのときに、「問題 X について考えたいですが、かずさの記憶を踏まえてください」とすることで、認識を合わせることができる期待があります (が、今のところ理解の登録が乏しく、認識が合ったと実感がもてる使い方はまだできていません)。
理解を架空の人物「かずさ」の記憶に託したのは、愚直に「私は何を知っていましたか?」でトリガーさせようとすると意図しないコンテクストでも発動するし (1敗)、日本語としても不自然になるからです。
「かずさ」はあなたの頭の中の図書館にいる人で、あなたでない人にあなたが理解していることを案内でき、あなたが忘れた本棚にも手が届く存在だと思ってもよいかもしれないです。「かずさ」を育てることを目指してもよいかもしれないです。
今後の課題
以下の課題がありますが、対応するかは未定です。
- 理解の登録:
- 現在、理解の登録は完全に手動なので、対話型 AI との対話中に「この話をかずさに伝えたい」で追加内容をスタックしておき、次回セッション開始時に取り込むといったように自動化したら実用的になると思います。
- Zotero からエクスポートした BibTeX (メモ付き) を取り込むようにするのはたぶん難しくないので、対応した方がよいと思います。
- はてなブログや Qiita の記事もインポートできたら便利だと思います。
- 検索:
- 現在の実装では、手元のマシンで sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2 によるベクトル化が動く必要があります。リソースがないマシンでも動くように、外部のベクトル化サービスも利用できた方がよいかもしれません。
- そもそもこのモデルで十分関連する文を検索できているかまだわかっていません。
- チャンキングの自動化・最適化に対応していません。
- その他:
- いまは「かずさ」のワンオペなので、「分野 A の理解をもつかずさと、分野 B の理解をもつたくみ」のように体制を強化した方がよいかもしれません (現状でも、コードを複数チェックアウトして、別々の理解群を与え、MCP サーバ登録時に MCP サーバ名とキャラクター名を変更すれば実現できるはずですが、リソースを食います)。
- エンティティ間の関連を手動または自動で張っておくと役立つかもしれません。