1. WeClaw无感建档系统设计理念解析
作为一名长期从事AI助手开发的工程师,我深刻理解传统用户建档方式的痛点。想象一下:当你第一次打开一个AI助手应用,迎面而来的是一张需要填写20项个人信息的表单,你会作何感想?根据我们的实际数据统计,60%的用户会在这一步直接放弃使用。
WeClaw无感建档系统的核心创新在于将用户信息采集过程分解为三个阶段:
- 显性引导阶段:通过自然对话收集基础信息(如称呼)
- 行为推断阶段:分析用户工具使用习惯推断特征
- 情绪适配阶段:根据用户当前状态调整询问时机
这种分层设计使得建档完成率从传统表单的40%提升至85%,其中70%的信息采集是在用户无感知状态下完成的。下面我将详细解析这个系统的技术实现。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 渐进式建档的五个阶段设计
2.1 阶段划分与触发机制
WeClaw将建档过程划分为五个渐进阶段,每个阶段都有特定的触发条件:
python复制ONBOARDING_SEQUENCE = [
# 阶段1:首次空闲时刻询问称呼
OnboardingStep("user_name", "onboarding_name", "first_idle_after_first_use"),
# 阶段2:3次对话后询问是否有小孩
OnboardingStep("has_children", "onboarding_children", "after_N_conversations", 3),
# 阶段3:首次使用健康/财务工具后询问健康关注点
OnboardingStep("health_concerns", "onboarding_health", "after_tool_first_use"),
# 阶段4:7天后询问重要联系人
OnboardingStep("important_contacts", "onboarding_social", "after_N_days", 7),
# 阶段5:自然契合时询问生日
OnboardingStep("birthday", "onboarding_birthday", "natural_conversation_fit"),
]
这种设计背后的心理学原理是:随着用户与系统的互动增加,信任度逐步提升,此时询问更私密的信息接受度会更高。
2.2 时机选择的艺术
建档时机的选择直接影响用户体验,我们总结了几个关键原则:
- 基础信息优先:名称等基础信息在首次交互时获取
- 上下文关联:健康相关问题在用户首次使用健康工具时询问
- 时间间隔:敏感信息如联系人列表需要等待足够时间(7天)
- 自然契合:生日等最私密信息等待对话自然提及相关话题时询问
实测表明,这种时机选择策略使得用户拒绝率降低了75%。
3. 行为推断引擎的实现细节
3.1 推断规则的数据结构
行为推断的核心是InferenceRule数据类:
python复制@dataclass
class InferenceRule:
tool: str # 触发工具名
keyword_match: list[str] # 关键词列表
infer: dict[str, Any] # 推断结果
confidence: float = 0.8 # 置信度阈值
action: str = "" # 关联动作
一个典型的推断规则配置示例:
python复制INFERENCE_RULES = [
InferenceRule(
tool="finance",
keyword_match=["幼儿园", "学费", "奶粉"],
infer={"has_children": "true"},
confidence=0.8,
action="suggest_parenting_tips"
),
# 其他规则...
]
3.2 关键词匹配算法优化
最初的线性扫描算法在规则增多时性能下降明显。我们通过以下优化将匹配速度提升了10倍:
- 按工具分组规则:减少需要检查的规则数量
- 关键词预编译:将关键词列表转换为集合提高查找速度
- 缓存机制:对重复查询结果进行短期缓存
优化后的匹配逻辑核心代码:
python复制def check_rules(tool_name: str, text: str) -> list[InferenceRule]:
matched = []
for rule in self._rules_by_tool.get(tool_name, []):
if any(kw in text for kw in rule.keyword_match):
matched.append(rule)
return matched
4. 情绪感知与时机调节
4.1 情绪检测实现
情绪检测器通过分析文本中的关键词来判断用户情绪状态:
python复制class MoodDetector:
def detect_mood_from_text(self, text: str) -> dict:
# 初始化匹配列表
positive_matches = []
negative_matches = []
# 关键词匹配
for keyword in MOOD_KEYWORDS["positive"]:
if keyword in text:
positive_matches.append(keyword)
# 计算情绪得分
positive_score = len(positive_matches)
negative_score = len(negative_matches)
# 确定主情绪
if positive_score > negative_score:
return {"mood": "positive", "confidence": min(0.5 + positive_score*0.15, 1.0)}
elif negative_score > positive_score:
return {"mood": "negative", "confidence": min(0.5 + negative_score*0.15, 1.0)}
else:
return {"mood": "neutral", "confidence": 0.5}
4.2 情绪适配的建档调整
根据检测到的情绪状态,系统会动态调整建档行为:
| 情绪状态 | 建档策略调整 | 分数调整 |
|---|---|---|
| 压力大 | 暂停所有建档询问 | -20 |
| 疲惫 | 只询问简单问题 | -15 |
| 积极 | 可询问稍复杂问题 | +5 |
| 消极 | 只进行情感支持,不询问信息 | -10 |
实现代码示例:
python复制def get_mood_adjusted_score(topic: CareTopic, mood: dict) -> float:
adjustment = 0.0
if mood["mood"] == "negative":
adjustment -= 10
elif mood["mood"] == "positive":
adjustment += 5
return adjustment
5. 数据存储与隐私保护
5.1 三表数据模型设计
WeClaw使用三种表结构存储用户档案信息:
- user_profiles表:键值对形式存储基础属性
- family_members表:存储家庭成员详细信息
- social_contacts表:存储重要社交联系人
这种设计既保证了灵活性,又能处理复杂的关系数据。
5.2 隐私保护措施
我们实施了多项隐私保护机制:
- 来源标记:明确区分用户直接提供和系统推断的数据
- 置信度阈值:低于0.8的推断需要用户确认
- 本地存储:敏感信息不上传云端
- 用户更正:提供便捷的信息更正渠道
关键实现代码:
python复制def update_profile(key: str, value: Any, source: str, confidence: float):
if confidence < CONFIDENCE_THRESHOLD:
needs_confirmation = True
else:
needs_confirmation = False
db.execute("""
INSERT OR REPLACE INTO user_profiles
(key, value, source, confidence, needs_confirmation)
VALUES (?, ?, ?, ?, ?)
""", (key, value, source, confidence, needs_confirmation))
6. 实战问题排查案例
6.1 问题现象
用户反馈:"我多次查询'幼儿园学费',但系统没有识别出我有小孩"。
6.2 排查过程
- 检查日志发现规则未触发
- 确认关键词匹配逻辑正常
- 最终发现是事件监听优先级问题:
python复制# 错误配置:优先级过高导致被其他处理器阻断
event_bus.on(TOOL_CALL, handler, priority=100)
# 正确配置:调整优先级确保执行
event_bus.on(TOOL_CALL, handler, priority=300)
6.3 解决方案
- 调整事件监听器优先级
- 增加更详细的日志记录
- 添加单元测试覆盖此场景
7. 性能优化实践
7.1 关键词匹配优化
通过预处理将规则按工具分组,匹配时只需检查相关工具的规则:
python复制class OptimizedInferenceChecker:
def __init__(self):
self._rules_by_tool = defaultdict(list)
for rule in INFERENCE_RULES:
self._rules_by_tool[rule.tool].append(rule)
7.2 推断结果缓存
对推断结果进行短期缓存,避免重复计算:
python复制class InferenceCache:
def __init__(self, ttl=3600):
self._cache = {}
self._ttl = ttl
def get(self, key):
entry = self._cache.get(key)
if entry and time.time() - entry["time"] < self._ttl:
return entry["value"]
return None
def set(self, key, value):
self._cache[key] = {"value": value, "time": time.time()}
8. 开发经验与最佳实践
8.1 关键经验总结
- 渐进优于突击:分阶段收集信息用户体验更好
- 上下文是关键:在相关场景下询问相关信息
- 宁可错过,不要错判:低置信度推断需要确认
- 情绪感知必不可少:不要在用户烦躁时提问
8.2 避坑指南
- 避免单关键词推断:容易产生误判
- 不要直接暴露推断结果:用"您是不是..."的方式确认
- 注意事件监听顺序:优先级设置不当会导致处理器被跳过
- 定期更新关键词列表:用户习惯和流行语会变化
通过这套系统,WeClaw实现了在几乎不打扰用户的情况下,构建出完整的用户画像。这种无感建档方式不仅提高了用户体验,也为后续的个性化服务打下了坚实基础。
