spacevision

ガジェット好きのアマチュアサイクルフォトグラファー

半自動投稿botをやめて、自分専用の「編集支援」WebUIに作り替えた話

Xの運用を少し楽にしたくて、半自動のAI投稿botを作っていた。

spacevision-blog.net

RSSやスクレイピングで、自転車ロードレース、3DGS、Photogrammetry関連の情報を集める。AIで要約して、投稿文の候補を作る。それをLINEやDiscordに流し、よさそうなものを選んで投稿する。

仕組みとしては、ちゃんと動いたけれど、しばらく使ってみると、少しずつ違和感が大きくなっていった。

便利ではある。たしかに情報収集が早くて軽い。しかも投稿文のたたき台も出てくる。だが、運用しているうちに「これは本当に自分の発信として投稿していることになるのか」と思う場面が増えてきた。

そこで、いったん半自動投稿botの流れを止めた。

そして、投稿まで進めるbotではなく、自分専用の「編集支援」WebUIとして作り直すことにした。

今回は、その作り替えの記録である。

投稿候補を一覧管理するWebUIのイメージ 投稿候補をカード形式で一覧できるWebUIのイメージ。実データやURLは載せず、管理したい状態だけを図にした。

チャット通知は、投稿候補の管理には向かなかった

最初に気になったのは、LINEやDiscordのようなチャットに投稿候補を流す運用だった。

チャットは、情報を素早く受け取るにはとても便利だ。通知が来ればすぐ気づけるし、スマホからも確認しやすい。RSSで拾った記事やAIの要約を流すだけなら、かなり相性がいい。

ただ、投稿候補の管理となると話が変わる。

候補がどんどん流れていく。あとから見返しにくい。どれを確認済みにしたのか、どれを却下したのか、どれをあとで直したいのかが残りにくい。

つまり、チャットは「流れてくる情報を見る」場所としてはよいけれど、「候補を並べて比較し、状態を管理し、編集してから判断する」場所としては少し弱かった。

これはLINEやDiscordが悪いという話ではない。用途の違いだ。

ニュースの通知として情報を受け取るだけならフローでいい。しかし、そこから発信の候補へ移行するためにはストックとして扱いたい。あとから比較したいし、却下した理由も残したい。投稿前に本文を直し、文字数を見て、似た内容の連投になっていないかも確認したい。

そう考えると、チャットの中で番号を選ぶ運用には限界があった。

常駐botとWebhookは、自分一人には少し重かった

もうひとつの理由は、構成の重さだった。

半自動投稿botとして作ると、どうしても常駐botやWebhookサーバのような部品が増えていく。通知を受ける。番号を選ぶ。承認を拾う。投稿処理へ渡す。エラーを返す。

個人開発としては面白い。

ただ、自分一人のX運用のために、そこまで常時動かす必要があるのかと言われると、だんだん微妙になってきた。

一度動かして終わりではない。トークン、認証、ログ、エラー、再起動、ネットワーク、外部公開の経路。気にすることが増える。

もちろん、仕組みをきちんと作れば運用できる。けれど、自分が欲しかったのは「すべてを自動化するシステム」ではなく、「毎日の発信の入口を少し軽くする道具」だった。

そこを間違えると、楽をするための道具のはずが、道具の面倒を見る時間を増やしてしまう。

自動投稿経路があること自体が、少し怖かった

いちばん大きかったのは、心理的な不安だった。

「気づいたら勝手に投稿されていた」

「AIが怪しい情報を含んだ投稿文を作っていた」

この状態だけは避けたい。

それは、親しいフォロワーも同じだったようだ。

「アカウントが乗っ取られたかと思って心配した」

…完全に失敗である。

AIは便利だ。要約も速いし、論点も出してくれる。自分が見落としていた角度を拾ってくれることもある。

でも、AIは記事にない情報をもっともらしく補うことがある。日付、数字、背景、因果関係。人間が読むと自然に見えてしまう文章ほど、確認をすり抜けやすい。そして、私の文体を学習しているとはいえ、機械的な文章なのだ。

特にSNSは、ブログよりも投稿までの距離が短い。また、短文なので言葉の重みがある。少しの違和感が大きな不協和音として響く。

とどめを刺したのは、X上で印象に残った投稿だ。

あるサービス系アカウントのポストが、元の情報をうまく拾えておらず、読者に違う受け取り方をさせる内容になっていた。私が見た範囲では、その投稿に対してかなり強い反応が集まっていた。

参考:該当ポスト

もちろん、そのアカウントを責めたいわけではない。ここで気にしたいのは、AI要約や自動投稿の仕組みでは「要約としてはそれっぽいが、文脈としては危うい」文章が出てしまうことだ。

元記事に書かれていない因果関係を足す。数字の意味を取り違える。強い言い切りにしてしまう。誰かを批判しているように見える角度へ寄せてしまう。

こういうズレは、技術的なエラーとしては見つけにくい。だからこそ、投稿前に人間が「これはミスリードにならないか」を見る場所が必要になる。

でも、自分のアカウントで出す言葉は、自分の言葉として読まれる。

AIが作った文章であっても、投稿した瞬間に、それは自分の発信になる。

だからこそ、最後の判断をAIに渡してはいけないと思った。

投稿候補詳細画面のイメージ 要約、重要点、投稿本文、自分の追記、最終プレビューを一括で確認するUIイメージ。

botではなく、編集支援システムにする

そこで、考え方を変えた。

作るものを「投稿bot」ではなく、「編集支援システム」にする。

AIに任せる範囲は、次のところまで。

  • 情報源を集める
  • 記事を要約する
  • 重要そうなポイントを抜き出す
  • 投稿文のたたき台を作る
  • コメントの角度を提案する

一方で、AIには任せないことも明確にした。

  • 投稿可否を決めない
  • 承認済み状態を勝手に付けない
  • 自動で返信しない
  • 自動で引用しない
  • 自動でメンションしない
  • 記事にない事実を書かせない

人間がUIで操作したときだけ、候補が承認済みになる。

初期状態はドライラン。いきなり投稿される経路にはしない。投稿経路も一本化する。

ここで大事なのは、AIを信用しないという話ではない。むしろ、AIを使い続けるために、役割を分けるという話だ。

AIは素材を出す。自分が編む。

この距離感のほうが、今の自分の発信には合っている。

WebUIにした理由

WebUIにしたのは、投稿候補を「編集対象」として扱いたかったからだ。

チャットに流れてくる候補は、どうしてもその場で反応するものになりやすい。けれどWebUIなら、候補を一覧で並べられる。状態を持たせられる。あとから戻れる。

今回の状態遷移は、ざっくり次のように考えている。

new -> AI分析 -> drafted -> レビュー -> 承認 -> 投稿

AI編集支援WebUIの状態遷移 AIが進める場所と、人間が判断する場所を分ける。編集支援WebUIとして設計した。

編集支援WebUIの技術構成イメージ 候補を集め、AI分析を通し、人間が確認する。止められる場所を設計の中心に置いた。

一覧画面では、候補をカード形式で表示する。

カードには、元記事のタイトル、情報源、AI要約、状態、投稿前チェックの結果を出す。詳細画面では、AIが作った投稿本文をその場で編集できるようにする。自分の追記欄も用意し、最後に実際の投稿イメージをプレビューする。

文字数も見たい。

URLが入っているか。重複ではないか。似た文を連投していないか。NG語が入っていないか。そういう投稿前チェックも、画面上で見えるようにしたい。

Xの投稿は短い。短いから簡単、ではない。

短いからこそ、確認すべきことを画面に出しておく必要がある。

スマホで承認できることも大事だった

このWebUIは、モバイルファーストで作っている。

Xを見るのは、机の前だけではない。移動中、休憩中、ちょっとした空き時間にニュースを見ることも多い。だから、投稿候補の確認もスマホからできるようにしたかった。

ただし、スマホで操作できることと、雑に承認できることは違う。

承認ボタンは押しやすい位置に置く。でも、画面の流れとしては、要約、投稿文、チェック結果、プレビューを見てから押せるようにする。

状態も色で見分けられるようにした。

new、drafted、レビュー中、承認済み、投稿済み。ぱっと見て、今どこにある候補なのか分かるようにする。

却下するときは、理由タグとメモを残せるようにした。

これは、単に記録を残すためではない。却下理由をためていくことで、あとからAI側の改善に使えると思っている。

「要約が弱い」

「元記事の情報が薄い」

「自分の関心とズレている」

「似た投稿が続いている」

こういう理由がたまれば、情報源の選び方や、要約プロンプトや、チェック条件を見直せる。

投稿しなかった候補も、次の改善材料になる。

却下理由タグのイメージ 却下理由は、AI改善のためのフィードバックとして扱う。

セキュリティは、細部よりも考え方を書く

今回のWebUIは、自宅PCのローカルで動かしている。外から確認するために、トンネル経由でアクセスできるようにもしている。

ただ、この記事では具体的なドメイン名やログインURL、トンネル設定、APIキー管理の詳細は書かない。

公開する必要がないからだ。

考え方としては、次のようにしている。

  • 初期状態はドライランにする
  • 投稿経路は一本化する
  • 承認済み状態は人間の操作でしか付かない
  • 自動返信、自動引用、自動メンションは作らない
  • 認証は複数段で考える
  • ログインURLや内部設定は公開しない
  • 公開画像には機密情報を写さない

もちろん、これで「完全に安全」と言うつもりはない。

個人開発のローカルツールを外から触れるようにする以上、慎重に扱う必要がある。だからこそ、記事では実装手順や設定値の紹介ではなく、どこに境界線を引いたかを書くにとどめる。

速く投稿できることより、間違って投稿されないこと。

ここを優先した。

半自動の幻想より、人間中心の編集支援

自動化を進めていると、つい「最後まで自動で行けるのでは」と考えたくなる。

情報を集める。要約する。投稿文を作る。承認する。投稿する。

この流れを全部つなげると、たしかに気持ちはいい。システムとしても美しい。

でも、自分の発信に必要だったのは、そこではなかった。

必要だったのは、投稿を自動で増やす仕組みではなく、発信する前に考える余白を残す仕組みだった。

AIが素材を集める。AIが下書きを作る。そこまでは大いに助けてもらう。

ただし、最後に「これは自分が言いたいことか」「この表現で読者に届いてよいか」「元記事にないことを言っていないか」を見るのは自分だ。

この一手間を残すことで、むしろ運用は軽くなる気がしている。

自動投稿の不安を抱えたまま速くするより、自分が納得して押せる画面を作ったほうが、結果的に続けやすい。

スマホで投稿候補をレビューするイメージ
スマホの承認ボタンは押しやすく。ただし確認の後に置く。

自分専用の編集部として育てる

このWebUIは、まだ完成形ではない。

実運用しながら、却下理由をためていく。AIの要約を見直す。情報源を入れ替える。投稿前チェックの条件も調整する。

たぶん、最初から正解の形にはならない。

でも、それでいいと思っている。

これは、誰にでもそのまま勧められる万能のSNS運用ツールではない。自分の関心、自分の発信の温度、自分が許容できるリスクに合わせて作っている、自分専用の編集支援システムだ。

AIに発信を置き換えるのではなく、発信の入口を軽くする。

AIに投稿させるのではなく、自分が編集するための素材を出してもらう。

半自動投稿botをやめたことで、むしろAIとの付き合い方ははっきりした。

最後に押すボタンは、自分で押す。

そのための画面を、これから少しずつ育てていく。

主要リンク

※X APIや自動化ルールは変更される可能性があるため、この記事では具体的な運用手順ではなく、個人運用でどこに判断の境界線を置いたかを中心に書いています。