@zleap-ai/sag-cli 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.en.md +214 -0
- package/README.md +120 -66
- package/dist/cli.js +206 -2
- package/dist/cli.js.map +1 -1
- package/package.json +4 -2
- package/skill/SKILL.md +59 -0
- package/skill/references/citation-rules.md +85 -0
- package/skill/references/cli-reference.md +223 -0
- package/skill/references/search-strategies.md +73 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zleap-ai/sag-cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "Command-line client and diagnostics for SAG knowledge bases",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -9,7 +9,9 @@
|
|
|
9
9
|
"files": [
|
|
10
10
|
"dist",
|
|
11
11
|
"README.md",
|
|
12
|
-
"
|
|
12
|
+
"README.en.md",
|
|
13
|
+
"LICENSE",
|
|
14
|
+
"skill"
|
|
13
15
|
],
|
|
14
16
|
"scripts": {
|
|
15
17
|
"build": "tsup",
|
package/skill/SKILL.md
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sag-knowledge
|
|
3
|
+
description: "通过 sag CLI 检索 SAG 知识库。当用户需要在 SAG 知识库中查找、阅读、引用或核实内容时使用。重要约束:(1)必须先 sag source list 确认范围 (2)引用必须标注 [n] 编号 (3)禁止对整个文件一次性 read,必须分页 (4)无结果时如实告知,禁止编造 (5)文档非 ready 状态不可检索,需提示用户等待处理完成。"
|
|
4
|
+
metadata:
|
|
5
|
+
sag:
|
|
6
|
+
emoji: "📚"
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# SAG Knowledge Base
|
|
10
|
+
|
|
11
|
+
通过 `sag` CLI 探索和检索 SAG 知识库。
|
|
12
|
+
|
|
13
|
+
## 调用方式
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
sag <command> [options]
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
详细参数与返回格式见 [references/cli-reference.md](references/cli-reference.md)。
|
|
20
|
+
|
|
21
|
+
## 探索漏斗
|
|
22
|
+
|
|
23
|
+
每次知识检索按漏斗从宽到窄推进:
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
sag source list → sag document list → sag outline → sag search/sag grep → sag get-chunk/sag read
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
能用 `sag search` 回答就不进 `sag get-chunk`。用户追问出处时才展示原文。
|
|
30
|
+
|
|
31
|
+
## 工具选择决策
|
|
32
|
+
|
|
33
|
+
| 场景 | 命令 | 说明 |
|
|
34
|
+
| -------------------- | -------------------------- | ------------------------------------- |
|
|
35
|
+
| 进入任何任务的第一步 | `sag source list` | 确认范围,即使只有一个信源也要调用 |
|
|
36
|
+
| 概念性问题 | `sag search "<query>"` | 返回 `[n]` 编号证据块,回答时标注引用 |
|
|
37
|
+
| 精确字符串 | `sag grep "<pattern>"` | 大小写不敏感,编号/函数名/配置项 |
|
|
38
|
+
| 文档结构 | `sag outline <doc-id>` | 标题大纲 + chunk_id |
|
|
39
|
+
| 读完整文档 | `sag read <doc-id>` | 分页读取,每次 ≤ 120 行 |
|
|
40
|
+
| 追问出处 | `sag get-chunk <chunk-id>` | 展示对应分块完整原文 |
|
|
41
|
+
| 人物/组织/概念 | `sag get-entity "<name>"` | 精确匹配 → 子串匹配 |
|
|
42
|
+
| 文档状态 | `sag document list/status` | 仅 `ready` 状态可检索 |
|
|
43
|
+
| 诊断 | `sag doctor` | 检查 SAG 实例健康状态 |
|
|
44
|
+
|
|
45
|
+
## 禁止项
|
|
46
|
+
|
|
47
|
+
- **禁止跳过 `sag source list` 直接搜索**——先确认范围
|
|
48
|
+
- **禁止一次 `sag read` 整个文件**——始终分页
|
|
49
|
+
- **禁止编造知识内容**——search/grep 空态时如实告知
|
|
50
|
+
- **禁止向用户暴露技术细节**——不展示 chunk_id、source_id 等技术字段
|
|
51
|
+
- **禁止对非 ready 状态的文档调用 search**——告知用户等待处理完成
|
|
52
|
+
|
|
53
|
+
## References
|
|
54
|
+
|
|
55
|
+
| 文件 | 何时看 |
|
|
56
|
+
| ------------------------------------------------------------------ | ------------------------------------------- |
|
|
57
|
+
| [references/cli-reference.md](references/cli-reference.md) | 需要准确的命令参数、返回格式、空态文案 |
|
|
58
|
+
| [references/search-strategies.md](references/search-strategies.md) | 设计复杂多步检索流程、search vs grep 决策树 |
|
|
59
|
+
| [references/citation-rules.md](references/citation-rules.md) | 引用 `[n]` 编号规范、原文溯源流程、追问处理 |
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# 引用规范
|
|
2
|
+
|
|
3
|
+
## 为什么需要引用
|
|
4
|
+
|
|
5
|
+
SAG 是原文溯源型知识库——每条检索结果都能追溯到原始文档的具体分块。引用规范保证:
|
|
6
|
+
|
|
7
|
+
- 用户能验证答案的准确性
|
|
8
|
+
- 追问时能快速定位原文
|
|
9
|
+
- Agent 回答有据可查,避免幻觉
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## 引用标注格式
|
|
14
|
+
|
|
15
|
+
使用 `sag search` 返回的 `[n]` 编号标注每条外部知识来源。
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
sag search 返回:
|
|
19
|
+
[1] 授权流程概述(chunk_id=chunk_042)
|
|
20
|
+
授权分为三步:……
|
|
21
|
+
|
|
22
|
+
[2] 权限模型(chunk_id=chunk_078)
|
|
23
|
+
系统采用 RBAC 模型……
|
|
24
|
+
|
|
25
|
+
Agent 回答:
|
|
26
|
+
授权分为三步:用户发起、主管审批、系统记录 [1]。
|
|
27
|
+
权限控制基于 RBAC 模型,支持角色、用户组、资源三级粒度 [2]。
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### 标注位置
|
|
31
|
+
|
|
32
|
+
- 标注紧跟被引用的句子或段落末尾。
|
|
33
|
+
- 一句话引用多个来源时并排标注:`[1][3]`。
|
|
34
|
+
- 不要把所有引用堆在段落末尾——逐句标注。
|
|
35
|
+
|
|
36
|
+
### 标注粒度
|
|
37
|
+
|
|
38
|
+
- 每条来自知识库的事实都要标注。
|
|
39
|
+
- 常识性内容(如"RBAC 是 Role-Based Access Control 的缩写"这类通用知识)不需要标注。
|
|
40
|
+
- 不确定是否需要标注时,倾向于标注。
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## 原文溯源流程
|
|
45
|
+
|
|
46
|
+
当用户追问出处时,按以下步骤展示原文:
|
|
47
|
+
|
|
48
|
+
```
|
|
49
|
+
用户: 这个授权流程是从哪来的?
|
|
50
|
+
|
|
51
|
+
Agent:
|
|
52
|
+
1. 确认引用编号 → 上一轮回答引用了 [1]
|
|
53
|
+
2. sag get-chunk chunk_042 → 获取完整分块原文
|
|
54
|
+
3. 展示原文并说明来源文档
|
|
55
|
+
|
|
56
|
+
回复示例:
|
|
57
|
+
这来自《产品手册》第 2 章「授权流程概述」:
|
|
58
|
+
|
|
59
|
+
> 授权分为三步:用户发起请求,主管在线审批,
|
|
60
|
+
> 系统自动记录并通知。请求需在 24 小时内完成审批,
|
|
61
|
+
> 超时自动退回。
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## 追问处理模式
|
|
67
|
+
|
|
68
|
+
| 追问类型 | 处理方式 |
|
|
69
|
+
| ------------------------------ | -------------------------------------------- |
|
|
70
|
+
| "这个结论从哪来的" | `sag get-chunk` 展示对应原文 |
|
|
71
|
+
| "原文怎么说的" | `sag get-chunk` 展示对应原文 |
|
|
72
|
+
| "有没有更详细的内容" | `sag read` 相关章节(先 `sag outline` 定位) |
|
|
73
|
+
| "还有其他相关的内容吗" | 扩大 search top_k 或换表述再 search |
|
|
74
|
+
| "这个人在知识库里还有什么信息" | `sag get-entity` 查看实体上下文 |
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
## 常见错误
|
|
79
|
+
|
|
80
|
+
| 错误 | 正确做法 |
|
|
81
|
+
| ------------------------------ | ---------------------------------- |
|
|
82
|
+
| 回答中不标注任何引用 | 每条知识库事实必须标注 `[n]` |
|
|
83
|
+
| 标注了 [n] 但 n 是编造的 | [n] 必须来自当次 search 的真实返回 |
|
|
84
|
+
| 用户追问出处时复述而非展示原文 | 用 `sag get-chunk` 展示原文 |
|
|
85
|
+
| 把常识当作知识库内容标注 | 只有来自 SAG 的知识需要标注 |
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
# CLI 命令参考
|
|
2
|
+
|
|
3
|
+
所有命令返回结构化文本。空态统一返回中文占位文案,不抛异常。
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## sag source list
|
|
8
|
+
|
|
9
|
+
列出当前可访问的全部信源。
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
sag source list
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
**返回**:
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
可访问的知识来源:
|
|
19
|
+
- 产品文档(source_id=src_prod_001)· 12 文档 · 340 分块
|
|
20
|
+
- 技术博客(source_id=src_blog_002)· 5 文档 · 89 分块
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
**空态**: `(暂无可用信源)`
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## sag document list
|
|
28
|
+
|
|
29
|
+
列出指定信源下的文档列表。
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
sag document list --source <id>
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
**返回**:
|
|
36
|
+
|
|
37
|
+
```
|
|
38
|
+
- 产品手册.pdf · id=doc_001 · ready · 120 分块
|
|
39
|
+
- 更新日志.md · id=doc_002 · processing · 0 分块
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
**空态**: `(暂无文档)`
|
|
43
|
+
|
|
44
|
+
**文档状态**:
|
|
45
|
+
|
|
46
|
+
| 状态 | 含义 | 可否检索 |
|
|
47
|
+
| ---------- | ----------- | ------------- |
|
|
48
|
+
| ready | 处理完成 | ✅ |
|
|
49
|
+
| processing | 解析/抽取中 | ❌ 告知等待 |
|
|
50
|
+
| error | 处理失败 | ❌ 需重新上传 |
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
## sag document status
|
|
55
|
+
|
|
56
|
+
查看文档处理进度。
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
sag document status --source <id> # 信源汇总
|
|
60
|
+
sag document status --source <id> <doc-id> # 单个文档
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## sag search
|
|
66
|
+
|
|
67
|
+
语义检索。自然语言问题 → 带编号证据块。
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
sag search "<query>" --source <id> --top-k 10
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
**参数**:
|
|
74
|
+
|
|
75
|
+
| 参数 | 说明 |
|
|
76
|
+
| ---------- | ----------------------------- |
|
|
77
|
+
| --source | 限定信源,可重复指定多个 |
|
|
78
|
+
| --top-k | 返回数量,默认 8,上限 50 |
|
|
79
|
+
| --strategy | vector(快速)/ multi(精确) |
|
|
80
|
+
|
|
81
|
+
**返回**:
|
|
82
|
+
|
|
83
|
+
```
|
|
84
|
+
[1] 授权流程概述(chunk_id=chunk_042)
|
|
85
|
+
授权分为三步:用户发起请求,主管在线审批,系统自动记录并通知。
|
|
86
|
+
|
|
87
|
+
[2] 权限模型设计(chunk_id=chunk_078)
|
|
88
|
+
系统采用 RBAC 模型,支持角色、用户组、资源三级粒度。
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
**空态**: `(未找到匹配内容)`
|
|
92
|
+
|
|
93
|
+
**使用规则**:
|
|
94
|
+
|
|
95
|
+
- 回答时引用 `[n]` 编号标注每条事实
|
|
96
|
+
- search 失败时告知用户检查模型配置
|
|
97
|
+
- 同一轮对话复用已有结果,不要重复调用
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
## sag grep
|
|
102
|
+
|
|
103
|
+
精确字符串匹配。大小写不敏感,`%` 和 `_` 已自动转义。
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
sag grep "<pattern>" --source <id> --limit 20
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
**参数**:
|
|
110
|
+
|
|
111
|
+
| 参数 | 说明 |
|
|
112
|
+
| -------- | -------------------------- |
|
|
113
|
+
| --source | 限定检索范围 |
|
|
114
|
+
| --limit | 返回数量,默认 20,上限 50 |
|
|
115
|
+
|
|
116
|
+
**空态**: `(未找到匹配 "pattern" 的内容)`
|
|
117
|
+
|
|
118
|
+
**使用规则**: 第一次无结果时可换同义词或缩短 pattern 再试一次。最多 2 次。
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
## sag outline
|
|
123
|
+
|
|
124
|
+
返回文档的层级大纲(标题 + chunk_id),按阅读顺序排列。
|
|
125
|
+
|
|
126
|
+
```bash
|
|
127
|
+
sag outline <document-id>
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
**返回**:
|
|
131
|
+
|
|
132
|
+
```
|
|
133
|
+
1. 概述(chunk_id=chunk_001)
|
|
134
|
+
1.1 项目背景(chunk_id=chunk_002)
|
|
135
|
+
1.2 技术选型(chunk_id=chunk_003)
|
|
136
|
+
2. 快速开始(chunk_id=chunk_004)
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
**空态/处理中**: `(文档处理中,暂无大纲)`
|
|
140
|
+
|
|
141
|
+
---
|
|
142
|
+
|
|
143
|
+
## sag get-chunk
|
|
144
|
+
|
|
145
|
+
读取单个分块的完整原文。
|
|
146
|
+
|
|
147
|
+
```bash
|
|
148
|
+
sag get-chunk <chunk-id> --source <id>
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
**空态**: `(未找到该分块)`
|
|
152
|
+
|
|
153
|
+
---
|
|
154
|
+
|
|
155
|
+
## sag read
|
|
156
|
+
|
|
157
|
+
按行分页读取原始文件。
|
|
158
|
+
|
|
159
|
+
```bash
|
|
160
|
+
sag read <document-id> --offset 1 --limit 120
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
**参数**:
|
|
164
|
+
|
|
165
|
+
| 参数 | 说明 |
|
|
166
|
+
| -------- | ---------------------------- |
|
|
167
|
+
| --offset | 起始行号,默认 1 |
|
|
168
|
+
| --limit | 每页行数,默认 120,上限 500 |
|
|
169
|
+
|
|
170
|
+
**返回**:
|
|
171
|
+
|
|
172
|
+
```
|
|
173
|
+
第 1-120 行 / 共 560 行
|
|
174
|
+
1 | # 产品手册
|
|
175
|
+
...
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
**使用规则**: 禁止一次 read 整个文件——始终分页,每次 ≤ 120 行。
|
|
179
|
+
|
|
180
|
+
---
|
|
181
|
+
|
|
182
|
+
## sag get-entity
|
|
183
|
+
|
|
184
|
+
查询实体的相关事件上下文。先精确名称匹配、再子串匹配。
|
|
185
|
+
|
|
186
|
+
```bash
|
|
187
|
+
sag get-entity "<name>" --source <id>
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
**返回**:
|
|
191
|
+
|
|
192
|
+
```
|
|
193
|
+
实体:张三 · 类型:人物
|
|
194
|
+
相关事件:
|
|
195
|
+
- 张三于 2024 年加入团队(chunk_id=chunk_031)
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
**空态**: `(未找到相关实体)` — 此时建议用 `sag search` 替代。
|
|
199
|
+
|
|
200
|
+
---
|
|
201
|
+
|
|
202
|
+
## sag doctor
|
|
203
|
+
|
|
204
|
+
诊断 SAG 实例健康状态。检查项:API 可达性、数据库状态、LLM 配置。
|
|
205
|
+
|
|
206
|
+
```bash
|
|
207
|
+
sag doctor
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
---
|
|
211
|
+
|
|
212
|
+
## 空态文案速查
|
|
213
|
+
|
|
214
|
+
| 命令 | 空态/异常返回 |
|
|
215
|
+
| ----------------- | --------------------------------- |
|
|
216
|
+
| sag source list | `(暂无可用信源)` |
|
|
217
|
+
| sag document list | `(暂无文档)` |
|
|
218
|
+
| sag outline | `(文档处理中,暂无大纲)` |
|
|
219
|
+
| sag search | `(未找到匹配内容)` |
|
|
220
|
+
| sag grep | `(未找到匹配 "pattern" 的内容)` |
|
|
221
|
+
| sag get-chunk | `(未找到该分块)` |
|
|
222
|
+
| sag read | `(文档不存在或无法读取)` |
|
|
223
|
+
| sag get-entity | `(未找到相关实体)` |
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# 查询策略
|
|
2
|
+
|
|
3
|
+
## 漏斗范式
|
|
4
|
+
|
|
5
|
+
每次知识检索按漏斗从宽到窄推进:
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
sag source list → sag document list → sag outline → sag search / sag grep → sag get-chunk / sag read
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
| 步骤 | 命令 | 产出 |
|
|
12
|
+
| ----------- | --------------------------------- | ----------------------------------- |
|
|
13
|
+
| 1. 确认范围 | `sag source list` | 可用的 source_id 列表 |
|
|
14
|
+
| 2. 锁定文档 | `sag document list --source <id>` | 候选 document_id(只看 ready 状态) |
|
|
15
|
+
| 3. 定位章节 | `sag outline <document-id>` | 目标章节的 chunk_id |
|
|
16
|
+
| 4. 召回证据 | `sag search` 或 `sag grep` | 带编号的证据片段 |
|
|
17
|
+
| 5. 溯源原文 | `sag get-chunk` 或 `sag read` | 完整原文 |
|
|
18
|
+
|
|
19
|
+
**原则**: 能用第 4 步回答就用第 4 步,用户追问出处时才进第 5 步。
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## search vs grep 决策树
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
用户查询是自然语言问句?
|
|
27
|
+
├── 是 → sag search
|
|
28
|
+
│ 例:"授权流程是怎样的""资料里有没有提到微服务"
|
|
29
|
+
│
|
|
30
|
+
└── 否 → 是精确字符串?
|
|
31
|
+
├── 是 → sag grep
|
|
32
|
+
│ 例:编号 INV-2024-0037、函数名 handleAuth、配置项 SAG_MAX_CHUNK
|
|
33
|
+
│
|
|
34
|
+
└── 不确定 → sag search(语义覆盖面更广)
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
**sag search 擅长**: 概念、问句、模糊表述、跨段落相关的内容。
|
|
38
|
+
**sag grep 擅长**: 确定字符串、编号、代码片段、专有名词的精确出现位置。
|
|
39
|
+
|
|
40
|
+
### 组合使用
|
|
41
|
+
|
|
42
|
+
1. 先用 `sag search` 找到相关主题范围
|
|
43
|
+
2. 再用 `sag grep` 精确定位关键术语
|
|
44
|
+
|
|
45
|
+
例:用户问"INV-2024 这批货的审批流程" → 先 `sag search "审批流程"` 理解全貌 → 再 `sag grep "INV-2024"` 确认该批次记录。
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## 多步检索示例
|
|
50
|
+
|
|
51
|
+
### 场景 1:用户问"这份资料讲了什么?"
|
|
52
|
+
|
|
53
|
+
```
|
|
54
|
+
1. sag source list → 确认范围,取得 source_id
|
|
55
|
+
2. sag document list --source <id> → 找到目标文档,确认 status = ready
|
|
56
|
+
3. sag outline <doc-id> → 获取全书大纲
|
|
57
|
+
4. sag get-chunk chunk_001 → 读概述章节
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### 场景 2:用户问"授权流程是怎样的?"
|
|
61
|
+
|
|
62
|
+
```
|
|
63
|
+
1. sag search "授权流程" --source <id> → [1] 授权流程概述 [2] 权限管理 ……
|
|
64
|
+
2. 用返回内容回答,标注引用
|
|
65
|
+
3. (用户追问原文)→ sag get-chunk chunk_042
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### 场景 3:用户问"INV-2024-0037 这个编号在哪里出现过?"
|
|
69
|
+
|
|
70
|
+
```
|
|
71
|
+
1. sag grep "INV-2024-0037" → 精确匹配所有出现位置
|
|
72
|
+
2. 如有必要 → sag get-chunk <chunk-id> 读其中某个位置的完整上下文
|
|
73
|
+
```
|