ここまで散々ネタにしているのに、詳細がベールに隠されていた小説検索bot。この章では結局どんな仕組みが採用されて、どんな工夫を追加したかをサラッと流す努力をする。

実際のプログラミング?的な仕組みは、まあこんな感じである。

  • MeiliSearch:キーワード検索用として有名なプログラムらしい、多分Misskeyの鯖缶経験の中で単語だけは知ってた
  • Qdrant:さっきチラッと話題に出ていたベクタ検索……つまり曖昧でふわっとした検索向きのプログラムで、採用理由は確かラズパイ5でも簡単に放り込めてしかも動くから
  • Embedding:何かよく分かってないけど多分単語を切って上記検索に放り込む判定をしているAIっぽい……
  • RRF:キーワードとベクタ(ベクトル)の検索結果を混ぜる仕組みっぽい
  • LLM:ユーザーたちの質問を実際に読解して判断してくれるAIたち(複数切り替え機能対応)←切り替え機能つけるのが筆者の好み

Discordから特定コマンドを入力すると、コマンドに応じて検索結果を返してくれる。Discord botの形をとっているのは、適度にクローズドで適度に見守りやすいからである。

小説をテキスト形式、空行込みで所定のフォルダに入れて転送し、取り込み作業を回すと何かイイ感じに検索用データが作成・保存される。そして例えばLLMに聞くモードのコマンドでふわっと質問すると、「どこの話のどこの章の何番目の段落」という出所情報付きで答えてくれるのである。

プログラムそのものはPythonで組まれていた筈だ。LLMのAPIにもDiscordにも対応してくれており、LLMたちが比較的得意なプログラミング言語であり、起動させっぱなしで動かせるからである。

個人的な工夫ポイントとしては、以下が挙げられる。実際にはもっとあったかもしれないが、今でも「これは多分GJだったよなあ」と思っているものはこれらだ。

  • 出所(出典)明記:実際に探しに行くのに迷子にならない、かつ、LLMたちに嘘を吐かせない対策の一つ
  • 取り込み作業で青空文庫形式をへっぱがす:どうせそんな面倒な形式(しかも特定単語のルビが毎回違うような言葉遊び)を嬉々として本文中で多用しているのは筆者くらいである
  • モデル切り替え機能:これについは直ぐに後述

モデル切り替え機能は正直、筆者くらいしか喜ばない変態機能である。OpenAIとClaudeを切り替えられて、しかもモデル名が明記できればそれを呼び出せてしまう。極端な話、HaikuなClaudeさんとSonnetなClaudeさんとOpusなClaudeさんとGPT系統とで聞き比べができてしまうという……いや本当、比較実験大好き筆者の気質をよ~く表した機能だ。

いやね、検索機能そのものについても、キーワード検索とか回数検索とか一応実装されてはあるのだけれど、筆者以上にプログラミングについてはふわっとしてる友だちが何のオプションも使わずに全てをLLM質問モードで捌くのを見て、筆者が悟りを開いた。そのレベル前提でブラッシュアップさせる必要があったかと。