第03章 产品定义:LLM应用的最小可行产品设计

第03章 产品定义:LLM应用的最小可行产品设计

“完美是优秀的敌人。MVP不是劣质产品,是对核心价值最简洁的表达。” —— Reid Hoffman


验证了需求,现在该定义产品了。对工程师来说,这一步最容易犯的错误是:把MVP做成了完整产品的缩水版,而不是核心价值的最小实现

本章帮你用正确的方式定义你的LLM应用MVP。


3.1 Job-to-be-Done:用户真正在雇佣什么

# 著名的"奶昔研究"背后的产品逻辑
# 麦当劳研究奶昔销量时发现:
# 早晨购买奶昔的顾客不是想要甜食
# 他们"雇佣"奶昔来完成一个工作:
# "在开车上班时打发无聊,同时代替早餐"

# 对LLM应用同样适用:

JTBD_FRAMEWORK = {
    "表面需求(用户说的)": "我需要一个AI助手帮我写邮件",
    "真实工作(JTBD)": "让我从繁琐的邮件撰写中解放出来,把时间花在更重要的事上",
    "功能需求(怎么做)": "自动生成邮件草稿,需要我只做最终确认",
    "情感需求(感受什么)": "不再为邮件焦虑,感到高效和专业",
    "社会需求(显示什么)": "发出去的邮件让收件人觉得我很专业",
}

def identify_jtbd(product_idea: str, interviews: list[dict]) -> dict:
    """
    从访谈数据中提取用户的真实Job
    """
    # 分析三类关键语句
    functional_jobs = []
    emotional_jobs = []
    social_jobs = []
    
    for interview in interviews:
        for quote in interview.get("quotes", []):
            if any(word in quote for word in ["节省时间", "自动化", "不需要手动"]):
                functional_jobs.append(quote)
            elif any(word in quote for word in ["烦", "压力", "担心", "焦虑"]):
                emotional_jobs.append(quote)
            elif any(word in quote for word in ["看起来", "专业", "老板", "团队觉得"]):
                social_jobs.append(quote)
    
    return {
        "功能性工作(效率/任务完成)": functional_jobs,
        "情感性工作(消除焦虑/提升满足感)": emotional_jobs,
        "社会性工作(印象管理/认可)": social_jobs,
    }

关键问题:当你的LLM应用真正工作时,用户的哪个"工作"被完成了?


3.2 核心功能取舍:只做一件事

# 功能优先级矩阵

from enum import Enum

class Priority(Enum):
    MUST_HAVE = "必须有(核心价值)"
    SHOULD_HAVE = "应该有(体验加分)"
    NICE_TO_HAVE = "锦上添花(v2再做)"
    WONT_HAVE = "不做(永远放弃)"

def prioritize_features(features: list[dict]) -> dict:
    """
    使用 MoSCoW 优先级方法筛选MVP功能
    
    判断标准:
    - MUST_HAVE: 没有这个功能,产品无法使用/无法创造核心价值
    - SHOULD_HAVE: 没有这个功能,用户体验明显下降,但产品仍然可用
    - NICE_TO_HAVE: 用户提到过,但不影响核心决策
    - WONT_HAVE: 很酷但不在核心路径上
    """
    categorized = {p: [] for p in Priority}
    
    for feature in features:
        name = feature["name"]
        
        # 判断标准
        is_core = feature.get("without_it_product_fails", False)
        user_requested_count = feature.get("user_requested_count", 0)
        is_technical_foundation = feature.get("is_technical_foundation", False)
        
        if is_core or is_technical_foundation:
            categorized[Priority.MUST_HAVE].append(name)
        elif user_requested_count >= 5:
            categorized[Priority.SHOULD_HAVE].append(name)
        elif user_requested_count >= 2:
            categorized[Priority.NICE_TO_HAVE].append(name)
        else:
            categorized[Priority.WONT_HAVE].append(name)
    
    return {p.value: features for p, features in categorized.items()}

# 一个合同审查AI的功能优先级示例
CONTRACT_REVIEW_FEATURES = [
    {"name": "上传PDF合同", "without_it_product_fails": True, "user_requested_count": 20},
    {"name": "识别风险条款", "without_it_product_fails": True, "user_requested_count": 20},
    {"name": "生成审查报告", "without_it_product_fails": True, "user_requested_count": 18},
    {"name": "标注具体位置(第X页第Y条)", "user_requested_count": 12, "is_technical_foundation": False},
    {"name": "合同对比功能(与标准合同比较)", "user_requested_count": 7},
    {"name": "法条引用", "user_requested_count": 5},
    {"name": "团队协作/评论", "user_requested_count": 3},
    {"name": "合同模板库", "user_requested_count": 2},
    {"name": "手机App", "user_requested_count": 1},
    {"name": "合同签署功能(如DocuSign)", "user_requested_count": 1},
]

result = prioritize_features(CONTRACT_REVIEW_FEATURES)
for priority, features in result.items():
    if features:
        print(f"\n{priority}:")
        for f in features:
            print(f"  - {f}")

3.3 用户旅程:从痛点到Aha Moment

LLM应用的用户旅程关键节点:

1. 发现(Discovery)
   └── 用户第一次听说你的产品
   └── 关键问题:他们在哪里发现你?什么触发了点击?

2. 注册(Sign-up)
   └── 关键问题:注册流程有多长?需要信用卡吗?
   └── 黄金法则:注册到首次使用 < 2分钟

3. ⭐ Aha Moment(第一次感受到价值)
   └── 这是最关键的节点!
   └── 用户第一次说"哦,这真的有用!"的那一刻
   └── 对于合同审查AI:上传合同后30秒内看到第一个风险条款

4. 习惯养成(Habit)
   └── 用户开始在日常工作流中使用你的产品
   └── 关键问题:用户每天/每周会用几次?

5. 付费(Conversion)
   └── 从免费试用到付费
   └── 关键问题:是什么触发了付费决策?

6. 留存(Retention)
   └── 用户持续使用,续订
   └── 关键问题:用户用了3个月后,还会用吗?为什么?
# Aha Moment设计原则

def design_aha_moment(product: dict) -> dict:
    """
    设计你产品的Aha Moment
    
    原则:
    1. 越快越好(< 60秒)
    2. 具体而可见(不是"分析完成",是"发现了3个高风险条款")
    3. 超出预期(给用户一个惊喜,而不只是"满足预期")
    """
    return {
        "触发动作": product["first_action"],
        "等待时间": "< 30秒",
        "结果呈现": product["compelling_result"],
        "情感设计": "结果要让用户想截图/分享",
    }

# 合同审查AI的Aha Moment设计
aha_design = design_aha_moment({
    "first_action": "拖拽PDF到页面",
    "compelling_result": """
    ⚠️ 发现3个高风险条款:
    
    1. 第5页第2条:违约赔偿金无上限 → 建议添加赔偿上限条款
    2. 第8页第4条:自动续约且没有30天通知要求 → 建议修改通知期
    3. 第12页第1条:管辖法院条款对你不利 → 建议协商改为仲裁
    
    [查看完整报告]  [导出PDF]
    """,
})

3.4 AI交互设计:不要让用户感到被AI控制

# LLM应用的6个交互设计原则

LLM_UX_PRINCIPLES = {
    "原则1:设置合理的期望": {
        "问题": "AI有时会输出错误信息,用户一旦发现会立刻失去信任",
        "解决": [
            "明确说明'AI生成,请审核'",
            "对于关键信息,加上置信度或来源引用",
            "区分AI生成的内容和数据库事实",
        ],
    },
    
    "原则2:进度可见": {
        "问题": "LLM处理需要几秒甚至几十秒,空白等待让用户焦虑",
        "解决": [
            "流式输出(streaming):让文字一个一个出现",
            "状态提示:'正在分析第3/15页...'",
            "进度条 + 预计剩余时间",
        ],
    },
    
    "原则3:让用户在回路中": {
        "问题": "用户不信任黑盒操作",
        "解决": [
            "AI生成后让用户编辑修改",
            "提供'重新生成'按钮",
            "显示AI的推理过程(可折叠)",
        ],
    },
    
    "原则4:失败要优雅": {
        "问题": "AI会返回无关内容或格式错误",
        "解决": [
            "兜底提示:'无法分析这部分,可能是格式问题,请手动检查'",
            "提供反馈按钮(用于收集训练数据)",
        ],
    },
    
    "原则5:输出格式化": {
        "问题": "纯文本墙让用户抓不到重点",
        "解决": [
            "结构化输出(列表、表格、风险等级标签)",
            "关键信息高亮(用颜色/icon区分严重程度)",
            "支持导出(PDF/Markdown)",
        ],
    },
    
    "原则6:成本控制透明化": {
        "问题": "用户不清楚一次操作消耗多少",
        "解决": [
            "显示剩余配额('本月剩余20次分析')",
            "在操作前告知预计消耗",
        ],
    },
}

3.5 MVP范围最终确认

# MVP画布(一页纸定义你的MVP)

class MVPCanvas:
    def __init__(self):
        self.canvas = {}
    
    def fill(
        self,
        problem: str,           # 一句话描述核心问题
        target_user: str,       # 具体用户(职位+公司规模)
        unique_value: str,      # 你与竞争对手的差异
        solution: str,          # 核心解决方案(一句话)
        key_features: list[str], # MVP的3个核心功能(不超过3个!)
        success_metric: str,     # 如何判断MVP成功
        timeline: str,          # 构建周期
    ):
        self.canvas = {
            "问题": problem,
            "目标用户": target_user,
            "独特价值": unique_value,
            "解决方案": solution,
            "核心功能(最多3个)": key_features[:3],
            "成功标准": success_metric,
            "构建周期": timeline,
        }
        return self
    
    def print_canvas(self):
        print("=" * 50)
        print("MVP 画布")
        print("=" * 50)
        for key, value in self.canvas.items():
            if isinstance(value, list):
                print(f"\n{key}:")
                for i, item in enumerate(value, 1):
                    print(f"  {i}. {item}")
            else:
                print(f"\n{key}: {value}")
        print("=" * 50)

# 示例
canvas = MVPCanvas().fill(
    problem="小律所律师每次审合同需要2-4小时,压力大且容易漏掉细节",
    target_user="独立律师事务所的初级律师,1-20人规模事务所",
    unique_value="专注中国劳动合同,识别准确率比通用AI高30%",
    solution="上传合同PDF,60秒内生成结构化风险报告",
    key_features=[
        "PDF上传 + 文字提取(支持扫描件OCR)",
        "风险条款识别 + 风险等级标注(高/中/低)",
        "一键导出PDF报告(带律师事务所Logo)",
    ],
    success_metric="2周内10个律师完成试用,3个愿意付费$299/月",
    timeline="3周(1周基础功能,1周UI打磨,1周内测)",
)
canvas.print_canvas()

本章小结

五个核心认知:

  1. JTBD比功能列表更重要:用户雇佣你的产品完成一个工作,不是一组功能;理解真正的"工作"才能做出用户离不开的产品

  2. MVP只做3件事:必须有的功能最多3个;去掉所有"锦上添花",只留下"没有就死"的功能;其余的都是v2+的事

  3. Aha Moment决定留存:用户在60秒内必须看到明确的价值;Aha Moment没有发生,再好的功能也白费

  4. AI交互设计有独特挑战:期望管理、进度可见、人在回路——LLM的不确定性需要UI设计来弥补,让用户感到被控制而不是被AI控制

  5. MVP画布一页纸说清楚:问题、用户、差异化、3个功能、成功标准、周期——说不清楚的产品,写再多代码也没用

核心行动

# 今天就填写你的MVP画布
# 把3个核心功能写在便利贴上,贴在你的显示器旁边
# 每次想加新功能时,先问自己:没有这个功能,产品还能运转吗?

本章提示词模板

模板一:MVP功能清单审查

我正在为[产品描述]规划MVP,以下是我打算做的功能:
[列出功能清单]

目标用户是[描述],核心Aha Moment是[用户第一次感受到价值的场景]。

请帮我:
1. 识别哪些功能是真正的"Must Have"(缺了产品就废了)
2. 哪些是"Should Have"(有了更好,但不是MVP必需)
3. 哪些应该直接扔掉(对核心价值无贡献)
4. 最终推荐3个MVP核心功能
5. 评估我定义的Aha Moment是否足够快速和直观

特别关注:是否有功能可以合并,以及是否有我遗漏的关键功能。

模板二:用户旅程设计

产品:[一句话描述]
目标用户:[描述]
核心工作(JTBD):[用户真正想完成的事]

请帮我设计完整的用户旅程(从发现到成为忠实用户),包括:
1. 每个阶段的用户目标/期望
2. 每个阶段的关键动作
3. 可能的摩擦点(让用户放弃的原因)
4. 消除摩擦点的设计建议
5. 如何设计Aha Moment(具体到30秒内用户看到什么)
6. 习惯养成的触发器设计(让用户每天/每周回来)

[→ 第04章:技术架构:AI SaaS的最小可行技术栈](第04章_技术架构:AI SaaS的最小可行技术栈.md)