これまで、AIに文章を書かせるということは、「あなただったらどう書きますか?」という一例を得ることにすぎなかったと思う。
そこで生成されたものが自分なりにしっくりくるかどうかは、確率的なものでしかない。結局そこから自分らしさに寄せることに労力を使うことが多かった。

そうではなく、「私だったらどう書くと思いますか?」というところを自動化したい。そんな仕組みづくりを試みている。

アイデアの軸

これまでも、「私はこういう文体で文章を書く」というスタイルガイドは用意していたが、人手での大きな修正が必要ないくらい、満足いくほどの生成結果にはならなかった。

そこで、なんとなくChatGPTに「私の文体を分析する効果的な手法はないか?」と尋ねたところ、次のような返答があった。

「文体を分析する」こと自体を目的にすると、あまり似ません。
Claude CodeやLLMが真似しやすいのは、「この人はこういう文章を書く」という特徴を列挙することではなく、「どういう思考プロセスで文章を組み立てているか」を抽出することです。

ここから着想を得て、文章そのものだけでなく、文章を組み立てる際の思考回路まで推測させる、文章のリバースエンジニアリングをベースとした文章生成の仕組みを試してみようと考えた。

analyzerスキルとwriterスキル

今試している「私っぽい」文章を生成する仕組みは、リバースエンジニアリングのように私の文章執筆過程を「学習」するanalyzerスキルと、その「知識」を利用して文章執筆を行うwriterスキルに分けて構成している。

  • analyzer:指定された複数の記事を分析し、複数の観点でのスタイルガイドを生成 or 更新する
  • writer:スタイルガイドを段階的に適用し、私が文章を書く際の思考の流れや手順を模倣しながら、指定されたキーワード群を網羅した記事を執筆する

writerスキルは、書きかけの記事を補って完成させたり、箇条書きのアウトラインを文章化したり、指示された編集を行う用途にも使うことができる。
新規生成でも編集でも同じスタイルガイドを適用したいため、別スキルには分けず、引数の形態や本文の状態でどちらの「モード」なのかを判別する仕組みにしている。

analyzerによる分析

analyzerスキルは、次の4つの観点での分析を行い、それぞれのスタイルガイドを生成する。

  1. Thinking Flow(思考の設計)
  2. Writing Style(文章構造の設計)
  3. Stylistic Quirks(言葉や言い回しの選定)
  4. Refine Style(AIっぽさを除去するための推敲)

Thinking Flow

既存記事から、著者が執筆時にたどったと考えられる思考プロセス(なぜそう書こうとしたのか?という判断)をリバースエンジニアリングする。

  • 解説したい概念をどう噛み砕いているか
  • なぜこの説明が必要だと判断したのか
  • 他にも説明方法がある中で、なぜこの方法を選んだのか
  • 読者の理解をどこまで深めることをゴールに設定したか
  • 読者がどこで疑問や誤解を持つと想定していたか
  • 説明せず切り捨てる対象と、深く説明する対象の切り分け
  • …etc.

といった内容を分析した上で、

  1. 思考の遷移(判断の連鎖)を復元する
  2. 執筆中の著者の脳内の独り言として流れを再構成する
  3. 再利用可能な判断ルールへ抽象化する

ということを行ってまとめる。

Writing Style

セクション・段落・文の構成、導入文やまとめなど、文章の中でどこに何を置いて全体を組み立てているか?という傾向を分析する。

Stylistic Quirks

頻出する言い回し・言葉選び・語尾・接続表現・表記など、多くの文章でよく使われている、いわば私の「癖」を分析する。

Writing Styleがセクション・段落単位の「全体」のルールであったのに対し、Stylistic Quirksは文・単語単位の「細部」のルールを与える。

Refine Style

AIと協働して書いた過去のコミット履歴から、AIによる初稿を人手で修正した際の追加・削除・並べ替え・書き換えの傾向を分析する。

writerによる執筆

writerスキルは、次の手順で執筆を進める。

  1. 執筆条件を整理する(扱う範囲、必要なコード・図・数式・例、既存記事との関係など)
  2. 思考の流れを設計するthinking-flow.mdを参照し、想定読者を中心に構成を考える)
  3. 構成を作るwriting-style.mdを参照し、文の流れやテンポを中心に構成を考える)
  4. 初稿を書く(表現の模倣は行わず、引数で指定されたトピックを自然に取り入れた内容を固める)
  5. 表現を調整するstylistic-quirks.mdを参照し、語り口を調整する)
  6. 推敲するrefine-style.mdを参照し、著者が嫌うAIっぽい表現をとり除いて整える)
  7. スタイルレビューを行う(完成稿を4つの観点でレビューする)

Syntax Guide

また、writerはanalyzerが生成したスタイルガイドに加え、syntax-guide.mdというファイルも参照する。

このsyntax-guide.mdでは、独自のディレクティブ記法や数式の記法などを記載しており、執筆のすべての段階で遵守すべきルールとして定めている。

syntax-guide.mdの内容は、コンポーネントの実装やプラグインの設定などに依存するものなので、分析による自動生成はせず、必要なときにルールを追加する運用にしている。

追加学習の仕組み

analyzerスキルは、複数の記事を渡してその共通点を抽出するのが役割だが、一気に大量の記事を渡すと実行時間やトークン消費が恐ろしい。

そこで、まだ分析されていない記事を新たに渡して、スタイルガイドを差分更新する仕組みを組み込んでいる。

確度と保留というレベル分け

差分更新の仕組みは、「確度」という段階分けと「保留事項」の記録によって支えられている。

スタイルガイドに抽出したパターンは「確度」という段階ごとにまとめている。多くの記事で見られるパターンほど確度が高くなり、確度が高いパターンほど、文章生成に積極的に適用される。

また、汎用的なパターンとしていいのか現時点で判断がつかないものは、「保留事項」として記録させている。(保留されたパターンはwriterが参照する必要はないため、スタイルガイドとは別ファイルに分けている。)

確度が低いものや、保留事項になっていたものも、新たに渡された記事で同じパターンが見られたら、保留事項から昇格させたり、確度が上がったりする。(逆に、矛盾が見えてきたら、降格させられることもある。)

廃止した旧体制

ちなみにこの仕組みを作るまでは、interviewerとghostwriterという2つのエージェントを作り、それらを順番に呼び出すスキルで記事生成を行っていた。

この仕組みは、次のブログから着想を得たものだった。

しかし、interviewerとのやりとりはアウトラインの壁打ち程度にしかならず、そこで構成を決めたところで、文章自体は当然AIっぽいものになってしまう。

interviewerという仕組みによって対話の時間が長くなり、生成される文章の質の割に、かかる時間が長くなるのが悩ましかった。

これで変わったこと、これから変えたいこと

analyzerによる学習にはそれなりに時間がかかるが、一度スタイルガイドを作ってしまえば、writerスキルは、以前のinterviewer一体型スキルよりも格段に短い時間で文章を書いてくれるようになる。
独自の理解による解説を盛り込みたい箇所は当然書き換えるが、文体などの細かい調整や、セクション構成ごと組み直すような大きな修正からは解放されつつある。

とはいえ、このanalyzerを使った仕組みも、まだまだ試行錯誤中。目下の課題は、analyzerの実行時間とトークン使用量を抑えること。

また、今、運用しているサイトでは、色彩に関するコンテンツは文章を簡潔にして図示を中心にするスタイル、CGや画像処理に関するコンテンツは徹底的に言葉で噛み砕いたスタイル、という書き分けを意識しているため、スキルも現状はこのサイトのコンテンツ特化型になっている。

私の書く文章についての知識自体は、他の場での執筆でも使えるものなので、もっと汎用的にできたらよいなと思う。

Next Step