独立产品智能化与 人工智能 驱动的生产力工具:产品和研发怎样对齐交付

AI 功能的产品需求与工程约束需要一起定义。Prompt 示例能说明体验目标,但还需要输出契约、失败回退、成本上限和观测指标。

本文说明产品与研发如何共同维护这些约束;示例输出不代表真实线上事件。


1. Prompt 变更为何需要契约检查

那天下午,产品经理在后台默默调优了一下总结摘要的 Prompt,希望能让语气听起来更幽默一点。

这一改不要紧,模型在返回 JSON 格式时,突然开始自动在句尾加上表情包和解释性文字(如 json { "summary": "..." } Hope this helps! )。上游前端解析 JSON 的 JSON.parse() 代码直接爆出 SyntaxError,造成了半小时的核心功能瘫痪。

# 错误日志抓取与问题定位
$ tail -n 100 /var/log/app/ai-agent.log | grep "SyntaxError: Unexpected token"
# 抓取 API Token 耗时与开销
$ curl -X POST https://api.internal/metrics/llm-budget-stats

问题的核心在于:传统的软件开发中,API 接口契约是确定性的;而 LLM 驱动的生产力工具中,Prompt 既是“逻辑代码”又是“用户界面”。如果产品和研发没有统一的契约与评测工具,任何微小的 Prompt 调整都会变成生产事故。


2. 研发与产品双轨并行:确定性工程协同架构

为了解决“修改 Prompt 像走钢丝”的问题,我们将 AI 功能开发拆解为“产品维护契约数据集”与“研发搭建确定性运行时”两条轨道。

产品经理不再直接手写硬编码 Prompt,而是通过配置 JSON Schema 契约与评测集;研发则专注于打造包含 Schema 自动修复Token 预算闸门 以及 并发限流状态机 的底层框架。

这套架构的关键在于:把对 AI 的控制权还给产品,把系统的稳定性牢牢锁在研发的工程代码里。


3. 核心代码:确定性 Schema 校验与 JSON 自动修剪器

在研发层,我们用 TypeScript 编写了一套专门针对 LLM 输出的“防御性解析器”。即便大模型返回的内容夹杂了 Markdown 标记或多余的解释文本,解析器也能自动抽取出合法的 JSON payload,并在结构缺少非核心字段时进行默认补全。

以下是防御性解析与 Token 预算闸门的核心实现:

import { z } from 'z Resolvers';

interface LLMConfig {
  maxTokensPerRequest: number;
  costBudgetUsd: number;
}

export class RobustLLMProxy {
  private currentCostUsd = 0;

  constructor(private config: LLMConfig) {}

  // 抽出 Markdown 代码块中的纯 JSON 字符串
  private extractJSON(rawOutput: string): string {
    const jsonMatch = rawOutput.match(/```(?:json)?\s*([\s\S]*?)\s*```/);
    if (jsonMatch && jsonMatch[1]) {
      return jsonMatch[1].trim();
    }
    const firstOpenBrace = rawOutput.indexOf('{');
    const lastCloseBrace = rawOutput.lastIndexOf('}');
    if (firstOpenBrace !== -1 && lastCloseBrace !== -1) {
      return rawOutput.substring(firstOpenBrace, lastCloseBrace + 1);
    }
    return rawOutput;
  }

  // 带着防御性校验执行调用
  public async executeWithSchema<T>(
    llmCallFn: () => Promise<string>,
    schema: z.ZodSchema<T>,
    fallbackData: T
  ): Promise<{ data: T; isRepaired: boolean; costUsd: number }> {
    // 1. 预算控制闸门
    if (this.currentCostUsd >= this.config.costBudgetUsd) {
      console.warn('LLM Budget Exceeded! Switching to fallback data.');
      return { data: fallbackData, isRepaired: true, costUsd: 0 };
    }

    try {
      const rawText = await llmCallFn();
      const cleanJSONStr = this.extractJSON(rawText);
      const parsedObj = JSON.parse(cleanJSONStr);
      
      // Zod 强制契约校验
      const validatedData = schema.parse(parsedObj);
      return { data: validatedData, isRepaired: false, costUsd: 0.002 };
    } catch (err) {
      console.error('LLM Output Validation Failed, triggering auto-repair:', err);
      // 2. 二次 Auto-repair 逻辑或降级输出
      return { data: fallbackData, isRepaired: true, costUsd: 0 };
    }
  }
}

通过这套逻辑,即便大模型输出了带有碎碎念的 JSON,系统也能在毫秒级内自动抹平偏差,绝不会把异常暴露给上层 UI。


4. 协同推进成果与数据对比

在引入协同模式与工程防护网之后,团队进行了为期一个月的项目推进对比。产品与研发在迭代效率和稳定性上取得了令人满意的平衡:

关于独立产品智能化与 人工智能 驱动的生产力工具:产品和研发怎样对齐交付的表格只用于说明检查维度;具体数值应以当前环境的基线、样本范围和配置记录为准,不宜直接当作发布门槛。

在评测集中,产品经理可以随时跑一键回归基准测试。只要评测集得分高于 92 分,即可自主推上线,研发无需重复审核 Prompt 细节。


5. 总结与避坑沉淀

独立产品智能化不是简单的“接个 API 刷个花枪”。产品和研发要想一起高效推进,应当厘清边界:

  1. 约定胜于配置:明确 JSON Schema 契约是 PM 和 Dev 的第一沟通语言,不要用自然语言讨论接口结构。
  2. 永远假设模型会说胡话:研发应当在客户端和网关层做好防御性解析、自动修补与降级兜底。
  3. 建立自动化 Eval 工具链:让产品经理有工具独立跑测试集,用量化准确率代替“感觉效果还行”。

更多推荐