第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 | 自研大模型+RAG | K12学生 |
| 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关键章节
题目识别准确率要求:数学公式识别准确率>95%,普通文字>98%。低于这个数字,用户体验会断崖式下降。
回答质量标准:分步解析必须包含"题目分析、解题思路、分步计算、最终答案"四个部分。不能只给答案。
追问支持:支持至少5轮追问,每轮追问的上下文不能丢失。
响应时间:首次回答<5秒,追问回答<3秒。
错误处理:题目识别失败时,提示用户重新拍照;无法解答时,明确告知"这道题超出了我的能力范围"而不是瞎编。
技术选型决策
| 决策点 | 方案A | 方案B | 决策 | 理由 |
|---|---|---|---|---|
| OCR能力 | 百度OCR | 火山OCR | 火山OCR | 数学公式识别效果更好 |
| 大模型 | GPT-4 | 火山方舟 | 火山方舟 | 国内合规,延迟更低 |
| 知识库 | 向量数据库自建 | 火山知识库 | 火山知识库 | 开箱即用,省开发时间 |
| 前端 | 原生App | 低代码H5 | 低代码H5 | MVP阶段速度优先 |
这里选火山引擎全家桶是有原因的:OCR、大模型、知识库三个核心能力在同一平台,省去了多平台对接的复杂度。MVP阶段,集成成本比单点性能更重要。
9.1.4 实战:火山知识库题目录入工具构建
知识库是AI答疑的核心。没有知识库,大模型只能靠自己的"记忆"答题,准确率和可靠性都得不到保证。
知识库的数据结构设计
初中数学知识需要分层组织:
第一层:知识点(如"一元二次方程")
第二层:题型分类(如"一元二次方程的解法")
第三层:具体题目+解析每道题目在知识库中的结构:
{
"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:
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)知识库质检脚本
上传完不是结束,需要质检。至少检查三项:
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"语义上很相似,但解题方法可能完全不同。
所以需要多路召回:
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?" | 逐步检查学生的计算过程 |
| 拓展问题 | "如果系数是负数怎么办?" | 扩展讲解,举一反三 |
| 完全无关 | "今天作业有多少?" | 礼貌引导回数学问题 |
追问的上下文管理很重要。每次追问都要携带完整的对话历史,否则大模型会丢失之前的解题上下文:
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:回答质量评分
如何判断大模型的回答质量?不能只靠人肉审核,需要自动化评分:
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平台上搭建对话流:
# 对话流配置(伪代码,实际在平台上可视化配置)
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: "返回用户"调试技巧
低代码平台的好处是可视化,但调试大模型输出仍然不轻松。几个实用技巧:
每个节点都加日志。特别是知识库检索的Top-K结果和大模型的完整输出。出问题时看日志比猜问题快得多。
准备测试用例集。至少50个覆盖各个知识点的题目,每次调整后全量跑一遍。
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- 关注延迟。大模型的Token生成速度直接影响体验。如果总延迟超过5秒,考虑:
- 减少知识库检索的Top-K数量
- 使用更快的模型(doubao-lite代替doubao-pro)
- 开启流式输出,让用户看到"正在生成"的过程
- 异常兜底。大模型不是万能的,必须设计好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:后处理过滤。检查大模型的输出是否违反角色设定,如果违反则重新生成。
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不同。用户不会说"我要情感倾诉",用户只会说"今天好累"。所以需要基于语义理解而非关键词匹配:
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:批量生成+人工审核
用自动化脚本生成大量对话,然后人工审核:
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:
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字足够了。
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天)
- 对话摘要
- 关键信息提取(用户的喜好、近期事件、情绪变化)
- 存储在数据库中,每次新会话加载
长期记忆(全部历史)
- 用户画像
- 重要的共享经历
- 用户的情感模式
- 定期从中期记忆中提炼,写入长期记忆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如何渗透办公、创作、编程等工作场景,从效率工具到生产力平台的演进路径。