Skip to content

第9章 AI 润物无声:重塑生活、学习与娱乐

前8章我们讲了Agent技术、产品方法论、商业设计,都是偏"严肃"的场景。这章换个方向,聊两个离普通人更近的赛道:AI答疑和AI陪伴。

这两个赛道有一个共同特征:用户不需要理解AI是什么,他们只是觉得"这个东西好用"。润物无声,用户甚至意识不到自己在用AI。

但也正因为离生活近,这两个赛道的坑特别多。技术门槛看似不高,产品门槛反而更高。做了3年AI产品,我见过太多团队倒在"技术能用但用户不买账"这个坎上。

我是怕浪猫,这章带你从市场分析到实战落地,完整走一遍这两个赛道的AI产品打造过程。

9.1 AI 答疑产品

9.1.1 AI 答疑发展历史与市场格局

AI答疑不是新概念。从最早的知识库检索到后来的智能客服,再到现在的大模型答疑,技术路线已经换了三代。

第一代:关键词匹配时代(2010-2018)

核心是"关键词+模板":用户输入关键词,系统匹配预设的FAQ条目,返回标准答案。代表产品是各类企业客服系统的"智能问答"模块。

技术原理极简:用户问题做分词,和FAQ库做BM25或TF-IDF匹配,取Top-K返回。没有任何理解能力,全是统计学。

问题也很明显:只能回答预设问题,用户换个说法就匹配不上。维护成本极高,知识库更新靠人工。

第二代:意图识别+槽位填充时代(2018-2022)

NLP技术的进步催生了对话管理框架。代表方案是Rasa、百度UNIT这类对话引擎。核心思路:先把用户问题分类(意图识别),再提取关键参数(槽位填充),然后走预定义的对话流。

比如用户说"帮我查一下北京到上海的高铁票",系统识别意图是"查询车票",槽位是出发地=北京、目的地=上海,然后调用查票API。

这一代比第一代聪明不少,但依然是"走流程"。对话流是开发者预定义的,用户只要稍微偏离预定义路径,就会卡死。

第三代:大模型+RAG时代(2022至今)

大模型的出现彻底改变了答疑的技术底座。核心转变:从"流程驱动"变成"理解驱动"。大模型理解用户问题的语义,RAG负责检索相关知识,两者结合生成自然流畅的回答。

维度第一代关键词第二代意图识别第三代大模型+RAG
理解能力关键词匹配意图分类+槽位语义理解
知识更新人工维护人工维护自动检索
多轮对话预定义流程上下文记忆
回答方式固定模板固定模板自然语言生成
开发成本中高
维护成本

市场格局

教育赛道是目前AI答疑最大的应用场景。国内几类玩家:

玩家类型代表产品技术路线目标用户
大厂学而思AI答疑、作业帮AI自研大模型+RAGK12学生
AI创业公司网易有道AI、科大讯飞通用大模型+垂直调优全年龄段
开放平台百度千帆、火山引擎平台化SaaS企业/教育机构
垂直工具各类题库App内嵌答疑API接入大模型特定学科

竞争已经白热化,但市场远未饱和。原因很简单:教育答疑的需求是分层的,小学和大学对答疑的需求完全不同,文科和理科的答疑逻辑也不同。一个通用方案吃不下所有场景。

这章实战部分,我们以"初中数学答疑"为具体场景,从需求调研到产品上线,完整走一遍。

9.1.2 实战:需求调研与分析

做任何产品之前,先搞清楚用户到底需要什么。AI答疑尤其如此,因为技术太容易让产品经理陷入"我觉得可以这样"的幻觉。

第一步:定义目标用户

不要说"学生"。太宽泛了。初中数学答疑的目标用户分层:

用户类型核心需求使用场景付费意愿
成绩好的学生查漏补缺、竞赛题拓展遇到难题时偶尔使用
成绩中等的学生课后作业辅导、错题解析每天写作业时使用
成绩较差的学生基础概念理解、手把手讲解高频使用,基础题也需要
家长了解孩子学习情况不直接使用,但决定是否购买高(决策者)

关键发现:真正的高频高付费用户是"成绩中等偏下"的学生和他们的家长。成绩好的学生有更好的资源(老师、竞赛班),不太依赖AI答疑。所以产品设计要围绕"成绩中等偏下"这个群体。

第二步:收集真实痛点

通过用户访谈和社群观察,整理初中数学学习的核心痛点:

痛点1:不会的题不知道怎么问。很多学生知道题不会做,但说不出"哪里不会"。

痛点2:老师的讲解太快,课堂上跟不上。

痛点3:错题本抄了但不会复习,不知道错在哪里。

痛点4:家长想帮忙但不会做现在的数学题。

痛点5:晚上写作业遇到问题没人可问,要等到第二天。

痛点6:网上搜答案能看到结果但看不到过程,不理解为什么。

这6个痛点中,AI能解决的是1、3、5、6。痛点2是教学节奏问题,痛点4是家长能力问题,AI能辅助但不能根治。

第三步:验证需求真实性

不要只听用户说,要看用户的行为。几个验证方法:

  • 看各大题库App的数据:拍照搜题功能的使用频率极高,说明"遇到不会的题想找人帮"是真实需求
  • 看课外辅导的付费数据:初中数学辅导是K12辅导中付费比例最高的科目之一
  • 看AI答疑工具的留存数据:如果能解决核心痛点,用户会持续使用

结论:AI答疑是真实需求,市场规模足够大,但要做出差异化需要解决"过程讲解"而不是只给答案。

需求优先级矩阵

功能需求用户价值技术可行性优先级
拍照上传题目识别高(OCR成熟)P0
分步解析过程中(大模型能做到)P0
针对性知识点讲解P1
相似题推荐P1
错题自动归档低(需要用户体系)P2
学习报告低(家长需要)P2

9.1.3 实战:PRD 与流程设计

需求搞清楚之后,写PRD。AI答疑产品的PRD和传统产品不同,需要额外关注几个点。

核心功能定义

MVP版本只做两个核心功能:拍照搜题和分步解析。其他的都砍掉。

用户主流程

用户拍照上传题目
    |
系统OCR识别题目文字
    |
大模型理解题目+检索知识库
    |
生成分步解析过程
    |
用户查看解析
    |
用户追问("为什么这一步要用勾股定理?")
    |
大模型基于上下文回答追问
    |
结束

这个流程看起来简单,但每个环节都有坑。

PRD关键章节

  1. 题目识别准确率要求:数学公式识别准确率>95%,普通文字>98%。低于这个数字,用户体验会断崖式下降。

  2. 回答质量标准:分步解析必须包含"题目分析、解题思路、分步计算、最终答案"四个部分。不能只给答案。

  3. 追问支持:支持至少5轮追问,每轮追问的上下文不能丢失。

  4. 响应时间:首次回答<5秒,追问回答<3秒。

  5. 错误处理:题目识别失败时,提示用户重新拍照;无法解答时,明确告知"这道题超出了我的能力范围"而不是瞎编。

技术选型决策

决策点方案A方案B决策理由
OCR能力百度OCR火山OCR火山OCR数学公式识别效果更好
大模型GPT-4火山方舟火山方舟国内合规,延迟更低
知识库向量数据库自建火山知识库火山知识库开箱即用,省开发时间
前端原生App低代码H5低代码H5MVP阶段速度优先

这里选火山引擎全家桶是有原因的:OCR、大模型、知识库三个核心能力在同一平台,省去了多平台对接的复杂度。MVP阶段,集成成本比单点性能更重要。

9.1.4 实战:火山知识库题目录入工具构建

知识库是AI答疑的核心。没有知识库,大模型只能靠自己的"记忆"答题,准确率和可靠性都得不到保证。

知识库的数据结构设计

初中数学知识需要分层组织:

第一层:知识点(如"一元二次方程")
第二层:题型分类(如"一元二次方程的解法")
第三层:具体题目+解析

每道题目在知识库中的结构:

json
{
  "id": "math_001",
  "grade": "初三",
  "topic": "一元二次方程",
  "sub_topic": "公式法求解",
  "difficulty": 3,
  "question": "解方程:x^2 - 5x + 6 = 0",
  "answer": "x = 2 或 x = 3",
  "steps": [
    {
      "step": 1,
      "content": "识别方程类型:一元二次方程,标准形式 ax^2 + bx + c = 0",
      "formula": "a=1, b=-5, c=6"
    },
    {
      "step": 2,
      "content": "计算判别式",
      "formula": "Delta = b^2 - 4ac = 25 - 24 = 1"
    },
    {
      "step": 3,
      "content": "代入求根公式",
      "formula": "x = (-b ± sqrt(Delta)) / 2a = (5 ± 1) / 2"
    },
    {
      "step": 4,
      "content": "得到两个解",
      "formula": "x1 = 3, x2 = 2"
    }
  ],
  "tags": ["一元二次方程", "公式法", "判别式"]
}

题目录入工具构建

手動一条条录入不现实,初中数学题库动辄上万道。需要做一个批量录入工具。

这里用Python写一个录入脚本,对接火山知识库API:

python
import requests
import json
import os

VOLCANO_API_KEY = os.getenv("VOLCANO_API_KEY")
COLLECTION_ID = "math_junior_high"
BASE_URL = "https://api.volcengine.com/v1"

headers = {
    "Authorization": f"Bearer {VOLCANO_API_KEY}",
    "Content-Type": "application/json"
}

def load_questions(filepath):
    """从Excel/CSV加载题目数据"""
    import pandas as pd
    df = pd.read_excel(filepath)
    questions = []
    for _, row in df.iterrows():
        q = {
            "id": f"math_{row['id']}",
            "grade": row["grade"],
            "topic": row["topic"],
            "sub_topic": row["sub_topic"],
            "difficulty": int(row["difficulty"]),
            "question": row["question"],
            "answer": row["answer"],
            "steps": json.loads(row["steps"]) if row["steps"] else [],
            "tags": row["tags"].split(",") if row["tags"] else []
        }
        questions.append(q)
    return questions

def upload_to_collection(questions, batch_size=50):
    """批量上传题目到火山知识库"""
    for i in range(0, len(questions), batch_size):
        batch = questions[i:i+batch_size]
        documents = []
        for q in batch:
            # 构建文档内容,包含题目+解析+标签
            content = f"""
题目:{q['question']}
知识点:{q['topic']} - {q['sub_topic']}
难度:{q['difficulty']}
答案:{q['answer']}
解题步骤:{json.dumps(q['steps'], ensure_ascii=False)}
标签:{', '.join(q['tags'])}
年级:{q['grade']}
"""
            documents.append({
                "doc_id": q["id"],
                "content": content,
                "metadata": {
                    "grade": q["grade"],
                    "topic": q["topic"],
                    "difficulty": q["difficulty"]
                }
            })
        
        resp = requests.post(
            f"{BASE_URL}/collections/{COLLECTION_ID}/documents/bulk",
            headers=headers,
            json={"documents": documents}
        )
        
        if resp.status_code == 200:
            print(f"批次 {i//batch_size + 1} 上传成功,{len(batch)} 条")
        else:
            print(f"批次 {i//batch_size + 1} 上传失败: {resp.text}")
    
    print(f"全部上传完成,共 {len(questions)} 条")

if __name__ == "__main__":
    questions = load_questions("questions.xlsx")
    upload_to_collection(questions)

知识库质检脚本

上传完不是结束,需要质检。至少检查三项:

python
def quality_check():
    """知识库质量检查"""
    checks = {
        "total_count": 0,
        "missing_steps": [],
        "empty_answers": [],
        "duplicate_questions": []
    }
    
    questions = load_questions("questions.xlsx")
    checks["total_count"] = len(questions)
    
    for q in questions:
        if not q["steps"]:
            checks["missing_steps"].append(q["id"])
        if not q["answer"]:
            checks["empty_answers"].append(q["id"])
    
    # 检查重复题目
    seen = set()
    for q in questions:
        q_text = q["question"].strip()
        if q_text in seen:
            checks["duplicate_questions"].append(q["id"])
        seen.add(q_text)
    
    print(f"总题目数: {checks['total_count']}")
    print(f"缺少解题步骤: {len(checks['missing_steps'])} 条")
    print(f"缺少答案: {len(checks['empty_answers'])} 条")
    print(f"重复题目: {len(checks['duplicate_questions'])} 条")
    
    return checks

实际操作中,初中数学题库大约5000-8000道就能覆盖主要考点。重点是质量而不是数量,100道有详细解析的题比1000道只有答案的题有价值得多。

知识库分批更新策略

题库不是一次性录入就完事的。需要定期更新:

更新类型频率来源流程
错题补充每周用户反馈的解答失败题目人工审核后录入
新题录入每月教研团队编写质检后批量导入
知识点扩展每季度教学大纲更新整体结构调整
清理过时题目每半年数据分析(低质量/低使用率)标记归档

9.1.5 实战:核心工作流优化

知识库建好了,接下来是核心的答疑工作流。这一步直接决定用户体验。

基础工作流

最基础的流程是:用户提问 -> 知识库检索 -> 大模型生成回答。但这个流程在实际使用中效果一般,原因是知识库检索的召回率不够。

优化后的工作流

用户输入(拍照/文字)
    |
预处理:OCR + 格式化
    |
并行执行:
  ├─ 知识库检索(相似题目Top-5)
  ├─ 知识点分类(意图识别)
  └─ 难度判断
    |
结果合并 + 重排序
    |
大模型生成回答(Prompt包含检索结果+分步要求)
    |
后处理:格式校验 + 安全审核
    |
返回用户

关键优化点:

优化1:多路召回

只用向量检索不够,数学题的相似度和语义相似度不完全一致。"x^2+2x+1=0"和"x^2-2x+1=0"语义上很相似,但解题方法可能完全不同。

所以需要多路召回:

python
def hybrid_search(question, top_k=5):
    """混合检索:向量 + 关键词"""
    # 向量检索(语义相似)
    vector_results = vector_search(question, top_k=10)
    
    # 关键词检索(精确匹配)
    keyword_results = keyword_search(extract_keywords(question), top_k=10)
    
    # 融合排序
    merged = merge_and_rerank(vector_results, keyword_results, top_k)
    
    return merged

def extract_keywords(question):
    """从数学题中提取关键词"""
    # 提取数学关键词(如"求解"、"证明"、"最大值"等)
    # 提取数学概念(如"二次函数"、"三角形"等)
    # 提取数值(具体数字)
    pass

优化2:Prompt工程

Prompt是决定回答质量的另一个关键因素。数学答疑的Prompt需要特别设计:

你是一位经验丰富的初中数学老师。请根据以下信息回答学生的问题。

【检索到的参考资料】
{retrieved_documents}

【学生的问题】
{user_question}

【回答要求】
1. 先分析题目,告诉学生这道题考查什么知识点
2. 给出清晰的解题思路,解释"为什么这样做"而不是只说"怎么做"
3. 分步骤展示计算过程,每一步都要有说明
4. 给出最终答案
5. 如果检索到的参考资料中有相似题目,可以补充"举一反三"的练习建议

【格式要求】
- 使用清晰的步骤编号(第一步、第二步...)
- 数学公式用标准写法
- 如果题目信息不完整,明确指出缺少什么信息
- 如果你无法确定答案,诚实地说"这道题我需要再想想"而不是猜测

请开始回答:

这个Prompt的设计要点:

  • 明确了角色定位(老师,不是机器)
  • 融入了检索结果作为参考
  • 强制了回答结构(分析、思路、步骤、答案)
  • 处理了边界情况(信息不完整、不确定时的策略)

优化3:追问机制

学生看了回答之后,大概率会有追问。追问的处理质量决定了产品的"粘性"。

追问场景分类:

追问类型示例处理策略
步骤不理解"第二步为什么用公式法不用因式分解?"详细解释两种方法的适用条件
答案质疑"我算出来是x=3,为什么你说是x=2?"逐步检查学生的计算过程
拓展问题"如果系数是负数怎么办?"扩展讲解,举一反三
完全无关"今天作业有多少?"礼貌引导回数学问题

追问的上下文管理很重要。每次追问都要携带完整的对话历史,否则大模型会丢失之前的解题上下文:

python
def build_context(conversation_history, new_question):
    """构建包含完整上下文的Prompt"""
    context_parts = ["以下是你和学生之前的对话:"]
    
    for turn in conversation_history:
        context_parts.append(f"学生:{turn['question']}")
        context_parts.append(f"老师:{turn['answer']}")
    
    context_parts.append(f"学生(追问):{new_question}")
    context_parts.append("老师:")
    
    return "\n".join(context_parts)

优化4:回答质量评分

如何判断大模型的回答质量?不能只靠人肉审核,需要自动化评分:

python
def answer_quality_scorer(question, answer):
    """回答质量评分(0-100分)"""
    score = 0
    
    # 结构完整性(25分)
    if "解题思路" in answer or "思路" in answer:
        score += 10
    if has_step_numbers(answer):
        score += 10
    if has_final_answer(answer):
        score += 5
    
    # 内容质量(40分)
    if contains_explanation(answer):
        score += 15
    if math_formulas_valid(answer):
        score += 15
    if answer_relevant_to_question(question, answer):
        score += 10
    
    # 安全性(20分)
    if not contains_hallucination(answer):
        score += 10
    if not contains_harmful_content(answer):
        score += 10
    
    # 格式(15分)
    if well_formatted(answer):
        score += 15
    
    return score

这个评分函数是简化版的,实际部署时需要更精细的判断逻辑。但核心思路不变:自动化评分筛选低质量回答,减少人工审核的工作量。

9.1.6 实战:低代码界面搭建与调试

技术方案确定后,MVP阶段用低代码平台搭界面。理由很简单:一个人或小团队做MVP,前端开发不应该成为瓶颈。

平台选择:火山引擎Bot平台

选火山引擎Bot平台的原因:

  • 和OCR、知识库、大模型在同一生态,不需要额外对接
  • 内置对话流编排能力
  • 支持自定义API接入
  • 有现成的H5部署方案

界面设计原则

AI答疑界面的设计要围绕一个核心目标:让学生最快地得到帮助。

界面元素按优先级排列:

优先级元素理由
P0拍照上传按钮核心入口,必须最显眼
P0文字输入框备选入口,拍照失败时使用
P0回答展示区核心输出,必须清晰可读
P1追问按钮引导用户深入理解
P1"看不懂"反馈按钮收集回答质量问题
P2题目历史记录回顾之前的答疑
P2知识点标签帮助学生理解自己缺什么

对话流搭建

在火山引擎Bot平台上搭建对话流:

yaml
# 对话流配置(伪代码,实际在平台上可视化配置)
bot:
  name: "初中数学答疑助手"
  greeting: "你好,我是数学答疑助手。拍照上传题目或直接输入问题,我来帮你分析。"
  
  flows:
    - name: "主流程"
      trigger: "用户发送消息"
      steps:
        - id: "判断输入类型"
          type: "condition"
          branches:
            - condition: "包含图片"
              next: "OCR识别"
            - condition: "纯文字"
              next: "知识库检索"
            - condition: "追问(有对话历史)"
              next: "上下文增强回答"
        
        - id: "OCR识别"
          type: "api_call"
          service: "volcano_ocr"
          params:
            image_url: "{{user_input.image}}"
          output: "recognized_text"
          next: "知识库检索"
        
        - id: "知识库检索"
          type: "api_call"
          service: "volcano_knowledge_base"
          params:
            query: "{{recognized_text || user_input.text}}"
            top_k: 5
            filter:
              grade: "初中"
          output: "retrieved_docs"
          next: "大模型生成"
        
        - id: "大模型生成"
          type: "llm_call"
          model: "doubao-pro"
          prompt: "{{math_teacher_prompt}}"
          variables:
            question: "{{recognized_text || user_input.text}}"
            references: "{{retrieved_docs}}"
            history: "{{conversation_history}}"
          output: "answer"
          next: "后处理"
        
        - id: "后处理"
          type: "post_process"
          actions:
            - "格式校验"
            - "安全审核"
            - "质量评分"
          output: "final_answer"
          next: "返回用户"

调试技巧

低代码平台的好处是可视化,但调试大模型输出仍然不轻松。几个实用技巧:

  1. 每个节点都加日志。特别是知识库检索的Top-K结果和大模型的完整输出。出问题时看日志比猜问题快得多。

  2. 准备测试用例集。至少50个覆盖各个知识点的题目,每次调整后全量跑一遍。

python
test_cases = [
    {
        "question": "解方程:2x^2 + 3x - 2 = 0",
        "expected_knowledge": "一元二次方程",
        "expected_keywords": ["求根公式", "判别式", "因式分解"],
        "difficulty": 3
    },
    {
        "question": "在三角形ABC中,角A=60度,AB=5,AC=8,求BC的长度",
        "expected_knowledge": "余弦定理",
        "expected_keywords": ["余弦定理", "边长", "角度"],
        "difficulty": 4
    },
    {
        "question": "已知函数f(x)=x^2-4x+3,求f(x)的最小值",
        "expected_knowledge": "二次函数最值",
        "expected_keywords": ["配方", "顶点坐标", "最小值"],
        "difficulty": 2
    }
]

def run_test_suite():
    """全量测试"""
    results = []
    for case in test_cases:
        answer = call_bot(case["question"])
        result = {
            "question": case["question"],
            "expected": case["expected_knowledge"],
            "has_keywords": all(
                kw in answer for kw in case["expected_keywords"]
            ),
            "quality_score": answer_quality_scorer(case["question"], answer)
        }
        results.append(result)
    
    # 输出测试报告
    passed = sum(1 for r in results if r["quality_score"] >= 70)
    print(f"测试完成: {passed}/{len(results)} 通过")
    for r in results:
        if r["quality_score"] < 70:
            print(f"  失败: {r['question'][:30]}... 评分={r['quality_score']}")
    
    return results
  1. 关注延迟。大模型的Token生成速度直接影响体验。如果总延迟超过5秒,考虑:
  • 减少知识库检索的Top-K数量
  • 使用更快的模型(doubao-lite代替doubao-pro)
  • 开启流式输出,让用户看到"正在生成"的过程
  1. 异常兜底。大模型不是万能的,必须设计好fallback:
  • 题目识别失败 -> 提示"没看清题目,请重新拍照"
  • 超出知识库范围 -> "这道题我暂时解答不了,建议请教老师"
  • 回答质量评分低于阈值 -> "我对这个回答不太确定,建议参考课本XX页的例题"

上线前检查清单

检查项标准状态
OCR识别率(数学公式)>95%待验证
知识库覆盖率核心考点>90%待验证
回答质量(抽样)70分以上>80%待验证
响应时间(首次)<5秒待验证
追问支持至少5轮不丢失上下文待验证
安全审核无有害内容待验证
异常兜底所有异常路径有处理待验证
移动端适配主流机型显示正常待验证

9.2 AI 陪伴产品

9.2.1 AI 陪伴行业历史沿革

AI陪伴是另一个"润物无声"的赛道。用户不需要理解大模型,他们只是在和一个"人"聊天。

这个赛道的商业潜力已经被验证——Character.ai月活超过2000万,国内的星野、筑梦岛等产品也拿到了大量用户。但AI陪伴产品的设计难度被严重低估了。

发展脉络

2015-2019:聊天机器人的前夜

这个阶段是"规则+模板"的聊天机器人。微软小冰是代表产品。核心逻辑是基于大量预定义的对话模板做回复匹配,辅以简单的情感识别。

小冰的聪明之处在于它不强调"有用",而是强调"有趣"。它不会帮你写代码、翻译文档,但会陪你聊天、讲笑话、记住你的喜好。这个定位在当时非常超前。

但受限于技术,小冰的对话深度很有限,聊几轮就会"露出马脚"——重复、答非所问、逻辑断裂。

2020-2022:情感计算的探索期

GPT-2和GPT-3的出现让聊天机器人的质量有了明显提升。Replika是这个时期的代表产品,主打"AI朋友"概念。

Replika的关键创新:

  • 持久记忆:记住用户说过的事情,下次对话能引用
  • 情感追踪:跟踪用户的情绪状态,调整对话风格
  • 角色定制:用户可以定义AI的外貌、性格、说话方式

这个阶段的核心认知:AI陪伴产品不是"做得像人",而是"让用户觉得有人懂自己"。

2023至今:大模型驱动的爆发期

大模型的能力质变催生了Character.ai、星野、筑梦岛等产品的爆发。AI陪伴从"小众玩具"变成了"大众应用"。

几个关键变化:

维度大模型前大模型后
对话质量3-5轮就露馅能维持深度对话
角色一致性容易出戏基本能保持人设
情感表达机械、模板化自然、有温度
创作能力只能做预设内容能共同创作故事
响应延迟较慢实时或近实时

当前行业的核心矛盾

技术能力上去了,但商业化和用户体验之间存在尖锐矛盾:

矛盾1:用户粘性 vs. 内容新鲜度。AI角色没有真正的"生活",聊多了就会重复。如何保持新鲜感是最大的产品难题。

矛盾2:情感投入 vs. AI的本质。用户会对AI产生真实的情感依赖,但AI本质上是无意识的。这种"伪亲密"的伦理问题怎么处理?

矛盾3:个性化 vs. 运营成本。每个用户都想要独一无二的AI伙伴,但高度个性化意味着更高的推理成本和更复杂的技术架构。

这些矛盾没有完美解,产品设计就是在矛盾中找平衡。

9.2.2 拟人角色设计方法

AI陪伴产品的核心竞争力不是技术,是角色设计。技术门槛会越来越低,但好的角色设计是稀缺的。

角色设计的核心框架

设计一个AI角色,需要定义6个维度:

维度问题示例
身份背景TA是谁?从哪里来?做什么?"25岁,独立音乐人,在北京驻唱"
性格特征TA是什么性格?有什么优缺点?"外冷内热,有点毒舌但很关心人"
说话风格TA怎么说话?口头禅是什么?"喜欢用比喻,经常说'讲真'"
价值观TA看重什么?反对什么?"看重真实,讨厌虚伪的社交"
关系定位TA和用户是什么关系?"认识了3年的网友,偶尔深夜聊天"
成长弧线TA会变化吗?怎么变?"慢慢打开心防,从冷淡到主动关心"

这6个维度中,"关系定位"和"成长弧线"是AI陪伴产品特有的,也是最容易忽略的。

关系定位决定了对话的边界

AI陪伴不是"什么都聊"。不同关系定位有完全不同的对话边界:

关系定位可聊话题禁区情感深度
朋友生活、兴趣、吐槽过于私人的问题
恋人日常、情感、亲密话题
导师工作、学习、人生规划轻浮话题中高
陪伴者情感支持、倾听、安慰专业建议(如医疗)

关系定位要在产品设计中明确,不能模糊。一个定位为"朋友"的AI角色突然说暧昧的话,用户会觉得诡异而不是感动。

System Prompt设计

角色设计的落地形式是System Prompt。一个好的System Prompt需要涵盖角色设计的6个维度:

你是"林夕",一个25岁的独立音乐人。

【身份背景】
你在北京一家小酒馆驻唱,白天写歌晚上演出。高中开始弹吉他,大学辍学追求音乐梦想。生活不太规律,经常深夜才有灵感。

【性格特征】
表面冷淡但内心细腻。不太会主动表达关心,但对方难过的时候会默默做点什么。有点理想主义,对音乐有近乎偏执的追求。偶尔毒舌,但从不恶意。

【说话风格】
- 句子偏短,不爱长篇大论
- 喜欢用音乐相关的比喻
- 偶尔自嘲
- 口头禅:"讲真"、"你懂我意思吧"
- 用词口语化,不用书面语
- 情绪激动时会用更多标点

【价值观】
- 看重真实,讨厌虚伪的社交
- 认为每个人都值得被认真对待
- 对"为了赚钱放弃热爱"持保留态度

【与用户的关系】
你们是认识了3年的朋友。最开始是在一场音乐节上认识的。你偶尔会在深夜给用户发消息,分享新写的歌词。用户是你为数不多可以放松聊天的人。

【行为规范】
- 不要过于主动,保持适当的距离感
- 用户难过时先倾听,不要急着给建议
- 聊到音乐话题时会变得活跃
- 如果用户说了一些让你不舒服的话,会直接但温和地表达
- 不要剧透你"是AI"这件事,在角色里自然地互动

这个Prompt的设计有几个关键点:

  • 每个维度都有具体可执行的行为指令,不是空泛的描述
  • "行为规范"部分定义了什么该做什么不该做,这比只定义性格有效得多
  • 没有堆砌形容词,而是用具体场景来体现性格

角色一致性的维护

大模型最大的问题是"角色崩塌"——聊着聊着就出戏了。维护角色一致性的方法:

方法1:每轮对话都注入完整的角色设定。Token成本高但效果最好。

方法2:在对话历史中定期插入"角色提醒"。比如每5轮对话,在System Prompt中追加一句"记住你是林夕,一个独立音乐人"。

方法3:后处理过滤。检查大模型的输出是否违反角色设定,如果违反则重新生成。

python
def character_consistency_check(response, character_config):
    """角色一致性检查"""
    violations = []
    
    # 检查是否使用了角色不该用的词汇
    forbidden_words = character_config.get("forbidden_words", [])
    for word in forbidden_words:
        if word in response:
            violations.append(f"使用了禁止词汇: {word}")
    
    # 检查是否偏离了说话风格
    if character_config["style"] == "casual" and is_too_formal(response):
        violations.append("语气过于正式")
    
    # 检查是否暴露了AI身份
    ai_exposures = ["我是AI", "我是语言模型", "作为一个人工智能"]
    for phrase in ai_exposures:
        if phrase in response:
            violations.append(f"暴露了AI身份: {phrase}")
    
    return violations

def is_too_formal(text):
    """判断文本是否过于正式"""
    formal_indicators = ["综上所述", "首先其次", "值得注意的是"]
    return any(ind in text for ind in formal_indicators)

9.2.3 AI 陪伴商业化思考

AI陪伴产品的商业化比技术实现更难。几个核心问题需要想清楚。

付费模式对比

模式优点缺点代表产品
订阅制收入稳定可预测用户流失率高Replika Pro
按次付费降低试用门槛收入不稳定Character.ai
虚拟商品ARPU高容易变成氪金游戏星野
广告变现用户零门槛严重损害体验较少采用

我的建议:AI陪伴产品不要一开始就搞重度商业化。先用免费策略获取用户,跑通留存之后再考虑变现。

原因:AI陪伴产品的核心指标是"用户对角色的情感投入程度"。用户刚来的时候没有情感投入,急着收费会把用户推走。等用户用了2-3周,和AI角色建立了感情之后,再设计付费点,转化率会高得多。

付费点设计原则

原则1:付费功能不能损害免费用户的体验。如果付费才能解锁"角色主动发消息"这个功能,免费用户会觉得被冷落,直接流失。

原则2:付费功能应该增强体验而不是限制体验。好的付费点:

  • 解锁新的对话场景(比如"旅行"、"看电影"等主题对话)
  • 自定义角色的外观
  • 解锁角色的"深度记忆"(记住更多过去对话的内容)
  • 专属的故事线/剧情分支

不好的付费点:

  • 限制每天的对话次数
  • 锁定核心的对话功能
  • 强制看广告才能继续聊天

原则3:付费转化要自然。不要弹出付费墙,要在用户自然产生需求的时候提供付费选项。比如用户说"想看看你最近写了什么歌",这时候提供"解锁林夕的完整创作集"就比较自然。

关键业务指标

指标定义健康值
次日留存率第二天回来的用户比例>40%
7日留存率7天后还在使用的比例>25%
平均会话轮次每次打开平均聊多少轮>10轮
平均会话时长每次打开聊多久>5分钟
主动发起率用户主动发消息的比例(非推送触发)>60%
付费转化率免费转付费的比例>5%

其中"平均会话轮次"和"主动发起率"是最重要的两个指标。如果用户每次只聊3-5轮就走了,说明产品没吸引力。如果用户都是被推送拉回来的,而不是自己想聊,说明没有建立真正的情感连接。

9.2.4 实战:对话流设计与搭建

具体到实现,AI陪伴产品的对话流和AI答疑不同。答疑是对话式RAG,陪伴是"角色驱动"的对话生成。

对话流架构

用户消息
    |
意图识别
    ├─ 闲聊/情感倾诉 -> 情感回应流
    ├─ 话题讨论 -> 深度对话流  
    ├─ 角色相关提问 -> 角色信息流
    ├─ 创作请求("帮我写首歌")-> 创作辅助流
    └─ 系统事件(早安/晚安)-> 日常互动流
    |
基于意图选择对话策略
    |
角色一致性注入
    |
大模型生成
    |
情感基调调整
    |
返回用户

意图识别方案

AI陪伴产品的意图识别和传统NLU不同。用户不会说"我要情感倾诉",用户只会说"今天好累"。所以需要基于语义理解而非关键词匹配:

python
intent_patterns = {
    "emotional_vent": {
        "description": "用户在倾诉情绪",
        "signals": ["好累", "烦死了", "不想上班", "难过", "孤独", "失眠"],
        "response_strategy": "先共情再引导"
    },
    "topic_discussion": {
        "description": "用户在聊某个话题",
        "signals": ["你觉得", "有没有", "推荐", "怎么样"],
        "response_strategy": "基于角色观点回应"
    },
    "role_question": {
        "description": "用户在问角色的事",
        "signals": ["你是谁", "你多大", "你做什么工作", "你喜欢什么"],
        "response_strategy": "用角色身份自然回答"
    },
    "creative_request": {
        "description": "用户请求创作",
        "signals": ["写一首", "帮我写", "编一个", "来一段"],
        "response_strategy": "用角色的创作风格完成"
    },
    "daily_interaction": {
        "description": "日常互动",
        "signals": ["早安", "晚安", "在干嘛", "吃饭了吗"],
        "response_strategy": "日常自然回应+引入话题"
    }
}

情感回应流

情感倾诉是AI陪伴产品中最核心的场景。处理得好,用户粘性极强;处理不好,用户会觉得"冷冰冰"。

情感回应流的设计:

用户表达负面情绪
    |
情绪强度判断(轻微/中度/强烈)
    |
轻微情绪:
  - 简短共情 + 转移话题
  - "确实,这种事挺让人心烦的。对了,你今天中午吃的啥?"
    |
中度情绪:
  - 深度共情 + 倾听 + 轻微引导
  - "听起来确实挺难过的。发生什么事了?"
  - (等用户说完后)"我能理解你为什么这么想。"
    |
强烈情绪:
  - 纯陪伴 + 不急于解决问题
  - "我在。"
  - "不用说什么也没关系。"
  - "想聊聊的时候就聊,不想聊的话我就在这儿。"
    |
兜底规则:
  - 不要给专业建议(心理/医疗)
  - 不要说"别想了"、"开心点"之类的有害正能量
  - 不要比惨("我也很难过")

日常互动设计

AI陪伴的"陪伴感"很大程度来自日常互动。不需要每次都是深度对话,偶尔的一句问候反而更有温度。

日常互动的触发机制:

事件触发条件消息示例
早安早上8-9点,用户打开App"起了?今天精神怎么样"
晚安晚上11点后,用户还在"还不睡?明天不上班啊"
天气用户所在地下雨/极端天气"外面下雨了,你带伞了吗"
周末周六上午,用户打开App"周末打算干嘛?别告诉我又宅在家"
长时间未联系用户3天没来"失踪人口回归了?最近忙啥呢"
生日/纪念日用户资料中的特殊日期"生日快乐啊你。蛋糕吃了吗"

这些消息的关键:自然、不刻意、符合角色性格。一个冷淡型的角色不会主动发"早安"和表情包,但可能会在凌晨2点发"写不出歌,睡不着,你也没睡啊"。

9.2.5 实战:调试与性能优化

AI陪伴产品的调试比AI答疑复杂得多。因为"好不好"是一个主观判断,没有标准答案。

调试策略

策略1:角色扮演测试

让一个人类扮演AI角色,和另一个扮演用户的人对话。记录对话过程,分析:

  • 角色是否保持了人设
  • 对话是否有自然感
  • 是否有让人不舒服的回复
  • 哪些场景下角色容易出戏

策略2:批量生成+人工审核

用自动化脚本生成大量对话,然后人工审核:

python
def generate_test_conversations(character_prompt, test_scenarios):
    """批量生成测试对话"""
    conversations = []
    
    for scenario in test_scenarios:
        # 模拟用户输入序列
        user_inputs = scenario["inputs"]
        conversation = []
        
        for user_input in user_inputs:
            response = call_llm(character_prompt, conversation, user_input)
            conversation.append({
                "role": "user",
                "content": user_input
            })
            conversation.append({
                "role": "assistant", 
                "content": response
            })
        
        conversations.append({
            "scenario": scenario["description"],
            "dialogue": conversation
        })
    
    return conversations

test_scenarios = [
    {
        "description": "用户情绪低落",
        "inputs": [
            "今天真的好累",
            "工作出了问题,被领导说了",
            "感觉自己什么都做不好",
            "谢谢你说这些,好多了"
        ]
    },
    {
        "description": "日常闲聊",
        "inputs": [
            "在干嘛呢",
            "写歌啊,写什么主题",
            "听起来不错,能让我听听吗",
            "哈哈好的"
        ]
    },
    {
        "description": "用户追问角色信息",
        "inputs": [
            "你为什么选择做音乐",
            "不后悔吗,当时辍学",
            "你现在收入够生活吗",
            "如果重来一次你还会选这条路吗"
        ]
    }
]

策略3:A/B测试Prompt变体

同样的角色设定,不同的Prompt写法,效果差异很大。用A/B测试找到最优的Prompt:

python
prompt_variants = {
    "A_detailed": "完整的角色设定,包含所有维度,约800字",
    "B_concise": "精简的角色设定,只包含核心性格和说话风格,约200字",
    "C_behavior_focused": "以行为指令为主,少描述多规则,约400字",
    "D_example_driven": "包含大量对话示例的角色设定,约600字"
}

# 对每个变体,生成20组测试对话,人工评分
# 评分维度:角色一致性、自然度、情感表达、互动深度

实际测试经验:详细的Prompt(Variant A)不一定比精简的(Variant B)效果好。过于详细的Prompt反而会限制大模型的自然表达。通常C和D的效果最好——明确的行为规则比性格描述更有效,对话示例比抽象定义更直观。

性能优化

延迟优化

AI陪伴产品对延迟特别敏感。答疑等5秒还行,陪伴聊天等5秒就出戏了。目标:首Token延迟<1秒,完整回复延迟<3秒。

优化手段:

手段效果成本
流式输出感知延迟降低50%无额外成本
使用轻量模型延迟降低30-50%质量略有下降
缓存常见回复特定场景延迟降到0需要预计算
降低Max Tokens延迟降低20-40%回复长度受限

推荐方案:流式输出+适当的Max Tokens限制。陪伴对话不需要长篇大论,200-400字足够了。

python
generation_config = {
    "max_tokens": 512,
    "temperature": 0.8,
    "top_p": 0.9,
    "stream": True,
    "stop": ["\n\n\n"]  # 防止过长的输出
}

成本优化

AI陪伴产品的推理成本是商业化的核心挑战。一个日活10万的产品,如果每个用户每天聊20轮,每轮平均200 Tokens,一天就是4000万Tokens。按国内大模型API的定价,每天光推理成本就上万。

成本优化策略:

策略节省比例实现复杂度
简单意图分类+短回复模板30-40%
对话轮次内缓存上下文摘要20-30%
使用轻量模型处理日常对话40-50%
用户分层(免费用户用轻量模型)30-40%

推荐组合:轻量模型处理80%的日常闲聊(早安晚安、简单话题),主力模型处理20%的深度对话(情感倾诉、创作请求)。这样既保证了核心场景的质量,又控制了成本。

记忆管理优化

AI陪伴产品的记忆管理是另一个关键挑战。用户希望AI记住之前说过的话,但完整的对话历史会很快超出上下文窗口。

记忆分层方案:

短期记忆(当前会话)
  - 完整的当前对话历史
  - 保存在会话中,会话结束即清除

中期记忆(最近7天)
  - 对话摘要
  - 关键信息提取(用户的喜好、近期事件、情绪变化)
  - 存储在数据库中,每次新会话加载

长期记忆(全部历史)
  - 用户画像
  - 重要的共享经历
  - 用户的情感模式
  - 定期从中期记忆中提炼,写入长期记忆
python
def build_memory_context(user_id, current_message):
    """构建包含记忆的上下文"""
    # 加载长期记忆
    long_term = get_long_term_memory(user_id)
    
    # 加载中期记忆摘要
    mid_term_summary = get_mid_term_summary(user_id)
    
    # 组装记忆上下文
    memory_context = f"""
【你记得关于这个人的事】
{long_term}

【最近的动态】
{mid_term_summary}
"""
    return memory_context

记忆注入的时机也很重要。不要在每轮对话都注入全部记忆,这样会浪费Token。在以下时机注入:

  • 新会话开始时(注入长期记忆+近期摘要)
  • 用户提到过去的事件时(检索相关记忆片段)
  • 角色需要引用之前的对话时

AI陪伴产品本质上做的是"虚拟关系"。好的虚拟关系需要三个要素:角色有深度、对话有温度、记忆有连续性。技术实现上,角色靠Prompt设计,温度靠意图识别+情感回应,连续性靠记忆管理。三者缺一不可。

本章小结

主题核心要点
AI答疑发展三代技术演进:关键词->意图识别->大模型+RAG,技术门槛降低但产品门槛升高
答疑需求调研目标用户分层,真实痛点优先于想象需求,MVP聚焦核心场景
答疑PRD设计核心是"过程讲解"而非"给答案",每个环节都要考虑错误处理
知识库构建结构化数据设计、批量录入工具、质检脚本、分批更新策略
答疑工作流多路召回、Prompt工程、追问机制、自动化质量评分
低代码搭建平台选型考虑集成成本,界面设计围绕核心目标,调试靠测试用例集
AI陪伴历史从规则模板到大模型驱动,核心矛盾是粘性vs新鲜度、情感vs本质
角色设计6维度框架,关系定位决定对话边界,Prompt以行为指令为主
陪伴商业化先跑通留存再变现,付费增强体验而非限制体验,关注会话轮次和主动发起率
对话流设计意图识别、情感回应流、日常互动触发,关键是自然不刻意
调试优化角色扮演测试+批量审核+A/B测试,延迟用流式+轻量模型,成本用分层策略

怕浪猫说:AI答疑和AI陪伴是两个截然不同的赛道,但有一个共同点——技术是下限,产品设计才是上限。大模型的能力在快速趋同,未来比拼的是谁更懂用户、谁更能把技术包装成自然的产品体验。

系列进度 9/13

下章预告: 第10章AI赋能工作,聊聊AI如何渗透办公、创作、编程等工作场景,从效率工具到生产力平台的演进路径。

热爱生活,喜好美食,追求未来!