AI匹配:矩阵优先,神经网络随后
Source: Dev.to
1. 真正的业务问题:“我们从哪里获取用于训练神经网络的数据?”
让我们从大多数团队不愿明确阐述的问题说起。
神经网络 不会 因为它们本身不好而失败。
它们失败的原因是 它们需要的数据尚不存在。
要训练一个有意义的匹配模型,你需要:
- 历史匹配记录
- 结果(成功/失败)
- 用户行为(点击、接受、转化)
- 足够的量级以避免过拟合
早期系统往往缺乏这些数据。这就产生了一个悖论:
- 你需要好的匹配来获取用户。
- 你需要用户来获取数据。
- 你需要数据来训练匹配模型。
大多数团队会悄悄忽视这一点,直接上线:
- 随机相关性
- 过度自信的 AI 标注
- 伪装成 “ML” 的脆弱规则引擎
这不是技术问题,而是 产品和架构问题。
2. 一个具体的使用案例:选择合适的营销渠道或代理机构
情景: 一家公司正在推出新的营销活动,想要选择 合适的广告渠道、代理机构或网红。
约束条件真实:
- 预算有限
- 品牌声誉受到影响
- 对什么会有效的期望不明确
对于此确切设置 没有历史绩效数据。
供给侧属性(渠道、代理机构、网红):
- 不同的覆盖范围
- 不同的可信度
- 不同的风险特征
- 不同的沟通风格
业务问题 不是:
“哪个选项在统计上与此活动相似?”
真正的问题是:
“哪个选项最符合此活动的期望和约束?”
这是一种 兼容性问题,而非相似性问题。
3. 为什么 “只训练神经网络” 在这里行不通
此时,通常会有人说:
“我们把所有东西都嵌入进去,之后再训练模型。”
这只有在你已经拥有以下条件时才有效:
- 结果(Outcomes)
- 标签(Labels)
- 规模(Scale)
在我们的使用场景中,这些都不存在。尝试使用神经网络会导致三种失败之一:
- 在极少数据上过拟合 – 模型输出看似自信的噪声。
- 模型被“暂时”禁用 → 实际上是永久禁用 – 团队失去信任。
- 没有对“拟合”意义的先验理解 – 系统盲目无知。
真正的问题并不是缺少机器学习人才;而是 系统没有“拟合”这一先验概念。 你需要一个先验。
4. 重新构建问题:相似性 vs. 兼容性
这是关键的概念转变。
大多数机器学习工具围绕 相似性 构建:
- Cosine similarity
- Euclidean distance
- Nearest‑neighbors
相似性回答:
“这两件事有多相似?”
但业务匹配很少会这样提问。相反,它会问:
“这个选项在此情境下有多合适?”
那就是 兼容性——它具有:
- 非对称
- 基于期望
- 领域特定
并且它可以 显式 表达,而无需假装从不存在的数据中学习它。
Source: …
5. 解决方案:兼容性矩阵(特征矩阵,而非机器学习)
与其尝试学习相关性,不如将领域知识编码为矩阵。
定义两个小而稳定的特征空间。
活动方
blog_type ∈ { corporate, brand_voice, expert, personal }
涵盖:
- 沟通的正式程度
- 预期的权威水平
- 可接受的个人叙事方式
供应方(机构 / 网红 / 渠道)
social_status ∈ { celebrity, macro, micro, nano }
涵盖:
- 感知的权威性
- 覆盖范围的预期
- 风险容忍度
- 可信度
现在定义一个 compatibility matrix:
compatibility[blog_type][social_status] → score ∈ [0 … 1]
该矩阵回答:
“给定此活动风格,这种权威水平有多合适?”
它 不是猜测;它是一个 product hypothesis。
6. 示例:一个简单的 4 × 4 兼容矩阵
| celebrity | macro | micro | nano
---------------|-----------|-------|-------|------
corporate | 1.0 | 0.8 | 0.4 | 0.2
brand_voice | 0.7 | 1.0 | 0.8 | 0.5
expert | 0.6 | 0.9 | 1.0 | 0.7
personal | 0.3 | 0.6 | 0.9 | 1.0
# Compatibility Matrix lookup (Day‑1 matching)
matrix = {
'corporate': [1.0, 0.8, 0.4, 0.2],
'brand_voice': [0.7, 1.0, 0.8, 0.5],
'expert': [0.6, 0.9, 1.0, 0.7],
'personal': [0.3, 0.6, 0.9, 1.0]
}
def matrix_score(campaign_type: str, influencer_status: str) -> float:
"""O(1) lookup — thousands of RPS without trouble."""
statuses = ['celebrity', 'macro', 'micro', 'nano']
idx = statuses.index(influencer_status)
return matrix[campaign_type][idx]
# Production usage
score = matrix_score('corporate', 'macro') # 0.8 ✅
print(f"Corporate ↔ Macro: {score}")
这在业务层面的含义
- Corporate(企业)活动侧重权威性和低风险。
- Personal(个人)叙事在可关联的、小众的声音中更能发挥作用。
- Expert(专家)活动更看重可信度,而不是单纯的覆盖量。
重要说明
- 这些数字是 相对值,而非绝对值。
- 它们并不预测成功,而是定义 预期匹配度,而非结果。
7. 为什么在没有数据的情况下也能工作
“这不就是硬编码的逻辑吗?”
是的——这正是重点。
当你没有数据时,唯一可靠的真相来源是人类专业知识。将这种专业知识转化为透明的矩阵:
- 你获得即刻相关性——系统可以立刻给出合理的推荐。
- 避免过拟合——没有模型在少量数据上过拟合。
- 创建反馈回路——随着真实结果的出现,你可以调整矩阵或逐步引入机器学习组件。
换句话说,这个矩阵是一个基线,在拥有足够信号后可以演化为数据驱动的模型。
8. 从矩阵到机器学习(当数据到来时)
当你开始收集结果时,你可以:
- Validate 矩阵与真实转化率进行验证。
- Calibrate 分数(例如,通过逻辑回归),同时保持相同的特征空间。
- Hybridize – 将矩阵作为贝叶斯模型中的强先验或作为下游学习器的特征。
由于 特征定义保持不变,仅最终相关性得分的计算方式改变,过渡是平滑的。
9. 要点
- 不要等到有数据 再开始提供相关性。
- 显式编码领域知识 为 compatibility matrix。
- 将矩阵视为 product hypothesis,而不是最终预测。
- 将其用作未来 data‑driven model 的 launchpad。
通过将问题从“similarity”重新定义为“compatibility”,并在前期利用人类专业知识,你可以从第一天起交付一个有用的匹配引擎——无需大数据。
为什么使用 Compatibility Matrix?
一个 compatibility matrix 是 结构化、分级、显式 的,区别于:
- 二元规则
if/else链- “Fake” ML 模型
Compatibility matrix 为你提供:
- 确定性行为
- 可解释的决策
- 可控的偏差
- 早期相关性的稳定性
最重要的是,它在任何数据存在之前为系统提供 a worldview。
Source: …
8. 如何在不重写的情况下演变为机器学习
这种方法 不是反机器学习——它是 机器学习前置。
随着系统运行,你自然会收集:
- 哪些匹配被列入候选名单
- 哪些被接受
- 哪些导致了互动或转化
此时,转变是渐进的。
阶段 1 — 仅矩阵
score = compatibility_matrix[blog_type][social_status]
阶段 2 — 混合
# Phase 2: Matrix 70% + NN 30%
matrix_score = 0.8
nn_score = nn_model.predict(features) # 0.75
final_score = 0.7 * matrix_score + 0.3 * nn_score # 0.785
阶段 3 — 机器学习主导
score = nn_prediction
矩阵永远不会消失;它会变成:
- 基线
- 正则化器
- 冷启动的后备方案
9. 为什么这能让你在第一天就具备相关性
匹配系统中最大的隐藏风险是 上线时的无关性。
如果用户看到的匹配质量差:
- 他们不会互动
- 你无法收集数据
- 你的机器学习路线图在起步前就夭折
兼容性矩阵可以避免这个陷阱。它能为你提供:
- 合理的默认值
- 与业务预期相符的行为
- 来自用户的信任
- 实际反映意图的数据
所有这些都不需要假装拥有大数据。
# Day 1: 100% matrix, no training data needed
def get_matches(request, suppliers, min_score=0.6):
matches = []
for supplier in suppliers:
score = matrix_score(request.campaign_type, supplier.category)
if score >= min_score:
matches.append((supplier, score))
# Sort by score descending and return top 14
return sorted(matches, key=lambda x: x[1], reverse=True)[:14]
# Real metrics: 47 suppliers → 12 matches → 3 % conversion
# O(n) complexity, thousands of RPS, zero cold start
最后要点
如果只能记住一个概念:
相似度 是一个数学概念。
兼容性 是一个业务概念。
神经网络擅长在世界给你数据之后学习相似度。
兼容性矩阵让你在那个时刻到来之前就可以行动。
- 先有矩阵。
- 后用神经网络。
这不是妥协,而是让真实的匹配系统活得足够久以进行学习的方式。