AI Human Friction Model

AI Human Friction Model

面向 AI 编码代理的人类交互成本建模

操作指南DOCX下载原文件
从功能正确到交互低摩擦

面向 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