← ブログ一覧
技術ブログ

作って2ヶ月で消した機能の話 ― セマンティック検索、撤去しました

平原 典彦 — Tesseraを開発しているエンジニア。ヘッドレスCMSとAI連携に関心があります。

「こんな機能作りました!」って記事は、書いてて楽しいんです。今回はその逆です。作った機能を消しました

7月に、ワークスペースの中身を「意味」で探せるセマンティック検索を入れました。で、9月に消しました。しかもついこの間、「全文検索とセマンティック検索の使い分け」って記事を出したばっかりです。あの記事には「消しました」の追記を入れてあります。かなり気まずい。

でもこういうのこそ、黙って消すより書いたほうがいいと思ったので、なぜ入れてなぜ消したのか、格好つけずに書きます。

何を作ってたのか

ザックリ言うと、ワークスペース限定の小さなRAGです。

  • コンテンツや資料をチャンクに切って、Voyageの埋め込みモデルでベクトルにして、pgvectorに入れる
  • MCPに semantic_search ってツールを生やして、AIエージェントから意味検索できるようにする
  • エントリが変わったら追従する同期フックと、30分おきに埋め込みを流すcron
  • 管理画面に取り込みページ、おまけに紹介用のLPまで

ちゃんと動いてました。「MCPと相性いいし、これは筋がいいのでは」と思ってたんです。当時は。

で、なんで消したの

理由は4つあるんですが、最初の1つがほぼ全部です。

1. 誰も使ってなかった。僕も。

本番のDBを見たら、埋め込み済みのチャンクが0件でした。使ってるワークスペースも0

いや、これはもうしょうがない。一番言い訳できないのは、作った本人(僕)が一度も使ってないことです。TesseraはTessera自身でブログを回してて、毎週のようにMCPで記事を書いて、画像を上げて、Webhookを飛ばしています。その中で、意味検索を使いたくなった場面が、一度もなかった。

「あったら便利そう」と「実際に使う」は、全然別ものでした。分かってたつもりで、分かってなかった。

2. そもそも誰もたどり着けなかった

これは完全にこっちのミスです。管理画面の取り込みページ、ナビに載せてなかったんです。URLを直打ちしないと行けない。つまり「使われなかった」以前に「見つけられてなかった」。

「じゃあ導線直せばよくない?」という声が聞こえてきそうです。ただ、導線を直したところで、次に書くコストに見合うだけ使われる自信がなかった。ここが正直なところです。

3. 使ってなくても、コストは毎日かかる

使われてない機能って、置いとけばタダな気がするじゃないですか。タダじゃないんです。

  • 30分おきのcronが、誰のためでもなく回り続ける
  • Voyageという外部サービスへの依存が残る(APIキーの管理、障害、仕様変更…)
  • エントリを作る・直す・消すたびに、同期フックが一緒に走る
  • MCPのツールが1個増えて、その分ドキュメントも説明も増える

一個一個は小さい。でも「誰も使ってないもの」のためにこれを永遠に抱えるのは、さすがに割に合わない。機能は、増やした分だけ見えない請求書が来る。

4. 実は最初から「こうなったら消す」と決めてた

ここだけはちょっと胸を張れるところです。Tesseraには早い段階で決めてた方針があって、「汎用のベクトルDBにはならない。TesseraはRAGのコンテンツ供給源に徹する」

今回のやつは、その方針の中で「ワークスペース限定ならアリか?」を確かめるための検証でした。で、確かめたらナシだった。なら畳む。検証って、畳むところまでが検証ですよね。そこをサボると「機能の墓場」ができる。

消すのも、意外と大仕事

「消すだけでしょ」と思うと痛い目を見ます。作ったときはあちこちに糸を張ってるので、それを全部、矛盾なく抜かないといけない。

  • DBのテーブル(knowledge_documents / knowledge_chunks)と列(semantic_search_enabled)とenumを、マイグレーション1本でまとめてDROP
  • ただしpgvector拡張は消さない。過去のマイグレーションが CREATE EXTENSION vector してるので、ここでDROPすると履歴が矛盾する
  • 利用量ログの embedding ってenum値も残す。過去のログと互換を保つため
  • MCPのツールを1つ減らして(22→21)、LP・docs・料金表・フッター・sitemapから参照を全部引っこ抜く

「機能を消す」は、実は「機能を足す」と同じくらい設計の仕事でした。

意味検索を否定したわけじゃない

ここだけは誤解されたくないので。意味検索はいいものです。変えたのは「それをTesseraが自分で抱えるか」だけ。

意味検索が要るなら、GraphQLかMCPでコンテンツを取り出して、好きなベクトルDBに入れてください。これが今のTesseraの推奨です。埋め込みモデルもベクトルDBも、この界隈は半年で景色が変わる。CMSの中に特定の実装を固定するより、Tesseraはコンテンツを素直に出す側に徹して、意味検索は得意な道具に任せたほうが、使う側の自由度が高い。

もしこの先、「ワークスペースの中身を意味検索したい」って声がちゃんと複数来たら、そのときは外部ベクトルDBとの連携を先に考えます。自前でもう一回作るのは、一番最後。

足すより、消すほうが難しい

機能を増やすのは、正直楽しいし、楽です。難しいのは「これ、誰も使ってないな」を認めて、手を動かして消すことです。消すのは地味だし、リリースノートにも書きづらい。

でもTesseraがやりたいのは、スキーマ生成AI・GraphQL・MCPの3つを、ちゃんと回るコストで長く続けることです。使われない機能を抱え続けるのは、そのどっちにも効かない。ならさっさと消す。それも設計のうちだと思ってます。

まとめ

  • 7月に入れたワークスペース限定のセマンティック検索(Voyage+pgvector+MCP semantic_search)を、9月に消した
  • 理由:誰も使ってなかった(作った本人含む)/そもそもナビに無くてたどり着けなかった/使ってなくてもコストはかかる/最初から「ダメなら消す」と決めてた
  • 消すのも大仕事:テーブル・列・enumはDROP、でもpgvector拡張と互換用enum値は残す。参照も全部引っこ抜く
  • 意味検索が要るならGraphQL/MCPで取り出して外部ベクトルDBへ。Tesseraはコンテンツ供給源に徹する
  • 足すより消すほうが難しい。でもそこをサボらないのが、長く続けるコツだと思う

作った機能を消すのは、格好よくはないです。でも「作ってみて、確かめて、ダメだったら消す」をちゃんとやれることのほうが、プロダクトとしては健康だと思ってます。次に何か足すときも、同じ目で見ます。「これ、本当に使う?」って。

無料で始めるドキュメントを見る