はじめに
個人サイトに専門分野の資料や情報を蓄積する、ナレッジベースと呼ばれるものを作成しました。登録されている記事はまだテスト用の数件だけです。
この後簡単に書くように、既存のプラグインを使わずオリジナルのシステムにしました。コードはかなりの部分生成AIに書いてもらったので「一緒に」と言うのはおこがましいかもとは思いましたが、トラブル対応や修正案を考えるのはけっこう自分でもやりました。
これと下記の記事で紹介した、やはりオリジナルの文献情報表示の仕組みと合わせて、ようやくはてなブログからの記事の移行準備が整いました。
Zoteroから文献情報を取得してWordpressで表示させる仕組みを作った - 誰がログ
経緯
先に簡単にまとめると、記事数が多くなりそうなのでナレッジベースのような仕組みで管理したい、でもBetterDocsが使いにくかったのでオリジナルで作ることにした、というところです。
ブログの記事は一過性のものになってしまいがちで、またさいきんははてなブログが生成AIからの(直接の)アクセスをブロックしているということもあって、はてなブログに書いた専門的な記事を個人サイトに移行することを計画しました。
そこでどの記事を移行してどう管理するかを考えてみたのですが、意外と移行の候補数が多くてただ固定ページや記事として移すだけではやはり情報や資料が埋もれてしまいそうです。
そこで、以前から気になっていたナレッジベースを導入してみることにしてみました。当初は自分で作る気などまったくなく、BetterDocsを試してみたのですが、サイトで使用しているSWELLというテーマとどうも相性が良くなかったのです。BetterDocs自体は良いプラグインだと思ったのですけどね。
そこまで詳しくありませんのでざっくり書きますが、SWELLがサイト全体のCSSに与える影響がBetterDocs内の記事にもあって、うまく見た目が調整できませんでした。これについても生成AIに相談しながらいろいろな方法を試してみたのですがどうにもうまくいかず。
ここで運悪く文献情報表示の仕組みの成功体験があったため、「じゃあオリジナルのナレッジベースを作っちゃえ」と思いついてしまったのです。結果としてなんとか形にできましたが、遥かに骨が折れました。
生成AIの環境
エディターや使い分けなど
ZedというエディターとClaudeのSonnet4の組み合わせ、CursorとClaude Code(ProプランなのでこちらもSonnet4)の組み合わせ、でほとんどの作業を行いました。
ただしこれらのプランだとそれほどガンガン使えるという感じではないので、事前の情報収集や方針・案の検討についてはアプリの方のChatGPTやClaudeで下準備をしました。体感としては、イメージややりたいことがぼんやりしている段階ではChatGPTのo3かDeep ResearchあるいはClaudeのOpus4に相談、ある程度やりたいことが具体的になってからの相談はClaude Codeのplan modeがちょうど良い感じでした。Claude Opus4はProプランだとすぐ使用上限が来るので、後に書く問題点の解決のために取っておくという役割分担に今は落ち着いています。
アプリ版のChatGPTやClaudeだと質問や作業を投げて任せることができるので、ほかにやることがある場合にとりあえず依頼だけしておいて、時間ができたら結果を読むというのが細切れな時間を使ったもの作りと相性が良いように思います。特に、通勤で電車に乗っている時間がけっこうあるので、電車に乗る前にDeep Researchを依頼して乗車中にレポートを読むというのは良かったです。追加の質問くらいならスマホでもぽちぽちできますしね。
トラブルとその対応
今回、Soneet4はお任せにするとなんでもコーディングで解決しようとするのでかえって変なトラブルにはまるということがそこそこ起こるなあという感触を持ちました。Wordpress上での管理やプラグインを使ったらあっさり解決したものもあったので自分の介入があった方が結果として良かったというケースが思ったよりありました。アンダースコアとハイフンを間違えるとか、開きタグと閉じタグが一致していないというような、私が目視で気付いたような単純ミスもあってこれは意外でしたね。
そういえば、その時のやりとりではぜんぜん言及していなかった重要なファイルをついでに消してしまう(報告もなし)ということもありました。幸いWordpress側にファイルがあったのですぐ復元できましたが、けっこうこわいですね。
Sonnet4がどうも変にはまってしまったなと感じたときは、アプリ版のClaudeでOpus4に聞いてみるとあっさり解決するという体験を何度かしたので、さいきんはちょっと変だなと感じたらすぐOpus4にも聞いてみています。ただProプランだとOpus4はすぐに使用上限に達してしまうんですよね…Maxプランでやると楽なんだろうなあ。コーディングだけでなく、背景や状況までも考慮したトラブル対応もやはりOpus4の方が良い気がします。
あと、Zedには「New from Summary」という今のチャットを要約して次のチャットに引き継ぐという機能があるのですが、それほどきれいに引き継げるわけではなくまた確認から作業が始まったりしますので、Sonnet4だともうトークン上限に達してしまった、でももうちょっと今の作業を継続すれば一段落、というような状況のときにGemini 2.5 Proにモデルを変更してそのチャットで最後までやりきってもらう、ということでGeminiにも少し手伝ってもらいました。
ナレッジベースに持たせた特徴
最初は記事数を多くしてもある程度整理できれば良いくらいに考えていたのですが、作っているといろいろ欲も出てきて。これが仕事ならコストとか納期とかのリミットが要因で歯止めがきくのかもしれません。
それでもそんなに多機能にはしていません。実装に時間がかかったのはトップページと個別の記事のサイドバーにある目次でしたが、良くあるタイプのものです。
学術関係の記事・情報だと、内容のアップデートと記事自体の修正はずれるよなあというのをずっと思っていたので、バージョン情報は手動で入力するようにしました。個別の記事の最下部に表示されているやつです。
役割語(キャラクターとことばの結びつき)に関する本 | 田川拓海
これは個別の記事の編集時に毎回挿入しているわけではなく、ACF (Advanced Custom Fields) というプラグインで編集画面に入力欄を作り、その内容が自動で表示されるような仕組みにしています。
検索の実装にもチャレンジしてみましたが、オーバーレイ検索の実装が難しくてあきらめました。検索にはプラグインを使用しています。
おわりに
PHPはぜんぜん詳しくないのでかなり大変かもとは思っていましたが、想像以上にエラーやトラブルが多く、何度か「重大なエラーでサイトが表示できません」状態になったりもしました。その際に訪問してくださった方には申し訳ありません。
今後、PHPやWordpressのアップデートにちゃんとついていけるかなど不安もありますが、自分用にカスタムした環境はやはり快適ですね。この後待っている長くなりそうな移行の作業もがんばりたいと思います。