技术约束理解与三线冲突处理
PM 不需要会写代码,但必须听得懂"数据不够"、"延迟太高"、"准确率上不去"背后的真实意思。技术约束不是借口,是边界条件——在边界内做决策,才是有效的产品判断。
三线冲突的典型结构
graph TD
U["用户线\n用户需要什么"]
B["业务线\n业务要什么结果"]
T["技术线\n当前能做到什么"]
U -- "需求 vs 体验成本" --> CONF["三线冲突区"]
B -- "目标 vs 可行性" --> CONF
T -- "约束 vs 期望" --> CONF
CONF --> R1["调整需求范围\n降低用户期望或分阶段"]
CONF --> R2["调整业务目标\n放宽时间或接受次优指标"]
CONF --> R3["扩展技术边界\n投入资源或引入外部能力"]
CONF --> R4["向上升级决策\n暴露冲突,让更高层决定取舍"]
style CONF fill:#fce4ec,stroke:#c62828,stroke-width:2px
style R1 fill:#e3f2fd,stroke:#1565c0
style R2 fill:#fff8e1,stroke:#f57f17
style R3 fill:#e8f5e9,stroke:#2e7d32
AI 产品的三类核心技术约束
数据质量约束:模型的能力上限由训练数据决定。如果数据有偏、标注不一致、样本量不足,模型在某些场景会系统性失败。PM 要问清楚:当前数据覆盖了哪些场景?覆盖不到的场景模型会怎样表现?
模型延迟约束:AI 推理有计算成本,实时场景(如对话、搜索)对延迟极其敏感。"做到 200ms 以内"和"做到 2 秒以内"是完全不同的工程成本和产品形态。
准确率阈值约束:不同场景对准确率的要求不同。内容推荐可以接受 70% 准确,医疗辅助诊断不能接受低于 95%。PM 要帮团队定义"可接受的最低准确率",而不是追求无止境的优化。
三线冲突处置顾问
from dataclasses import dataclass, field
from typing import List, Optional
from enum import Enum
class ConstraintType(Enum):
DATA_QUALITY = "数据质量"
MODEL_LATENCY = "模型延迟"
ACCURACY = "准确率"
SCALABILITY = "扩展性"
COST = "计算成本"
COMPLIANCE = "合规限制"
class ConflictLine(Enum):
USER_VS_TECH = "用户需求 vs 技术约束"
BUSINESS_VS_TECH = "业务目标 vs 技术约束"
USER_VS_BUSINESS = "用户需求 vs 业务目标"
THREE_WAY = "三线同时冲突"
class ResolutionStrategy(Enum):
SCOPE_DOWN = "缩减需求范围"
PHASE_DELIVERY = "分阶段交付"
TECH_INVEST = "投入资源扩展技术边界"
ACCEPT_TRADEOFF = "接受次优指标,明确文档化"
ESCALATE = "向上升级决策"
EXTERNAL_TOOL = "引入外部能力(API/平台)"
@dataclass
class TechConstraint:
constraint_type: ConstraintType
description: str
current_state: str # 当前实际情况
threshold_needed: str # 产品目标需要达到的水平
gap_severity: int # 差距严重程度 1-5
def is_blocking(self) -> bool:
return self.gap_severity >= 4
def summary(self) -> str:
block = "🚫 阻断性" if self.is_blocking() else "⚠️ 限制性"
return (
f"[{self.constraint_type.value}] {block}\n"
f" 现状:{self.current_state}\n"
f" 需要:{self.threshold_needed}\n"
f" 差距严重度:{'★' * self.gap_severity}{'☆' * (5 - self.gap_severity)}"
)
@dataclass
class Conflict:
title: str
conflict_line: ConflictLine
user_expectation: str
business_requirement: str
tech_constraint: TechConstraint
recommended_strategies: List[ResolutionStrategy] = field(default_factory=list)
pm_notes: str = ""
def analyze(self):
print(f"\n 冲突:{self.title}")
print(f" 类型:{self.conflict_line.value}")
print(f"\n 用户期望:{self.user_expectation}")
print(f" 业务要求:{self.business_requirement}")
print(f"\n 技术约束:")
for line in self.tech_constraint.summary().split("\n"):
print(f" {line}")
if self.recommended_strategies:
print(f"\n 建议处置策略:")
for i, s in enumerate(self.recommended_strategies, 1):
print(f" {i}. {s.value}")
if self.pm_notes:
print(f"\n PM 判断备注:{self.pm_notes}")
@dataclass
class ConflictAdvisor:
product_name: str
conflicts: List[Conflict] = field(default_factory=list)
def add(self, conflict: Conflict):
self.conflicts.append(conflict)
def blocking_conflicts(self) -> List[Conflict]:
return [c for c in self.conflicts
if c.tech_constraint.is_blocking()]
def report(self):
print(f"\n{'='*64}")
print(f" {self.product_name} — 三线冲突分析报告")
print(f"{'='*64}")
print(f" 共发现冲突 {len(self.conflicts)} 项,"
f"其中阻断性 {len(self.blocking_conflicts())} 项")
blocking = self.blocking_conflicts()
non_blocking = [c for c in self.conflicts if not c.tech_constraint.is_blocking()]
if blocking:
print(f"\n{'─'*64}")
print(f" 【阻断性冲突 — 需立即决策】")
for c in blocking:
c.analyze()
if non_blocking:
print(f"\n{'─'*64}")
print(f" 【限制性冲突 — 可在迭代中处理】")
for c in non_blocking:
c.analyze()
print(f"\n{'='*64}\n")
# ── Demo ──────────────────────────────────────────────────────
advisor = ConflictAdvisor("AI 医疗影像辅助诊断系统")
advisor.add(Conflict(
title="实时诊断反馈 vs 模型推理延迟",
conflict_line=ConflictLine.USER_VS_TECH,
user_expectation="医生上传影像后 3 秒内看到 AI 诊断建议",
business_requirement="延迟在 5 秒内即可满足 SLA",
tech_constraint=TechConstraint(
constraint_type=ConstraintType.MODEL_LATENCY,
description="当前模型在 GPU 环境下推理耗时约 8-12 秒",
current_state="P95 延迟 11 秒",
threshold_needed="P95 延迟 ≤ 3 秒",
gap_severity=4
),
recommended_strategies=[
ResolutionStrategy.PHASE_DELIVERY,
ResolutionStrategy.TECH_INVEST,
],
pm_notes="一期先满足 5 秒 SLA,用轻量化模型降延迟;二期考虑边缘部署方案"
))
advisor.add(Conflict(
title="罕见病识别准确率 vs 数据量不足",
conflict_line=ConflictLine.THREE_WAY,
user_expectation="AI 能识别包括罕见病在内的全量病种",
business_requirement="产品宣传准确率 ≥ 90%",
tech_constraint=TechConstraint(
constraint_type=ConstraintType.DATA_QUALITY,
description="罕见病影像样本量极少,部分病种样本数 < 50 张",
current_state="罕见病识别准确率约 42%",
threshold_needed="≥ 85%(满足合规要求)",
gap_severity=5
),
recommended_strategies=[
ResolutionStrategy.SCOPE_DOWN,
ResolutionStrategy.ACCEPT_TRADEOFF,
ResolutionStrategy.ESCALATE,
],
pm_notes="建议一期产品范围限定为高频 20 种常见病,罕见病明确标注为'参考建议'而非诊断"
))
advisor.add(Conflict(
title="历史数据隐私合规 vs 模型训练需求",
conflict_line=ConflictLine.BUSINESS_VS_TECH,
user_expectation="患者数据不离开医院系统",
business_requirement="需要大规模数据训练提升模型",
tech_constraint=TechConstraint(
constraint_type=ConstraintType.COMPLIANCE,
description="医疗数据受《数据安全法》限制,不能集中传输至云端",
current_state="无法获取院外数据",
threshold_needed="联邦学习或本地化部署",
gap_severity=3
),
recommended_strategies=[
ResolutionStrategy.TECH_INVEST,
ResolutionStrategy.EXTERNAL_TOOL,
],
pm_notes="评估联邦学习方案可行性,或与有数据授权的合规平台合作"
))
advisor.report()
技术约束类型与 PM 应对策略
| 约束类型 | 典型表现 | PM 应问的问题 | 常见应对策略 |
|---|---|---|---|
| 数据质量 | 特定场景效果差 | 哪些场景数据不足?能补充吗? | 缩小产品范围或标注数据局限性 |
| 模型延迟 | 实时场景响应慢 | 用户能接受多少延迟? | 轻量化模型、缓存策略、分阶段展示 |
| 准确率瓶颈 | 错误率超出可接受范围 | 这个场景能接受多低的准确率? | 人工兜底、降低 AI 决策权重 |
| 合规限制 | 数据不能流通 | 有没有符合合规的替代方案? | 联邦学习、本地化部署、数据脱敏 |
| 计算成本 | 推理成本过高 | 成本和产品价值的比例合理吗? | 按需调用、批处理、精简模型 |
本章 checklist
- 是否在功能立项前就向工程侧问清了三类核心约束:数据质量、延迟、准确率
- 是否区分了"阻断性约束"和"限制性约束",避免把所有技术问题都当成死路
- 对于阻断性冲突,是否主动向上升级,而不是自己扛着或悄悄降低产品预期
- 是否在 PRD 中明确文档化了已知的技术局限,让业务方和用户有正确预期
- 是否评估了"引入外部能力"作为解法,而不是默认所有能力都要自研
本章小结
- PM 不需要懂算法实现,但必须理解数据质量、延迟、准确率这三类 AI 核心约束的业务含义,才能做出有效判断。
- 三线冲突的处理优先级:先确认约束是阻断性还是限制性,再选择缩减范围、分阶段交付、投入资源或向上升级四种路径之一。
- 技术局限不是要隐藏的,而是要明确文档化的——让用户和业务方对产品能力有正确预期,比"超预期惊喜"更重要。
本章完:下一章进入 05-AI适配判断,学完三条线协调之后,进入更深的判断层:具体的场景到底适不适合用 AI,怎么系统性地评估。