RAGった

WordPressの検索機能はMySQL/MariaDBの全文検索なので、甚だ使い勝手が悪い。

例えば、当ブログでは散々「養蜂」を扱ってきたが、「ミツバチ」を漢字で記述したことが無い。従って、漢字で検索するとまるでヒットしない。あるいは、「Linux」と書いたか「RHEL」と書いたか、「Red Hat」なのか「レッドハット」なのかみたいなものも多い。どっちも見つけてほしい。

なので、Difyにナレッジベースとしてブログのポストを突っ込んでtext-embedding-3-largeでベクトル化、pgvectorで保存してハイブリッドサーチをするワークフローを組んで、標準の検索機能をhookで横取りするプラグインを作った。

ワークフローはこんな感じ。

で、ブログを投稿した際にはナレッジベースに追加してHNSWを更新する。現時点でDifyのDocker Composeに含まれるpgvectorのHNSQは3072次元のベクトルをサポートするので、特に問題は無し。もっとポスト数が多いなら、HNSWではなくDiskANNを検討するところだけど、所詮個人ブログでそんなにデータは無いw

当初はプラグインを公開しようかと思ったんだけど、使いこなすのが相当に難しいのでやめた。Knowledge base / Workflow APIを切り替えたり、A/Bテスト(adminログインしてると機能が有効になる)とか、色々入れたんですけどねw

仕事としては2023年からRAG構築は散々やっていたのだけど、自宅鯖のWordPressが後回しになっていたのは皮肉としか言い様がないw

当初、Embeddingはbge-m3をCPUで実行してみたが、質が低すぎる&遅すぎてキャンセル。text-embedding-3-smallに切り替えたら30倍高速かつ質が全然違った。業務で触ってるので薄々そうだろうなとは思ってたが、検索結果が出るまで30秒のタイムアウトを超えてしまうようでは話にならない。