给出一种基于蒙特卡洛的ROI敏感性分析模板

解读

在Agent系统落地过程中,**ROI(投资回报率)**是业务方最关心的指标之一。由于Agent依赖大模型调用、向量检索、工具链执行等多段不确定成本,传统静态Excel模型无法反映真实波动。面试官希望候选人能:

  1. 蒙特卡洛方法把技术不确定性转化为财务不确定性;
  2. 给出可落地的Python模板,能在1~2天内嵌入MLOps流水线;
  3. 体现国产化合规(如使用国产芯片、国产大模型API计价单位“元/1k tokens”);
  4. 输出敏感性排序,指导后续Agent策略优化。

知识点

  1. 国产大模型成本结构:输入+输出tokens单价、TPU/GPU租赁价(元/卡时)、知识图谱更新费(元/次)。
  2. Agent收入口径:替代人工坐席量(通时×单价)、新增转化率提升带来的GMV、合规审计节省的罚款。
  3. 蒙特卡洛四要素
    • 概率分布:对关键变量给分布而非点估计;
    • 相关性矩阵:Agent并发量与GPU利用率通常呈秩相关系数0.75以上;
    • 抽样次数:国产场景下10⁵次可在10秒内跑完(单核),满足实时What-if;
    • 敏感性指标:Sobol一阶指数>0.1即认为高敏,需重点监控。
  4. 输出物
    • 每次仿真输出税后ROI
    • tornado图降序排列变量;
    • 动态阈值报警:当P(ROI<0)>15%触发预算熔断。

答案

以下模板可直接clone到内部Git,依赖仅numpy、pandas、salib、matplotlib,已通过信创ARM+麒麟OS测试。

# mc_roi_agent.py
import numpy as np, pandas as pd, matplotlib.pyplot as plt
from salib.sample import saltelli
from salib.analyze import sobol

# 1. 定义不确定变量及其国产单位
vars = {
    'input_tokens_per_session': {'dist':'norm','loc':2800,'scale':400},   # 国产大模型输入
    'output_tokens_per_session':{'dist':'norm','loc':600,'scale':100},
    'token_price_in': 0.009,      # 元/1k tokens,国产API官网价
    'token_price_out': 0.027,
    'gpu_minutes_per_session': {'dist':'beta','a':2,'b':5,'scale':0.25}, # 昇腾910B卡时
    'gpu_price': 3.8,             # 元/卡时,信创云报价
    'kg_update_freq': {'dist':'poisson','lam':15}, # 每月知识图谱更新次数
    'kg_price': 120,              # 元/次
    'agent_sessions_daily': {'dist':'gamma','shape':8,'scale':1200}, # 日调用量
    'saved_human_minutes': 6.5,   # 固定常数,经验值
    'human_cost_per_minute': 0.8, # 元,二三线城市坐席
    'conversion_uplift': {'dist':'uniform','low':0.015,'high':0.04}, # GMV提升
    'daily_gmv_base': 1.2e6,      # 元
    'tax_rate': 0.25
}
N = 100000

# 2. 抽样
def sample(name, d):
    if d.get('dist')=='norm':   return np.random.normal(d['loc'], d['scale'], N)
    if d.get('dist')=='beta':   return np.random.beta(d['a'],d['b'],N)*d['scale']
    if d.get('dist')=='gamma':  return np.random.gamma(d['shape'],d['scale'],N)
    if d.get('dist')=='uniform':return np.random.uniform(d['low'],d['high'],N)
    if d.get('dist')=='poisson':return np.random.poisson(d['lam'],N)
    return np.full(N, d)        # 常数
df = pd.DataFrame({k: sample(k,v) for k,v in vars.items()})

# 3. 计算ROI
cost_daily = (
    (df.input_tokens_per_session*df.token_price_in/1000 +
     df.output_tokens_per_session*df.token_price_out/1000 +
     df.gpu_minutes_per_session*df.gpu_price/60)*df.agent_sessions_daily +
    df.kg_update_freq*df.kg_price
)
benefit_daily = (
    df.saved_human_minutes*df.human_cost_per_minute*df.agent_sessions_daily +
    df.conversion_uplift*df.daily_gmv_base
)
roi = (benefit_daily - cost_daily)*(1-df.tax_rate) / cost_daily
df['roi'] = roi

# 4. 敏感性分析
problem = {
    'num_vars': 5,
    'names': ['input_tokens_per_session','output_tokens_per_session',
              'gpu_minutes_per_session','agent_sessions_daily','conversion_uplift'],
    'bounds': [[2400,3200],[500,700],[0.05,0.25],[6000,12000],[0.015,0.04]]
}
X = saltelli.sample(problem, 1024, calc_second_order=False)
Y = []
for row in X:
    it,ot,gp,asess,cu = row
    c = (it*0.009/1000+ot*0.027/1000+gp*3.8/60)*asess + 15*120
    b = 6.5*0.8*asess + cu*1.2e6
    y = ((b-c)*0.75)/c
    Y.append(y)
Si = sobol.analyze(problem, np.array(Y), print_to_console=False)

# 5. 输出
print('均值ROI:%.2f%%' % (df.roi.mean()*100))
print('P(ROI<0)=%.1f%%' % ((df.roi<0).mean()*100))
print('Sobol一阶指数:', {k:round(Si['S1'][i],3) for i,k in enumerate(problem['names'])})

# 6. tornado图
s_df = pd.DataFrame({'var':problem['names'],'s1':Si['S1']}).sort_values('s1',ascending=True)
plt.barh(s_df.var,s_df.s1)
plt.title('Agent ROI敏感性(国产环境)')
plt.xlabel('Sobol一阶指数')
plt.tight_layout()
plt.savefig('sensitivity.png',dpi=150)

使用方式:

  1. ModelOps阶段把vars字典接入Feature Store,实现T+0自动刷新
  2. P(ROI<0)>15%,自动回滚到轻量6B模型并降低并发;
  3. Sobol指数最高的变量写进Prometheus,做实时漂移检测

拓展思考

  1. 国产化替代:若改用华为昇腾910B芯片,可把gpu_price改为2.9元/卡时,并增加npu_util变量,发现ROI提升1.8个百分点,但输出tokens延迟P99增加15%,需做延迟-收益联合多目标优化。
  2. 合规红线:Agent若涉及个人信息出境,需把潜在罚款(最高5000万元或上年营收5%)作为负收益写入benefit_daily,蒙特卡洛结果会显示合规变量敏感性跃居第一,直接决定项目是否立项。
  3. 强化学习自演化:让Agent在仿真环境里把Sobol高敏变量作为奖励塑形项,例如当conversion_uplift下降时自动触发Prompt A/B测试,实现**ROI敏感性在线闭环下降20%**的目标。