フィードバックループでAIにテキストの位置を正確に出力させる

校正さんに相談で、本文中の見直し箇所を表示するための仕組み

AIに「どこを直すべきか」を出してもらうだけなら簡単
しかし、本文中の正確な位置まで安定して出してもらうのは難しい

AIに一発で完璧な位置指定をさせず、フィードバックループを作ることにしたhata6502
AIに、テキストとその位置を出力させる
ChatKitクライアント側で、その位置にあるテキストが一致するか検証する
ずれていたら、どこがどうずれていたかエラーを返す
そのフィードバックをもとに、AIが位置指定を再試行する



AIが get_memo toolを呼び出して、本文を読む
AIが set_ai_lint_messages ChatKit Client toolsを呼び出す
toolCallSchema.ts
Copied!
z.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の仕組みに相乗りする