与 AI 工程师协作的关键接口
PM 和 AI 工程师之间最常见的矛盾不是技术问题,是职责边界不清。PM 越界去指定模型选型,或者 AI 工程师因没有清晰的评估标准而自己拍脑袋定"效果不错"——这两种情况都会造成浪费。
PM 与 AI 工程师的职责分工
graph LR
subgraph PM职责
P1[定义问题边界]
P2[提供评估标准]
P3[给出边界 Case]
P4[验收结果]
P5[决策上线时机]
end
subgraph 共同决策
C1[实验设计]
C2[数据需求]
C3[质量阈值]
end
subgraph AI工程师职责
A1[模型选型]
A2[架构设计]
A3[Prompt 工程]
A4[评估实验执行]
A5[性能优化]
end
P1 --> C1
P2 --> C3
P3 --> C1
C1 --> A4
C3 --> A4
A4 --> P4
P4 --> P5
style P1 fill:#e3f2fd,stroke:#1565c0
style A1 fill:#e8f5e9,stroke:#2e7d32
style C1 fill:#fff9c4,stroke:#f9a825
PM 必须提供的三类输入
1. 问题定义(不是解决方案)
错误做法:"我们用 GPT-4 来做意图分类" 正确做法:"我们需要从用户消息中识别出 12 类意图,准确率 ≥ 85%,响应时间 ≤ 1.5 秒"
2. 评估标准(量化、可测)
| 标准类型 | PM 要定义的 | AI 工程师负责执行 |
|---|---|---|
| 准确率目标 | 具体数字(如 ≥ 85%) | 用测试集测量并报告 |
| 测试数据范围 | 哪些场景需要覆盖 | 设计测试集并标注 |
| 失败的定义 | 什么算"错误"(包括误识别) | 实现评估逻辑 |
| 延迟预算 | SLA 要求(P50/P95) | 优化并测量 |
3. 边界 Case 清单
PM 应该提供真实业务场景中最容易出错的输入样本,而不是让工程师自己猜。
PM 不应该决定的事
| 不该 PM 决定的 | 为什么 | 正确做法 |
|---|---|---|
| 用哪个模型(GPT-4/Claude/自研) | 技术权衡,PM 没有足够信息 | 给目标和约束,让 AI 工程师选型 |
| Prompt 具体写法 | 工程优化细节 | 审核输出质量,不审核 Prompt 文本 |
| 向量数据库选型 | 基础设施决策 | 说明规模和延迟要求 |
| 训练数据标注规则 | 领域专业判断 | 提供业务理解,与工程师共同确认规则 |
联合实验设计会的标准议程
PM 和 AI 工程师应该定期(每 1-2 周)开一次联合实验设计会,议程如下:
- 现状同步(10 分钟):当前 baseline 数据,上一轮实验结论
- 问题分析(15 分钟):哪类样本还没达标,模式是什么
- 实验方案(20 分钟):下一轮要测什么假设,测试范围
- 决策标准(10 分钟):什么结果算成功,什么结果代表需要换方向
- 行动项(5 分钟):谁在什么时候完成什么
Python 示例:PM-AI 工程师协作接口检查器
"""
PM-AI 工程师协作接口检查器
PM 视角:检查一个 AI 任务的需求输入是否完整,能否支持 AI 工程师有效工作
"""
from dataclasses import dataclass, field
from typing import List, Dict, Optional
@dataclass
class AITaskRequirement:
"""AI 任务需求(PM 提供的)"""
task_name: str
# 问题定义
problem_statement: str # 要解决什么问题
input_description: str # 输入是什么
output_description: str # 期望输出是什么
excluded_cases: List[str] # 明确不处理什么
# 评估标准
accuracy_target: Optional[float] # 准确率目标 (0-1)
latency_p50_ms: Optional[int] # P50 延迟要求
latency_p95_ms: Optional[int] # P95 延迟要求
failure_definition: Optional[str] # 什么算"失败输出"
# 测试数据
has_labeled_test_set: bool # 是否有标注测试集
test_set_size: Optional[int] # 测试集大小
edge_cases_provided: List[str] # 提供的边界 case
# 约束
cost_budget_per_1k_calls: Optional[float] # 每千次调用预算(元)
privacy_constraints: List[str] # 数据隐私约束
@dataclass
class CollaborationCheckResult:
"""协作接口检查结果"""
task_name: str
completeness_score: int
missing_items: List[str]
pm_scope_violations: List[str] # PM 越权或缺位的地方
ready_to_start: bool
blockers: List[str]
def check_problem_definition(req: AITaskRequirement,
issues: List[str]) -> int:
"""检查问题定义完整性"""
score = 0
if req.problem_statement and len(req.problem_statement) > 20:
score += 20
else:
issues.append("问题陈述过于简单,无法让 AI 工程师理解业务背景")
if req.input_description:
score += 10
else:
issues.append("未描述输入格式(数据类型、长度限制、来源)")
if req.output_description:
score += 10
else:
issues.append("未描述期望输出格式和内容")
if req.excluded_cases:
score += 10
else:
issues.append("未定义排除场景,AI 工程师会做不必要的优化")
return score
def check_evaluation_criteria(req: AITaskRequirement,
issues: List[str]) -> int:
"""检查评估标准完整性"""
score = 0
if req.accuracy_target is not None:
if 0 < req.accuracy_target <= 1:
score += 20
else:
issues.append("准确率目标数值异常,请确认(应为 0-1 之间)")
else:
issues.append("未定义量化准确率目标,AI 工程师无法判断何时算完成")
if req.latency_p95_ms is not None:
score += 10
else:
issues.append("未定义延迟要求(P95),性能优化无方向")
if req.failure_definition:
score += 10
else:
issues.append("未定义「失败输出」的判断标准(对 AI 产品尤其重要)")
return score
def check_test_data(req: AITaskRequirement,
issues: List[str]) -> int:
"""检查测试数据准备情况"""
score = 0
if req.has_labeled_test_set:
if req.test_set_size and req.test_set_size >= 100:
score += 20
elif req.test_set_size:
issues.append(f"测试集仅 {req.test_set_size} 条,建议至少 200 条以保证统计可靠")
score += 10
else:
score += 10
else:
issues.append("无标注测试集,无法客观评估模型效果,是最高优先级阻塞项")
if len(req.edge_cases_provided) >= 5:
score += 10
else:
issues.append(f"边界 Case 仅 {len(req.edge_cases_provided)} 个,"
"建议提供至少 10 个真实业务中的困难样本")
return score
def detect_pm_scope_violations(req: AITaskRequirement) -> List[str]:
"""检测 PM 越权情况(这些不应该由 PM 决定)"""
violations = []
# 此处通过问题描述的关键词检测 PM 是否越权
scope_keywords = {
"GPT-4": "模型选型(应由 AI 工程师决定)",
"Claude": "模型选型(应由 AI 工程师决定)",
"fine-tune": "训练策略(应由 AI 工程师决定)",
"FAISS": "向量数据库选型(应由 AI 工程师决定)",
"embedding": "向量化方案(应由 AI 工程师决定)",
}
combined_text = (req.problem_statement + " " +
req.input_description + " " +
req.output_description).lower()
for keyword, description in scope_keywords.items():
if keyword.lower() in combined_text:
violations.append(f"需求中包含「{keyword}」,这属于{description},"
"PM 应描述需求而非技术方案")
return violations
def check_collaboration_readiness(req: AITaskRequirement) -> CollaborationCheckResult:
"""综合检查协作接口是否就绪"""
issues: List[str] = []
score = 0
score += check_problem_definition(req, issues)
score += check_evaluation_criteria(req, issues)
score += check_test_data(req, issues)
violations = detect_pm_scope_violations(req)
# 确定阻塞项
blockers = [i for i in issues if any(keyword in i for keyword in
["未定义量化", "无标注测试集", "未描述输入"])]
ready = len(blockers) == 0 and score >= 70
return CollaborationCheckResult(
task_name=req.task_name,
completeness_score=score,
missing_items=issues,
pm_scope_violations=violations,
ready_to_start=ready,
blockers=blockers,
)
def print_check_result(result: CollaborationCheckResult):
grade = ("就绪" if result.ready_to_start else
"基本就绪" if result.completeness_score >= 60 else "需补充")
print(f"\n{'='*55}")
print(f" 协作接口检查:{result.task_name}")
print(f"{'='*55}")
print(f" 完整度得分:{result.completeness_score}/100 [{grade}]")
print(f" 可以开始:{'是' if result.ready_to_start else '否'}")
if result.blockers:
print(f"\n 阻塞项(必须先解决):")
for b in result.blockers:
print(f" ✗ {b}")
if result.missing_items:
remaining = [i for i in result.missing_items if i not in result.blockers]
if remaining:
print(f"\n 待补充项:")
for item in remaining:
print(f" ⚠ {item}")
if result.pm_scope_violations:
print(f"\n PM 越权提示:")
for v in result.pm_scope_violations:
print(f" → {v}")
# ── 演示 ──────────────────────────────────────────────
if __name__ == "__main__":
task = AITaskRequirement(
task_name="客服意图分类模型",
problem_statement=(
"当前客服系统无法自动判断用户意图,导致所有工单都需要人工分类。"
"需要一个意图分类能力,将用户消息分到预定义的 12 个意图类别。"
),
input_description="用户消息文本,UTF-8 编码,最长 500 字",
output_description="意图类别(12 个枚举值之一)+ 置信度(0-1)",
excluded_cases=[
"多轮对话中的跟进消息(仅处理首条消息)",
"包含图片的消息",
"非中文输入",
],
accuracy_target=0.85,
latency_p50_ms=800,
latency_p95_ms=2000,
failure_definition="将「投诉」意图分类为「咨询」或「其他」算严重失败",
has_labeled_test_set=True,
test_set_size=350,
edge_cases_provided=[
"用户消息极短(2-3 个字)的情况",
"意图混合(同时询问和投诉)",
"使用方言/网络用语",
"包含订单号等数字编码",
"情绪激动的表达",
"反问句形式",
"多个问题并列",
"隐晦表达不满",
],
cost_budget_per_1k_calls=0.5,
privacy_constraints=["不能将用户消息发送到境外服务器", "日志保留不超过 30 天"],
)
result = check_collaboration_readiness(task)
print_check_result(result)
本章 checklist
- [ ] 每个 AI 任务的需求文档包含了问题定义、评估标准、边界 Case 三类输入
- [ ] 需求中没有指定具体模型或技术方案(那是 AI 工程师的职责)
- [ ] 与 AI 工程师建立了固定的联合实验设计会节奏(每 1-2 周一次)
- [ ] 标注测试集已准备好,不靠 AI 工程师自己造测试数据
- [ ] 验收时 PM 看的是输出质量,不是 Prompt 写法或代码实现
本章小结
- PM 对 AI 工程师最大的贡献是提供清晰的问题定义和评估标准,而不是提供技术方案
- 边界 Case 清单是 PM 独有的贡献——AI 工程师不了解业务,无法独立发现真实场景中的困难输入
- 联合实验设计会是 PM 和 AI 工程师最重要的协作节点,确保每轮实验都有明确假设和决策标准
下一节:03-跨职能团队节奏与决策机制 — 固定节奏能让团队少开临时会,好的决策机制能让 PM 减少被打断。