技术约束理解与三线冲突处理
High Contrast
Dark Mode
Light Mode
Sepia
Forest
5 min read976 words

技术约束理解与三线冲突处理

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

本章小结

本章完:下一章进入 05-AI适配判断,学完三条线协调之后,进入更深的判断层:具体的场景到底适不适合用 AI,怎么系统性地评估。