※ AIと相談しながら構成や内容を整理し、AIに作成してもらいました。
以前、AI Agentの判断精度を上げるためにmemorypというMCPサーバーを作った記事を書いた。あれから実際に使いながら改善を続けてきて、いくつか良い変化があったので、そのまとめ。
今回は主に2つの取り組みについて書く。
- memorypへのベクトル検索機能の追加
- phase分割アプローチでのAI開発
どちらも個人開発レベルで実際に使ってみて、いい感じに機能している。
以前のmemorypはlist_memories
で全メモリ一覧を取得する仕組みだったので、必要な情報を探すために一度全体を見るフェーズを挟む必要があり、検索と比べて非効率だと感じていた。
前回の記事でも「テキスト検索やベクトル検索に対応したい」と書いていたので、実際に追加することにした。
ベクトル検索の実装は以下の構成で進めた。
- エンベディングモデル: OpenAI text-embedding-3-small (1536次元)
- ベクトルDB: PostgreSQL + pgvector extension
- 類似度計算: コサイン類似度
この構成を選んだ理由はシンプルで、既にNeonDBのPostgreSQLを使っていたのでpgvector拡張を追加するのが手っ取り早かった。OpenAIのコストも、memorypの使い方なら問題ない規模だと判断した。
Memory(知識)とProcedure(手順)は完全分離していて、それぞれ独立したベクトル空間で検索できるようにしている。
- Memory検索:
context
+content
からエンベディング生成 - Procedure検索:
trigger
+content
からエンベディング生成
実装は基本的にAIに作業してもらった。pgvectorの設定、エンベディング生成、検索APIの実装など、特にハマることなくスムーズに進んだ。
MCPツールとしてsearch_memories
とsearch_procedures
を追加して、Web UIからもベクトル検索APIを使えるようにした。
ベクトル検索を追加したことで、AIが主体的に必要な情報へ直接アクセスできるようになった。以前は全メモリを一覧で取得してから探す必要があったけど、今は検索クエリで関連する情報だけを効率的に取得できるので、AI主体の活用がより柔軟にできるようになった。
Memory/Procedure完全分離のおかげで検索精度も上がっている印象があり、知識を探すときはMemory検索、手順を探すときはProcedure検索と使い分けられる。
memorypのベクトル検索追加はphase分割を使わずに進めたけど、その後AIと開発を進める中でphase分割アプローチが出てきた。これが思った以上に効果的だったので、最近はいろいろなプロジェクトで活用している。
phase分割は、project_workflowという手続きで定義している開発手法。ざっくり言うと、プロジェクトを段階的に分割して、各phaseで要件・分析・調査・設計・実装を完結させるアプローチ。
具体的な流れは以下の通り。
- フェーズ1: プロジェクト初期化
- フェーズ2: 目的・要求・要件の定義
- フェーズ3: 分析・調査
- フェーズ4: フェーズ分割計画
- フェーズ5: 各フェーズをプロジェクトとして実装
フェーズ5では、分割した各phaseをさらにプロジェクトとして扱って、それぞれで要件・分析・調査・設計・実装を完結させていく。各phaseでドキュメントを作成していくので(requirement.md, analyze.md, research.md, design.md, tasks.mdなど)、段階的に整理しながら進められる。
また、手戻りが発生すると困るような重要なタスクは先に持ってきて小さく検証することで、手戻りのリスクを減らせるようになっている。
phase分割を使ってみて、いくつか良い効果があった。
細かくphaseを分けているので、問題が発生したときに調整しやすく、差し込みタスクが発生してもどのphaseに影響するかが明確なのでリカバリーもスムーズ。大きなタスクを一気に進めると崩壊しがちだけど、細かく分けることで小さく完結するので比較的スムーズに進む。
各phaseで調査などを全て入れ込んでいるので現状把握や理解が深まり、結果としてコーディングの精度が上がっている印象(あくまで体感だけど)。
phase分割は、新規開発やリファクタリングなど、いろいろなプロジェクトで使っている(個人開発レベルの規模だけど)。実際に使ってみて、大きな手戻りなく進められている。
今の開発は人間コーディングが0で全てAIに任せており、TDD + リファクタリング + phase分割の組み合わせで大きな崩壊なく開発が進められているのが現状。個人開発レベルでは、phase分割が面倒だと感じることは特にない(大きな規模だとドキュメント把握が少し大変かもしれないけど)。
AI開発でphase分割が効果的だと感じている理由は、AIの特性に合っているから。AIは一気に大きなタスクを進めると崩壊しがちだけど、phase分割で小さく区切ることで安定するし、各phaseで調査・確認を挟むことでズレが少なくなる。
動作確認などはサボっていることもあるけど、リファクタリングを挟んだりTDDで進めることで致命的な問題は起きていない。
memorypにベクトル検索を追加したことでAI主体の活用がより柔軟になり、phase分割でAI開発も破綻しづらくなってきた。
どちらも実際に使いながら改善していくアプローチが効いている。一度に完璧を目指すのではなく、使いながら「ここが不便だな」と感じたところを段階的に改善していくことで、個人開発レベルでもAI開発がだいぶ進めやすくなってきた印象。