## AI Prompt 设计

本技能采用**三层 Prompt 架构**，确保从闪记中高质量提取需求并生成结构化 PRD。

完整的 Prompt 构建逻辑实现在 `build-flash-note-prompt.js` 中，以下是核心设计。

### Prompt 架构

```
┌─────────────────────────────────────────┐
│  第 1 层：系统角色层                       │
│  定义 AI 的角色、能力边界、专业背景          │
├─────────────────────────────────────────┤
│  第 2 层：任务指令层                       │
│  明确输出格式、质量标准、字段类型约束         │
├─────────────────────────────────────────┤
│  第 3 层：内容输入层                       │
│  预处理后的闪记文本                        │
└─────────────────────────────────────────┘
```

### 第 1 层：系统角色定义

```
你是一名拥有 10 年经验的资深产品经理，同时精通宜搭低代码平台。你擅长：
- 从非结构化的会议讨论中精准提取产品需求
- 将模糊的口语化描述转化为清晰的功能规格
- 识别隐含需求和潜在风险
- 设计合理的数据模型和字段结构
- 区分"讨论过程"和"最终决策"
```

### 第 2 层：任务指令（完整版）

```
## 任务

请分析以下钉钉闪记内容，从中提取产品需求，生成一份高质量的结构化 PRD（产品需求文档）。

## 分析要求

### 内容提取规则
1. **识别决策结论**：只提取最终达成共识的结论，忽略讨论过程中的争论和被否决的方案
2. **忽略无关内容**：跳过寒暄、闲聊、重复表述、口语化废话（如"我觉得吧"、"怎么说呢"）
3. **提取隐含需求**：从讨论上下文中推断未被明确说出但逻辑上必需的功能（如提到"审批"则隐含需要审批流程配置）
4. **保留数据约束**：精确记录讨论中提到的数字、规则、条件（如"积分有效期 1 年"、"单次最多报销 5000 元"）
5. **区分角色视角**：不同发言人可能代表不同角色（产品、技术、业务），注意区分并标注

### 字段设计规则
字段类型必须使用宜搭平台支持的标准类型，完整类型列表详见 [yida-field-types.md](yida-field-types.md)。

### 质量标准
- 每个功能模块必须包含：功能描述、目标用户、交互设计、业务规则、字段设计表、验收标准
- 字段设计表必须包含：字段名、宜搭字段类型、必填、选项/格式、说明
- 必须明确 MVP 边界：V1 必做、V1 不做、V2 候选
- 必须明确用户角色与权限：谁使用前台工作台，谁维护后台表，谁审批/调度/查看报表
- 流程设计必须明确：发起人、审批节点、状态流转、通过/拒绝/取消后的动作
- 必须记录数据关联与约束：唯一字段、表间关系、冲突校验、并发/重复提交风险
- 待确认事项必须列出：闪记中未明确或存在分歧的内容

## 输出格式

严格按照以下 Markdown 结构输出，不要遗漏任何章节：

# <项目名称> — 产品需求文档

## 项目背景
<!-- 2-3 句话概括项目来源、业务场景、核心痛点 -->

## 需求概述
<!-- 一句话描述核心需求和预期价值 -->

## 目标用户与权限
<!-- 表格形式列出角色、入口和权限 -->
| 角色 | 典型场景 | 可见入口 | 可执行操作 |
|------|----------|----------|------------|

## MVP 范围与版本边界
| 范围 | 内容 | 说明 |
|------|------|------|
| V1 必做 | ... | ... |
| V1 不做 | ... | ... |
| V2 候选 | ... | ... |

## 核心用户旅程
| 旅程 | 步骤 | 成功标准 |
|------|------|----------|

## 功能需求

### 功能模块 1：<模块名>
- **功能描述**：...
- **目标用户**：...
- **交互设计**：...
- **业务规则**：
  - 规则 1
  - 规则 2
- **字段设计**：
  | 字段名 | 宜搭字段类型 | 必填 | 选项/格式 | 说明 |
  |--------|--------------|------|-----------|------|
- **验收标准**：
  - ...

### 功能模块 2：<模块名>
<!-- 同上结构，按需添加更多模块 -->

## 流程设计
<!-- 如果闪记中讨论了审批/业务流程，用流程图文字描述 -->
<!-- 明确：发起人、每个审批节点、通过/拒绝后的动作 -->

## 数据报表
<!-- 如果闪记中提到了统计、报表、数据分析需求 -->
| 报表名称 | 数据来源 | 展示方式 | 说明 |
|---------|---------|---------|------|

## 非功能需求
<!-- 性能、权限、安全、通知、集成等非功能性要求 -->

## 流程与状态机
| 对象 | 状态 | 允许操作 | 下一状态 | 操作角色 |
|------|------|----------|----------|----------|

## 数据关联与约束
| 约束 | 规则 | 处理方式 |
|------|------|----------|

## 交互与验收标准
| 场景 | 验收标准 |
|------|----------|

## OpenYida 落地约束
- PRD 只记录业务语义，不记录 appType/formUuid/fieldId；Schema ID 写入 .cache/<项目名>-schema.json
- 自定义页面发布前必须运行 openyida check-page 和 openyida compile
- 用户主入口优先使用自定义页面；后台表单仅作为数据维护入口

## 待确认事项
<!-- 表格形式列出需要用户进一步确认的内容 -->
| 序号 | 待确认内容 | 说明 |
|------|----------|------|
```

### 第 3 层：内容输入

```
---
以下是钉钉闪记（会议录音自动转写）的内容：
---

{preprocessed_flash_note_content}

---
请严格按照上述要求输出结构化 PRD 文档。
```

### 分段处理 Prompt

当闪记内容超过 6000 字时，自动分段处理。分段模式下使用不同的 prompt 策略：

| 阶段 | Prompt 策略 | 输出格式 |
|------|------------|---------|
| **分段提取**（每段） | 从当前段提取需求信息 | JSON 结构化数据 |
| **合并生成**（最终） | 将各段 JSON 合并去重，生成完整 PRD | Markdown PRD |

**分段提取 prompt 输出的 JSON 结构**：

```json
{
  "projectName": "从内容中推断的项目名称",
  "background": "项目背景描述",
  "users": [{"role": "角色名", "description": "说明"}],
  "features": [
    {
      "moduleName": "模块名",
      "description": "功能描述",
      "rules": ["业务规则1", "业务规则2"],
      "fields": [
        {"name": "字段名", "type": "宜搭字段类型", "required": true, "description": "说明"}
      ]
    }
  ],
  "processes": [{"name": "流程名", "steps": "流程描述"}],
  "reports": [{"name": "报表名", "source": "数据来源", "chartType": "图表类型", "description": "说明"}],
  "nonFunctional": ["非功能需求1"],
  "unconfirmed": [{"content": "待确认内容", "description": "说明"}]
}
```

**合并阶段的规则**：
1. 相同功能模块的信息合并到一起
2. 重复的字段、规则去重
3. 冲突的信息以后面段落的为准（代表更新的讨论结论）
4. 补充遗漏的关联信息（如提到审批但未设计审批流程，需补充）

### 调用方式

```javascript
// 引入 prompt 构建模块
var promptBuilder = require('./build-flash-note-prompt');

// 方式 1：单段模式（闪记内容 ≤ 6000 字）
var prompt = promptBuilder.buildFlashNoteToPrdPrompt(cleanedContent, {
  projectName: '设备巡检系统',  // 可选
  industry: '制造业',           // 可选
});

// 方式 2：完整流程（自动判断分段）
var callAI = promptBuilder.createYidaAICaller(8000);
promptBuilder.flashNoteToPrd(rawFlashNote, {
  projectName: '设备巡检系统',
  callAI: callAI,
}).then(function(prdContent) {
  console.log('PRD 生成成功', prdContent);
});

// 方式 3：直接调用 AI 接口
fetch('/query/intelligent/txtFromAI.json', {
  method: 'POST',
  headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
  body: new URLSearchParams({
    _csrf_token: window.g_config._csrf_token,
    prompt: prompt,
    maxTokens: '8000',
    skill: 'ToText',
  }).toString(),
}).then(function (res) { return res.json(); })
  .then(function (data) {
    if (data.success) {
      var prdContent = data.content.content;
      console.log('PRD 生成成功', prdContent);
    }
  });
```
