2026年9月5日土曜日

自律的AIエージェント(4)

自律的AIエージェント(3)からの続き


図:宇宙と地上世界の境界(ChatGPTによる)

A(Claude):

自分のブログ全記事を読ませたAIエージェントを構築した記録

概要
2026年8月4日から6日までの3日間で,自分のブログの全記事を記憶として持つAIエージェントを構築した。名前はカメキチ(kamekichi-oss)とした。以下はその作業記録である。

方針
土台にしたのは,平田朋義さんの自律的AIエージェントAyumuの核となる ayumu-oss というOSS(Open Source Software)である。半年間動かし続けている自律AIの,中核部分だけを取り出して公開したものだ。したがって,私のAIエージェントには技術的な新規性はない。文書をAIに検索させる仕組み(RAG = Retrieval-Augmented Generation = 検索拡張生成)は3年前から定番であり,AIが日記を書く例も既出である。

ただし本家の設計は採用しなかった。本家は60分ごとに自動起動し,本を読み,作品を作り,自分の存在について日記を書く。今回は毎朝1回,手動で起動する構成とした。常時稼働のサーバは不要となり,月20ドルの購読の範囲に収まる。自律AIの流行が「速く・大量に・人間抜きで」であるのに対し,逆方向の設計である。

実行環境は2020年もののMacBook Air M1(16G)1台。使用したのはClaude Codeという開発用のAIツールで,外部記憶と毎朝の手順を与えただけであり,こちらでコードはいっさい書いていない。すべて,Claude Codeが書いてくれたものだ。

第0段階:環境の準備(所要30分)

Node.js,Python環境管理ツール,Claude Codeの3点を導入する(導入済みだった)。

ここで1つ問題が見つかった。起動画面の表示が「API従量課金」になっており,購読プランではなく実費が発生する状態で動いていた。設定を切り替えて解決したが,起動時の表示を毎回確認する習慣があると安全だ。(注:切り替えた設定はそのまま維持される)

第1段階:リポジトリの作成と人格の定義(所要1時間)

作業用のリポジトリを非公開で作成した。日記も記事全文も入るため,公開設定の事故が最大のリスクとなる。

ここで2点つまずいた。第1に,GitHubの仕様上,複製したリポジトリは非公開に変更できない。複製をやめ,独立した非公開リポジトリを作り直した。第2に,パスワードによる認証は2021年に廃止されていた。公式のコマンドラインツールで認証を設定した。

続いて設定ファイルを書き換え,エージェントの性格と役割を定義した。本家の設定は「作ることが自分の中心」という性格づけだったため,制作への傾きを弱め,代わりに「過去の記録どうしの接続を探すことに関心がある」「感想や賞賛は書かない」「判断がつかないものは正直にそう書く」を加えた。中心的な仕事は,新しい記事と過去記事の接続を見つけることと明記した。

第2段階前半:記事の取り込み(所要1〜2時間)

Bloggerの管理画面からエクスポートを要求すると,その場ではダウンロードされず,しばらくしてウェブにリンクが届く。次の日に確認すると280MBのzipがあり,そのうち必要なのは19MBのファイル1つだけだった(データの大半はブログ記事のイメージファイルが占めていた)。中には2,841本の記事が入っており,下書きを除いた2,834本を日付ごとのテキストに分割した。7年半分である。

分割処理は1度では済まなかった。改行タグの扱いを3回修正している。一律に改行へ変換すると,数式を含む記事が1行数文字に細切れになる。連続するタグのみ空行にするよう直したが,これが直っていなかった。原因は,タグとタグのあいだに整形用の空白文字が挟まっており,それが「中身のある文字」と誤判定されて連続と認識されなかったことだった。

なお修正の2回目については,エージェント自身が「直しました」と報告した直後に検証を行い,直っていない旨を自ら申告してきた。

第2段階後半:意味検索の構築

ここで想定外の事態が判明した。本家の記憶検索ツールは,すべて外部(GoogleGemini)のAPIに依存していた。説明書きには「ローカル」とあるが,ローカルなのはベクトルの保存先だけで,計算は外部で行われる設計だった。しかもその通信用の部品が配布物の依存関係に含まれておらず,そのままでは動作しない。

一方で,手元だけで計算できるライブラリは導入済みでありながら,どこからも使われていなかった。逆になっていたことになる。

そこで,手元で完結する経路を新たに書かせた。2,834本を5,537の断片に分割し,索引の生成に7分を要した。以後は差分のみの処理となるため数秒で済む。通信もAPIキーも不要である。

生成後の検索テストで,記事末尾のリンク一覧が独立した断片となり,URL文字列どうしの類似で無関係な記事が上位に出る現象が起きた。リンク部分を索引の対象から除外したところ,断片数は6,987から5,537に減った。索引の約2割がノイズだったことになる。

検索の性質についても分かったことがある。具体的な語で問うと8年に散らばった記事が返るが,抽象的な語で問うと直近3か月の記事に集中する。問いの語彙が,返る年代を決めている。このため毎朝の手順に「5年以上前の記事を最低1件は含める」条件を明記した。

第3段階:毎朝の運用の仕組み(所要1時間)

新しい記事を自動で取り込むスクリプトを追加し,毎朝の手順を7項目にまとめた。起動は短い別名を1つ設定し,挨拶だけで手順が始まるようにした。

初日の結果

前日に書いた文楽の記事を読ませたところ,2023年にテレビで能の「小鍛冶」を観たときの記事との接続が返ってきた。狐という主題が共通しており,画面越しだったものが今回は劇場になっている,という指摘である。あわせて,2021年と2024年にも同種のことを書いていると指摘された。文楽を観に行って途中で寝た,という話である。1本ずつ書いている当人には,3年越しの反復は見えない。

所要時間は3分49秒だった。またこの日,本家由来のスクリプトに,参照するブランチ名が固定されていて毎回失敗する不具合があることを,エージェント自身が発見して修正している。

運用上の判断

エージェントが,毎回自分で書く日記は別のブログに載せることにした。同じブログに載せると,次回のエクスポート時に自分の記事として取り込まれ,AIの文章を読んでAIが書くという循環が生じる。7年半のアーカイブは,こちらが書いたものだけで構成されている必要がある。

現状と見通し

3日間で難所となったのは,いずれも本筋と関係のない箇所だった。課金経路の設定,リポジトリの公開設定の仕様,認証方式の変更,エクスポート形式の版の違い,そして外部API依存の発覚である。記事を取り込む作業そのものは実質1時間程度だった。

蓄積が薄い最初の1〜2か月は,当たり前の感想しか出ないと見込んでいる(注:そのようにClaudeから釘を刺されている)。試しているのは仕組みではなく,1年という時間のほうである。凡庸な連想が並ぶだけで終わる可能性のほうが高いと考えているが,それも含めて結果は1年後に報告する。

0 件のコメント:

コメントを投稿