推荐业务里的 AI 代码生成,最怕的不是“写不出来”,而是写出来以后直接撞进复杂线上链路:召回、粗排、精排、重排、特征、实验、策略,每一层都有性能、稳定性和业务指标约束。得物推荐 AI Harness 工程化实践系列的开篇,重点不是炫耀模型能生成多少代码,而是把“狂野代码”纳入一套从生成、防护校验到安全上线的工程体系。
这类体系的核心价值很直接:让 AI 参与生产,但不让 AI 绕过生产规则。
Harness 不是脚本包装,而是生产闸门
在复杂推荐场景里,AI 生成的代码通常会碰到几类硬问题:
- 业务上下文碎片化:一个排序策略可能依赖特征口径、实验配置、流量分层、历史兼容逻辑。
- 代码风险不透明:生成代码可能能编译,却引入超时、空指针、资源泄漏或指标污染。
- 上线路径长:推荐系统对延迟和效果敏感,不能把“模型觉得合理”的改动直接推到生产。
因此,AI Harness 更像一条带闸门的生产线。它把 AI 代码生成放进固定流程:输入目标、生成候选、静态检查、单测验证、沙箱执行、策略评估、灰度发布、回滚监控。每一步都可以拦截,而不是等线上报警以后再追溯。
从摘要看,系列后续会展开整体架构、安全防护、混合智能体算法和工业落地细节。对工程团队来说,最值得提前抓住的是边界:AI 可以负责产生方案和代码,但 Harness 必须负责约束、验证和发布。
从“按提示生成”到“按目标生产”
“按目标生产”意味着输入不只是自然语言需求,而是可验证的工程目标。例如:
- 新增一个排序因子,但 P99 延迟不能增加超过 3ms。
- 改写某段特征处理逻辑,但特征缺失率不能上升。
- 生成实验配置,但只能影响指定实验桶。
- 修复策略代码,但必须保留历史兼容分支。
AI Harness 需要把这些目标拆成机器可执行的检查项。一个可落地的方式是把任务描述、代码范围、测试命令、性能预算和上线策略一起固化为任务规格,而不是只把一句 prompt 扔给模型。
可以这样实践:为每次 AI 代码任务定义一个最小任务清单。
# ai-task.yaml
id: rec-rank-feature-normalize-001
objective: "为排序特征增加归一化逻辑,并保持历史缺省值兼容"
code_scope:
allow:
- "src/ranking/features/**"
- "tests/ranking/features/**"
deny:
- "src/serving/**"
- "configs/prod/**"
quality_gates:
unit_test: "pytest tests/ranking/features -q"
lint: "ruff check src/ranking/features tests/ranking/features"
latency_budget_ms_p99: 3
release_policy:
require_human_approval: true
rollout: "shadow -> 1% -> 5% -> 20%"
rollback:
metric:
- "rank_service_error_rate"
- "feature_missing_rate"
- "p99_latency_ms"
这份 YAML 不代表得物内部实现细节,而是一种可改造的工程写法:让 AI 任务天然带着范围、验证和发布约束。它比“帮我改一下排序特征”更适合进入生产流水线。
防护校验要覆盖三类风险
AI 代码进入推荐链路前,防护不能只停留在语法层。至少要覆盖三类风险。
代码风险:是否越权修改、是否引入危险 API、是否绕过已有抽象、是否缺少测试。比如推荐服务里随手访问外部 HTTP、写本地文件、读取生产密钥,都应该被规则拦住。
业务风险:是否改变实验边界、是否影响未授权流量、是否破坏特征口径。推荐系统里的“看似小改动”很容易扩大到全链路。
运行风险:是否增加延迟、内存、CPU 消耗,是否导致降级逻辑失效。AI 生成代码很可能只追求功能正确,却忽略线上预算。
可以先用一个轻量级本地 Harness 验证思路。下面这个 Python 示例会读取 ai-task.yaml,检查本次变更文件是否越界,并执行配置里的质量门禁。运行前需要安装 pyyaml,并把 changed_files 换成你从 Git diff 得到的文件列表。
# mini_harness.py
import fnmatch
import subprocess
import sys
from pathlib import Path
import yaml
def load_task(path: str) -> dict:
return yaml.safe_load(Path(path).read_text())
def match_any(path: str, patterns: list[str]) -> bool:
return any(fnmatch.fnmatch(path, pattern) for pattern in patterns)
def check_scope(task: dict, changed_files: list[str]) -> None:
allow = task["code_scope"]["allow"]
deny = task["code_scope"].get("deny", [])
violations = []
for file in changed_files:
if match_any(file, deny) or not match_any(file, allow):
violations.append(file)
if violations:
raise SystemExit("Scope violation:\n" + "\n".join(f"- {f}" for f in violations))
def run_gate(name: str, command: str) -> None:
print(f"Running {name}: {command}")
result = subprocess.run(command, shell=True)
if result.returncode != 0:
raise SystemExit(f"Gate failed: {name}")
def main() -> None:
task = load_task("ai-task.yaml")
# 实际接入时可替换为:git diff --name-only origin/main...HEAD
changed_files = sys.argv[1:]
if not changed_files:
raise SystemExit("Usage: python mini_harness.py <changed-file> [changed-file...]")
check_scope(task, changed_files)
gates = task.get("quality_gates", {})
for name in ("lint", "unit_test"):
if name in gates:
run_gate(name, gates[name])
print("Harness checks passed")
if __name__ == "__main__":
main()
运行方式:
python -m pip install pyyaml
python mini_harness.py src/ranking/features/normalize.py tests/ranking/features/test_normalize.py
如果 AI 修改了 configs/prod/rank.yaml,这个脚本会直接拒绝。真实生产系统还需要接入 CI、权限系统、代码审查、指标平台和发布平台,但最小闭环就是这样:先把边界写下来,再让工具严格执行。
混合智能体适合做分工,不适合无约束自治
摘要提到后续会讲混合智能体核心算法实现。放在工程视角看,混合智能体的价值不是让一个 Agent 从需求一路冲到上线,而是让不同角色处理不同问题:
- 需求分析 Agent:把自然语言目标转成任务规格。
- 代码生成 Agent:在允许范围内生成候选补丁。
- Review Agent:检查风格、边界、潜在 bug 和测试缺口。
- 验证 Agent:调度静态检查、单测、回归和沙箱评估。
- 发布 Agent:根据策略推进灰度,但关键节点保留人工审批。
这里的关键是“分工 + 制衡”。生成者不应该自己批准自己,验证者不应该跳过任务规格,发布者不应该绕过指标阈值。AI Harness 的工程化味道,就体现在这些约束不是口头约定,而是流水线中的硬规则。
落地时先抓三件事
想在推荐系统里引入类似 AI Harness,不建议一开始就追求全自动上线。更稳的路径是从低风险、强验证、可回滚的场景开始。
可以用这份清单判断是否具备试点条件:
- 任务范围能否被明确限定到少数目录或模块。
- 是否有足够快的单测、静态检查和回归数据集。
- 是否能在沙箱或影子流量中验证结果。
- 是否有指标阈值和自动回滚策略。
- 是否保留人工审批,尤其是实验配置和生产发布环节。
- 是否记录 AI 输入、生成结果、校验结果和人工修改,方便追溯。
AI Harness 的重点不是把开发者移出流程,而是把不确定性关进可观察、可拦截、可回滚的流程里。对推荐这种高频迭代又高度敏感的业务,真正可用的 AI 编程能力,不是“生成代码”,而是“按目标、按边界、按证据生产代码”。