※この記事は、Claude Codeで1人開発しているSNS運用SaaS「ThreadPost」の開発日記だ。
画面に並んだ文字を見て、僕は頭を抱えた。違う。僕がAIに求めたのは、読者の思考を強制的に止めるような、クールで不親切な「ぶつ切り」の終わり方だった。なのにClaudeは、優等生が書いた読書感想文のように、きれいに着地していた。
親切心が、牙を剥く。AI開発の現場では、この「良かれと思ったお節介」が最大のバグになる。今週の僕は、AIの優等生すぎる人格を削ぎ落とし、泥臭いSNSのアルゴリズムと格闘し、跳ね上がるAPIコストに冷や汗をかいた。
SNS運用を自動化しませんか?
ThreadPostなら、投稿作成・画像生成・スケジュール管理まで全てAIにお任せ。
今週の全体像
今週の成果は「AIの擬人化と、プラットフォームの壁の破壊」だ。SNS投稿の質を上げるためにAIに人格を叩き込み、Threadsという新しい戦場へXの知見を移植した。
- 総コミット数: 28件
- 実装した新機能: 4件(Threads自動化、代理閲覧、APIコスト自動ログ、黄色マーカー記法)
- 修正したバグ: 6件
- 壊した回数: 数えきれない
開発速度は上がっている。Claude Codeを並走させることで、エンジニア3人で1ヶ月かかるようなボリュームを、わずか数日で形にした。だが、その代償としてAPI代が消え、AIの勝手な解釈によってシステムが何度も沈黙した。便利さと脆さは、常に表裏一体だ。
AIの「親切心」という名のバグを削ぎ落とす
「余韻を残して締めるな。結論で丸めるな。」
僕はプロンプトにそう書き込んだ。僕が作っているのはSNSの投稿を自動生成するエンジンだ。今のSNSでは、最後まで語りすぎない投稿の方が反応が良い。読者が「え、それで?」と思う余白を残すことが、インプレッションを伸ばす鍵になる。
だから僕は、AIに「ぶつ切り」で終わるように指示した。「feat(video-post): メイン末尾をぶつ切り型に変更」というコミットがその格闘の記録だ。だが、AIは言うことを聞かない。どうしても「丁寧で完結した回答」を出そうとする。RLHFによって、彼らは「不親切であること」を悪だと教え込まれているからだ。
僕は具体例を渡すのをやめ、代わりに「なぜぶつ切りにするのか」という思想を渡した。読者が考える余白を残すため、教科書っぽく見えるのを防ぐため。禁止パターンを10個書き込み、出力の構造を厳密に縛った。これでようやく、AIは意図した「不親切な投稿」を吐き出すようになった。
さらに問題は出力形式にも及んだ。「fix(post-gen): JSON応答のcontent値にMarkdown見出しを含めないよう明示」というコミットがある。AIは親切心から、JSONの中にMarkdownの装飾を混ぜてきた。これをやられると、プログラム側のパースエラーでシステムが止まる。AIにとっての読みやすさは、プログラムにとっての毒だ。
しんたろー:
AIに「自由にやっていいよ」と言った瞬間、システムは死ぬ。12件中8件が一発OKだったけど、残り4件はAIの「親切」のせいでゴミになった。自由度は、不具合の温床だ。
Xの知見をThreadsに移植して、アルゴリズムの壁に激突した話
「Xで1年磨いたロジックがあるんだから、Threadsでも余裕だろう。」
そう思っていた。「feat(threads-quote): X 側ロジックを移植して品質強化」と意気揚々にフィルタリングロジックを移植した。だが、Threadsで動かした瞬間、候補が10件中0件になった。完全な沈黙だ。
原因は、プラットフォームごとのアルゴリズムの「流速」の違いにあった。ThreadsのAPIを叩いてわかったのは、Xに比べて圧倒的にデータが薄いということだ。Xと同じ基準でフィルタをかけると、宝物までゴミと一緒に捨ててしまう。
「feat(threads-collect): Threads アルゴ実態に合わせた reply 重視 + Latest 検索追加」
僕は戦略を変えた。Threadsはリプライを重視する。なら、バズっている投稿を探すのではなく、会話が生まれている場所を探すロジックに変える。さらに、検索経由での収集を諦め、自分の「For You」フィードをスクレイピングする方向に舵を切った。
「feat(threads-collect): For You フィードをメイン経路化」
結局、AIが判断するよりも、Threadsのレコメンドエンジンが勧めてくる投稿の方が、よっぽど反応すべき対象として正しかった。Xの知見をそのまま使うのではなく、その思想だけを抽出し、Threadsの泥臭い仕様に合わせて再構築する。この試行錯誤のサイクルを数分で回せるのが、AI開発の強みだ。
しんたろー:
プラットフォームが違えば、正義も変わる。Xでは「いいね数」が信頼の証だったけど、Threadsでは「リプライの熱量」が全て。自分の成功体験を疑うことから、開発は始まる。
ここまで読んだあなたに
今なら無料で全機能をお試しいただけます。設定後は完全放置でプロ品質の投稿を毎日生成。
落とし穴
AIにプロンプトを書くとき、多くの人が「具体例」を入れれば精度が上がると信じている。僕もそうだった。動画の解析プロンプトに、理想とする「ぶつ切り」の例を14個も詰め込んだ。結果、AIは言い回しをコピーするだけのマシーンになった。生成される投稿が、どれもこれも似たような語尾で終わる。
僕は具体例を全て削除した。代わりに、「なぜそうするのか」という抽象的なルールと、絶対にやってはいけない禁止事項だけを残した。すると、AIは自ら考え、バリエーション豊かな投稿を生成し始めた。指示が具体的であればあるほど、出力は均一化され、人間味を失っていく。削る引き算の指示こそが、AIに魂を吹き込む方法だ。
今日の数字
| 項目 | 実績値 | 比較対象 |
|------|------------|----------------|
| 総コミット数 | 28件 | 企業開発なら1スプリント分 |
| APIコスト(最適化前) | 約30,000円 | サーバー代の約15倍 |
| モデル切替後のコスト | 1ユーザー月$2〜3 | Sonnet垂れ流し時の1/10 |
| 開発時間(Threads実装) | 約12時間 | 外注なら仕様策定だけで3日 |
「chore(ai-cost): SONNET 残り全部を HAIKU に + 画像デフォルトを nano-banana-2 に」
僕は即座にモデル選定を見直した。全ての処理にSonnetを使うのは、近所のコンビニにフェラーリで行くようなものだ。要約や単純な分類はGemini 3.5 FlashやClaude 3 Haikuに逃がし、論理的な推論が必要な箇所だけをSonnetに残した。
しんたろー:
1リクエスト数円。それを「安い」と思うか「高い」と思うかで、SaaSの生存率は変わる。僕は、1円を惜しむために数時間を費やす方を選んだ。
FAQ
Q: モデルのコストを性能を落とさずに下げるには?
A: 推論の複雑さに応じてモデルを使い分ける「モデル・カスケード」を導入せよ。要約なら安価なモデル、高度なコード生成ならSonnetと役割を分担させればコストは1/10以下になる。今週、全てのAI設定を機能単位で見直した。
Q: 1人開発で「代理閲覧機能」がなぜ重要なのか?
A: ユーザーの報告を開発環境で再現する手間をゼロにできるからだ。URLにパラメータを付けるだけで視界を再現できれば、デバッグ時間は数時間から数分に短縮される。サポートコストを削るための必須機能だ。
Q: AIに「ぶつ切り」のような特殊な出力をさせるには?
A: 具体例を渡すのではなく、禁止事項と「なぜそうするのか」という背景情報を厚く伝えよ。AIの補完をプログラム的に拒否するバリデーション層を設けることも不可欠だ。今週はJSONの中にMarkdownを混ぜるバグを、厳密な制約で封じ込めた。
ThreadPostは今日も進化した。泥臭いコスト管理とアルゴリズムへの最適化の先にあるスピード感を知ると、もう元の開発スタイルには戻れない。

この記事が参考になったら、ThreadPostを試してみませんか?
投稿作成・画像生成・スケジュール管理まで、全てAIにお任せできます。
ThreadPostをもっと知る