Files
digital-psychology/.ai/product/feature-spec/ask.md
T
jackyu66gitandCursor 89756f65b4 feat(ECR-012–016): 合规、题库、时辰刷新、头像、MBTI OEJTS 与埋点
落地输入合规、探索题库、报告日/时辰刷新、账号头像、OEJTS 量表,并补齐 H5 埋点与 Admin 漏斗;同步 ESS 工件、切至自建 Git、清理 GitHub Actions。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-13 01:27:58 +08:00

185 lines
5.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Feature Spec: AI 成长助手(问答)
> Status: `Active` · Map: `§3 问答 [P1]` · Phase: `P1`
> 规范:[../feature-design.md](../feature-design.md)
---
## 1. 功能定义
| 字段 | 内容 |
|---|---|
| Name | AI 成长助手 |
| Purpose | 结合个人档案,用对话帮助认识自己、理解关系、整理情绪与生活节奏 |
| Business Goal | 战略中心 Tab 留存;配额驱动会员 |
| In | Out |
|---|---|
| 挂 profile 的多轮对话;场景入口 | 占卜/运势/预测未来 |
| DeepSeek(可配)+ 规则引擎降级 | 医疗诊断 |
| 免费次数 + 额度包(ask_pack)+ 会员配额 | 无档案空聊(禁止) |
---
## 2. 用户价值
1. **为何需要:** 看完画像仍有具体情境问题。
2. **完成后获得:** 结合档案的结构化建议与可执行小步骤。
3. **为何付费:** 免费次数用尽后可购买问答额度包,或开通成长会员获得更多回复。
---
## 3. 用户角色
| Actor | 能力 |
|---|---|
| Visitor | 有档案则可问;受配额限制 |
| VIP | 额外 Ask 配额 |
| 无档案 | 仅引导建档,不可消耗成功回复 |
---
## 4. 用户流程
```text
进入 /ask
无档案? → Empty 引导首页/档案
选择档案(我 / TA+ 可选场景
输入问题 → 检查配额
├─ 耗尽 → 引导购买额度包 / 成长会员(mock 支付后立刻加次)
└─ 有余 → 创建/续 thread → assistant **SSE 流式**回复(delta → done
DeepSeek 失败/无 key → 规则引擎降级(仍按字流式输出)
```
---
## 5. 页面设计
| 路由 | 页面 |
|---|---|
| `/ask` | AskPageChatThread |
```text
/ask
├── 愈心 AI / 顾问 Tab
├── 顾问列表 → 顾问专属对话(?advisor=key · 顶栏返回回列表)
├── Empty(无档案)
├── Loading(发送中)
├── Normal(历史 + 输入)
├── Error(发送失败可重试)
└── Quota Exhausted(额度包 + 会员)
```
---
## 6. 页面状态规范
| 状态 | UI |
|---|---|
| Empty | 无档案引导 |
| Loading | 发送中禁用重复点 |
| Error | 失败 + 重试 |
| Normal | 消息列表 |
| Quota | 明确耗尽文案 + 额度包购买 + `/membership` |
---
## 7. Business Rules
| ID | Rule |
|---|---|
| R1 | 每条用户消息必须绑定 `profile_id`self 或 other |
| R2 | 免费回复次数有上限(实现:如 3);可购 `ask_pack` 加次;会员另计配额 |
| R3 | 配额耗尽返回明确业务错误,不生成付费假回复;引导购买额度或会员 |
| R7 | 扣次顺序:会员配额 → 已购额度包 → 免费额度(非会员);购买额度不解锁报告深度版 |
| R4 | LLM 可选;失败降级规则引擎,仍须 lexicon 安全 |
| R5 | 禁止占卜/算命/吉凶恐吓/医疗诊断;可用愈心解码·星座·人格匹配等探索向用语 |
| R6 | 回复宜短(约 80–160 字):回应当下 → 1 条档案洞察 → 1–2 条可执行建议;system prompt 须对齐 lexicon 与产品定位 |
---
## 8. 数据模型影响
| 表 | 备注 |
|---|---|
| `ask_threads` | user_id, profile_id |
| `ask_messages` | role, content |
| `ask_quotas` / 等价 | 余量 |
| `users.ask_paid_quota_left` | 已购额度包余量 |
---
## 9. API 需求
| Method | Path | 意图 |
|---|---|---|
| GET | `/api/v1/ask/quota` | 余量 |
| POST | `/api/v1/ask/threads` | 创建线程(profile_id, scene? |
| POST | `/api/v1/ask/threads/{id}/messages` | 发消息拿回复(默认 JSON) |
| POST | `/api/v1/ask/threads/{id}/messages?stream=1` | SSE`meta` / `delta` / `done` / `error` |
| DELETE | `/api/v1/ask/threads/{id}` | 清空该会话(软删除) |
| POST | `/api/v1/orders` kind=`ask_pack` | 购买额度包(plan: pack10/pack30/pack100 |
| POST | `/api/v1/orders/{id}/pay-mock` | 支付后增加 `ask_paid_quota_left` |
---
## 10. 权限设计
| 能力 | 无档案 | 有配额 | 配额耗尽 | VIP 有配额 |
|---|---|---|---|---|
| 提问 | ✗ | ✓ | ✗ | ✓ |
---
## 11. 埋点
| Event | 触发 |
|---|---|
| `ask_opened` | 进入页 |
| `ask_message_sent` | 发送 |
| `ask_reply_received` | 成功回复 |
| `ask_quota_exhausted` | 耗尽 |
| `ask_fallback_rule` | 走规则引擎 |
---
## 12. 测试验收标准
**Given** 有 Self 档案与配额
**When** 发送问题
**Then** 返回助手消息且含免责;配额减一
**Given** 配额为 0
**When** 再发送
**Then** 业务错误引导购买额度/会员,无助手胡编
**Given** 免费额度耗尽
**When** pay-mock `ask_pack` pack10
**Then** GET `/ask/quota` remaining ≥ 10,可继续提问
**Given** 无 DeepSeek key
**When** 提问
**Then** 规则引擎仍给出档案相关回复
---
## 13. AI 开发前检查
- [x] Spec 齐全 · map · lexicon · OpenAPI · 可测
---
## 14. Implementation Notes
| 项 | 内容 |
|---|---|
| Packages | `service/ask` · `internal/ask` · `internal/llm/deepseek` · `AskPage` |
| Config | `config.local.yaml` deepseek.* |
| Gaps | 长期记忆 P3;顾问预约仅占位;埋点未接 |
| Tests | ask reply L1;集成 threadAskPage.spec |
| Process Review | 2026-08-02 [P1-PROCESS-REVIEW](P1-PROCESS-REVIEW.md) · 设计闭合 · 实现 PASS · 测试 PASS |