AI Human Friction Model
面向 AI 编码代理的人类交互成本建模
面向 AI 编码代理的人类交互成本建模
Human Interaction Friction Model · 工程研究稿
| 核心命题 AI 不需要拥有人类的痛苦,但需要拥有人类痛苦的可计算代理。 |
|---|
案例来源:歌词时间戳编辑器微交互 · 2026-08-30
摘要
当前 AI 编码系统已经能够快速完成大量功能性开发任务,但在微交互、连续操作和高频任务中,仍经常出现一种现象:功能在工程意义上已经正确,但在人类使用意义上仍然存在显著摩擦。本文以歌词时间戳编辑器为案例:用户需要在歌曲播放过程中连续为歌词打时间戳。传统实现虽然能够正确写入时间,但要求用户在每次操作后重新移动鼠标、滚动列表并寻找下一目标。对于快速歌曲,这些额外动作会显著增加完成时间和误操作概率。
本文提出一种工程化观点:AI 无须真正体验人的疲劳、焦躁或不适,但应当拥有能够近似这些体验后果的可计算代理指标(Computable Proxies)。在此基础上,本文构建一套 Human Interaction Friction Model(HIFM,人类交互摩擦模型),通过指针移动距离、目标重新获取次数、滚动次数、等待延迟、认知负荷和错误率等指标,对用户体验进行量化,并讨论其如何成为未来 AI Coding Agent 的自主验收机制。
| 概念边界 Fitts’s Law 等属于既有 HCI 理论;HFC、APR、Fixed Action Anchor 等在本文中作为工程化建模与命名,用于描述本案例及其可推广机制,并非宣称为现有国际标准。 |
|---|
1. 问题定义
假设用户需要为一首包含 N 条歌词的歌曲连续打时间戳。普通实现流程为:点击当前歌词 → 写入时间戳 → 寻找下一句 → 滚动 → 移动鼠标 → 再次点击。
-
点击事件正常;时间戳写入正确;数据成功保存。
-
页面没有报错;音频播放正常;列表可以滚动。
因此,传统功能测试可能给出 Engineering Correctness = PASS。可是对于真实用户,每完成一次操作,还存在额外的人机交互成本。若一首歌有 120 条歌词,则从第一句到最后一句存在 119 次潜在重新定位过程。
| 关键结论 功能正确性并不能推出交互正确性。 |
|---|
2. Engineering Loss 与 Human Loss
传统软件工程主要关注 Engineering Loss,例如编译错误、运行时异常、API 失败、数据错误、系统崩溃、安全漏洞和性能问题。但真实产品还存在另一类损失:Human Loss,即用户为了完成任务而承担的动作、认知、等待和错误成本。
| L_total = α · L_engineering + β · L_human α 表示工程正确性权重,β 表示用户交互成本权重。 |
|---|
在金融结算等系统中,通常 α ≫ β;而在歌词标注、视频剪辑、绘图、游戏控制、数据标注等高频交互系统中,β 的重要性会显著提高。
3. Human Friction:把“难用”变成可计算问题
“累”“烦”“麻烦”“找不到”本身不是机器可直接计算的指标,因此需要完成一次代理变量映射:主观体验 → 行为结果 → 可观测指标。
| 人的感受 | 可计算代理指标 |
|---|---|
| 手累 | 鼠标移动距离、拖拽距离 |
| 操作繁琐 | 点击次数、滚动次数 |
| 找不到按钮 | 目标重新获取次数 |
| 眼睛累 | 视觉跳转距离、信息搜索次数 |
| 等得烦 | 系统响应延迟、动画时间 |
| 容易点错 | Error Rate / Miss Rate |
| 脑子累 | 状态记忆数量、决策数量 |
| 操作被打断 | Task Context Switch Count |
因此,“用户痛苦”未必可以直接测量,但导致这种痛苦的行为成本通常可以测量。
4. 指针移动成本
定义第 i 次操作时鼠标屏幕坐标为 p_i = (x_i, y_i)。连续两次操作之间的欧氏距离为:
| d_i = √[(x_{i+1} − x_i)² + (y_{i+1} − y_i)²] |
|---|
完成整个任务时,鼠标总移动距离为:
| D_pointer = Σ d_i , i = 1 … N−1 |
|---|
对于传统歌词时间戳模式,D_pointer > 0,并且通常随歌词数量增加而增加。固定操作锚点的设计目标是:
| D_pointer ≈ 0 连续录入期间,人手保持稳定,由系统移动下一操作目标。 |
|---|
5. Fitts’s Law:为什么鼠标距离真的存在成本
在人机交互领域,Fitts’s Law 用于描述指向目标所需时间与目标距离、目标尺寸之间的关系,其常见形式为:
| MT = a + b · log₂(1 + D / W) MT:移动时间;D:目标距离;W:目标有效宽度;a、b 为经验参数。 |
|---|
其中难度指数(Index of Difficulty)为:
| ID = log₂(1 + D / W) |
|---|
例如 D = 80 px、W = 28 px 时,ID ≈ 1.95。若这种重新定位连续发生 100 次,其微小成本会累计。固定锚点模式下 D ≈ 0,因此 ID ≈ 0,等价于近乎消除“移动至下一目标”这一部分的运动成本。
6. Target Reacquisition Cost
鼠标移动之前,用户通常还要重新找到下一次应该点击的位置。定义 R_i 为本次操作是否需要重新获取目标:需要则为 1,不需要则为 0。
| R = Σ R_i |
|---|
普通列表中 R 往往接近 N;固定锚点模式希望 R 接近 1:用户第一次定位按钮后,后续所有操作目标都来到相同位置。
7. Manual Scroll Cost
定义 S_manual 为用户主动执行鼠标滚轮、滚动条拖动、Trackpad 或触摸滑动的次数。传统设计通常 S_manual > 0,而固定操作锚点模式的目标是:
| S_manual = 0 |
|---|
这里并不是禁止滚动,而是将空间调整从“用户滚动”转换为“系统滚动”:S_system > 0,但 S_manual = 0。
| 设计原则 由系统承担空间调整成本,而不是让用户承担。 |
|---|
8. Human Friction Cost(HFC)
为了形成可自动比较的综合指标,可以定义:
| HFC = w_D·D̂ + w_R·R̂ + w_S·Ŝ + w_T·T̂ + w_E·Ê + w_L·L̂ |
|---|
其中 D 为鼠标总移动距离,R 为目标重新获取次数,S 为人工滚动次数,T 为任务完成时间,E 为错误率,L 为等待延迟,w 为各指标权重,带帽变量表示归一化值。
归一化的原因是不同指标量纲不同。例如 4000 px、3 次错误、2.3 秒等待不能直接相加。可以采用基线归一化:
| D̂ = D / D_baseline |
|---|
若旧版平均鼠标移动 4000 px,新版为 200 px,则 D̂ = 0.05,即 Pointer Travel Reduction = 95%。
9. 歌词时间戳系统的优化目标
该功能可以被描述为一个受约束优化问题:
| minimize HFC |
|---|
-
TimestampAccuracy = 100%
-
PointerDisplacement → 0
-
ManualScroll = 0
-
TargetReacquisition → 0
-
InteractionLatency < threshold
用产品语言表达:在保证时间戳正确的前提下,让用户尽可能少移动鼠标、少滚动、少重新寻找按钮、少等待。
10. Fixed Action Anchor Pattern
本文将这种高频连续操作模式命名为 Fixed Action Anchor Pattern(固定操作锚点模式):将用户的操作位置固定,由系统主动把下一待处理对象移动到固定操作位置。
| Target_i —click→ Processed ; Target_{i+1} → Anchor |
|---|
| p_{i+1} ≈ p_i |
|---|
工程中可以允许一个极小误差:
| ||p_{i+1} − p_i|| < ε 例如 ε = 2 px。 |
|---|
11. Anchor Preservation Rate(APR)
为了便于自动测试,可以定义锚点保持率:
| APR = N_successful_anchor_transitions / N_all_transitions |
|---|
例如 100 次连续操作中有 98 次下一按钮准确进入锚点范围,则 APR = 98%。对于本文案例,理想目标是 APR = 100%,包括最后一条歌词。
12. 为什么最后几句会失败
实际实现中,前面的歌词可以正常移动到鼠标位置,但到了歌曲最后几句,下一歌词无法继续上移。这不是锚点算法失效,而是滚动容器达到最大滚动边界。
| scrollTop_max = scrollHeight − clientHeight |
|---|
当 scrollTop = scrollTop_max 后,即使目标仍没有到达锚点,浏览器也没有更多内容可继续滚动。因此这是 Scroll Geometry 问题,而不是目标定位问题。
13. Bottom Spacer:为最后一条提供“滚动余量”
解决方式是在歌词列表底部增加一个额外可滚动空间 Bottom Spacer。它不是真实歌词,不参与业务数据,不可点击,没有文本,只用于提供滚动余量。
其结构可理解为:正常歌词列表 + 末尾不可见的空白缓冲区。
14. Bottom Spacer 的数学模型
设歌词容器顶部为 Y_t,底部为 Y_b,用户鼠标固定锚点为 Y_a,最后按钮距离内容底部仍有 B 的剩余空间。为了让最后按钮仍能移动至 Y_a,底部至少需要:
| H_spacer = max(0, Y_b − Y_a − B) |
|---|
若最后按钮基本位于内容末尾,按钮高度为 H_button,可近似取 B ≈ H_button / 2,因此:
| H_spacer ≈ Y_b − Y_a − H_button / 2 |
|---|
例如 Y_b = 900、Y_a = 600、H_button = 40,则 H_spacer = 280 px。
15. 为什么不应该固定写“20 行空白”
固定 padding-bottom 虽然可能有效,但不是稳健方案,因为浏览器窗口、系统缩放、字体、移动设备、响应式布局都会改变实际几何关系。更合理的方法是在运行时根据容器底部、锚点位置和按钮尺寸动态计算 Spacer。
| spacerHeight = max(0, rect.bottom − anchorY − buttonHeight/2) |
|---|
16. 为什么 AI Coding Agent 没有主动发现
当前大部分 Coding Agent 的闭环近似为 Requirement → Generate Code → Run → Test → PASS/FAIL。测试主要验证 Functional Correctness:按钮能点、数据写入、下一行可见、没有运行时错误。于是 Agent 很容易宣布 TASK COMPLETED。
但用户真实使用可能仍然发生 119 次目标重新定位、80 次鼠标移动、12 次人工滚动、4 次误点击。这些行为通常不会被传统测试视为 Software Failure。
17. 更完整的 AI Product Agent 闭环
面向产品体验的 Agent 应扩展为:Requirement → Implementation → Functional Test → Simulated User Task → Human Friction Measurement → UX Evaluation → Redesign / Pass。
| Done ⇔ EngineeringLoss < threshold AND HumanFriction < threshold |
|---|
只有工程正确与人类交互成本同时通过门槛,Agent 才允许宣告完成。
18. AI 是否需要“痛苦”
真人工程师会通过手部运动、视觉搜索、等待、错误和连续操作累积主观反馈;AI 本身不会疲劳、焦躁或不耐烦。但这并不意味着 AI 无法优化体验。它真正需要的是这些主观体验背后的可计算代理信号。
19. Reward 与 Human Friction
| Reward = R_functional − λ · HFC |
|---|
当 HFC 上升时,Reward 下降;当 HFC 下降时,Reward 上升。这里的目标不是让 AI 真正“感到移动鼠标很累”,而是让制造用户额外操作成本成为系统中的负反馈。
20. 从 Human Pain 到 Machine Loss
完整转换链可以表示为:
| Human Pain → Behavioral Cost → Observable Metric → Machine Loss → Optimization |
|---|
例如:“每次都挪鼠标太烦” → 每次任务需要重新移动指针 → Pointer Travel = 4260 px → HFC 上升 → Agent 寻找降低 Pointer Travel 的方案 → 固定鼠标锚点 → 重新测试 Pointer Travel = 120 px。
21. 自然语言编程仍然存在 Specification Barrier
普通用户可以说“帮我做一个歌词时间戳编辑器”,但未必知道如何提出 Fixed Action Anchor、Pointer Invariant、Dynamic Bottom Spacer、APR 等专业约束。如果必须用户掌握这些概念,编程门槛只是发生了迁移:
| Programming Barrier → Specification Barrier |
|---|
也就是说,编程门槛下降,但需求形式化门槛仍然存在。
22. 理想的 AI Product Engineer
更理想的 AI 不应该要求用户首先学习专业语言。用户只需要说:“我打每一句歌词都要一直往下挪鼠标,很累。” AI 应自动推导:高频连续任务 → 重复指针位移 → 目标重新获取成本 → 固定操作锚点 → 最后项滚动边界 → 动态 Bottom Spacer → 验收 Pointer Displacement ≈ 0、APR = 100%。
| Human Complaint → UX Model → Engineering Constraint → Implementation → Evaluation |
|---|
23. AI 看见交互,与人经历交互
AI可以读取截图、分析 DOM、查看代码、分析视频和观察不同时间点的视觉状态;但人类亲自经历交互时还拥有手部运动反馈、鼠标距离、视觉注意变化、操作节奏、等待感、错误后的恢复以及疲劳累积。
| 核心差异 AI 可以看到交互,人是在经历交互。未来 Agent 的目标,是通过可测量代理,让“看到”更接近“经历后的判断”。 |
|---|
24. 一套最小可用的 Human Friction Metrics
| Metric | Symbol | Optimization |
|---|---|---|
| Task Completion Time | T | ↓ |
| Pointer Travel Distance | D | ↓ |
| Manual Scroll Count | S | ↓ |
| Target Reacquisition Count | R | ↓ |
| Interaction Latency | L | ↓ |
| Error / Miss Rate | E | ↓ |
| Anchor Preservation Rate | APR | ↑ |
| HFC = w_T·T̂ + w_D·D̂ + w_S·Ŝ + w_R·R̂ + w_L·L̂ + w_E·Ê + w_A·(1−APR) |
|---|
25. Human Friction 的进一步拆分
| HFC = H_motor + H_visual + H_cognitive + H_latency + H_error |
|---|
-
Motor Friction:鼠标移动、拖拽、滚动、点击次数。
-
Visual Friction:搜索目标、视线跨度、信息拥挤、页面跳转。
-
Cognitive Friction:记忆状态、决策数量、规则一致性、上下文切换。
-
Latency Friction:动画、网络等待、响应时间、页面切换。
-
Error Recovery Friction:误操作概率、撤销次数、恢复步骤、数据损失风险。
26. 一个可能的 Agent UX Gate
未来可以像 CI/CD 一样,为 AI 产品增加 UX Gate。即使 Unit Test = PASS,只要 Pointer Travel、Error Rate 或 APR 出现显著回归,仍禁止自动合并。
| Experience Gate = Functional PASS + Friction PASS |
|---|
这意味着 UX 可以从“主观意见”逐渐进入工程质量门禁体系。
27. 从 Code Quality 到 Experience Quality
传统软件工程已经拥有 Unit Test、Integration Test、E2E Test、Performance Test、Security Test、Regression Test。AI Agent 时代可以进一步加入 Experience Test:模拟点击、滚动、拖拽、等待、选择、返回、撤销和连续操作,并记录时间、距离、状态切换、错误、等待和操作数量。
28. 结论
歌词编辑器里的一个小按钮暴露了 AI 软件工程中的基础矛盾:功能正确与产品正确不是同一个问题。AI 已经非常擅长降低软件从 0 到 60 分的生成成本,但从 60 到 80、80 到 90、90 到真正好用,仍隐藏着大量用户行为、操作摩擦、视觉细节、边界状态和认知成本。
未来真正成熟的 AI Product Engineer,不应该只拥有 Compiler、Tests、Browser、DOM、Logs、Screenshots,还应该拥有一套 Human Friction Model,使其能够主动判断:用户是否多做了一个不必要动作?目标是否离鼠标过远?是否需要反复寻找同一个按钮?动画是否浪费操作时间?流程是否产生不必要的认知切换?
| 最终结论 AI 不需要拥有人类的痛苦,但需要拥有人类痛苦的可计算代理。只有当这些代理进入 Observation → Measurement → Loss → Evaluation → Autonomous Iteration 之后,AI 才可能从“能够生成软件”进一步走向“能够主动发现软件为什么难用”。 |
|---|
参考概念
-
Fitts’s Law
-
Index of Difficulty
-
Human-Computer Interaction (HCI)
-
Human Factors
-
Interaction Cost
-
Target Acquisition
-
Cognitive Load
-
Error Rate
-
Task Completion Time
-
UX Regression
-
Reinforcement Learning Reward / Loss
-
Automated UI Testing
-
AI Coding Agent
-
Autonomous Software Engineering
核心公式汇总
总软件损失:L_total = α·L_engineering + β·L_human
指针总移动距离:D_pointer = Σ √[(x_{i+1}−x_i)² + (y_{i+1}−y_i)²]
Fitts’s Law:MT = a + b·log₂(1 + D/W)
Index of Difficulty:ID = log₂(1 + D/W)
Human Friction Cost:HFC = w_D·D̂ + w_R·R̂ + w_S·Ŝ + w_T·T̂ + w_E·Ê + w_L·L̂
Anchor Preservation:||p_{i+1} − p_i|| < ε
Anchor Preservation Rate:APR = N_successful / N_all
Scroll Maximum:scrollTop_max = scrollHeight − clientHeight
Bottom Spacer:H_spacer = max(0, Y_b − Y_a − B)
Agent Reward:Reward = R_functional − λ·HFC
完整模型:HFC = H_motor + H_visual + H_cognitive + H_latency + H_error