与 AI 工程师协作的关键接口
High Contrast
Dark Mode
Light Mode
Sepia
Forest
5 min read952 words

与 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 周)开一次联合实验设计会,议程如下:

  1. 现状同步(10 分钟):当前 baseline 数据,上一轮实验结论
  2. 问题分析(15 分钟):哪类样本还没达标,模式是什么
  3. 实验方案(20 分钟):下一轮要测什么假设,测试范围
  4. 决策标准(10 分钟):什么结果算成功,什么结果代表需要换方向
  5. 行动项(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

本章小结


下一节03-跨职能团队节奏与决策机制 — 固定节奏能让团队少开临时会,好的决策机制能让 PM 减少被打断。