フィードバックループでAIにテキストの位置を正確に出力させる
校正さんに相談で、本文中の見直し箇所を表示するための仕組み

AIに「どこを直すべきか」を出してもらうだけなら簡単
しかし、本文中の正確な位置まで安定して出してもらうのは難しい
AIには何文字目ではなく何行目で出力させる方法だけでは不十分
AIに一発で完璧な位置指定をさせず、フィードバックループを作ることにした
AIに、テキストとその位置を出力させる
ChatKitクライアント側で、その位置にあるテキストが一致するか検証する
ずれていたら、どこがどうずれていたかエラーを返す
そのフィードバックをもとに、AIが位置指定を再試行する
AIが
get_memo toolを呼び出して、本文を読むAIが
set_ai_lint_messages ChatKit Client toolsを呼び出すtoolCallSchema.tsz.object({ name: z.literal("set_ai_lint_messages"), params: z.object({ messages: z.array( z.object({ line: z.number().min(1).describe("1-based line number"), column: z.number().min(1).describe("1-based column number"), text: z .string() .describe("Text at the line/column position, for validation"), }), ), }),}), line 行番号
column その行内での文字位置
text その位置にあるはずのテキスト
クライアント側で、lineとcolumnから本文中の位置を再計算する
lineは
\n 区切りで計算 columnは書記素クラスタ単位で計算する
絵文字や結合文字があっても、見た目どおりの1文字単位で計算できる
その位置にある文字列がtextと一致するか確認する
一致しないときは、エラーをAIに返す
AIが次の試行で直せるよう、想定していたテキスト(expected)と実際のテキスト(actual)を含める
たとえば
line 14, column 1: expected "[AI]" but found " AIは" 一致したら、
TextlintMessage 構造に合わせてデータを組み立てて、表示する いままで実装してきたtextlintの仕組みに相乗りする
