记录一次用opencode从0创建一个项目的完整过程

背景

想搞一个数据标注系统,我没有这方面经验,这两天刚好用上opencode,想做一个实践。

Step1 先整一个明确的需求文档

需求文档比较难整格式,我只有一些我想要让这个标注系统达成的要求,然后我就让chatgpt老师给我输出一个完整的需求文档。

我的输入:

我想让AI agent帮我写一个标注系统的代码,我需要先梳理清楚我的需求,但是我的需求可能目前还不够清晰。我想让这个标注系统可以做到以下几件事情: 1、服务起来后,我可以通过网页打开这个服务; 2、标注的第一页是能上传一个我待标注的数据文件,这个数据文件我想是json格式; 3、上传后能能自助解析我json文件里,每一个元素有多少个字段,每个字段的格式和示例; 4、然后让我选在具体标注页面里,哪些字段需要显示出来; 5、更关键的是有字段是图像字段,但是json文件里只有图像的相对路径地址,在标注页面里需要能够根据这个相对地址取到这个图像; 6、还有一个要求,用户每标注完一条数据,可以把他的标注结果及时保存,其中有几个字段可以由用户指定标注时会修改的字段,并且需要保存标注人信息。 现在请你根据我的上述要求,写一份完整的需求文档,我好让AI-Agent开始帮我写代码。

chatgpt老师的输出:

下面我帮你把“想法级需求”整理成一份**结构化、可直接交给 AI Agent 开发的完整需求文档(PRD)**。我会尽量做到:清晰、无歧义、可实现、可拆解。

---

# 🧾 标注系统需求文档(PRD)

## 一、项目背景

为了提高数据标注效率,需要开发一个**通用的 Web 标注系统**,支持上传 JSON 数据、自定义字段展示、图像加载、在线标注及实时保存。

系统目标:

* 降低标注工具开发成本(通用化)
* 支持不同 JSON 结构的数据
* 支持图像 + 文本混合标注
* 支持多人标注及标注记录追踪

---

## 二、系统总体功能

系统分为 4 个核心模块:

1. **数据上传与解析模块**
2. **字段配置模块(标注配置)**
3. **标注执行模块(核心页面)**
4. **结果存储与管理模块**

---

## 三、功能需求详述

### 3.1 服务访问

#### 功能描述

* 系统启动后提供 Web 服务
* 用户通过浏览器访问

#### 要求

* 支持本地访问(如:[http://localhost:xxxx)](http://localhost:xxxx))
* 后续可扩展为部署服务(可选)

---

### 3.2 数据上传

#### 功能描述

用户上传待标注数据文件

#### 输入要求

* 文件格式:JSON
* 支持两种结构:

  * JSON Array(推荐)
  * JSON Lines(可选)

#### 示例

```json
[
  {
    "id": 1,
    "text": "这是一段文本",
    "image_path": "images/1.jpg"
  }
]
```

#### 功能点

* 文件上传(前端按钮)
* 后端保存文件
* 校验 JSON 格式是否合法

---

### 3.3 JSON 自动解析

#### 功能描述

系统自动分析 JSON 数据结构

#### 输出内容

解析结果需包括:

1. 字段列表
2. 每个字段:

   * 字段名
   * 数据类型(string / number / list / object)
   * 示例值(前 N 条)
   * 是否为空(统计)

#### 示例输出

```json
{
  "fields": [
    {
      "name": "text",
      "type": "string",
      "example": "这是一段文本"
    },
    {
      "name": "image_path",
      "type": "string",
      "example": "images/1.jpg"
    }
  ]
}
```

---

### 3.4 字段选择(标注配置)

#### 功能描述

用户选择在标注页面展示哪些字段

#### 配置项

每个字段支持以下配置:

| 配置项     | 描述                   |
| ------- | -------------------- |
| 是否显示    | 在标注界面展示              |
| 是否可编辑   | 是否允许标注时修改            |
| 字段类型    | text / image / label |
| 是否为标注字段 | 标注结果字段               |

#### 特殊要求(重点)

* 用户需手动指定:

  * 哪些字段是“图像字段”
  * 哪些字段是“标注字段”

---

### 3.5 图像字段处理(重点)

#### 问题

JSON 中只提供相对路径,如:

```
images/xxx.jpg
```

#### 解决方案

系统需支持:

1. **配置图像根目录**

   * 如:`/data/project/`
2. 拼接路径:

   ```
   完整路径 = 根目录 + 相对路径
   ```
3. 后端提供图片访问接口:

   ```
   GET /image?path=xxx
   ```

#### 前端显示

* 自动加载图片
* 支持:

  * 缩放
  * 预览(可选)

---

### 3.6 标注页面(核心)

#### 页面结构

每条数据展示:

* 字段展示区(只读)
* 标注区(可编辑字段)
* 图像展示区(如有)

#### 示例 UI

```
-------------------------
文本:这是一段文本
图片:[展示图片]

标注:
[分类标签 dropdown]
[备注 textarea]

[保存按钮]
-------------------------
```

---

### 3.7 标注流程

#### 单条标注流程

1. 展示一条数据
2. 用户填写标注字段
3. 点击“保存”
4. 自动跳转下一条

---

### 3.8 实时保存(关键需求)

#### 要求

* 每标注一条立即保存
* 防止数据丢失

#### 保存内容

每条记录需保存:

```json
{
  "original_data": {...},
  "annotations": {
    "label": "xxx",
    "remark": "xxx"
  },
  "annotator": "用户名",
  "timestamp": "时间戳"
}
```

---

### 3.9 标注人信息

#### 功能描述

记录是谁标注的

#### 实现方式(简单版)

* 用户进入系统时输入用户名
* 后续自动带入

(可扩展登录系统)

---

### 3.10 数据存储

#### 存储方式(建议)

* JSON 文件(简单版)
  或
* SQLite(推荐)

#### 数据结构

表:annotations

| 字段          | 描述     |
| ----------- | ------ |
| id          | 主键     |
| data_id     | 原始数据ID |
| annotations | 标注结果   |
| annotator   | 标注人    |
| timestamp   | 时间     |

---

### 3.11 进度管理(建议)

#### 功能

* 显示:

  * 总数据量
  * 已标注数量
  * 当前进度 %

---

## 四、非功能需求

### 4.1 性能

* 支持至少 1万条数据加载(分页)
* 标注保存 < 200ms

### 4.2 可扩展性

* 支持后续增加:

  * 多人协作
  * 多任务管理

### 4.3 易用性

* 无需代码即可配置标注任务

---

## 五、系统架构建议(给 AI Agent)

### 后端(推荐)

* Python + FastAPI

模块:

* 文件上传
* JSON解析
* 图片服务
* 标注保存 API

### 前端(推荐)

* React / Vue

页面:

1. 上传页
2. 字段配置页
3. 标注页

---

## 六、接口设计(简要)

### 1. 上传文件

```
POST /upload
```

### 2. 获取字段信息

```
GET /schema
```

### 3. 保存配置

```
POST /config
```

### 4. 获取数据

```
GET /data?page=1
```

### 5. 保存标注

```
POST /annotate
```

### 6. 获取图片

```
GET /image?path=xxx
```

---

## 七、关键难点(AI Agent重点实现)

1. **JSON 自动解析(通用化)**
2. **动态表单生成(字段驱动 UI)**
3. **图像路径映射**
4. **实时保存机制**
5. **配置驱动标注系统(核心)**

---

## 八、可选增强(后续版本)

* 标注撤销 / 修改
* 多人协作冲突控制
* 标签体系管理
* 数据导出(JSON / CSV)
* 快捷键标注
* 自动预标注(AI辅助)

---

## 九、交付标准

AI Agent 生成代码需满足:

* 可运行(本地一键启动)
* 有 README
* 示例 JSON 数据
* 支持完整流程:

  ```
  上传 → 配置 → 标注 → 保存
  ```

---

## 十、你可以下一步这样做

你现在可以直接对 AI Agent 说:

👉
**“请按照这个PRD,用 FastAPI + React 帮我实现第一版(MVP)代码”**

如果你愿意,我也可以帮你下一步直接做👇:

* 拆成“AI可执行任务清单”(一步步生成代码)
* 或者直接给你一版**完整可运行的初始代码骨架**

只要你说一句:**“开始写代码”** 👍

Step 2 让OpenCode帮我生成MVP版

将上面需求文档放到一个新建文件夹下的某个txt文档,让openCode根据这个需求文档,用FastAPI + React 帮我实现第一版(MVP)代码。

opencode一顿操作后,有了基本代码结构和readme,还告诉我怎么启动,按照他的启动方式,出现下面的问题,然后让opencode解决这个问题并自己验证,下面是和opencode进行的第二轮交互

> [email protected] dev /home/huangting/Documents/codes/chat_label_sys/frontend
> vite

/home/huangting/Documents/codes/chat_label_sys/frontend/node_modules/vite/bin/vite.js:2
import { performance } from 'node:perf_hooks'
       ^

SyntaxError: Unexpected token {
    at Module._compile (internal/modules/cjs/loader.js:723:23)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10)
    at Module.load (internal/modules/cjs/loader.js:653:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:593:12)
    at Function.Module._load (internal/modules/cjs/loader.js:585:3)
    at Function.Module.runMain (internal/modules/cjs/loader.js:831:12)
    at startup (internal/bootstrap/node.js:283:19)
    at bootstrapNodeJSCore (internal/bootstrap/node.js:623:3)
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! [email protected] dev: `vite`
npm ERR! Exit status 1
npm ERR! 
npm ERR! Failed at the [email protected] dev script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     /home/huangting/.npm/_logs/2026-04-01T11_48_46_089Z-debug.log 我按照你给我的启动方式,前端代码有报错,请你解决一下,一会最好是能自己启动验证下。

之后继续交互n轮,修复了启动前端报错问题,目前前面load json文件,配置每个字段是否显示在标注系统,以及哪些路径是对应的图像路径都有了。

step3 一边使用一边提示opencode调整代码,优化展示形式

最终差不多经过3个小时左右的打磨,到了完全满足我的最初对标注系统提的要求,自己适用后也满足我的预期。以下是readme部分的说明。

# 通用标注系统
基于 FastAPI + React 的通用 Web 标注系统,支持 JSON 数据上传、字段配置、图像标注和实时保存。
## 功能特性
- **JSON 数据上传与自动解析** - 支持 JSON Array 格式,自动解析字段类型
- **字段配置** - 可配置是否显示、是否可编辑、字段类型(text/image/label)、是否为标注字段
- **图像字段支持** - 支持配置图像根目录,单图/多图列表,点击放大查看
- **实时保存** - 标注后立即保存到 SQLite 数据库
- **进度统计** - 显示总数据量、已标注数量、进度百分比
- **断点续标** - 自动从上次标注结束的位置继续
- **配置记忆** - 同一文件再次上传时保留之前的字段配置
- **标注状态绑定** - 标注结果与文件名绑定,不同文件独立管理
- **数据导出** - 一键导出已标注数据(仅导出标注过的记录)
- **长文本显示** - 支持复杂字典和列表嵌套结构,默认滚动到最后
## 项目结构
```
chat_label_sys/
├── backend/           # FastAPI 后端
│   ├── main.py        # 主程序
│   ├── requirements.txt
│   ├── annotations.db # 标注数据库(自动生成)
│   └── uploads/      # 上传的 JSON 文件
├── frontend/          # React 前端
│   ├── src/
│   │   ├── App.jsx    # 主组件
│   │   ├── main.jsx
│   │   └── index.css
│   └── package.json
└── README.md
```
上一篇 芋道minIO配置-minio异常处理:S3 API Requests must be made to API port

管理员

1篇 本周更新
1篇 本月更新
1个 用户数量