理系学生日記

おまえはいつまで学生気分なのか

Clineを使ってブログの文体・文調を言語化しエントリ執筆を自動化する試み

最近、AI技術の進歩により、技術文書の作成プロセスが大きく変化しています。そんな中、mizchiさんの以下の記事に大きな影響を受けました。

この記事では、自身のブログエントリから文体や技術的専門性を抽出し、AIに学習させることで記事を自動生成するという取り組みが紹介されていました。特に興味深かったのは、AIが書き手の個性を学習し、その特徴を活かした記事を生成できる可能性を示していた点です。

僕も長い間このブログを書いていますが、この記事に触発され、自分のブログエントリの特徴をAIに学習させて執筆を自動化できないかと考えました。今回は、GitHubで管理している自分のブログエントリから文体や特徴を抽出し、Clineを使って記事を自動生成する取り組みについて紹介します。

なぜブログ執筆を生成AIに任せるのか

ブログ執筆の課題

技術ブログを継続的に執筆する上で、多くの課題に直面してきました。記事構成はいつも「書きながら考える」ですし、文体の一貫性を保つことに特別注意を払ってきたわけでもありません。 また、技術的な正確性を担保しながら、読みやすい文章を作成することには苦心しています。特に仕事と並行してブログを書き続けるのは難しく、割とストレスを抱えがちでした。

自動化を導入することで、記事構成の生成にかかる時間を大幅に削減できると考えています。 何より、生成AIにどういう知識を与えることで、どのような文章が生成できるようになるのかという点は、仕事柄も含めて大きな興味がありました。

最終的に出来上がった記事がこちらです。全て生成AIに書かせたわけではなく、僕がそれなりに手を加えました。その辺りも含めて、今回のアプローチを本エントリに記録します。

記事からの特徴抽出

僕のブログエントリはGitHub上でMarkdownファイルとして管理し、blogsyncで投稿等を管理しています。

ここからの帰結は何かというと、特段何か準備をしなくても、ローカルに全エントリが(基本的には)Markdown形式で存在しており、生成AI(ここではCline)にそれを読ませることができることです。

このため、mizchiさんの方法を参考に、最初にClineに与えたプロンプトは次のものです。また、

私はエンジニアリングとBlogエントリの記述が好きな kiririmode といいます。もし私について知っていたら、以下でその知識を使っても構いません。

kiririmode.hatenablog.jp/entry/* 以下は自分がブログエントリとして記述した内容です。ディレクトリ構成は @/memory-bank/systemPatterns.md を参照してください。

私は、AIが書いたとバレない範囲で、ブログの記述を自動化したいです。

  1. AIに私の文体を記述させるにあたって、そのときに必要な情報をまず検討してください。それを私と議論し、合意してください。
  2. 2020年以降の記事一覧から私が興味を持つ技術の方向性、文章スタイルを抽出してください。2020年以降の記事からランダムに読んでください。最低限、20記事は読んでください。そこから私の人格と文体を抽出して、それを @/.clinerules に抽出してください。

2020年以降のBlogエントリをどう調べるのかという点で生成AIも混乱していましたが、最終的に生成された僕のBlog文章スタイルがこちらです。 全部で15エントリくらいを読ませたでしょうか。あぁ確かに、というものが多かったです。

こちらは生成AIが頑張ってエントリを読んでいるところ。

生成AIがエントリを読んでいるところ

記事の特徴分析では、記事構造のパターンや頻出する表現、技術説明の展開方法などが詳細に調査されたようです。 特にカテゴリ別の文章スタイルの違いに注目することで、それぞれの文脈に適した説明方法が抽出されています。本Blogエントリも、この.clinerulesに基づいて生成し手を加えています。その過程でAIが読み取った文体パターンでの定義は次のようなものです。

Clineが読み取った文体パターン

記事の基本構造を明確に定義しています。タイトルには具体的な技術要素を含め、動詞で終えることを基本としています。導入部では現状の説明から入り、課題提起を含めることで読者の興味を引く工夫をしています。本文では段階的な説明を心がけ、コードと説明を適切に配置することで理解しやすい構成を実現しています。

技術説明時には、確定的な事実を「〜となります」、基本的な説明を「〜です」、機能や可能性の説明を「〜できます」という形で表現することで、文意の明確化を図っています。また、個人の見解を示す際には「僕は〜と考えています」「〜と思います」といった表現を用いることで、主観と客観を適切に区別しています。

ソースコード解説記事では、実装の背景説明からコードブロックの効果的な使用、実装のポイント解説まで、一連の流れを重視しています。一方、インフラ構築記事ではアーキテクチャ図を活用し、手順を明確に記述することで、読者が実践できる内容となるよう心がけています。

Clineを使った記事生成プロセス

では、実際にClineを使って記事を生成するプロセスについて説明します。

記事生成は、まずテーマを設定し、.clinerules に基づいて構成を生成することから始まります。その後、各セクションを自動生成し、人間によるレビューと編集を加えていきました。

最初にClineに与えたプロンプトは次のようなものです。

syftとgrypeを使って、pom.xml と package.json を解析して脆弱性検知を行う Blog エントリを作成・記述・投稿したい。memory-bank を読んだ上でまずは計画を作成して。

生成AIはMemory bankの内容を確認した上で、記事の内容と構成を考えてくれました。これがAIによる初稿です。

冒頭の出出しは僕っぽい文章なのですが、徐々にAIっぽさが目立ち始めます。このAIっぽさ、箇条書きに起因しているような気がしますね。 ただ、なるほどこのくらいまではAIで記述できるのかという点はかなり驚きました。

人間による情報追加

学習した知識のみに根ざしているからか、あるいはBlogエントリ記述のために与えた情報が表面的すぎるからか、いまいち現場感・手触り感がない文章となったため、syftとgrypeを手元で動かしながら僕の方で文章を追加しました。やはり動かしていくとなかなかうまくいかなかいポイントがあるもので、それをきちんと記述することが、現時点で人間が加えられる価値なのかなと思ったり。 ただ、エージェントがその辺りの実行を含む試行錯誤を行えるようになると、エージェントは自らの知識を増やせるようになるわけで、それが人間特有と言えるのは短期間だけなんでしょうね。

生成AIによる校正

私が手を加えた内容なので、生成AIに校正を依頼しました。

問題ないですが、次に当該文章を見て、論理展開、技術的な正しさ、読者としての読みやすさをチェックし、推敲・修正を行ってほしい

そうすると、生成AIから以下のような改善ポイントを指摘されました:

  1. 文章の論理的な流れ

    • セクション間の接続が不自然な箇所の指摘
    • 説明の順序に関する提案
  2. 技術的な説明の深さ

    • 専門用語の解説が不足している箇所
    • 実装手順の詳細化が必要な部分
  3. 読者視点での分かりやすさ

    • 前提知識の補足が必要な箇所
    • 具体例の追加が望ましい部分

指摘内容

これらの指摘に基づき、AIが内容を修正してくれました。修正差分は以下です。私がミスして、ちょっと私の修正差分も加わってしまっていますが、大半が生成AIの修正であることは間違いありません。

textlintのチェック

最後に、Clineにtextlintを実行させ、指摘された問題点の修正を依頼してみました。例えば以下のような指摘がありました:

  1:1   ✓ error  文末が"。"で終わっていません                                                 ja-technical-writing/ja-no-mixed-period
  2:1   ✓ error  1文が長すぎます                                                           ja-technical-writing/max-kanji-continuous-len
  3:1   ✓ error  一文で"、"を3つ以上使用しています                                           ja-technical-writing/max-ten

しかし、これらの指摘に対するClineの修正は、残念ながら期待通りの結果とはなりませんでした。修正箇所の特定は行えるものの、文脈を理解した適切な修正ができず、むしろ文章の意味を損なってしまうケースが多発しました。

現在の生成AIは「差分抽出が苦手」「長い文章だと細部に着目するのが難しい」(いわゆる Needle in a haystack)と言われていますが、今回の経験はまさにその典型例となりました。textlintのような細かな文章校正については、現時点では人間が行う方が効率的かつ高品質な結果が得られると結論付けました。

生成された記事の評価

生成された記事は、文章の論理性、技術的な正確性、読者視点での分かりやすさ、文体の一貫性という観点から私が主観で評価しました。それを評価をいえるかはさておき、少なくとも文章構成・事前知識の提示などは、生成AIが介在することによって明らかに質が向上したなという感想です。

一方で、人間チック・私チックでないところも目立ち、箇条書きの多用・セクション構成の粒度等は私の文体ではないです。ただし、このような特徴の違いは、改めてその観点で文体分析を生成AIに行わせ、.clinerulesなりMemory-bankなりに記憶させておくことで、一定の改善ができることは間違い無いでしょう。

完全な自動化は現時点では難しく、技術的な正確性の確認や具体例の追加・修正、読者層に合わせた調整といった点で、人間の介入が必要不可欠です。これは単なる制約ではなく、むしろ「現時点での」AIと人間の相互補完的な関係を示すものと考えています。

まとめ

Clineを使った技術ブログの執筆半自動化を通じて、管理している記事から特徴を抽出し、AIに学習させることで、ある程度一貫した文体での記事生成が可能になりました。.clinerules による文体パターンの定義は、品質の安定化に貢献してくれそうです。 完全な自動化には至っていないものの、執筆プロセスの効率化・質の向上という点では、人が単独で行うよりも改善しているように感じます。

今後は、より詳細な文体パターンの定義や特徴抽出の強化を行い、協働作業は仕方がないとしてもできるだけ多くの執筆作業を生成AIに寄せられるようにチャレンジしたいと思います。ただ、僕自身も自分の考えを文章化することは好きなので、完全自動化はあまり目指さないかもしれません。

協働作業のために

この取り組みを始める際のポイントをいくつか共有させていただきます。

まず、AIに学習させる記事の選定が重要です。私の場合は2020年以降の記事を中心に選びましたが、これは比較的最近の文体や技術的な内容を反映させたかったためです。また、カテゴリごとの特徴をAIが学習できるよう、様々なタイプの記事を含めることを意識しました。ただ、カテゴリが多すぎるとAIの学習が難しくなるため、適切なバランスを保つことが重要そうで、僕ももう少しカテゴリをまとめようと思います。

次に、AIと人間の役割分担を明確にすることをお勧めします。私の場合、AIには記事の骨格作成と基本的な説明を担当させ、技術的な正確性の確認と具体例の追加は人間が行うという形で分担しました。私の文体・文調をもう少し精度よく言語化できれば、さらに品質は向上すると思います。

最後に、この取り組みは単なる効率化だけでなく、自分の文章の特徴を客観的に理解する良い機会となります。実際に私も、.clinerules の作成過程で自分の文体の特徴や、カテゴリごとの記事パターンについて、新たな発見がありました。