GrooveSeek

Semantic search over a Markdown knowledge base, served over MCP.

View the Project on GitHub alphabet-h/grooveseek

30. 表の行の位置は chunk ごとの NULL 可の列に持ち、追いつきは形式ごとの key で行う

背景と課題

v1.18.0 (.docx) と v1.19.0 (.pptx) から、表の行は chunk の 1 行で、セルはタブで区切る。 抜粋を見せる側 (grooveseek-desktop など) は、どの行が表の行かを本文の文字だけから推測するしか なく、その推測は 2 方向に外れる: 表の外の段落もタブを持ち得るし、最初か最後のセルが空の行は タブで始まるか終わり、trim でそのタブが消える。どの行を表の行として書いたかを知っているのは parser だけで、それは chunk ごとの情報である。

ADR-0028 と ADR-0029 は schema を変えずに、policy key で既存の索引を追いつかせた。.docx は 4 本目の key が要り、ADR-0029 の見直し条件「1 つの形式に同じ種類の key が 4 本目に要る時」に 当たる。

判断の軸

検討した選択肢

  1. 本文に印の文字を入れる。 .docx / .pptx の全 chunk の embedding と全文検索の入力が 変わり、全部を再 embedding する。却下。
  2. chunk id → 範囲の別 table。 全ての書き込み・削除の経路で chunks と揃え続ける必要がある。 却下。
  3. chunks の NULL 可の列。 採用: NULL がそのまま「計算していない」を表し、値は行と一緒に 動く (upsert_document は行をまとめて消して書き直す)。ADR-0028 / 0029 が schema を変えなかった のは「どの規則で書いたか」を行に持たせないためで、この列は規則の世代ではなく chunk の中身 (行の位置) なので、その軸に反しない。

追いつきについて:

  1. 今、形式ごとの key を一般化する (ADR-0029 の見直し条件)。既存の key の値と「key を消すと pass が開く」を test が固定していて、一般化すればそれを編集することになる。却下。
  2. 列の NULL を追いつきの印に使う。 chunk の本文がどの規則で切られたかは表さないので key は どのみち残り、1 つの問いに仕組みが 2 つになる。却下。
  3. 形式ごとに key を 1 本足し、同じ述語に乗せる。 採用: 定数、read / write、告知で済む。

決定

結果と代償

参考