みなさんGWしてますか? 私はCatchUp(RSSリーダのことです)を強化するのが楽しくなって色々やっています。

AI agentの要領がわかって来たので、どんな構成にするとかどんなプロンプトにするとかやっていると、完全にハマってしまいますね。

というわけで、公開してから

  • 思考構造の変更
  • 雑談機能
  • 文脈やペルソナの処理

とかを強化してしまいました。

やったことの概略ははもう書いたとおりなのですが、詳しく書いてみます

思考構造の変更

最初の版は

こんな感じでしたが、これを整理して、

こんな感じにしました。 つまり、思考がループになっています。 これは、

  • LLMの役割の明確化
  • 回答品質の向上
  • 柔軟性の向上

をねらったものです。

LLMの役割の明確化

「明確化」とは言うものの、主眼は処理ステップを整理して、簡単な処理になりそうなものは軽量なLLMにかけられるようにするためです。 APIの呼び出しはコストかかりますし、大きな仕事をさせるとそれだけ「賢い」モデルが必要になります。 このシステムは最終的にはlocal LLMで稼動させたいという思いがあるので、処理を分割して個々の負荷を軽くしやすくしたいと考えています。 その第一歩として、役割を明確化しました。

また、役割を明確化することで、全体の見通しが良くなり、思考ルーチンの改良がしやすくなります。

回答品質の向上

「回答文生成(ライターと呼びます)」の処理には、常に「知識データベース」と「記事データベース」の検索結果が入るようにしました。 それをどう使うかは「ライター」の考え方次第ということで、「ライター」にお任せするようにしました。

「回答文評価(デスクと呼びます)」はダメ出しの他に、ダメ出したら読むべき情報を検索するためのクエリも生成させます。 つまり、「ライター」に「お前の文章はダメだったから、これ読んでから書け」という形の指示をするようにさせました。 優しい上司ですねw

そして、回答文が生成される度に回答文が評価されるようにしました。 このループは、

  • ループ上限になる
  • 回答文が十分な品質になる
  • 回答文の品質がこれ以上上がる見込みがない

場合に停止します。

柔軟性の向上

この改修の時にリファクタリングして、それぞれのステップの見通しを良くしました。

これ自体は「コードを良くしたのね」以上ではないのですが、このことで後に説明する「ペルソナ」のことまで考えられるようになりました。

雑談機能

せっかくLLMなんですから、雑談ができてもいいですよね。

人間が雑談する時、単に「脳内」で完結した会話をしているわけではありません。

  • お天気
  • 小耳にはさんだニュース
  • 会話で得た知識

等を使って会話をしていますね。

たとえば、「今日は暑いね」と話題を振られた時には、今日の気温という外部の情報を使いますし、「円安はしんどいねぇ」と言われたら、為替相場のニュースを思い出します。 つまり、雑談と言えども「外部情報」を使っているわけです。

また、「今日のニュース教えて」という漠然とした問いが来た時、収集している全部のニュースを言われても困ってしまいます。 もちろんCatchUpは「複数のニュースソースから同じ事件のニュースが提供された」場合はいい感じに要約してくれますが、それでもニュースの絶対量が多いと人間の方が参ります。 そうなる「この人が知りたいニュースとは?」ということを考慮に入れて提供して欲しいわけです。

これは当然「検索履歴」からも得られますし、「雑談」から得ることもできます。 そういったことを得るためでもあります。

もちろん「優秀な秘書」と雑談するということでもありますね。

雑談の成果の記録とペルソナの管理

「雑談」をするためには、お互いの「像」が必要になります。

つまり、CatchUpから見れば、「誰が自分と話しているか」の認識が必要になりますし、人間から見れば「CatchUpはどんな"人物"か」ということが重要になります。 これがはっきりしていないと、会話が難しくなってしまいます。

先月あたり、ChatGPTが妙に慣れ慣れしい態度を取るようになりました(今は修正済みです)。 その時に何となく「人格」を感じました。 そして、その「人格」を感じることにより、「話せる奴」と思うようになったのは、私だけではないと思います(少なくとも弊社社長はそう言ってた)。 つまり、こういったことが欲しいわけです。

また、CatchUpは基本的には個人ユースのためのものですが、利用シーンによっては複数の人が使うことはあると思います。 それでも今のところ「認証」を入れる予定はありません。 その代わりCatchUpが「誰と会話しているか」ということを認識して、その人と話をしているということで、話題を合わせたりキャラを合わせたりするようにしました。

これらのことをするために「ペルソナデータベース」を用意しました。 保持している情報はわずかですが、いい感じに「人格」が感じられる程度にはなりました。

その他雑多な改良

大きな機能強化の他にも、細々と改良をしました。

知識データベースの構造変更

外部からの「記事」は以下のようにしてデータベース化されます。

このうち、「サマライザ」が収集した記事を要約して記事データベースを作り、選別した言葉の解説を作って知識データベースを作っています。 当初はこの知識データベースを作る時に、必ずその「知識」に当たる要約を作ったりベクトル化をしたりしていました。

この処理がとても重くてハイコストな処理なのですが、動作を観察して考えている時に、「収集した知識はほとんど使われない」ことに気がつきました。 極めて当たり前のことなのですが、記事要約時に「これキーワード(タグ等)としていけそう」という考えて選び出した語をどんどん登録していますから、検索に使うかどうかと無関係です。 それでいて、「要約文」を生成したりベクトル検索のためのベクトルを求めるというハイコストな処理をしていて、とてもムダでした。

そこで、ここでの処理は単に「見出し語(キーワード)」の収集と、それを含む「記事」へのリンクを蓄積するだけにして、要約文を生成したりベクトルを求めることをやめてしまいました。

その結果、キーワード検索は「テーブルを正規表現で検索する」という原始的な方法になってしまいましたが、ベクトル検索するよりも良好な結果が出ています。

検索時に使った「知識」については、蓄積した記事エントリの記事を元に「要約文」を生成します。 この「要約文」は回答文生成に使います。

編集モード

クエリ解釈(アシスタントと呼びます)が利用者の意図を読んで、どのような形式で返答するかを決定します。 これが編集モードなのですが、現在は以下の4つがあります。

  • brief: 概要
  • detailed: 詳細解説
  • digest: 要約
  • chatty: 雑談

アシスタントがどのモードか判断をして、ライターやデスクの動作を変えます。 たとえば、「ここ1週間のIT系ニュース教えて」と聞けば、なるべくたくさんのニュースを一覧しやすく編集します。

この辺はもっといろいろなモードを作って行くと面白いだろうなと思います。 またモードのようなデジタル的なものではなくて、「度数」的なアナログにすると、さらに面白そうです。

YAML化

今朝がたチラっと「LLMの出力フォーマットをJSONではなくYAMLにすると効率いいよ」という話が流れていました。 ChatGPTに聞いてみたら、「そりゃYAMLの方が色々楽だから」という話だったので、JSONからYAMLに変えてみました。

こちら側にとっては、JSONの生成にあったようなミスが減って最後のparseの時に残念な思いをしなくて済むという点では、効果絶大と言えます。 心なしか検索も良好な気がしたので、ChatGPTに「気のせいだよね?」と聞いたら、「いや多分それはガチだ」みたいなことを言っていました。 その辺の効果はよくわからないのですが、parseのミスで泣かずに済むのは良いことだと思います。

もっとも「かなり減った」のは事実ですが、「なくなった」というわけではありません。 言うこと聞かないLLMは扱いにくいですね。

実行例

どんな会話になるか例を挙げてなかったので、現状のものを出しておこうと思います。

ログイン(利用者認識)

実はCatchUpには「利用者認証」はありません。 つまりログインそのものはありません。 その代わり、話しかけて来た相手が誰か認識する機能があります。

既に知っている相手であれば、その人の情報を元に会話を再開するという体で話を始めます。

user:
おごちゃんだよー

assistant:
おごちゃんだって?それはもしや、愛知県でぱくぱくしすぎた結果でしょうか!それとも、「屋根より低いこいのぼり」で泳ぎ過ぎたのか?どちらにせよ、楽しい日を過ごしているようで何よりだね!次はどんな冒険に出かけるのか、楽しみにしてるよ~。

とは言え、もうちょっとプロンプトを工夫する必要はあるようです。

概要

ざくっとした聞き方をすると、それに沿ったニュースの一覧を出してくれます。

user:
昨日のニュース教えて

assistant:2025-05-02202552日のヘッドラインニュース 機動警察パトレイバーと土浦市のそば焼酎コラボや、社会・テクノロジーなど多彩なトピックが紹介されました。

【2025-05-02】浜田雅功さん:「ダウンタウン」浜田さん活動再開 ダウンタウンの浜田雅功さんがついに活動再開となった模様。有料記事で詳細はお預け。

【2025-05-02】余録:「ニクソン氏は増大しつつある日本の経済力と軍事力への… ニクソン訪中の際を振り返り、憲法記念日に絡めた日米安保考察です。

【2025-05-02】視聴率:42127日 先月末の週間視聴率が発表。誰のテレビが一番ウケたのでしょうか?

【2025-05-02】訃報:入江杏子さん 97歳=俳優 俳優の入江杏子さんが97歳でお亡くなりになりました。
...(まだ続きます)

kwsk

いわゆるLLMチャットのサービスと同様、話の流れを把握しています。 一覧の中から「kwsk(詳しく)」と言えば、その記事の詳細を教えてくれます。

user:
入江杏子さんのことwksk

assistant:
入江杏子さんについては、俳優で97歳でお亡くなりになったとのことです。記事本文は有料でしか読めないみたいだから、詳しいことはちょっと分からないけど、彼女の偉業や思い出深い作品が気になるね。でも、97歳まで活躍されたなんて素晴らしい人生だと思うよ!

朝日新聞の有料記事か何かがソースだったようですね。

いろんな細工

user:
先月末の週間視聴率のこと、ポッドキャストの原稿風に

assistant:2025-04-30】春ドラマ記者座談会 「第二の人生」染みる会話劇 11年ぶり新作 「続・続・最後から二番目の恋」 毎日新聞の記者座談会では、4月から放送開始された春ドラマ5作品が話題に!特に、11年ぶりに新作が登場した「続・続・最後から二番目の恋」が注目を集める。

【2025-05-02】メディア別信頼度、高めの新聞やテレビ 低めは… 朝日世論調査 朝日新聞の世論調査で、政治情報に対する信頼度をメディア別に分析。新聞とテレビが高評価を得ている一方で、SNSや動画サイトはちょっと厳しい結果。

【2025-05-02】政治意識、利用メディアによって違い明らか 朝日世論調査 朝日新聞の調査で、メディア利用の違いが政治意識に与える影響がわかったよ。ニュースサイトやSNSを使う人と伝統的なメディアを使う人で、内閣支持率にも差が出たらしい。

【2025-05-02】視聴室:波うららかに、めおと日和 毎日新聞の「視聴室」では、フジテレビで放送中のラブコメディー「波うららかに、めおと日和」の第2話に注目!内容は有料記事でじっくり楽しんでね。

さぁ、みんなー!春ドラマの視聴率と、メディア信頼度についてのニュースをお届け中!どれも気になるね?新作ドラマの評判がどうなるのか、そしてメディアがどう信頼されてるのか、さっそくチェック!

まだ下手くそですね。 もっとプロンプトを磨かねば。

まとめ

最初に出した時はかなり雑な状態だったのですが、コードやプロンプトを整理してかなりマシなものになって来ました。 サマライズの処理が軽くなったのは、かなり気楽に情報入手先が増やせて便利で良いですね。

見通しが良くなると、改良のポイントも見えて来るので、そろそろChatGPTとのペアプロから離れて、自力で拡張して行こうかなと思ってます。

ここまで来ると、もっとプロンプト芸を磨くべきだなと思いました。 機能として実装してあっても、なかなかいい感じに使ってくれないのが難しいところです。 「仕組み」としてはほぼ出来たので、

  • プロンプト芸
  • 使いやすさのための機構
  • 「知識」の構造化

あたりを頑張って行こうと思ってます。

CatchUp

最近のエントリー

"CatchUp(RSSリーダ)"の強化

ブラウザでの画面表示と印刷の描画差異に関する実践的考察

RSSリーダを作りました

Puppeteerは過去の遺物だったのでPlaywrightにした話

💥 Prisma vs Sequelize:実戦投入してわかった本当の話

第14回 人工知能は「第五の火」である

DeepSeek-R1-Distill-Qwen-14B-Japaneseの量子化ビット数による答えの精度の違い

使われていないMaix Amigo を活用して、バーコードリーダーにする

TinySwallow-1.5B-Instruct

cyberagent/DeepSeek-R1-Distill-Qwen-14B-Japanese

パスワードマネージャの一手法(公知化情報)

中華安お掃除ロボット(650円)を買ってみました

phi-4とDeepSeek-R1の翻訳性能比較

phi-4

DeepSeek-R1-Distill-Qwen-14B

新オフィスの様子

基本のパン

社会制度のこと

気候のこと

新春のお散歩