From bb9d50decef5c5b4a4dc6b13a88f441095ce6916 Mon Sep 17 00:00:00 2001 From: liubiren Date: Thu, 14 May 2026 21:52:16 +0800 Subject: [PATCH] =?UTF-8?q?20260514=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 产品需求文档AI生成/main copy.py | 29 +++ 产品需求文档AI生成/main.py | 46 +--- .../skills/requirements-analysis/SKILL.md | 139 +++++++++++ .../skills/requirements-analysis/_meta.json | 6 + .../references/complete-example.md | 220 ++++++++++++++++++ .../requirements-analysis/references/epic-template.md | 60 +++++ .../references/prioritization-methods.md | 208 +++++++++++++++++ .../references/requirement-template.md | 63 +++++ .../references/user-story-template.md | 48 ++++ 产品需求文档AI生成/utils/agent.py | 67 +++++- 产品需求文档AI生成/utils/memory.py | 10 +- 产品需求文档AI生成/utils/memory_database.db | Bin 20480 -> 24576 bytes 12 files changed, 839 insertions(+), 57 deletions(-) create mode 100644 产品需求文档AI生成/main copy.py create mode 100644 产品需求文档AI生成/skills/requirements-analysis/SKILL.md create mode 100644 产品需求文档AI生成/skills/requirements-analysis/_meta.json create mode 100644 产品需求文档AI生成/skills/requirements-analysis/references/complete-example.md create mode 100644 产品需求文档AI生成/skills/requirements-analysis/references/epic-template.md create mode 100644 产品需求文档AI生成/skills/requirements-analysis/references/prioritization-methods.md create mode 100644 产品需求文档AI生成/skills/requirements-analysis/references/requirement-template.md create mode 100644 产品需求文档AI生成/skills/requirements-analysis/references/user-story-template.md diff --git a/产品需求文档AI生成/main copy.py b/产品需求文档AI生成/main copy.py new file mode 100644 index 0000000..640d8a4 --- /dev/null +++ b/产品需求文档AI生成/main copy.py @@ -0,0 +1,29 @@ +# -*- coding: utf-8 -*- +""" +主运行模块 +""" + +# 列举导入模块 +import asyncio + +from utils.agent import BaseAgent + + +# 主函数 +async def main(): + print("进入会话模式,输入 exit 结束会话") + + # 实例智能体 + agent = BaseAgent(instructions="请用一句话简洁回复。") + + while True: + user_prompt = input("用户:").strip().lower() + if user_prompt == "exit": + print("会话结束") + break + result = await agent.run(user_prompt=user_prompt) + print("智能体:", result.output) + + +if __name__ == "__main__": + asyncio.run(main=main()) diff --git a/产品需求文档AI生成/main.py b/产品需求文档AI生成/main.py index 509d83e..f6c245d 100644 --- a/产品需求文档AI生成/main.py +++ b/产品需求文档AI生成/main.py @@ -4,46 +4,16 @@ """ # 列举导入模块 -import asyncio -from uuid import uuid4 +import uvicorn from utils.agent import BaseAgent -from utils.memory import Memory - - -# 主函数 -async def main(): - print("进入会话模式,输入 exit 结束会话") - - # 实例智能体 - agent = BaseAgent(instructions="请用一句话简洁回复。") - # 实例记忆体 - memory = Memory() - - # 生成会话唯一标识 - session_id = uuid4().hex.lower() - - dialogue_round = 1 - while True: - user_prompt = input("用户:").strip().lower() - if user_prompt == "exit": - print("会话结束") - break - # 查询会话历史消息 - message_history = memory.read(session_id=session_id) - result = await agent.run( - user_prompt=user_prompt, message_history=message_history - ) - # 记录会话历史消息 - memory.create( - session_id=session_id, - dialogue_round=dialogue_round, - dialogue_message=result.new_messages(), - ) - - print("智能体:", result.output) - dialogue_round += 1 +# 实例智能体 +agent = BaseAgent( + instructions="使用提供的技能回答问题。", skill_name="requirements-analysis" +) +# 实例 Starlette 应用 +application = agent.to_web() if __name__ == "__main__": - asyncio.run(main=main()) + uvicorn.run(application, host="127.0.0.1", port=7932) diff --git a/产品需求文档AI生成/skills/requirements-analysis/SKILL.md b/产品需求文档AI生成/skills/requirements-analysis/SKILL.md new file mode 100644 index 0000000..fc674ad --- /dev/null +++ b/产品需求文档AI生成/skills/requirements-analysis/SKILL.md @@ -0,0 +1,139 @@ +--- +name: "requirements-analysis" +description: "资深需求分析师.通过多轮对话将想法生成产品需求文档。使用此技能当用户需要:(1) 需求分析,(2) 将史诗需求拆分为功能和用户故事,(3) 就多个需求进行优先级排序,(4) 识别利益相关者和依赖关系,(5) 定义验收标准,(6) 创建需求文档。支持单个需求分析、史诗级需求拆分、MoSCoW优先级排序方法。" +--- + +# 需求分析专家 + +## 核心能力 + +1. **对话式需求提取** - 通过系统化问题将一句话需求转化为全面规格说明 +2. **分层需求分解** - 将复杂需求从 EPIC → 需求 → 用户故事进行分解 +3. **优先级排序** - 支持 MoSCoW、RICE、价值 vs 成本、Kano、加权评分等方法 +4. **文档生成** - 创建结构化的专业需求文档 + +## 单个需求分析工作流程 + +### 步骤 1:初始需求捕获 + +提出问题: +1. 用一句话描述这个需求是什么? +2. 这解决了什么问题? +3. 谁提出了这个需求? + +### 步骤 2:利益相关者识别 + +提出问题: +1. 谁是最终用户? +2. 谁是业务负责人/赞助人? +3. 谁是技术利益相关者? +4. 是否有合规或安全利益相关者? + +### 步骤 3:详细需求规格 + +**功能性需求**: +- 需要哪些具体功能? +- 用户工作流程是什么? +- 需要捕获/显示哪些数据? + +**非功能性需求**: +- 性能期望(响应时间、吞吐量) +- 安全要求(认证、授权、加密) +- 可扩展性需求(并发用户数、数据量) +- 可用性要求(正常运行时间、灾难恢复) + +**业务背景**: +- 业务价值是什么? +- 成功指标是什么? +- 预期的投资回报率是多少? + +### 步骤 4:时间线和依赖关系 + +提出问题: +1. 什么时候需要?(硬性截止日期还是灵活的?) +2. 是否依赖其他项目/系统? +3. 是否有外部因素(监管截止日期、市场事件)? +4. 首选的交付方式是什么?(一次性交付还是分阶段?) + +### 步骤 5:验收标准定义 + +使用 Given-When-Then 格式: +``` +Given [前置条件] +When [操作] +Then [预期结果] +``` + +### 步骤 6:文档编写 + +参考 `references/requirement-template.md` 获取完整文档模板。 + +## EPIC 到用户故事的分解 + +### 层级结构 + +``` +EPIC(业务计划) +├── 需求 1(功能/能力) +│ ├── 用户故事 1.1 +│ ├── 用户故事 1.2 +│ └── 用户故事 1.3 +├── 需求 2(功能/能力) +│ ├── 用户故事 2.1 +│ └── 用户故事 2.2 +└── 需求 3(功能/能力) + └── 用户故事 3.1 +``` + +### 分解流程 + +1. **从 EPIC 开始** - 识别高层次业务计划,定义愿景和目标 +2. **分解为需求** - 将 EPIC 分解为逻辑功能或能力 +3. **将需求分解为用户故事** - 从用户角度编写用户故事,使用 INVEST 标准 +4. **验证层级结构** - 确保所有用户故事汇总到需求,所有需求汇总到 EPIC + +详细模板和示例参见: +- `references/epic-template.md` - EPIC 文档模板 +- `references/user-story-template.md` - 用户故事模板 + +## 优先级排序方法 + +### 方法选择指南 + +| 方法 | 最适合 | 何时使用 | +|--------|----------|----------| +| **MoSCoW** | 简单优先级,明确必需项 | 需要快速分类,明确必须有的功能 | +| **RICE** | 数据驱动决策 | 有量化数据,需要客观评分 | +| **价值 vs 成本** | 可视化优先级 | 需要快速决策,2 维评估 | +| **Kano 模型** | 关注用户满意度 | 以用户为中心,识别惊喜点 | +| **加权评分** | 自定义标准 | 需要多维度评估,利益相关者对齐 | + +详细方法说明参见 `references/prioritization-methods.md`。 + +## 最佳实践 + +1. **主动倾听** - 提出开放式问题,复述以确认理解,不要假设 +2. **迭代细化** - 从高层次理解开始,逐步添加细节 +3. **文档标准** - 使用一致的模板,包含所有必要信息 +4. **利益相关者管理** - 尽早识别所有利益相关者,保持定期沟通 +5. **可追溯性** - 将用户故事链接到需求,将需求链接到 EPIC +6. **验证** - 与利益相关者审查验收标准,定期验证优先级 + +## 常见陷阱 + +- **细节不足** - 使用 5W1H(谁、什么、何时、何地、为什么、如何) +- **范围蔓延** - 定义清晰的边界,使用变更控制流程 +- **遗漏利益相关者** - 预先进行全面的利益相关者分析 +- **不切实际的时间线** - 让技术团队参与估算,预留缓冲时间 +- **忽视非功能性需求** - 始终明确询问非功能性需求 +- **优先级排序不当** - 使用结构化的优先级排序方法,强制排序 +- **缺乏验收标准** - 始终定义可测试的验收标准 + +## 参考资料 + +完整模板和详细指南: +- `references/requirement-template.md` - 需求文档完整模板 +- `references/epic-template.md` - EPIC 文档模板 +- `references/user-story-template.md` - 用户故事模板 +- `references/prioritization-methods.md` - 优先级排序方法详解 +- `references/complete-example.md` - 完整需求分析示例 diff --git a/产品需求文档AI生成/skills/requirements-analysis/_meta.json b/产品需求文档AI生成/skills/requirements-analysis/_meta.json new file mode 100644 index 0000000..a5cbf18 --- /dev/null +++ b/产品需求文档AI生成/skills/requirements-analysis/_meta.json @@ -0,0 +1,6 @@ +{ + "ownerId": "kn7795tvpv9b8mq9wvh01g2e3n8167q2", + "slug": "requirements-analysis", + "version": "1.0.0", + "publishedAt": 1772418037477 +} \ No newline at end of file diff --git a/产品需求文档AI生成/skills/requirements-analysis/references/complete-example.md b/产品需求文档AI生成/skills/requirements-analysis/references/complete-example.md new file mode 100644 index 0000000..eee76b4 --- /dev/null +++ b/产品需求文档AI生成/skills/requirements-analysis/references/complete-example.md @@ -0,0 +1,220 @@ +# 完整需求分析示例 + +## 初始请求 +``` +用户:"我们需要一个管理者仪表板" +``` + +## 分析对话 + +### 第 1 轮:基本理解 +``` +AI:"我会帮你分析这个需求。让我先问几个问题: + +1. 管理者面临什么具体问题,这个仪表板将解决? +2. 谁在请求这个仪表板? +3. 这是用于现有系统还是新系统?" + +用户:"管理者无法轻松查看团队绩效指标。运营副总裁在请求它。这是用于我们现有的项目管理系统。" +``` + +### 第 2 轮:利益相关者识别 +``` +AI:"很好,让我了解利益相关者: + +1. 谁是将使用这个仪表板的管理者? +2. 除了运营副总裁,还有谁需要参与? +3. 是否有合规或安全要求?" + +用户:"所有部门经理(约 50 人)。我们需要让 IT 总监和数据隐私官参与,因为我们要显示员工数据。" +``` + +### 第 3 轮:详细需求 +``` +AI:"现在让我们深入细节: + +1. 管理者需要看到哪些具体指标? +2. 数据应该多久更新一次? +3. 管理者需要过滤或自定义视图吗? +4. 是否有性能要求?" + +用户:"他们需要看到:项目完成率、团队利用率、预算 vs 实际、即将到来的截止日期。数据应该每天更新。是的,他们应该能按团队、项目和日期范围过滤。仪表板应该在 3 秒内加载。" +``` + +### 第 4 轮:时间线和依赖关系 +``` +AI:"让我们讨论时间: + +1. 你什么时候需要这个仪表板? +2. 是否依赖其他项目? +3. 是否有特定事件或截止日期驱动这个需求?" + +用户:"我们需要在第二季度末(6 月 30 日)之前完成。它依赖于数据仓库项目首先完成。CEO 想在 7 月审查第二季度绩效,所以我们需要准备好。" +``` + +### 第 5 轮:验收标准 +``` +AI:"最后,让我们定义成功: + +1. 我们如何知道这个仪表板满足你的需求? +2. 哪些是必须有的功能,哪些是最好有的? +3. 你将如何测试?" + +用户:"成功意味着管理者可以做出数据驱动的决策,而无需向 IT 请求报告。必须有:我提到的 4 个指标、过滤和导出到 Excel。最好有:深入到单个项目、趋势图表。我们将首先与 5 位试点经理测试。" +``` + +--- + +## 最终需求文档 + +# 需求:管理者绩效仪表板 + +## 概述 +- **ID**:REQ-2026-001 +- **状态**:已批准 +- **优先级**:高 +- **创建日期**:2026-02-10 +- **最后更新**:2026-02-10 + +## 利益相关者 +- **业务负责人**:运营副总裁,Jane Smith +- **最终用户**:部门经理(50 位用户) +- **技术负责人**:IT 总监,John Doe +- **其他利益相关者**:数据隐私官(合规审查) + +## 业务背景 + +### 问题陈述 +部门经理目前缺乏对团队绩效指标的可见性,必须向 IT 请求自定义报告,导致决策延迟和 IT 资源使用效率低下。 + +### 业务价值 +- 将 IT 报告请求量减少 80% +- 实现实时数据驱动决策 +- 提高经理生产力 20% +- 支持 CEO 的第二季度绩效审查流程 + +### 成功指标 +- 1 个月内 90% 经理采用率 +- IT 报告请求减少 80% +- < 3 秒仪表板加载时间 +- 85% 用户满意度评分 + +## 需求详情 + +### 功能性需求 + +#### 核心指标显示 +1. **项目完成率** + - 显示按时完成的项目百分比 + - 按团队和整体显示 + - 颜色编码:绿色(>90%)、黄色(70-90%)、红色(<70%) + +2. **团队利用率** + - 显示团队容量利用百分比 + - 按团队成员和团队平均值显示 + - 包括可计费 vs 不可计费分解 + +3. **预算 vs 实际** + - 按项目显示预算差异 + - 显示为百分比和绝对值 + - 如果差异 > 10% 则警报 + +4. **即将到来的截止日期** + - 列出未来 30 天内有截止日期的项目 + - 按紧急程度排序 + - 以红色突出显示逾期项目 + +#### 过滤和自定义 +- 按团队过滤(多选) +- 按项目过滤(多选) +- 按日期范围过滤(最近 7/30/90 天,自定义范围) +- 保存每个用户的过滤偏好 +- 重置为默认视图 + +#### 数据导出 +- 导出到 Excel(.xlsx 格式) +- 包含基于当前过滤器的所有可见数据 +- 保持格式和颜色编码 + +#### 最好有的功能 +- 深入到单个项目详情 +- 趋势图表(显示随时间变化的指标的折线图) +- 电子邮件定时报告 + +### 非功能性需求 + +- **性能**: + - 仪表板加载时间 < 3 秒 + - 过滤器应用 < 1 秒 + - 支持 50 个并发用户 + +- **安全**: + - 基于角色的访问控制(经理只能看到他们的团队) + - 数据访问审计日志 + - 仅 HTTPS + +- **数据新鲜度**: + - 数据每天早上 6 点更新 + - 显示最后更新时间戳 + +- **可用性**: + - 移动响应式设计 + - 无障碍(符合 WCAG 2.1 AA) + - 无需培训的直观界面 + +- **可用性**: + - 工作时间(早上 6 点 - 晚上 8 点)99% 正常运行时间 + - 计划维护窗口:周日凌晨 2-4 点 + +## 验收标准 + +1. **Given** 我是一名经理,**When** 我登录仪表板,**Then** 我看到截至今天早上 6 点更新的我的团队绩效指标 + +2. **Given** 我正在查看仪表板,**When** 我应用过滤器(团队、项目、日期范围),**Then** 指标在 1 秒内更新以反映过滤后的数据 + +3. **Given** 我正在查看过滤后的数据,**When** 我点击"导出到 Excel",**Then** 下载一个 Excel 文件,包含所有可见数据并保持颜色编码 + +4. **Given** 我是一名经理,**When** 我尝试查看另一个团队的数据,**Then** 我被拒绝访问并看到适当的错误消息 + +5. **Given** 仪表板正在加载,**When** 页面加载时,**Then** 所有指标在 3 秒内可见 + +6. **Given** 我在移动设备上查看仪表板,**When** 我从手机访问它,**Then** 所有功能都可访问和可读 + +## 时间线 + +- **预期交付**:2026-06-30 +- **里程碑**: + - 需求批准:2026-02-15 + - 设计审查:2026-03-01 + - 开发完成:2026-05-31 + - 试点测试:2026-06-01 - 2026-06-15 + - 全面推出:2026-06-30 + +## 依赖关系 + +- **数据仓库项目**:必须在 2026-04-30 之前完成以提供数据源 +- **认证系统**:必须支持基于角色的访问控制 +- **Excel 导出库**:需要在 2026-03-15 之前评估和选择库 + +## 约束条件 + +- 必须使用现有项目管理数据库作为数据源 +- 必须符合数据隐私法规(GDPR、CCPA) +- 必须与当前浏览器版本(Chrome、Firefox、Safari、Edge)兼容 +- 预算:$50,000(开发 + 基础设施) + +## 风险 + +| 风险 | 影响 | 概率 | 缓解措施 | +|------|--------|-------------|------------| +| 数据仓库项目延迟 | 高 | 中 | 从直接数据库查询开始,稍后迁移到仓库 | +| 50 个并发用户的性能问题 | 中 | 低 | 在预发布环境进行负载测试,优化查询,添加缓存 | +| 经理抵制采用 | 高 | 低 | 让经理参与设计,提供培训,收集反馈 | +| 数据隐私问题 | 高 | 低 | 与数据隐私官提前审查,实施严格的访问控制 | + +## 备注 + +- 在全面推出之前,与来自不同部门的 5 位经理进行试点 +- 计划在 6 月为所有经理举办培训课程 +- 考虑根据反馈在第 2 阶段添加更多指标 +- 探索在未来版本中与移动应用集成 diff --git a/产品需求文档AI生成/skills/requirements-analysis/references/epic-template.md b/产品需求文档AI生成/skills/requirements-analysis/references/epic-template.md new file mode 100644 index 0000000..382f0aa --- /dev/null +++ b/产品需求文档AI生成/skills/requirements-analysis/references/epic-template.md @@ -0,0 +1,60 @@ +# EPIC 文档模板 + +## EPIC:[标题] + +### 愿景 +[高层次业务目标或能力] + +### 业务目标 +- [目标 1] +- [目标 2] + +### 目标用户 +[用户画像或细分] + +### 成功指标 +- [KPI 1]:[目标] +- [KPI 2]:[目标] + +### 时间线 +- **开始日期**:[日期] +- **目标完成**:[日期] +- **预计时长**:[周/月] + +### 需求列表 +1. [需求 1] +2. [需求 2] +3. [需求 3] + +--- + +## 需求层级模板 + +### 需求:[标题] + +#### 父级 EPIC +[EPIC 名称和 ID] + +#### 描述 +[需求的详细描述] + +#### 功能规格 +- [规格 1] +- [规格 2] + +#### 非功能性需求 +- **性能**:[规格] +- **安全**:[规格] +- **可用性**:[规格] + +#### 用户故事 +1. [用户故事 1] +2. [用户故事 2] +3. [用户故事 3] + +#### 依赖关系 +- [依赖 1] + +#### 验收标准 +- [标准 1] +- [标准 2] diff --git a/产品需求文档AI生成/skills/requirements-analysis/references/prioritization-methods.md b/产品需求文档AI生成/skills/requirements-analysis/references/prioritization-methods.md new file mode 100644 index 0000000..e79361d --- /dev/null +++ b/产品需求文档AI生成/skills/requirements-analysis/references/prioritization-methods.md @@ -0,0 +1,208 @@ +# 优先级排序方法详解 + +## 方法 1:MoSCoW 优先级排序 + +### 分类 +- **必须有(Must Have)**:发布的关键功能,不可协商 +- **应该有(Should Have)**:重要但不关键,必要时可以推迟 +- **可以有(Could Have)**:最好有,时间允许时包含 +- **不会有(Won't Have)**:本次发布不在范围内 + +### 流程 +1. 列出所有需求 +2. 对每个需求进行分类 +3. 在每个类别内按重要性排序 +4. 与利益相关者验证 + +### 示例 +``` +必须有: +1. 使用邮箱/密码的用户登录 +2. 密码重置功能 +3. 基本用户资料 + +应该有: +1. 社交登录(Google、Facebook) +2. 双因素认证 +3. 头像上传 + +可以有: +1. 使用手机号登录 +2. 生物识别认证 +3. 活动日志 + +不会有(本次发布): +1. 单点登录(SSO) +2. LDAP 集成 +3. OAuth 提供商 +``` + +--- + +## 方法 2:RICE 评分 + +### 公式 +RICE = (覆盖面 × 影响力 × 信心度) / 工作量 + +### 组成部分 +- **覆盖面(Reach)**:这将影响多少用户?(每季度) +- **影响力(Impact)**:对每个用户的影响有多大? + - 3 = 巨大 + - 2 = 高 + - 1 = 中 + - 0.5 = 低 + - 0.25 = 最小 +- **信心度(Confidence)**:我们对估算有多自信? + - 100% = 高 + - 80% = 中 + - 50% = 低 +- **工作量(Effort)**:这需要多少人月? + +### 流程 +1. 对每个需求在所有四个维度上评分 +2. 计算 RICE 分数 +3. 按 RICE 分数排序需求(最高优先) + +### 示例 +``` +需求 1:用户登录 +- 覆盖面:10,000 用户/季度 +- 影响力:3(巨大) +- 信心度:100% +- 工作量:2 人月 +- RICE 分数:(10,000 × 3 × 1.0) / 2 = 15,000 + +需求 2:社交登录 +- 覆盖面:5,000 用户/季度 +- 影响力:2(高) +- 信心度:80% +- 工作量:1 人月 +- RICE 分数:(5,000 × 2 × 0.8) / 1 = 8,000 + +需求 3:双因素认证 +- 覆盖面:10,000 用户/季度 +- 影响力:2(高) +- 信心度:90% +- 工作量:1.5 人月 +- RICE 分数:(10,000 × 2 × 0.9) / 1.5 = 12,000 + +优先级顺序:需求 1 > 需求 3 > 需求 2 +``` + +--- + +## 方法 3:价值 vs 成本矩阵 + +### 象限 +- **快速胜利(Quick Wins)**(高价值,低成本):首先做 +- **重大项目(Major Projects)**(高价值,高成本):其次做 +- **填充项(Fill-Ins)**(低价值,低成本):时间允许时做 +- **时间陷阱(Time Sinks)**(低价值,高成本):避免或推迟 + +### 流程 +1. 对每个需求的价值评分(1-10) +2. 对每个需求的成本评分(1-10) +3. 在 2×2 矩阵上绘制 +4. 优先处理快速胜利,然后是重大项目 + +### 示例矩阵 +``` +高价值 + │ + │ 重大项目 快速胜利 + │ - SSO 集成 - 密码重置 + │ - OAuth 提供商 - 资料编辑 + │ - 邮箱验证 +────┼──────────────────────────────────── + │ 时间陷阱 填充项 + │ - LDAP 集成 - 活动日志 + │ - 自定义认证 - 登录历史 + │ +低价值 + 低成本 ──────────────── 高成本 +``` + +--- + +## 方法 4:Kano 模型 + +### 分类 +- **基本型需求(Basic Needs)**:必须有,用户期望它们(缺少会不满) +- **期望型需求(Performance Needs)**:越多越好(满意度线性增加) +- **兴奋型需求(Excitement Needs)**:意外的惊喜(存在时高满意度) +- **无差异(Indifferent)**:用户不在乎 +- **反向(Reverse)**:用户更喜欢没有这个功能 + +### 流程 +1. 通过功能性和非功能性问题调查用户 +2. 对每个功能进行分类 +3. 优先级:基本型需求 → 期望型需求 → 兴奋型需求 + +### 示例 +``` +基本型需求(必须有): +- 用户登录 +- 密码安全 +- 账户恢复 + +期望型需求(应该有): +- 快速登录(< 2 秒) +- 多种登录选项 +- 会话管理 + +兴奋型需求(可以有): +- 生物识别登录 +- 无密码认证 +- 社交登录 + +无差异: +- 登录自定义主题 +``` + +--- + +## 方法 5:加权评分 + +### 流程 +1. 定义评估标准(例如:业务价值、技术可行性、用户影响、战略一致性) +2. 为每个标准分配权重(总计 = 100%) +3. 对每个需求在每个标准上评分(1-10) +4. 计算加权分数 +5. 按加权分数排序 + +### 示例 +``` +标准权重: +- 业务价值:40% +- 用户影响:30% +- 技术可行性:20% +- 战略一致性:10% + +需求 1:用户登录 +- 业务价值:10 × 0.4 = 4.0 +- 用户影响:10 × 0.3 = 3.0 +- 技术可行性:8 × 0.2 = 1.6 +- 战略一致性:9 × 0.1 = 0.9 +- 总分:9.5 + +需求 2:社交登录 +- 业务价值:7 × 0.4 = 2.8 +- 用户影响:8 × 0.3 = 2.4 +- 技术可行性:6 × 0.2 = 1.2 +- 战略一致性:7 × 0.1 = 0.7 +- 总分:7.1 + +优先级顺序:需求 1 > 需求 2 +``` + +--- + +## 方法选择指南 + +| 方法 | 最适合 | 优点 | 缺点 | +|--------|----------|------|------| +| **MoSCoW** | 简单优先级,明确必需项 | 易于理解,快速 | 主观,无量化评分 | +| **RICE** | 数据驱动决策,多需求 | 客观,考虑多因素 | 需要估算,耗时 | +| **价值 vs 成本** | 可视化优先级,快速决策 | 简单,可视化,快速 | 过于简化,只有 2 个维度 | +| **Kano 模型** | 关注用户满意度 | 以用户为中心,识别惊喜点 | 需要用户研究,复杂 | +| **加权评分** | 自定义标准,利益相关者对齐 | 灵活,透明 | 需要权重共识 | diff --git a/产品需求文档AI生成/skills/requirements-analysis/references/requirement-template.md b/产品需求文档AI生成/skills/requirements-analysis/references/requirement-template.md new file mode 100644 index 0000000..68bb7e7 --- /dev/null +++ b/产品需求文档AI生成/skills/requirements-analysis/references/requirement-template.md @@ -0,0 +1,63 @@ +# 需求文档模板 + +## 概述 +- **ID**:REQ-001 +- **状态**:草稿/已批准/进行中/已完成 +- **优先级**:高/中/低 +- **创建日期**:[日期] +- **最后更新**:[日期] + +## 利益相关者 +- **业务负责人**:[姓名、部门] +- **最终用户**:[用户画像] +- **技术负责人**:[姓名、团队] +- **其他利益相关者**:[列表] + +## 业务背景 + +### 问题陈述 +[这解决了什么问题?] + +### 业务价值 +[为什么这很重要?] + +### 成功指标 +- [指标 1]:[目标] +- [指标 2]:[目标] + +## 需求详情 + +### 功能性需求 +1. [需求 1] +2. [需求 2] + +### 非功能性需求 +- **性能**:[规格] +- **安全**:[要求] +- **可扩展性**:[期望] +- **可用性**:[SLA] + +## 验收标准 +1. Given [前置条件], When [操作], Then [结果] +2. Given [前置条件], When [操作], Then [结果] + +## 时间线 +- **预期交付**:[日期] +- **里程碑**: + - [里程碑 1]:[日期] + - [里程碑 2]:[日期] + +## 依赖关系 +- [依赖 1]:[描述] +- [依赖 2]:[描述] + +## 约束条件 +- [约束 1] +- [约束 2] + +## 风险 +- [风险 1]:[缓解措施] +- [风险 2]:[缓解措施] + +## 备注 +[附加信息] diff --git a/产品需求文档AI生成/skills/requirements-analysis/references/user-story-template.md b/产品需求文档AI生成/skills/requirements-analysis/references/user-story-template.md new file mode 100644 index 0000000..ee405a9 --- /dev/null +++ b/产品需求文档AI生成/skills/requirements-analysis/references/user-story-template.md @@ -0,0 +1,48 @@ +# 用户故事模板 + +## 用户故事:[标题] + +### 故事 +作为 [用户角色] +我想要 [操作] +以便 [收益] + +### 父级需求 +[需求名称和 ID] + +### 验收标准 +1. Given [前置条件], When [操作], Then [结果] +2. Given [前置条件], When [操作], Then [结果] +3. Given [前置条件], When [操作], Then [结果] + +### 技术说明 +- [实现细节 1] +- [实现细节 2] + +### 估算 +- **故事点数**:[点数] +- **预计小时数**:[小时] + +### 依赖关系 +- [依赖 1] + +### 完成定义 +- [ ] 代码完成并审查 +- [ ] 单元测试编写并通过 +- [ ] 集成测试通过 +- [ ] 文档更新 +- [ ] 部署到预发布环境 +- [ ] 验收标准验证 + +--- + +## INVEST 标准检查清单 + +用户故事应该满足 INVEST 标准: + +- **I - Independent(独立)**:故事应该尽可能独立,可以任意顺序开发 +- **N - Negotiable(可协商)**:故事不是合同,细节可以协商 +- **V - Valuable(有价值)**:故事必须为用户或业务提供价值 +- **E - Estimable(可估算)**:团队必须能够估算故事的大小 +- **S - Small(小型)**:故事应该足够小,可以在一个迭代中完成 +- **T - Testable(可测试)**:故事必须有明确的验收标准,可以测试 diff --git a/产品需求文档AI生成/utils/agent.py b/产品需求文档AI生成/utils/agent.py index 5853b15..af5a9c4 100644 --- a/产品需求文档AI生成/utils/agent.py +++ b/产品需求文档AI生成/utils/agent.py @@ -4,12 +4,20 @@ """ # 列举导入模块 -from typing import List - -from pydantic_ai import Agent, AgentRunResult, ModelMessage +from pathlib import Path +import sys +from typing import List, Optional +from uuid import uuid4 +from starlette.applications import Starlette +from pydantic_ai import Agent, AgentRunResult from pydantic_ai.models.openai import OpenAIChatModel from pydantic_ai.output import OutputSpec from pydantic_ai.providers.openai import OpenAIProvider +from pydantic_ai_skills import SkillsToolset + +sys.path.append(Path(__file__).parent.as_posix()) + +from memory import Memory class BaseAgent: @@ -19,27 +27,52 @@ class BaseAgent: 2)异步运行 """ - def __init__(self, instructions: str, output_type: OutputSpec = str): + def __init__( + self, + instructions: str, + output_type: OutputSpec = str, + skill_name: Optional[str] = None, + ): """ 初始化智能体 :param instructions: 指令 :param output_type: 输出类型 + :param skill_name: 技能名称,默认不使用技能 :return: 智能体实例 """ + # 生成会话唯一标识 + self.session_id = uuid4().hex.lower() # 实例智能体 - self.agent = self._instantiate( + self.agent = self._instantiate_agent( + skill_name=skill_name, instructions=instructions, output_type=output_type, ) + # 实例记忆体 + self.memory = Memory() - def _instantiate(self, instructions: str, output_type: OutputSpec) -> Agent: + def _instantiate_agent( + self, skill_name: Optional[str], instructions: str, output_type: OutputSpec + ) -> Agent: """ 实例智能体 + :param skill_name: 技能名称 :param instructions: 指令 :param output_type: 输出类型 :return: 智能体实例 """ + # 若技能名称为空则技能集合为 None,若技能名称非空则构建技能路径 + if not skill_name: + toolsets = None + else: + toolsets = [ + SkillsToolset( + directories=[Path(__file__).parent.parent / "skills" / skill_name] + ) + ] + agent = Agent( + toolsets=toolsets, model=OpenAIChatModel( model_name="deepseek-v4-flash", provider=OpenAIProvider( @@ -52,15 +85,27 @@ class BaseAgent: ) return agent - async def run( - self, user_prompt: str | List[str], message_history: List[ModelMessage] = [] - ) -> AgentRunResult: + async def run(self, user_prompt: str | List[str]) -> AgentRunResult: """ 异步运行 :param user_prompt: 用户提示词 - :param message_history: 历史消息 :return: 智能体回复 """ - return await self.agent.run( + # 查询会话历史消息 + message_history = self.memory.read(session_id=self.session_id) + result = await self.agent.run( user_prompt=user_prompt, message_history=message_history ) + # 记录会话历史消息 + self.memory.create( + session_id=self.session_id, + dialogue_message=result.new_messages(), + ) + return result + + def to_web(self) -> Starlette: + """ + 实例 Starlette 应用 + :return: Starlette 应用实例 + """ + return self.agent.to_web() diff --git a/产品需求文档AI生成/utils/memory.py b/产品需求文档AI生成/utils/memory.py index f067185..0c00345 100644 --- a/产品需求文档AI生成/utils/memory.py +++ b/产品需求文档AI生成/utils/memory.py @@ -43,8 +43,6 @@ class Memory(SQLite): id TEXT PRIMARY KEY, --会话唯一标识 session_id TEXT NOT NULL, - --对话轮次 - dialogue_round INTEGER NOT NULL, --对话消息 dialogue_message TEXT NOT NULL, --时间戳(毫秒) @@ -55,13 +53,10 @@ class Memory(SQLite): except Exception as exception: raise RuntimeError(f"初始化记忆体发生异常:{str(exception)}") from exception - def create( - self, session_id: str, dialogue_round: int, dialogue_message: List[ModelMessage] - ) -> bool: + def create(self, session_id: str, dialogue_message: List[ModelMessage]) -> bool: """ 新增对话消息 :param session_id: 会话唯一标识 - :param dialogue_round: 对话轮次 :param dialogue_message: 对话消息 :return: 新增是否成功 """ @@ -69,12 +64,11 @@ class Memory(SQLite): with self: return self.execute( sql=""" - INSERT INTO messages (id, session_id, dialogue_round, dialogue_message, timestamp) VALUES (?, ?, ?, ?, ?) + INSERT INTO messages (id, session_id, dialogue_message, timestamp) VALUES (?, ?, ?, ?) """, parameters=( uuid4().hex.lower(), session_id, - dialogue_round, ModelMessagesTypeAdapter.dump_json(dialogue_message), int(time.time() * 1000), ), diff --git a/产品需求文档AI生成/utils/memory_database.db b/产品需求文档AI生成/utils/memory_database.db index d41aeb50b6213f6b46c3f5691eddcd3c05d3a725..d6ac1c60ddb5c99271d0e6f798d455398407c748 100644 GIT binary patch delta 2057 zcmbVNOH5Q(7@jAzDBhT=P%YF>Ns}gAyzd8TY}0N8C0(?Owy`ny8I1~}w&})l1%Xjy zcpMSYQHpVtkUGP3usjCDuDWZJuHC3}?%Y|~jiyOs)BkdDA`~C#WM+~%^FO}t`@i#F z>j%Ge$KStg<7+;juLM3%Ux9&I77pva|FWF;%NHo0@Rd&xzh*XW|9w6Bu>4@zsjdFf zimEDqv^3LD-r`5^68F{zh{tYv3Gp}aINf?Jl$qM}@w%;W5)Q#vC{RY+^@WICK4O{} zBn}h1pqfN9)&!gUCM!#V#&fhJ$sEtI3U4T;$}pm=$dsT6VK+z<43<+2QQ}30Q%qA8 z8Cs@9O;aF;)$|Y=+|jZQI{C}?`^xr*rqZqBfPtF|m-K87lr%MEvYQ6O>&qb`5Pal& zJsy0NZY=~GdTK)O=gq9suV4gilIvyt4cbnQE0=Kt+0+OU01RC^;2=g&IV zPul5r6mQ(NC4cjrJr>1t=bTgm2+*=D0t2*f+OKQ|X!KJ;kiW^Uq33lFUJNNwbR zj{FrBh_Bl1=g`TjodK3czf>Lc(}=9DFS2B)I+~S4ibCI2C-yv5grUBQoT!Z)Iok5= z0o^#d@2GL?NK5lEW8VQiQXipJ$)Gh!Aq9idNRBlmQZ`M6G+C9ROj?o+Q;*c5KdURz zZ*OjRjw~yr+qt&9Md^UfVdJ=>E60^cee*Ym4xRYgf2C%DyLVOzf>qF1!zVE7%FL67 zU`d(lCx7W(U+LX+>mQ{J{qKY!WK;;h%+s&nrb_grq4W(aH#1QfP8P0SfT85FR&F-B z!cUA)CsMM&N-O;2or)q;^b==@94U&XNlFx_l9b569g_u#(b!k@QyWe!E8H(Sh8|ncU18K<`_Z!5+@yhzorw0C#49K8r{$n(lTo(Jc@C;;7>)(2c(k9>9nchBYK zx}XjC-z^oJ#PRVWKfqqp|6$wwS=^U$Iu_jf9Ur%E^*E^^z~uhyzwRU_@$F#`(-M>( z`+WCOoAZvo0T-K4|k4^1uOq8}ica5CvDb2rNIAbduLR7!czuUdd-~+SZNLNR|^iGI$gOh^-PY zpS|IxL4(eOlN@)FbCBPbTj*MzN@vu*5OZ7In$EY+xoqTrM`J{z=hg=k( z&0?25ns8EAmw*ho<6F|)TR8bkQ+6!zz&eS$yPzz@;Q1jSTI7mjqt33BYbVzv_Gv4Z zO?Z`X-^8*|XU=%xtGM86z0Tq!%o)_iy%``5OKs%6hw~R-;16i@>{@Gd7n-}*Xcpb6 zIvAuGY2{{<>)?6CbK=U)CckL2sj5UVysVSFDN`gT%RH&dyh>^+rJK5`ag@Za+H5bm M#M1xUY+p3}3$PlbAOHXW delta 242 zcmZoTz}T>Wae}lUD+2=q2*Uv5L>*(Gpk7rWFaHk)CSH36UVHxIn*|ll^Gvqq&E71^ z$Hyp8lwX>cq5uS*ej%>zu0fLx_%(T-uHX4${oH5UI-WJI=bBu|FEv?${|y%-|8J1d zto*+>7A|AiyhX%`TOuc?HkJ`6$il?Me}{pIe-Z=#cK%8HcYwB-^G|H>ojgfDpPS2< zfsthk1IrecEgK700Ck#dVcnb|)yFCV);>?+w@?W$&=5w>Sqz-BHWp6c&eUp0N%hwt^fc4