# 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` | AskPage(ChatThread) | ```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;集成 thread;AskPage.spec | | Process Review | 2026-08-02 [P1-PROCESS-REVIEW](P1-PROCESS-REVIEW.md) · 设计闭合 · 实现 PASS · 测试 PASS |