🤖

変換と評価のプロセスから見た仕様駆動開発

に公開

最近の仕様駆動開発といった生成AIにコードを生成させるアプローチについて、何かを何かに変換する(生み出す)という視点で、他の変換プロセスとの関係性を整理していく試みたいと思います。たとえば、自然言語の翻訳、ソフトウェア開発でのコンパイラによる変換などです。

また、図に示すように、変換した結果を評価するプロセスがあるとします。

様々な変換の性質を区別するために、区別するための要素を以下のように定義しました。

  • テキストを知っている(わかっている、読める)、知らない(わからない、読めない)
    • 変換前
    • 変換後
  • 理解が必要、理解が不要
    • 変換前
    • 変換後

理解の要素に関しては、変換を伴うタスク(作業)を行う上で、理解の必要性が発生するかどうかを表します。

知っているかどうかだけでも4つのパターンが考えられます。

  1. 変換前を知っている、変換後を知っている
  2. 変換前を知っている、変換後を知らない
  3. 変換前を知らない、変換後を知っている
  4. 変換前を知らない、変換後を知らない

理解の要素を足すと、16のパターンとなります。

変換前\変換後 知っている・理解が必要 知っている・理解が不要
知っている・理解が必要 例:人手翻訳、仕様理解を伴う手動実装 ??
知っている・理解が不要 ?? ??
知らない・理解が必要 ?? ??
知らない・理解が不要 ?? ??
変換前\変換後 知らない・理解が必要 知らない・理解が不要
知っている・理解が必要 ?? 例:コンパイラ
知っている・理解が不要 ?? ??
知らない・理解が必要 ?? ??
知らない・理解が不要 ?? ??

他にも評価の観点から、区別のための要素として以下を考えます。

  • 変換後の結果を評価できる、できない
  • 評価のプロセスの結果として、出力の編集が発生する、編集が発生しない

これは、変換結果をそのまま世の中に出すことは稀で、適切に変換できたかどうかを何からの評価基準・品質基準で評価する必要が出るためです。

なお「編集」は、変換のプロセスの一種だと捉えます。別の言語(モデルといってもいいかもしれません)への変換ではなく、同じ言語ないでの変換だと言えるかもしれません。たとえば、以下のような変換です。

  • 日本語から日本語への変換(誤字脱字を修正するなど)
  • JavaソースコードからJavaソースコードへの変換(バグ修正や機能追加などの変更)

ここで、出力を知らない場合は、知ろうとしない限り、あるいは、知っているものに頼らない限り、出力結果が適切かどうかは評価はできないため、評価のプロセスは発生しないとします。

上記は出力の編集でしたが入力の編集もあります。

  • 入力の編集が発生する、編集が発生しない

さらに、抽象度的なものも区別します。

  • 変換前と後が同じ抽象度(たとえば、JavaソースコードからJavaソースコード)
  • 変換前と後が異なる抽象度(上流から下流への変換)

変換前と後が同じ抽象度であるのにもかかわらず、編集と異なるのは、評価のプロセスを含まないためです。たとえば、Javaでのアノテーションをつけたクラスから、Javaのソースコードを生成するようなケースです。

区別の話しに戻ります。そもそも変換できるかどうかも区別します。

  • 変換できる
  • 変換できない
    できるかできないかは、変換を行う人やシステムにとってできるかどうかです。

続いて、第三者へ依頼するかどうかも含みます。これは変換や評価が、その人ができない場合に、できる人やシステムに依頼するというプロセスを表現するためです。

  • 変換
    • 変換を依頼する
    • 変換を依頼しない(依頼不要)
  • 評価
    • 評価を依頼する
    • 評価を依頼しない(依頼不要)

なお、依頼するかどうかの判断のプロセスも発生します。
依頼するかどうかは、任意の場合もあります。

最後に、変換プロセスの方法として、手動と自動が発生するのかも区別します。

  • 手動か自動が発生
  • 手動のみ発生
  • 自動のみ発生
    たとえば、コンパイルでの変換は、手動はなく自動のみです。

では、上記の区別をもとに、より具体的な例で特徴をとらえていきます。

  • 自然言語の翻訳としての変換
  • コンパイラの変換
  • 仕様駆動開発での変換

自然言語の翻訳(変換)の場合

まず、自然言語での翻訳を考えてみます。
手動翻訳と自動翻訳が考えられます。

日本語(入力)から英語(出力)への翻訳

パターン1:日本語と英語がわかっている
この場合、

  • 知っているかどうか
    • 入力:知っている
    • 出力:知っている
  • 変換有無:可能(知っているため)
  • 変換依頼有無:不要
  • 理解が必要かどうか
    • 入力:必要
    • 出力:必要
  • 評価の発生有無: 発生する(自身で見直すこともありますし、依頼して第三者が見直すこともあります)
  • 評価できるか:できる
  • 評価の依頼有無:不要(ただし、任意で依頼することも可能)
  • 編集が発生するかどうか
    • 入力:しない(一部が足りていなかったり、そもそも異なるテキストだったりは除く)
    • 出力:する(評価の結果、誤訳や誤字を直します)

入力 → 変換 → 出力 → 評価 (→ 出力を編集 → 出力)

日本語からドイツ語への翻訳(手動翻訳)

パターン2:日本語がわかっているが、ドイツ語はわからない場合
この場合、

  • 知っているかどうか
    • 入力:知っている
    • 出力:知らない
  • 変換有無:できない
  • 変換依頼有無:依頼しない
  • 理解が必要かどうか
    • 入力:-
    • 出力:-
  • 評価の発生有無: -
  • 評価できるか: -
  • 評価依頼有無: -
  • 編集が発生するかどうか
    • 入力:-
    • 出力:-

入力 → 変換 → 出力x

変換ができる第三者へ依頼することも考えられます。

日本語からドイツ語への翻訳(自動翻訳)

パターン3:日本語がわかっているが、ドイツ語はわからない場合
この場合、

  • 知っているかどうか
    • 入力:知っている
    • 出力:知らない
  • 変換有無:できない
  • 変換依頼有無:依頼する
  • 理解が必要かどうか
    • 入力:不要(変換を評価できないため)
    • 出力:不要(知らないのでできない)
  • 評価の発生有無: 発生
  • 評価できるか:できない
  • 評価依頼有無:しない
  • 編集が発生するかどうか
    • 入力:-
    • 出力:-

変換ができる第三者へ依頼することも考えられます。ここでは自動翻訳に依頼します。
翻訳結果は、評価できませんが、評価を依頼しないパターンとして考えます。

パターン3-変換依頼(自動翻訳):日本語がわかっており、ドイツ語もわかる場合
この場合、

  • 知っているかどうか
    • 入力:知っている
    • 出力:知っている
  • 変換有無:できる
  • 変換依頼有無:依頼しない(自動翻訳のため、判断が発生しない)
  • 理解が必要かどうか
    • 入力:必要(発生しない)
    • 出力:必要
  • 評価の発生有無: なし
  • 評価できるか:できない
  • 評価依有無頼:依頼しない(自動翻訳のため、判断が発生しない)
  • 編集が発生するかどうか
    • 入力:しない
    • 出力:しない

依頼[入力 → 変換 → 出力] → 評価x

日本語からドイツ語への翻訳(自動翻訳)評価あり

評価依頼ありバージョンです。

パターン4:日本語がわかっているが、ドイツ語はわからない場合
この場合、

  • 知っているかどうか
    • 入力:知っている
    • 出力:知らない
  • 変換有無:できない
  • 変換依頼有無:依頼する
  • 理解が必要かどうか
    • 入力:不要(変換を評価できないため)
    • 出力:不要(できない)
  • 評価の発生有無: 発生
  • 評価できるか:できない
  • 評価依頼有無:依頼する
  • 編集が発生するかどうか
    • 入力:しない(一部が足りていなかったり、そもそも異なるテキストだったりは除く)
    • 出力:する(評価の結果、誤訳や誤字を直します)

変換ができる第三者へ依頼することも考えられます。ここでは自動翻訳に依頼します。
翻訳結果は、評価できませんが、依頼するパターンとして考えます。

パターン4-変換依頼:日本語がわかっており、ドイツ語もわかる場合
この場合、

  • 知っているかどうか
    • 入力:知っている
    • 出力:知っている
  • 変換有無:できる
  • 変換依頼有無:依頼しない(自動翻訳のため、判断が発生しない)
  • 理解が必要かどうか
    • 入力:必要(発生しない)
    • 出力:必要
  • 評価の発生有無: なし
  • 評価できるか:できない
  • 評価依頼有無:依頼しない(自動翻訳のため、判断が発生しない)
  • 編集が発生するかどうか
    • 入力:しない
    • 出力:しない

「パターン3-変換依頼」と同じです。

パターン4-評価依頼(人):日本語がわかっており、ドイツ語もわかる場合
この場合、

  • 知っているかどうか
    • 入力:知っている
    • 出力:知っている
  • 変換有無:できる(できるがしない)
  • 変換依頼有無:依頼しない(評価依頼のため)
  • 理解が必要かどうか
    • 入力:必要
    • 出力:必要
  • 評価の発生有無: あり
  • 評価できるか:できる
  • 評価依頼有無:不要(ただし、任意で依頼することも可能)
  • 編集が発生するかどうか
    • 入力:しない(評価依頼のため)
    • 出力:しない(評価依頼のため)

依頼[入力 → 変換 → 出力] → 依頼[評価] (→ 出力を編集 → 出力)

スペイン語からドイツ語への翻訳

パターン5:どちらもわからない
この場合、

  • 知っているかどうか
    • 入力:知らない
    • 出力:知らない
  • 変換有無:できない
  • 変換依頼有無:依頼する
  • 理解が必要かどうか
    • 入力:不要(変換を評価できないため)
    • 出力:不要(できない)
  • 評価の発生有無: 発生
  • 評価できるか:できない
  • 評価依頼有無:依頼する
  • 編集が発生するかどうか
    • 入力:しない(一部が足りていなかったり、そもそも異なるテキストだったりは除く)
    • 出力:する(評価の結果、誤訳や誤字を直します)

変換依頼と評価依頼は、パターン4と同じです。

依頼[入力 → 変換 → 出力] → 依頼[評価] (→ 出力を編集 → 出力)

コンパイラの場合

次に、ソフトウェア開発業界での変換例をみてみます。
代表的なのはコンパイラやトランスパイラなど、ある言語を別の言語に変換する処理でしょうか。
この場合、手動での変換は発生せず、自動での変換のみ発生します。

Java から Javaのバイトコードへの変換
この場合、

  • 知っているかどうか
    • 入力:知っている
    • 出力:知らない
  • 変換有無:できる(コンパイラが行う)
  • 変換依頼有無:依頼する(コンパイラ)
  • 理解が必要かどうか
    • 入力:不要(評価が発生しないため)
    • 出力:不要(評価が発生しないため)
  • 評価の発生有無: 発生しない
  • 評価できるか:できない(不要)
  • 評価依頼有無:なし(発生しない)
  • 編集が発生するかどうか
    • 入力:しない(コンパイルエラーは除く)
    • 出力:しない

通常、Javaのコードがどのようなバイトコードへ変換されるのかを気にする機会は、無いと思います。
他にも、TypeScriptからJavaScriptへの変換(トランスパイラ)なども同様かと思います。

依頼[入力 → 変換 → 出力]

仕様駆動開発の場合

仕様駆動開発の定義はしないでおきますが、なんらかの自然言語で書かれた仕様から最終的には実装を生成する作業が発生する開発とします。仕様自体も、AIが(ある程度)生成します。

一直線に進むわけではありませんが
プロンプト → 仕様 → コード
のように変換プロセスが2段階だとして考えてみます。ただし、本記事では、仕様 → コードの変換プロセスのみを考えます。

生成AIによる自動での変換のみを議論の対象とします。

仕様からコードへの変換

大きく、4つのパターンを考えます。

  1. 仕様をわかっている、コードは読める
  2. 仕様をわかっている、コードは読めない
  3. 仕様をわかっていない、コードは読める
  4. 仕様をわかっていない、コードは読めない

パターン1

パターン1:仕様をわかっている、コードは読める、仕様通りかは評価が必要
この場合、

  • 知っているかどうか
    • 入力:知っている
    • 出力:知っている
  • 変換有無:できる(生成AIが行う)
  • 変換依頼有無:依頼する(生成AI)
  • 理解が必要かどうか
    • 入力:必要
    • 出力:必要
  • 評価の発生有無: 発生する
  • 評価できるか:できる
  • 評価依頼有無:なし(発生しない)
  • 編集が発生するかどうか
    • 入力:する
    • 出力:する

パターン2

パターン2:仕様をわかっている、コードは読めない
この場合、

  • 知っているかどうか
    • 入力:知っている
    • 出力:知らない
  • 変換有無:できる(生成AIが行う)
  • 変換依頼有無:依頼する(生成AI)
  • 理解が必要かどうか
    • 入力:必要
    • 出力:必要
  • 評価の発生有無: 発生する
  • 評価できるか:できない
  • 評価依頼有無:しない(発生しない)
  • 編集が発生するかどうか
    • 入力:する
    • 出力:する

評価依頼はしないケースです。

パターン2ー評価依頼あり

パターン2:仕様をわかっている、コードは読めない
この場合、

  • 知っているかどうか
    • 入力:知っている
    • 出力:知らない
  • 変換有無:できる(生成AIが行う)
  • 変換依頼有無:依頼する(生成AI)
  • 理解が必要かどうか
    • 入力:必要
    • 出力:必要
  • 評価の発生有無: 発生する
  • 評価できるか:できない
  • 評価依頼有無:依頼する(評価できる人やシステムに)
  • 編集が発生するかどうか
    • 入力:する
    • 出力:する

誰に依頼するのかは、人かシステム(生成AI)かに分かれます。

パターン2ー評価依頼(人に依頼):仕様をわかっている、コードは読める
この場合、

  • 知っているかどうか
    • 入力:知っている
    • 出力:知っている
  • 変換有無:できる
  • 変換依頼有無:しない(ただし、任意で依頼することも可能)
  • 理解が必要かどうか
    • 入力:必要
    • 出力:必要
  • 評価の発生有無: 発生する
  • 評価できるか:できる
  • 評価依頼有無:しない(ただし、任意で依頼することも可能)
  • 編集が発生するかどうか
    • 入力:しない(評価依頼のため)
    • 出力:しない(評価依頼のため)

パターン2ー評価依頼(生成AIに依頼):仕様をわかっている、コードは読める
この場合、

  • 知っているかどうか
    • 入力:知っている
    • 出力:知っている
  • 変換有無:できる
  • 変換依頼有無:できない(変換を他のAIエージェントに依頼する可能性も理論的にはあるかもしれません。この場合依頼するかどうかを判断できる評価の仕組みが必要だと思われます)
  • 理解が必要かどうか
    • 入力:必要
    • 出力:必要
  • 評価の発生有無: 発生する
  • 評価できるか:できる
  • 評価依頼有無:できない(変換を他のAIエージェントに依頼する可能性も理論的にはあるかもしれません。この場合依頼するかどうかを判断できる評価の仕組みが必要だと思われます)
  • 編集が発生するかどうか
    • 入力:しない(評価依頼のため)
    • 出力:しない(評価依頼のため)

パターン3

パターン3:仕様をわかっていない、コードは読める
この場合、

  • 知っているかどうか
    • 入力:知らない
    • 出力:知っている
  • 変換有無:できる(生成AIが行う)
  • 変換依頼有無:依頼する(生成AI)
  • 理解が必要かどうか
    • 入力:必要
    • 出力:必要
  • 評価の発生有無: 発生する
  • 評価できるか:できない
  • 評価依頼有無:しない(発生しない)
  • 編集が発生するかどうか
    • 入力:する
    • 出力:する

依頼は、パターン2と同様です。

パターン4

パターン4:仕様をわかっていない、コードは読めない
この場合、

  • 知っているかどうか
    • 入力:知らない
    • 出力:知らない
  • 変換有無:できる(生成AIが行う)
  • 変換依頼有無:依頼する(生成AI)
  • 理解が必要かどうか
    • 入力:必要
    • 出力:必要
  • 評価の発生有無: 発生する
  • 評価できるか:できない
  • 評価依頼有無:しない(発生しない)
  • 編集が発生するかどうか
    • 入力:する
    • 出力:する

依頼は、パターン2と同様です。

リファクタリングの場合

Discussion