跳转至

药品集采 —— 一个「运行发生在别处」的 study

studies/drug_procurement/ · reference: true · 外部 MARL 管线 (AgentProcure)

政府、企业与医院的策略如何优化药品集中采购(集采)的博弈策略?案例取自中国 第二批国家集采中的一个采购博弈单元:阿德福韦酯片(drug_68)、round 2、 三家竞标企业。但这一页存在的理由不是药品本身,而是那个机制:一个真正的运行 属于重型外部管线的 study,如何仍然接进同一套产物、同一批 discovery 字段、 同一个 dashboard。 除了训练本身,一切都已经在这里物化好了。

P / E / B

是什么 来自哪里
P 5 个 agent —— governmenthospitalenterprise_1..3,全部 learnable: true 且各有 policy_group。企业属性是本案真实(已脱敏)的工作簿行:共享 Pmax 1.08 元/片、Q0 2893.17、Qe 3471.804,但 beta_i / omega 各异(0.265/0.50、0.470/2.00、0.265/0.50)。交互结构为 explicit_network(政府↔各企业、政府↔医院、医院↔各企业)。 population/population.json
E 4 个层,没有 scheduled events、没有 broadcasts —— 外加一个 case-specific 的 game environment/environment.json
B RL 策略,不是 LLM agent。政府 Box(3)(Pmax scale、rho、omega);企业 Box(1)(归一化出价,映射到 (cost_i, Pmax));医院 Box(2)(下期报量比例、执行率)。 game 块 + model.py
layer modality scope dynamics 内容
policy_variables physical macro scheduled 政府侧 Pmax、rho、x、omega
enterprise_market_state physical local endogenous 成本、beta_i、出价、利润、中选状态
hospital_execution_state physical local endogenous 医院执行 / 报量变量
procurement_notice information macro scheduled 证据绑定的案例与运行模式说明

game 块是本案专属,不属于通用 environment schema

在标准的 layers / scheduled_events / information_program 之外,本研究的 environment.json 还带了一个 game 对象:game_type: general_sumtiming: simultaneousobservability: partially_observableapi_target: pettingzoo_parallelgamma_default: 0.99,以及带类型的 roles、 observations、action spaces、rewards 与终止条件。请把它当作本案的扩展—— 其它 study 使用的 environment schema 并不包含它。正是它让一个马尔可夫博弈 能被写进同一份产物里。

三类回报刻意采用三种不同量纲:政府是社会福利(utility)、企业是利润(元)、 医院是执行效用。它们只能分角色读,绝不能求和——这就是 general-sum、 混合动机(mixed-motive)在实操层面的含义。

该 study 物化出的博弈结构:5 个被追踪 agent、各自的动作空间与分角色回报

一步是什么,跑多久

n_steps: 50一个采购 episode,而这条轴是训练 episode,不是日历时间。 这是本组案例中最大的一处分野:一步推进的是博弈,而整个 50 步 episode 会在策略 学习过程中被重放成千上万次。

训练配置(simulation/simulation.json):RLlib 上的 PPO、ctde: truegamma: 0.99train_episodes: 10000eval_episodes: 1000,每个角色一套策略、 每家企业各自一套。中选机制在训练期用 soft_topk(可导、便于学习),在评估期用 hard_topk(最低价中选)——这正是 selection_accuracy 要作为独立指标存在、 而不是被摊进平均回报里的原因。

结果

没有结果——而这正是重点

reports/report.md 明确是一份预运行(setup-only)报告0 个训练 episode、0 个评估 episode。没有 trajectory/ 目录,也没有 study.duckdb。外部 AgentProcure 检出及其重型依赖 (pettingzoo / ray[rllib] / gymnasium / torch)未安装在本工作区。

代之交付的,是 study.yaml 上一条双语的 run_note,由工作流呈现给读者:

本案例通过外部 AgentProcure 多智能体强化学习管线运行(ray + torch,重训练 任务)。托管服务里不执行训练——如需真实跑批,请 clone 仓库在本地运行 AgentProcure/run_training.py,再用 studies/drug_procurement/adapter/socioverse_export.py 导回轨迹。

所以本研究的工作流是:在这里物化 → 到那边训练 → 再导回来。判断这项研究 所需的一切——博弈结构、t=0 roster、grounding 台账、图表——都在花掉任何一个 GPU 小时之前就已提交、可审阅。等训练真的跑了,导出的轨迹落进与其它所有 study 相同形状的 study.duckdb,同一套报告与 dashboard 路径照常适用,四条 display_metricsgovernment_returnenterprise_returnhospital_returnselection_accuracy

这份 setup 报告依然给出了发现——因为结构性发现不需要轨迹:人群规模不是随意 选的,而是被「同通用名 ≥3 家生产企业」的纳入门槛锚定;enterprise_2beta_iomega 两个维度上同时偏离,据此可预测两条可分离的策略路径 (高质高成本 vs 低价走量)——待真实运行去证实或证伪。

Grounding

5 条 sourced 事实、1 条 proxy 事实、3 条假设、2 条建模参考——外加一样 catalog 里独此一家的东西:resources.json 内的 evidence[] 数组,承载带类型的 工程证据(PettingZoo parallel API 合约、Gymnasium spaces、RLlib 多智能体策略 映射),每条带 supports[]confidenceretrieved_at,并由 game 块内的 evidence_ids 引用。

条目 basis 作用
纳入门槛:同通用名 ≥3 家生产企业(国家医保局) sourced 钉住 role_counts.enterprise = 3n_applicants = 3
中选药品平均降价 53% sourced 学习到的出价可以多激进的经验包络
单品种最高降价 93% sourced 该包络的上沿
本批 32 品种 / 100 产品中选 sourced 范围说明:本研究只是这一批里的一格
中选结果 2020-04 落地执行 sourced 把 round 2 锚定在 2020-01 开标 / 2020-04 执行的周期上
阿德福韦酯属于第二批集采品种 proxy 药品身份与定性价格水平来自行业媒体汇总;未找到该具体中选价的官方公告
企业成本 / 弹性 / 质量参数取自匿名化工作簿 assumed 真实投标成本不公开;这些数值是 simulator 输入,不是关于真实企业的事实主张
以单一 drug_68 × round 2 作为示范格 assumed 要的是一个完整可读的博弈,而非全批次全景
结果只能解读为 simulator 内的配对差异 assumed 三条里最强的一条:不得据此得出真实世界的因果政策结论

这是整个 catalog 里最清晰的一个 basis: proxy

sourced 表示有权威来源直接陈述该数值;assumed 表示没人陈述,研究自行 声明了选择。proxy 是人们通常会略过的中间态:主张支撑,但支撑物的 证据位阶更低——这里是行业报道代替官方公告。把它如实记为 proxy 而不是 悄悄升格成 sourced,一整套纪律就浓缩在这一个字段里。见 真实世界锚定与溯源

另外请注意第三条假设约束的是解读,而不只是输入。一个 study 可以在声明 自己常数的同一份台账里,一并声明自己结论的边界。

这个单一案例背后是大得多的研究数据集 —— AgentProcure 项目覆盖数百个集采品种、 多轮次、多企业类型与中标结果的 NVBP 语料,drug_id / round_id / focus_drugs 选的正是其中一格:

AgentProcure 研究数据集概貌:剂型、ATC 类别、轮次、竞争格局与企业属性

可以 fork 什么

参数 它打开的问题
drug_id 同一套博弈机器换一个品种——企业异质性的结构在不同药品间是否相似?
round_id 同一品种跨采购批次。
timestep 在 50 步 episode 的哪个位置切片。
focus_drugs 从单格博弈扩成多格对比。
data_path 让案例解析器指向另一个工作簿。
shock_id 反事实轴——见下。

--shock-id all 会跑 15 个反事实情景:6 个企业成本冲击 (enterprise_cost_down__cost_scale_{1p5,1p2,1p1,0p9,0p8,0p5})、6 个医院需求 冲击(hospital_demand_up__q0_scale_{…},同样六个系数)、3 个政府单一中选 情景(gov_single_winner__single_winner_x_{1,2,3})。最后一组是最直接的机制 设计实验:当中选家数变化时,三方回报各自怎么动?其中每一个结果都必须读作 simulator 内的配对差异——这条限制写在 grounding 台账里,不是脚注。