基于米塞斯行为学的专家匹配优化 + TITANS 长期记忆
问题分析
原有方案的局限性:
- 硬编码权重 - 关键词权重写死在配置文件中
- 静态规则 - 无法适应新问题类型
- 需要重新部署 - 每次调整都要重启服务
- 没有学习能力 - 不会从用户行为中改进
- 无记忆能力 - 不记得用户的历史偏好
米塞斯行为学原理
核心公理:人的行为是有目的的(Human Action)
"人的行为是有目的的行动。行动意味着使用手段来达成目的。" —— 路德维希·冯·米塞斯《人的行为》
应用到专家匹配
| 概念 | 在专家匹配中的对应 |
|---|---|
| 目的 | 用户真正想要解决的问题/获得的帮助 |
| 手段 | 用户选择的表达方式(提问) |
| 选择 | 系统为用户匹配的专家 |
| 效用 | 专家回答对用户的帮助程度 |
新架构:意图分析器 + TITANS 长期记忆
用户问题
↓
┌─────────────────────────────────────┐
│ TITANS 长期记忆查询 │
│ - 用户历史意图模式 │
│ - 专家偏好记录 │
│ - 反馈学习结果 │
└─────────────────────────────────────┘
↓
┌─────────────────────────────────────┐
│ 意图分析器 (IntentAnalyzer) │
│ 米塞斯行为学 + TITANS 记忆增强 │
├─────────────────────────────────────┤
│ 1. 识别意图类别 (8类) │
│ - 求知型:想要了解/学习 │
│ - 解决问题型:遇到具体问题 │
│ - 决策型:需要帮助做出选择 │
│ - 情感型:寻求情感支持 │
│ - 实践型:想要实际操作/执行 │
│ - 验证型:想要确认/验证 │
│ - 闲聊型:社交需求 │
│ - 追问型:对之前回答的追问 🆕 │
│ │
│ 2. 识别领域 │
│ 法律/健康/心理/技术/烹饪/文化... │
│ │
│ 3. TITANS 增强置信度 │
│ 基于历史模式调整分析结果 │
│ │
│ 4. 推断目的 │
│ "用户真正想要什么?" │
│ │
│ 5. 计算紧迫性 │
│ 紧急问题需要更专业的回答 │
│ │
│ 6. 确定需要的专业领域 │
│ 基于目的+记忆推断最合适的专家 │
└─────────────────────────────────────┘
↓
┌─────────────────────────────────────┐
│ 动态权重调整 │
│ - 意图加分:根据分析结果加分 │
│ - 反馈学习:从用户行为中学习 │
│ - TITANS 存储:写入长期记忆 │
│ - 惊讶度学习:关注异常反馈 │
│ - 自适应:无需重新部署 │
└─────────────────────────────────────┘
↓
最佳匹配专家
TITANS 长期记忆增强
记忆内容
| 记忆类型 | 内容 | 用途 |
|---|---|---|
| 意图历史 | 用户的意图类别统计 | 预测下次意图 |
| 领域偏好 | 用户常问的领域 | 调整领域识别置信度 |
| 专家偏好 | 用户常用的专家 | 个性化专家推荐 |
| 反馈记录 | 正面/负面反馈 | 惊讶度学习 |
惊讶度学习
# 正常反馈:常规存储
importance = 1.0
# 负面反馈:这是"惊讶"的,需要特别记住
if not was_helpful:
importance = 1.5 # 提高重要性
# TITANS 会对高重要性记忆进行更强的存储
titans.store(content, importance=importance)
记忆查询示例
# 查询用户历史
memory = titans.retrieve(query, context_key=f"intent:{user_id}")
# 返回结果
{
"intent_preferences": {"求知型": 15, "解决问题型": 8},
"domain_preferences": {"技术": 12, "法律": 3},
"expert_preferences": {"系统设计专家": 10, "民事律师": 2}
}
核心代码
意图分析器 (src/knowledge/intent_analyzer.py)
class IntentAnalyzer:
"""
基于米塞斯人的行为学原理分析用户意图
"""
def analyze(self, query: str, user_id: str) -> Intent:
# 1. 识别意图类别
intent_category = self._detect_intent_category(query)
# 2. 识别领域
domain = self._detect_domain(query)
# 3. 推断目的(核心:理解用户真正想要什么)
purpose = self._infer_purpose(intent_category, domain, query)
# 4. 确定需要的专业领域
expertise_needed = self._determine_expertise(intent_category, domain)
return Intent(
category=intent_category,
purpose=purpose,
expertise_needed=expertise_needed,
confidence=confidence
)
def record_feedback(self, user_id, query, expert, was_helpful):
"""从用户反馈中学习,动态调整权重"""
if not was_helpful:
self._adjust_weights_from_failure(query, expert)
else:
self._adjust_weights_from_success(query, expert)
集成到专家路由器
def match_expert(self, query, user_id):
# 1. 米塞斯意图分析(新增)
intent = analyzer.analyze(query, user_id)
# 2. 关键词匹配
scores = self._keyword_match(query)
# 3. 意图分析加分(动态,非硬编码)
for expert_id, expert in experts.items():
intent_boost = analyzer.get_expert_boost(intent, expert_id)
scores[expert_id] += intent_boost
# 4. 返回最佳匹配
return sorted_experts
优势对比
| 特性 | 原方案(硬编码权重) | 新方案(米塞斯+TITANS) |
|---|---|---|
| 新问题适应 | 需要手动调整 | 自动推断 |
| 部署要求 | 需要重启服务 | 无需重启 |
| 学习能力 | 无 | 从反馈中学习 |
| 维护成本 | 高 | 低 |
| 准确性 | 依赖规则覆盖 | 基于目的理解 |
| 长期记忆 | 无 | TITANS 永久存储 |
| 用户个性化 | 无 | 基于历史偏好 |
| 跨会话理解 | 无 | 记住用户模式 |
| 异常学习 | 无 | 惊讶度机制 |
反馈学习机制
# 用户切换专家或表示不满意时
analyzer.record_feedback(
user_id=user_id,
query=query,
matched_expert=expert,
was_helpful=False, # 用户不满意
user_switched=True # 用户切换了专家
)
# 系统自动调整权重,下次类似问题会有更好的匹配
测试结果
优化后的匹配效果:
- ✅ 情感问题 → 心理健康顾问
- ✅ 营养问题 → 营养治疗师
- ✅ 系统设计 → 系统设计专家
- ✅ 面包烘焙 → 面包大师
- ✅ 法律问题 → 民事律师
- ✅ 无明确匹配 → 通用生活助手(兜底)
已实现的扩展功能
1. LLM 深度意图分析
当规则分析置信度低时,使用 LLM 进行更深层的意图理解:
# 自动触发 LLM 分析
async def analyze_with_llm(self, query: str, user_id: str) -> Intent:
"""
LLM 分析提示词:
- 分析意图类别
- 识别领域
- 推断用户真正目的
- 计算紧迫性和置信度
"""
prompt = f"分析用户问题的真正意图: {query}"
response = await llm.chat(prompt)
return parse_intent_from_llm(response)
2. HOPE 用户画像整合
结合 HOPE 记忆系统,实现个性化专家匹配:
def _get_hope_boost(self, intent: Intent, expert_id: str) -> float:
"""
基于用户画像调整分数:
- 用户对专家的历史满意度
- 用户的领域兴趣偏好
- 交互风格匹配
"""
rating = hope_memory.get_expert_rating(expert_id)
if rating > 0.7:
return 2.0 # 用户喜欢这个专家
elif rating < 0.3:
return -1.0 # 用户不喜欢
return 0.0
3. 多轮对话意图追踪
识别追问,保持对话上下文:
def detect_follow_up(self, user_id: str, query: str) -> (bool, expert_id):
"""
追问检测特征:
- 代词使用("它"、"这个")
- 短问题(< 20字)
- 时间间隔短(< 5分钟)
"""
# 如果是追问,继续使用上一轮的专家
if is_follow_up:
return True, previous_expert_id
4. A/B 测试框架
持续优化算法的实验框架:
# 获取用户分组
variant = analyzer.get_ab_test_variant(user_id)
# A 组:仅规则分析
# B 组:规则 + LLM 深度分析
# 记录结果
analyzer.record_ab_test_result(variant, accuracy=0.85, latency=0.3)
# 获取报告
report = analyzer.get_ab_test_report()
# {
# "A": {"sample_size": 500, "avg_accuracy": 0.72, "avg_latency": 0.1},
# "B": {"sample_size": 480, "avg_accuracy": 0.85, "avg_latency": 0.4},
# "recommendation": "B" # B组准确率更高
# }
完整功能架构
┌─────────────────────────────────────────────────────────┐
│ 意图分析器 │
│ 米塞斯行为学 + TITANS + 扩展功能 │
├─────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ TITANS 记忆 │ │ HOPE 画像 │ │ LLM 深度分析│ │
│ │ - 长期记忆 │ │ - 用户偏好 │ │ - 复杂意图 │ │
│ │ - 全局上下文│ │ - 满意度 │ │ - 模糊问题 │ │
│ │ - 惊讶度学习│ │ - 兴趣领域 │ │ - 深层理解 │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ │ │ │ │
│ └────────────────┼────────────────┘ │
│ ▼ │
│ ┌──────────────────────────────────────────────────┐ │
│ │ 米塞斯意图分析核心 │ │
│ │ - 意图类别识别(8类) │ │
│ │ - 领域检测(8大领域) │ │
│ │ - 目的推断(核心:用户真正想要什么) │ │
│ │ - 紧迫性计算 │ │
│ └──────────────────────────────────────────────────┘ │
│ │ │
│ ┌────────────────┼────────────────┐ │
│ ▼ ▼ ▼ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │多轮对话追踪 │ │ A/B 测试 │ │ 反馈学习 │ │
│ │ - 追问检测 │ │ - 分组实验 │ │ - 权重调整 │ │
│ │ - 上下文保持│ │ - 效果对比 │ │ - 持续优化 │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ │
└─────────────────────────────────────────────────────────┘
动态关键词系统
问题:关键词从何而来?
原有方案的问题:
- 手动配置,每个领域只有 10-30 个关键词
- 缺乏系统性,容易遗漏重要词汇
- 新专家无法自动适配
解决方案:多源关键词提取
┌─────────────────────────────────────────────────────────────┐
│ 关键词来源(三层融合) │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ 开发者定义 │ │ 知识库提取 │ │ 用户反馈 │ │
│ │ (最高优先级) │ │ (自动TF-IDF) │ │ (持续学习) │ │
│ │ 20个核心词 │ │ 100个领域词 │ │ 动态调整 │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ │ │ │ │
│ └────────────────┼────────────────┘ │
│ ▼ │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ 专家关键词画像 (ExpertKeywordProfile) │ │
│ │ - core_keywords: 核心词(权重3.0) │ │
│ │ - domain_keywords: 领域词(权重1.5) │ │
│ │ - extended_keywords: 扩展词(权重0.5) │ │
│ └──────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
每个领域的关键词覆盖
| 领域 | 关键词数量 | 覆盖范围 |
|---|---|---|
| 法律 | 100+ | 民事、劳动、消费、交通 |
| 健康 | 100+ | 症状、营养、运动、疾病 |
| 心理 | 100+ | 情绪、问题、关系、成长 |
| 技术 | 100+ | 系统设计、数据库、编程、网络 |
| 烹饪 | 100+ | 面包、烹饪技法、食材、菜品 |
| 文化 | 100+ | 茶道、古建筑、历史、人物 |
| 考试 | 70+ | 公务员、备考、认证 |
| 生活 | 90+ | 日常、家居、技能、窍门 |
新专家自动适配
问题:专家数量增加如何处理?
当自研或开发者新建专家时,系统自动:
# 1. 开发者创建专家时
def on_expert_created(expert_config):
# 自动提取知识库关键词
extractor = get_keyword_extractor()
profile = extractor.build_expert_profile(
expert_id=expert_config["id"],
expert_name=expert_config["name"],
kb_id=expert_config["kb_id"],
developer_keywords=expert_config["keywords"]
)
# 自动扩展领域
expand_domain_from_expert(expert_config)
# 2. 意图匹配时动态使用
def match_intent(query, user_id):
# 使用动态关键词画像
profiles = extractor.get_all_keywords_for_matching()
# 匹配到具体专家,而非固定领域
matches = extractor.match_query_to_experts(query)
return matches
自适应流程
新专家创建
↓
┌─────────────────────────────────────┐
│ 1. 提取知识库关键词(TF-IDF) │
│ 2. 合并开发者定义的关键词 │
│ 3. 构建专家关键词画像 │
│ 4. 扩展领域指示器 │
└─────────────────────────────────────┘
↓
系统自动适配,无需重启
↓
┌─────────────────────────────────────┐
│ 用户提问时: │
│ - 意图分析识别目的 │
│ - 动态关键词匹配 │
│ - 结合 TITANS 记忆优化 │
└─────────────────────────────────────┘
↓
最佳专家匹配
反馈驱动优化
# 用户反馈时
def on_user_feedback(expert_id, query, was_helpful):
# 提取查询中的关键词
keywords = tokenize(query)
for kw in keywords:
# 记录到专家画像
extractor.add_feedback_keyword(expert_id, kw, was_helpful)
# 成功的关键词会提升到核心关键词
# 失败的关键词会被标记,避免误匹配
TITANS 关键词层级扩展
核心思想:指数级扩展
利用 TITANS 的记忆能力管理关键词层级关系:
第1层:8领域 × 100核心词 = 800
↓ 每词扩展100关联词
第2层:800 × 100 = 80,000
↓ 继续扩展
第3层:80,000 × 100 = 8,000,000
↓
第4层:8,000,000 × 100 = 8×10^8
↓
理论上可无限扩展...
层级结构
┌─────────────────────────────────────────────────────────────┐
│ TITANS 关键词图 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 第1层(核心词) 第2层(关联词) 第3层(扩展词) │
│ 权重: 1.0 权重: 0.7-0.9 权重: 0.3-0.6 │
│ │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ 合同 │───────→│ 违约 │───────→│ 违约金 │ │
│ │ │───────→│ 解除 │───────→│ 定金罚则│ │
│ │ │───────→│ 担保 │───────→│ 保证人 │ │
│ └─────────┘ └─────────┘ └─────────┘ │
│ │ │ │ │
│ │ │ │ │
│ 每个100词 每个100词 每个100词 │
│ = 800词 = 80,000词 = 8,000,000词 │
│ │
└─────────────────────────────────────────────────────────────┘
实现代码
class TitansKeywordManager:
"""基于 TITANS 的关键词层级管理"""
def expand_keyword(self, word: str, depth: int = 3) -> List[Tuple[str, float]]:
"""
递归扩展关键词
depth=1: 返回直接关联词(~100个)
depth=2: 返回二级关联(~10,000个)
depth=3: 返回三级关联(~1,000,000个)
"""
result = []
visited = set()
def _expand(current, d, weight):
if d > depth or current in visited:
return
visited.add(current)
result.append((current, weight))
for related, strength in self._keyword_graph[current].relations.items():
_expand(related, d + 1, weight * strength)
_expand(word, 0, 1.0)
return sorted(result, key=lambda x: x[1], reverse=True)
def learn_from_feedback(self, query, matched_domain, was_helpful):
"""
TITANS 惊讶度学习
成功匹配:常规存储,importance=1.0
失败匹配:惊讶反馈,importance=1.5(更强记忆)
"""
importance = 1.0 if was_helpful else 1.5
self._titans.store(
content=f"匹配: {query} -> {matched_domain}",
importance=importance
)
自动扩展能力
# 使用 LLM 自动扩展每个关键词到 100 个关联词
def auto_expand_with_llm(word: str, domain: str) -> List[str]:
prompt = f"列出与'{word}'相关的100个{domain}领域专业术语"
response = llm.chat(prompt)
return parse_keywords(response)
# 示例:扩展"合同"
expanded = auto_expand_with_llm("合同", "法律")
# 返回:违约、解除、担保、抵押、质押、转让、变更、终止...(100个)
# 继续扩展"违约"
expanded_2 = auto_expand_with_llm("违约", "法律")
# 返回:违约金、违约责任、根本违约、预期违约...(100个)
扩展规模统计
| 层级 | 关键词数量 | 覆盖能力 |
|---|---|---|
| 第1层 | 800 | 核心概念覆盖 |
| 第2层 | 80,000 | 专业术语覆盖 |
| 第3层 | 8,000,000 | 细分领域覆盖 |
| 第4层 | 800,000,000 | 几乎任何表述 |
TITANS 存储优化
# 关键词存储
titans.store(
content=f"关键词: {word}, 领域: {domain}",
context_key=f"keyword_graph:{domain}:{word}",
importance=1.0 / layer # 层级越高,重要性越低
)
# 层级关系存储
titans.store(
content=f"关系: {word1} -> {word2}, 强度: {strength}",
context_key=f"keyword_relation:{word1}:{word2}",
importance=strength
)
可扩展性设计
设计原则
- 专家自描述:每个专家通过知识库和配置自动生成匹配特征
- 动态更新:关键词库可热更新,无需重启服务
- 反馈学习:从用户行为持续优化匹配准确率
- 多层权重:核心词 > 领域词 > 扩展词,确保精准匹配
- TITANS 层级:利用 TITANS 管理无限层级的关键词关系
支持的专家规模
| 指标 | 当前 | 设计上限 |
|---|---|---|
| 专家数量 | 24+ | 1000+ |
| 关键词总数 | ~2000 | 理论无限(TITANS) |
| 层级深度 | 3 | 可配置 |
| 领域数量 | 8+ | 自动扩展 |
| 响应时间 | <100ms | <200ms |
与推荐系统集成 (2026-01-27)
意图分析已与专家推荐系统深度集成:
集成架构
用户查询
↓
┌─────────────────────────────────────┐
│ 意图分析器 (IntentAnalyzer) │
│ 米塞斯行为学 + TITANS 记忆增强 │
└─────────────────────────────────────┘
↓
┌─────────────────────────────────────┐
│ 推荐引擎 (RecommendationEngine)│
│ 意图匹配 + 协同过滤 + 信任度评分 │
└─────────────────────────────────────┘
↓
最佳专家推荐
相关模块
| 模块 | 文件 | 功能 |
|---|---|---|
| 意图分析 | src/knowledge/intent_analyzer.py |
米塞斯行为学分析 |
| 推荐引擎 | src/market/recommendation_engine.py |
多维度推荐 |
| 信任评分 | src/market/expert_trust_score.py |
专家质量评估 |
| 协同过滤 | src/market/collaborative_filter.py |
相似用户/专家推荐 |
| 探索策略 | src/market/exploration_strategy.py |
新专家曝光 |
推荐权重配置
RECOMMENDATION_WEIGHTS = {
"intent_match": 0.35, # 意图匹配(米塞斯)
"trust_score": 0.25, # 专家信任度
"cf_score": 0.20, # 协同过滤
"user_preference": 0.15, # 用户偏好(TITANS/HOPE)
"freshness": 0.05 # 新鲜度
}
参考
- 路德维希·冯·米塞斯《人的行为》(Human Action)
- TITANS: Learning to Memorize at Test Time (Google DeepMind)
- TF-IDF: Term Frequency-Inverse Document Frequency
- MBE 系统架构文档
最后更新: 2026-01-27