Lantide Data

Prompt 與 Context 工程:模型看見什麼、如何思考

配套①:Prompt 是每輪重新組裝的分層結構,而非一段寫死的 system string。本篇面向工程師;方法論見 工作流Memory。操作見 使用者指南 §12.11


系列位置

完整導讀見 系列導讀與產品定位

順序 文章 本題
0 系列導讀與產品定位 系列導讀與產品定位
1–2 Agent 時代的數據分析工作流可治理的 Agent Memory 工作流、記憶
3 本文 Context / Prompt
4–5 AI Agent 架構統一查詢層 Agent、查詢層

一、Prompt 是每輪重新組裝的分層結構

在 Lantide Data 裡,Prompt 指每輪 ReAct(推理—行動迴路)迭代時重新組裝的 system prompt(Core + State + 條件段 + 知識),並附上 Context Summary、工具 schemas、精簡後的 history,以及 active tab 的 Detail(含批註 Optimizer 產物)。這與「寫一段 system string 就定稿」的舊做法不同:目標是在有限 context window 內,讓模型知道自己在哪個產品狀態、能做什麼、不能做什麼


二、整體資料流

使用者訊息
    │
    ├─► Context Summary(每輪固定、偏小)
    ├─► get_app_context / 工具 ─► Detail(按需、可大)
    ├─► System: core_system + state_*.md + 知識注入
    ├─► Function schemas(依狀態過濾)
    ├─► History(截斷策略)
    └─► Active tab payload(Markdown 含批註優化)
            │
            ▼
        LLM → tool calls → 觀察 → 下一輪(可能刷新 state)

三、Context Summary:每輪都注入,但刻意很小

Summary 以結構化文字列出:

  • 當前時間(精簡一行:YYYY-MM-DD HH:MM (UTC±N),每輪注入)
  • Workspace、Focused Project(含 Plan/Report 檔名與狀態;略過已封存檔)
  • Active Tab 類型與是否 dirty
  • Open Tabs 數量、Cached Tables 數、外部庫與 MCP 摘要

不包含各分頁全文或完整 schema。模型若需細節,應呼叫 get_app_contextshow_tables / read_schema


四、Context Detail:完整內容透過工具按需取得

Detail 通道承載:

  • 指定表的 ANSI DDL(read_schema
  • 應用上下文 JSON(開啟分頁列表、專案檔案 meta)
  • Active Markdown tab:Plan/Report 全文(經批註 Optimizer)

當使用者說「處理當前 Plan 的批註」時,依賴的是 active tab Detail,而非把整個工作區塞進 Summary。


五、為什麼分 Summary 與 Detail 兩條通道

單通道把全文塞進每輪 prompt,在多分頁 IDE 裡很快 token 爆炸,且難以剔除過期內容。雙通道讓 Summary 保持穩定小巧,Detail 由工具按需拉取:

問題 單通道全文注入 雙通道
Token 爆炸 每輪重送所有 tab Summary 穩定小;Detail 按需
過期內容 難以剔除 dirty tab 送編輯器即時內容
探索階段 浪費在無關文件 工具拉 schema

六、System Prompt 的分層設計

  1. Core system — 產品角色、DuckDB 規則、工具使用通則、Query Execution Model、統計分析須 ask_user + activate_analysis
  2. State prompt — 依 NoProject / ProjectFocused / PlanningPlanPlanning)/ ExecutingPlanExecuting)等切換 workflow 段落;不重複列舉工具名錄(以 schemas 為準)。
  3. 條件段 — 例如 catalog 模式下的 expand 提示;html_report_active 時拼接 HTML 編輯段。
  4. Knowledge — 見 §十。
  5. Recent Query Steps(Layer 3.5) — 有 conversation_id 時注入 ledger 摘要;權威實作見 AI Agent 架構 §六。

State 檔只寫方法論與狀態限制(如 Planning 階段不得跑統計);探索預算句數只在 core 定義,避免重複佔 token。

Assistant 協議: 每次 run_query / run_sql_tab 成功後,正文一行 [[QUERY_STEP]] 摘要(含 purpose 等);解析與 patch_stepAI Agent 架構 §6.2。

Core 也承載一條跨狀態的分析操作循環:先確認問題、分母、粒度、欄位與 JOIN key,再跑最小可驗證 SQL,最後才考慮 cache、DAG 或 Source Run。這讓模型在不同 state 中都知道「分析可信度」優先於「管線形狀」。


七、Query Execution Model(查詢執行語意契約)

聊天型分析工具常把 Run、物化、多步依賴藏在生成的 Python/SQL 裡,使用者只見圖表。Lantide 的 Query Execution Model(QEM,查詢執行語意契約)validate / run_query / run_sql_tab / Source Run 的語意寫進 prompt,使「隱藏的 DA」的工作在 IDE 狀態裡可見、可審計——與 工作流 §三 SQL-first 同一脈絡。

Core 內專章為跨狀態權威,定義:

概念 行為
Persist tab + run_sql_tab 物化為與分頁同名的快取表;可 Source Run、血緣
run_query 條件物化(策略表見 統一查詢層 §8.1);探索性單表可僅預覽;每步 result_label + [[QUERY_STEP]]
Run vs Source Run 本分頁 vs 依 DAG 重算上游鏈
ExecutingPlanExecuting run_query / run_sql_tab 須傳 purpose(≤40 字,寫入 Ledger)
禁止 SQL 內 DDL/DML;; 多語句;自 FROM 自己快取名

工具回傳中的 hint 分兩種:

Hint 語意 Agent 應對
complexity_hint / COMPLEXITY_SPLIT_RECOMMENDED 阻擋型;目前主要用於 3+ CTE 等過度複雜 SQL 拆成更小步驟或上游 persist tab 後再跑
optimization_hint 非阻擋型;例如純多實體表 JOIN 時提醒可考慮 cache 視重用、審閱、Source Run 需求決定是否建 persist tab;不可把它當錯誤

State 檔以「見 Query Execution Model」引用,不重複長篇。物化 reason_code 與 API 細節見 統一查詢層 §8.1。


八、Core system:SQL 規則與安全邊界

除 QEM 外,Core 還承載下列安全與格式約束(不把 API Key 等敏感設定灌進 prompt;知識與 user 訊息仍受長度上限;System instruction 與 user 氣泡在 UI 區分,避免模型混淆角色):

  • 表名雙引號、Excel 兩段引用、MCP 表名格式。
  • 探索階段:validate_query 僅回 ok/錯誤,無資料列;不得用於分析結論。SQL Server 大結果可回 warning_required
  • 正式取數:run_query(預覽上限 200 行)或 run_sql_tab;SQL Server 大結果須 large_remote_warning_id
  • 外部庫 ATTACH 由 UI 管理,不在聊天 SQL 裡寫 ATTACH。
  • SQL Server ODBC staged:upstream 單源 → 物化 → 本地 JOIN;禁止透明跨源 single-statement JOIN(詳見 統一查詢層 §9.3)。

Secondary model: 對話命名、知識抽取等背景 LLM 呼叫可走 Secondary model Profile(與 active 主模型分離),降低主對話 token 成本(見 USER_GUIDE §12.3)。


九、State prompt:狀態決定「怎麼思考」

示例差異:

  • NoProject:可 Quick 分析或引導 focus_project
  • ProjectFocused + Planning:修 Plan、處理批註;不 Execute。
  • Executing:依前台/後台模式跑 SQL;可 source_run_sql_tab
  • html_report_active:追加 HTML 編輯 workflow(與 chunk 工具同現)。

ProjectFocused HTML: Generating 段常駐;Editing 段僅在 html_report_active 時注入,避免無工具卻 prompt 慫恿 patch。


十、Knowledge injection

治理敘事可治理的 Agent Memory。本文只述工程行為:

  • Enabled 且已核准的 User / Project 檔注入。
  • Queued 永不注入
  • 知識檔 mtime cache;變更後重讀(含舊版四區遷移)。
  • flat(User < 2,500、Project < 5,000 字):Rules + Info 全文。
  • catalog(達閾值):目錄索引 + 提示呼叫 expand_knowledge_catalog;超注入預算截斷。
  • pre-inject Reorganize:catalog 字數但無目錄結構時,新 conversation 首次 run 前可能自動重組(見 可治理的 Agent Memory §6.3)。

十一、批註 Sidecar 與 AI 上下文

呼應 Agent 時代的數據分析工作流 §六 批註產品故事。

Plan / Report 批註存於 *.annotations.json sidecar;Markdown 正文含 id-only <mark data-annotation-id> 標籤。read_plan / read_report 與 Context Engine Active Tab 回傳:

  1. 磁碟正文 content(含 id-only <mark data-annotation-id> 標籤)
  2. 批註 sidecar annotations(open / resolved 狀態、quote、history;忽略過期的 anchor.span
  3. open_annotation_countannotation_summary(Action Required 任務清單)
  4. patch_guidance(resolve 模式 A/B、mark 邊界;Agent 忽略 stale sidecar span)

Resolve 路徑: 工具列 Resolve (N) 或對話指令 → resolve_annotations 原子更新 sidecar 與 Markdown mark → sync_tab_content 刷新編輯器;若 sidecar 在磁碟上已被外部更新,主視窗可能提示重載(dirty tab toast)。

操作見 §11.7–11.9


十二、歷史訊息截斷

非「最後 N 則」,而是保留分析語境:近期 user/assistant、工具軌跡配對、關鍵系統事件。目標在長對話中仍可延續 Plan 執行上下文,同時控制 token。


十三、Mid-turn compaction

ReAct 迴圈內若 token 逼近上限,可對本輪已累積的 tool 結果等做 compaction,避免單輪多工具爆窗。與 §十二 的跨輪截斷互補。

run_query / query_result 壓縮時保留 step_idcached_table_namematerializedmaterialize_reasonwarnings,並將 sql 截為 sql_preview(前 200 字元),避免多步鏈在長輪次中失憶。


十四、Context window discovery

多 Profile、多模型時,執行時探測可用 context 上限,務實決定截斷與是否 auto-continuation(見 AI Agent 架構)。避免硬編碼單一模型假設。


十五、工程決策總覽

決策 原因
Summary + Detail Token 與新鮮度
State 不列工具 schemas 為單一真相
validate vs run 探索便宜、結論有數據
Sidecar + 正文 id mark 可追溯批註 history;人機共用同一磁碟全文
Query Execution 在 core 跨狀態一致
optimization_hint 非阻擋 引導使用 cache,但不為了 lineage 破壞分析

十六、結語

Context 工程決定 Agent「以為的世界」是否與 IDE 真實狀態一致——Summary 要小、Detail 要新、State 要對、知識要經核准才注入。

這些 prompt 如何變成可串流的 tool 行為,是 AI Agent 架構 的主題;查詢語意則由 統一查詢層 在 DuckDB 管線上落地。