Skip to content

查詢自身的 turn 成為第一名命中——查詢字串一進語料就把自己召回(self-hit) #62

Description

@kiki830621

Problem

v0.4.0 實測(2026-09-03,本機語料 639,209 chunk):

  1. MCPltm_query(query: "F_SETNOSIGPIPE EPIPE 測試 host SIGPIPE", limit: 3)第一名是這次呼叫本身——session 3a2ceb7e-41cf-41c1-ab0c-d1e197ad4beb turn 4dae970d-bd21-4a3c-89f5-653c088eedcc(2026-09-03T02:25:37Z),內容就是 ⟨tool mcp__plugin_ltm_ltm__ltm_query query=F_SETNOSIGPIPE …⟩。呼叫寫進 jsonl 的時間早於 server 查詢前的增量併入,所以它先被索引、再被自己查到。
  2. CLIltm query 的三個基準查詢(「tokenizer 討論」「flock inode 鎖」「資格考」)第一名全部是同一則 turn(2026-09-01T04:32:12Z)——查詢穩態延遲 ~4 秒、成本大宗在查詢前增量掃描——能否降到 1 秒以內 #56 量測時那行含有全部三個字串的 Bash 命令 for q in "tokenizer 討論" "flock inode 鎖" "資格考"

兩者是同一個形狀:查詢字串本身進了語料,之後任何相同查詢都先召回「問這個問題的那一刻」。對導航零價值(讀者要的是被問的事,不是問的動作),而且它會擠掉真正相關的 turn(例 1 裡今天實際討論 F_SETNOSIGPIPE 的 turn 沒進前三)。

LTM 類比(.claude/rules/ltm-analogy.md):人回想一件事時,不會把「我剛才在想這件事」當成想起來的內容。

Type

bug(檢索品質;不涉及不變式——索引內容正確,是排序/呈現層的問題)

Expected

先決定在哪一層、用什麼判準排除或降權,再實作。候選(不預設答案,需 diagnose):

  • A. 排除「就是這次查詢」的 turn:判準要能機械化——例如 chunk 文字為工具呼叫且其 query= / ltm query "…" 引數與本次查詢逐字相同。最窄、最不會誤殺;擋不住例 2 那種「含有查詢字串的舊命令」。
  • B. 降權「內容是 ltm 查詢/量測命令」的 turn:以 chunk 形狀(⟨tool … ltm_query / ltm query)判定,不是以查詢字串判定;涵蓋例 2。要量誤殺率——討論 ltm 本身的 session(本 repo)會大量命中。
  • C. 只在呈現層標記(「這是一次查詢動作」)而不改排序——最保守,但沒有解決擠掉相關 turn 的問題。

不論選哪個:不得改寫或刪除索引內容(性質 5:可以遺忘、不可以編造);決定要落在 MemoryStrategy seam 或檢索層的哪一側,要對照 openspec/specs/memory-strategy/spec.md 的「不得在 seam 之外重排」;前後要有 docs/measurements/ 紀錄(至少例 1/例 2 兩組查詢的前三名變化)。

Actual

如上:兩條路徑的第一名都是查詢動作本身或含查詢字串的舊命令。

相關

Source: surfaced during v0.4.0 post-release smoke test (2026-09-03)


Current Status

Tasks

  • 1. retrieval spec:fused list 成員資格加「對本系統的查詢動作不進候選」(封閉列舉+性質 5 推論),明寫是資格過濾非重排
  • 2. RetrievalEngine.search 候選資格謂詞,與 session 排除共用 refetch 迴圈(1,000 上限照舊)
  • 3. CLI/MCP 預設開,--include-query-turns escape(MCP 同名參數)
  • 4. 測試:重現表四列各一條;變異拿掉謂詞 → 紅
  • 5. docs/measurements/2026-09-xx-self-hit.md:例 1/例 2 前後前三名+母體數字+誤殺面
  • 6. CHANGELOG

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions