概要
Markdown Annotationsは2023年年末iAが発案したオーサーシップに関する仕様です。すでにiA Writer 7にて実装されています。仕様の内容はGitHubに公開されていますので、他のエディターも実装可能です。実際にObsidianのコミュニティでもMarkdown Annotationsに関する議論が行われているようです。仕様が非常にシンプルなので、そのうち何かしらの形で他のエディターでサポートされてもおかしくないと思います。
モチベーション
Markdown Annotationsが提案されるモチベーションについて、iAがiA Writer 7のリリースにあたって3本のブログを出していました。まず、出発点は昨今のAIブームです。
Since the introduction of ChatGPT, adding “AI” to everything has become a no brainer.
第一本目のブログで言われているように、自分がよく使っているツールNotionやIntelliJ、RaycastなどにAI機能が続々と組み込まれていました。iA社はこういう風潮に違和感を感じ、実際に多くの企業がAI機能、特にOpenAIのAPIを使ってGPTを製品に組み込むことによって発生し得る様々なリスクを十分に評価できていないのではないかと懸念しています。
まず、各社がAPIの上でアプリケーション面の工夫を行なっているが、それらは簡単にOpenAIやMicrosoftのチャートインタフェースに組み込まれることができるから、過度な依存は身を滅ぼしてしまいます。
また、AIは人間の知能の再生産ができないが、置き換えの能力を持っているため、書く時AI機能によって思考を放棄してしまうリスク、読む時AIの生成内容かどうか分からなくなるリスクが挙げられています。
As writers we can not allow AI to replace our own thinking. We should use it to simulate the thinking of a missing dialogue partner.
その中で、ChatGPTのようなツールはアイデーエーションやブレンストーミングなど、思考を深める/広げるために利用すべきだと考えられています。AIとのインタラクションを行なっていく中、ベストな表現を導き出すことが最善なシナリオです。しかし、そこでAIによって生成されたテキストであるかどうかは作者自分自身すら見分けできない、そして覚えきれないことが問題です。
上記の課題を踏まえ、文章の各部分のオーサーシップを記録&表現するために、Markdown Annotationsが提案され、iA Writer 7に組み込まれました。アプリの外部からテキストをコピペしてきた時オーサーシップを選ぶことができ、コピペしてきた文章は自分が書いた文章なのか、それともAIによって作成された文章なのか、はたまた他の誰かが書いた文章なのかは記録できるようになります。AIによって生成された部分は灰色になっているので、すぐに見分けられます。
仕様
Markdown Annotationsの仕様はまだバージョン0.1なので非常にシンプルです。
Markdown Annotations embed authorship in text while preserving its readability and portability.
---
Annotations: 0,95 SHA-256 1132bf5e376a605f5beed4b204456114
@Human: 0,20 33,4 45,6 62,4
&AI: 20,13 37,8 51,11 66,29
...
Markdownファイルの最後尾にMarkdown Annotationsのブロックが挿入される想定です。ブロックの始まりは`---`で終わり記号は`...`です。その中は実際のアノーテーション部分です。アノーテーションはKey・Value形式で`:`によって分断されます(実例を見たらコロンの後ろにスペースを一個挟む表現が一般的)。そして、Hash AnnotationとAuthor Annotation二種類あります。主に以下の注意点があります。
Keyの名称に`:`がある場合、`\`でエスケープする必要があります。
Valueが複数行になる場合、改行した後2スペース分以上を空ける必要があります。
アノーテーション部分はHash Annotationからスタートし、アノーテーション対象を表現します。Keyは常に`Annotations`で、Valueは対象文章の範囲、ハッシュアルゴリズム、そして対象文章UTF-8ハッシュ値によって構成されます。この3部分はスペースによって分断されます。また、Hash Annotationに関して主に下記の注意点があります。
分断用のスペースは1つ以上という仕様なので、スペースを2つ、3つ使っても良いです。(ただし、実例によれば基本的には1つです)
対象文章の範囲は`数字,数字`形式で、一つ目の数字は対象文章第一個目の文字の場所(Range Location)で、二つ目の数字は対象文章の文字総数(Range Length)です。
ハッシュアルゴリズムはSHA-256固定です。
対象文章のハッシュ値は切り詰めても良いので32~64文字なら問題ありません。
Author Annotationは具体的なオーサーシップを表現します。Keyの部分はオーサーの種類記号(人間なら`@`、そうじゃなければ`&`と表現)、名前、識別子(Gitのメールアドレスのようなもの)、そしてセッション(将来のバージョンで定義する予定)によって構成されます。Valueは該当オーナーの文章の範囲を表しています。表現方法はHash Annotationの方と同じ`数字,数字`形式です。複数ある場合はスペースによって分断します。言葉で表現してもイメージつきにくいですが、具体例で表現したらとてもシンプルです。
@John Doe <[email protected]>: 0,100 150,180
主な注意点は以下です。
識別子に山括弧(<>)を含めても良いが、`\`でエスケープするか、ペアで表現する必要があります。
文章範囲を表現するとき、もし1文字しかなければ、`数字,1`の代わりに`数字`だけで表現することができます。
Markdown Annotations v.s. CriticMarkup
Obsidianコミュニティの議論の中では、CriticMarkupが言及されていました。しかし、私は目的と表現方法に関して両者に大きな違いがあると考えます。
目的:CriticMarkupは作者の変更を追跡するために提案されたのに対し、Markdown Annotationsはオーサーシップを表現するために使われています。つまり、CriticMarkupは「誰による変更」を記録しませんし、Markdown Annotationsは「添削記録」を記録しません。
表現方法:CriticMarkupはMarkdownの文法を拡張して添削を記録するようにしています。そのため、`This {++is ++}a test.`のような表現でhuman editableになっています。対してMarkdown Annotationsは文章の最後に差し込むメタデータに該当するため、プログラムによる生成・編集のみ想定されています。
所感
Markdown Annotationsの仕様自体は非常にシンプルで説明する必要すらないと思いますが、この裏にある「LLM時代我々はどうやってライティングと向き合うべきか」という問題提起に惹かれ調べるようになりました。私自身はiA Writerのユーザーではありませんが、しっかりと設計思想を持ってプロダクトを作る姿勢には感心しています。
ちょうど最近、ChatGPTを利用して執筆された小説「東京都同情塔」が芥川賞を受賞し、議論を呼びました。時代の変化に逆らうことはメリットがあんまりないので、LLMの登場を認めない姿勢は無理があります。どうやってLLMと向き合うべきかをしっかり考え、その上でLLMサービスを「Think more」のツールとして利用しやすくする思考を私が評価したいと考えました。