💡阅读指南

前面已经分别讨论了 SPEC 的栏目和用户故事。这一节不再继续解释概念,而是把独立图片需求整理成一份完整的示例 spec.md,观察各个栏目怎样共同形成可验收的约定。

6.1 示例 SPEC

下面这份 SPEC 只覆盖“独立图片怎样形成文字证据”这一项功能。它不是胶囊系统的完整 SPEC,但作为一个独立功能,结构已经完整。

Markdown
# Feature Specification: 独立图片形成文字证据

**Feature Branch**: `001-independent-image-evidence`
**Created**: 2026-08-14
**Status**: Draft
**Input**: 用户提交一张没有正文、图注或补充说明作为上下文的图片,
系统判断它能否独立形成知识,并生成相应的文字证据。

## Scope Boundaries

- 本功能处理没有正文、图注或用户补充说明作为上下文的独立图片。
- 本功能负责判断图片能否形成文字证据,不承担图片文件的长期保存。
- PDF 中嵌入的图片和网页正文中的图片不属于本功能范围。

## User Scenarios & Testing

### User Story 1 - 把独立图片转换成文字证据 (Priority: P1)

作为个人知识库的使用者,我希望系统只把能够独立表达知识的图片
转换成文字证据,避免装饰图和普通照片进入知识内容。

**Why this priority**: 这是独立图片进入知识系统的主路径。没有这项能力,
系统既无法形成图片证据,也无法阻止无关图片进入知识内容。

**Independent Test**: 分别提交一张信息完整的流程图、一张普通风景图,检查系统是否给出二种明确且不同的处理结果。

**Acceptance Scenarios**:

1. **Given** 用户提交的图片有明确主题,并且其中的事实、步骤、关系或数据
   不依赖外部上下文也能理解,**When** 系统处理图片,**Then** 系统生成文字证据,
   保留这些主要信息,同时不保存图片文件。
2. **Given** 用户提交的是没有知识主题和事实信息的普通风景图,
   **When** 系统处理图片,**Then** 系统不生成文字证据,也不保存图片文件。
3. **Given** 用户提交的图片主体模糊或内容残缺,仅凭图片无法确认完整事实,
   **When** 系统处理图片,**Then** 系统把结果标记为待确认,并且不补写
   无法确认的内容。
4. **Given** 独立图片来自一个 URL,**When** 系统完成处理,
   **Then** 系统把处理结果与该 URL 关联。
5. **Given** 用户直接提交独立图片,并且没有提供来源 URL,
   **When** 系统完成处理,**Then** 系统不为该图片建立原始证据。

### Edge Cases

- 图片有标题,但主体内容模糊或残缺,无法形成完整事实。
- 图片包含大量文字,但这些文字只是广告、装饰语或水印。
- 图片表达了完整知识,但没有可以直接提取的文字,例如纯图形流程图。
- 来源 URL 无法再次访问,但图片内容已经完成本次判断。

## Requirements

### Functional Requirements

- **FR-001**: 系统必须把“有明确主题,并且包含可独立理解的事实、步骤、
  关系或数据”作为独立图片形成文字证据的必要条件。
- **FR-002**: 符合条件的图片必须生成文字证据,证据必须保留图片表达的
  主要事实及其关系。
- **FR-003**: 没有明确知识主题,或者不包含可独立理解的事实、步骤、关系
  或数据的图片,不得生成文字证据。
- **FR-004**: 无法确认完整含义的图片必须进入待确认状态,系统不得编造
  或补写无法从图片中确认的信息。
- **FR-005**: 图片来自 URL 时,系统必须把 URL 与处理结果关联;没有 URL 时,
  不得建立原始证据。
- **FR-006**: 系统不得把独立图片文件保存为原始证据或衍生证据。
- **FR-007**: 每次处理必须形成明确状态:已生成文字证据、不生成文字证据
  或待确认。

### Key Entities

- **独立图片输入**:用户本次提交的图片,以及可选的来源 URL。
- **处理结果**:记录本次判断状态、判断理由,以及是否形成文字证据。
- **文字证据**:从有效图片中形成的文本,记录主要事实、步骤、关系或数据。
- **原始证据**:图片存在来源 URL 时保存的 URL,并与处理结果保持关联。

## Success Criteria

### Measurable Outcomes

- **SC-001**: 对预先标明预期结果的有效图片、无效图片和待确认图片样例,
  系统的处理状态与预期结果的一致率达到 100%。
- **SC-002**: 带有 URL 的验收样例,其处理结果与来源 URL 的关联率达到 100%。
- **SC-003**: 所有验收样例都产生一个明确处理状态,不出现没有结果的输入。

## Assumptions

- 当前使用者是个人知识库的所有者,不涉及多人审批和企业合规流程。
- 用户接受独立图片处理完成后不长期保存原始图片文件。
- 如果用户在提交图片时另外提供了正文、图注或文字说明,系统需要把图片和这些内容放在一起理解。
- 待确认状态表示系统没有形成有效文字证据,需要用户以后决定是否继续处理。

6.2 英文字段

SPEC 文档通常可以先由 AI 生成初稿。比如上面这份 SPEC,就是先由 GPT 生成,然后再由我手动修改。GPT 保留了 Spec Kit 模板中的英文字段,我也没有特意把它们换成中文。当然,你也可以要求 GPT 在生成 SPEC 时使用中文字段。

大部分字段直接翻译就能理解。比如,Key Entities 就是“关键实体”,Success Criteria 就是“成功标准”。这些字段的中英文对照放在本节最后的“学点英语”中,这里不再逐个展开。

真正需要单独解释的是 GivenWhenThen。它们放在一起时,不是三个普通的英文字段,而是一条验收场景的固定结构:

Text
Given:在什么前提下
When:当什么动作发生时
Then:系统应该产生什么结果

Given 描述系统开始处理之前已经成立的条件。它可以是用户提交了某种输入,也可以是系统已经处在某个状态。When 描述触发这次验收的动作。Then 则规定动作发生以后,系统必须给出什么结果。

以前面的普通风景图为例,这条验收场景可以按中文读成:

在用户提交了一张没有知识主题和事实信息的普通风景图时(Given),当系统处理这张图片(When),系统不应生成文字证据,也不应保存图片文件(Then)。

这样写的价值在于,测试人员不需要猜测这条需求应该怎样验收。他只需要准备 Given 规定的输入,执行 When 规定的动作,再核对是否出现了 Then 规定的结果。

6.3 不要看不起中英混合

很多人会认为中英混合不专业。但我的看法不同。英文相对于中文来说,有更强的标识性。如果你对此有怀疑,那么可以把上述 SPEC 中的英文字段,更换成中文,你会发现整个文档的可读性变差了。

如果自己特意写中英混合,那大可不必。但如果是 AI 生成就这样,那没有必要纠正 AI 必须全中文。

6.4 从需求判断到验收约定

这份 SPEC 没有规定使用哪个视觉模型,也没有决定文字识别工具、提示词和判断阈值。它只固定了用户目标、功能范围、典型场景、特殊输入、系统行为、核心数据和成功标准。

因此,开发完成以后,验收者可以直接准备流程图、风景图和信息残缺的图表,逐项检查系统是否产生预期状态。至于系统怎样识别图片、怎样保存处理结果,要留给后面的 Plan 和 Tasks。

6.5 ■ 学点英语

中文 English 音标 说明
用户故事 User Story /ˈjuːzər ˈstɔːri/ 从用户目标和价值出发描述需求
独立测试 Independent Test /ˌɪndɪˈpendənt test/ 说明如何单独验证这条用户故事
验收场景 Acceptance Scenario /əkˈseptəns səˈnerioʊ/ 用明确的前提、动作和结果表达验收条件
前提—动作—结果 Given-When-Then /ˈɡɪvən wen ðen/ 把一条验收场景组织成前提条件、触发动作和预期结果
功能需求 Functional Requirement /ˈfʌŋkʃənəl rɪˈkwaɪərmənt/ 规定系统必须执行或禁止的行为
成功标准 Success Criteria /səkˈses kraɪˈtɪriə/ 用来判断整项功能是否成功的标准,缩写为 SC