如何用对抗性辩论框架让 LLM 对金融问题互相质证

发布时间:2026/9/14 6:40:37
如何用对抗性辩论框架让 LLM 对金融问题互相质证
如何用对抗性辩论框架让 LLM 对金融问题互相质证【免费下载链接】machine-learning-for-tradingCode for Machine Learning for Trading, 3rd edition — from data sourcing to live execution.项目地址: https://gitcode.com/GitHub_Trending/ma/machine-learning-for-trading当你让多个研究 Agent 对同一个金融问题各做一次概率预测后常见的处理方式是直接取平均——但这样会把分歧本身丢掉。machine-learning-for-trading 第 24 章的 07_adversarial_debate.ipynb 提供了另一种做法对抗性辩论。它让一个模型负责为 YES 提出最强论证bull另一个模型负责为 NO或更低概率提出最强论证bear每一轮把对方的上一轮论点喂回去然后追踪两边概率之差gap在若干轮之后是收窄、走平还是扩大。gap 的变化本身就是这次运行的核心产出收窄说明双方各有对方没权衡到的证据辩论产生了平均值给不出的调和保持原样则说明双方读的是同一份证据却得出相反结论此时中点只能报告分歧有多宽而不能当成更锐利的预测。这条路径的前提是你已经克隆了本仓库并完成环境安装uv 或 Docker 二选一见 docs/running-notebooks.md。默认模式下不需要任何 API keyNotebook 回放仓库里固化的一次真实运行记录不调用任何模型输出在每台机器上完全一致。机制DebateAgent 每轮做什么实现代码在 07_adversarial_debate.pyJupytext 源文件.ipynb由其生成。一轮辩论依次执行_run_bull_turn和_run_bear_turn两个方向都是真实的 LLM 调用llm.complete_with_usage(..., json_modeTrue)并且要求模型只输出 JSON{argument: Your strongest case, p_yes: 0.XX, key_evidence: [evidence point 1, ...]}bull 模板第一轮不携带 bear 的立场从第二轮起模板中的{bear_section}会带上 bear 上一轮的完整论点和概率bull 必须逐条回应。_run_debate_round在每轮结束后检查abs(bull_p - bear_p) consensus_threshold是否成立一旦成立_conduct_debate提前终止不再烧后面的轮次。DebateAgent类持有 LLM 客户端、轮次预算和共识阈值run()返回一个DebateArtifact定义在 agent_schemas.py包含全部轮次记录、双方最终概率、consensus_reached、early_termination与 token 用量。辩论的锚点是研究面板的聚合值3 个ResearchAgent来自 06_multi_agent_research.ipynb各自搜索证据后给出p_yes再用neyman_extremize(panel_probabilities, base0.5, correlationNEYMAN_CORRELATION)聚合成辩论前的基线。bull 和 bear 双方都拿到同一份 agent 摘要保证它们论证的是同一证据基础。准备环境与 API key所有命令都在仓库根目录执行Notebook 的依赖模块按仓库根解析在章节目录里直接跑会报No module named utils。本地 uv 路径需要 Python 3.14见 docs/running-notebooks.mdcp .env.example .env # 默认值即可暂不填任何 key uv syncDocker 路径Notebook 头部标注Docker image: ml4t推荐docker compose pull ml4t docker compose up ml4t只有走RUN_LIVE True的真实辩论时才需要配置 key。.env.example 中已预留这些空行ANTHROPIC_API_KEY、OPENAI_API_KEY、GOOGLE_API_KEY、OPENROUTER_API_KEY、TAVILY_API_KEY。按 24_autonomous_agents/README.md 的说法create_llm_client按 Anthropic → OpenAI → Google → OpenRouter → Ollama 的顺序自动选用第一个已配置 key 的 provider需要补装的只有对应 SDK例如 Claude 需uv pip install anthropic httpxOpenRouter/Ollama 只需uv pip install httpx。研究 Agent 的联网搜索另需TAVILY_API_KEY。没有 key 时 notebook 自动回落到 mock 模式确定性、无 API 调用但 mock 只算冒烟测试不能当作复现。参数都集中在 07_adversarial_debate.py 的# %% tags[parameters]单元格里RUN_LIVE False PINNED_TRACE 07_adversarial_debate_20260609T141631Z_cf1ad76cf379.json LLM_PROVIDER N_AGENTS 3 MAX_STEPS 5 DEBATE_ROUNDS 3 CONSENSUS_THRESHOLD 0.05 DEBATE_WEIGHT 0.3 MIN_PANEL_DISAGREEMENT 0.05 MIN_GAP_CLOSURE 0.05 NEYMAN_CORRELATION 0.3这些值的用途在 Notebook 的 Settings 一节里逐条写明DEBATE_ROUNDS 3够每一方陈述、回应、修正一次再多只是重复论点CONSENSUS_THRESHOLD 0.05是提前停止线五个百分点已在这类证据能支撑的概率分辨率之内DEBATE_WEIGHT 0.3决定最终预测里辩论中点占多少权重取低值是因为聚合建立在三次独立取证上而中点只是两条 prompt 在摘要上互辩——它是声明的约定没有任何拟合过程MIN_PANEL_DISAGREEMENT和MIN_GAP_CLOSURE是后文辩论是否值回票价判断的阈值。默认路径回放固化运行不调用任何 APIRUN_LIVE保持False时Notebook 从 forecast_traces/07_adversarial_debate_20260609T141631Z_cf1ad76cf379.json 加载一次真实 provider 的固化捕获pinned capture重建研究 Agent 面板、聚合结果和完整辩论转录驱动后续每一个单元格。这个文件已随仓库提交所以回放模式开箱即用且表格、转录和图在每台机器上都一样。从仓库根目录执行# 本地 uv 路径 uv run python 24_autonomous_agents/07_adversarial_debate.py # 或 Docker 路径 docker compose run --rm ml4t python 24_autonomous_agents/07_adversarial_debate.py桌面上跑.py会在图窗口处阻塞等待你关闭Matplotlib 交互后端行为关闭每个窗口即继续无显示环境用 headless 方式MPLBACKENDAgg PLOTLY_RENDERERjson uv run python 24_autonomous_agents/07_adversarial_debate.py也可以按仓库的测试方式Papermill 注入测试参数、mock provider跑uv run pytest tests/test_chapter_notebooks.py -v -k 24_autonomous_agents如何核对运行结果运行后按下列顺序核对输出默认回放模式下这些数字全部来自固化捕获不是新调用的结果运行模式与问题。开头打印Mode回放模式显示 replay of a capture recorded 日期、Provider、问题文本和Market p_yes。默认辩论对象是 agent_fixtures.py 中的CHAPTER_CONTESTED_QUESTIONWill the Federal Reserve hike rates in 2026?——刻意选用可信证据指向两个方向的争议问题因为研究 Agent 会因此散开辩论才有可作用的分歧06_multi_agent_research.ipynb 用的是证据单向的问题Agent 挤在一起辩论无从发力。辩论前基线。逐个 Agent 的p_yes与confidence以及neyman_extremize给出的Aggregate。这一步让你先看到面板本身分歧多宽。辩论结果。打印Debate completed: N rounds、Consensus reached、Bull final/Bear final和Debate tokens。随后是逐轮 polars 表round / bull / bear / gap / consensusshow_debate_transcript完整打印每轮双方的论点和引用证据不截断图则画出 bull、bear、中点三条线阴影带就是分歧本身点线是辩论前聚合。回折进预测。blended (1 - DEBATE_WEIGHT) * pre_debate DEBATE_WEIGHT * debate_midpoint打印辩论前聚合、辩论中点、混合值和Shift from debate若未达共识会明确提示blended 值带着未闭合的分歧。值不值这次成本。用两个独立判据面板分歧max(panel_probabilities) - min(panel_probabilities)是否 ≥MIN_PANEL_DISAGREEMENT低于它说明面板本来就同意辩论不值得发起gap 变化gaps[-1] - gaps[0]是否 -MIN_GAP_CLOSURE收窄才算辩论推动了什么注意判据看的是 gap 而非 blended 值的变化后者只是权重乘以中点与聚合的距离构造上必然会动。审计留痕。回放模式打印 Replayed N model calls (X tokens) from 07_adversarial_debate_20260609T141631Z_cf1ad76cf379.json最后的replay_llm_calls(debate_calls, content_chars700)把每一轮 bull/bear 的原始 prompt包括回填的对方上一轮论点和原始 JSON 响应并排展示——转录和图都是从这些响应推导出来的所以这是最底层的一次核对。可选路径RUN_LIVE 真实辩论把RUN_LIVE改为True后走的是另一分支create_llm_client(LLM_PROVIDER)create_search_client(...)建真实客户端3 个ResearchAgent每个套一个独立的trace_llm(llm, labelfagent_{i})追踪器保证每个 prompt 和原始响应都能归因到发起它的 Agent辩论同样套labeldebate的追踪器。Notebook 文档明确写了这一模式的前提RUN_LIVE True配ANTHROPIC_API_KEY和TAVILY_API_KEY且它辩论的是当前问题不会复现固化捕获里的数值——预测市场类答案是 point-in-time 的重跑会拉取新的网络证据得到不同数字市场结算后应换一个同类当前问题。真实运行结束时RunTrace.capture实现在 agent_observability.py把问题、Agent 产物、聚合、完整辩论转录和全部原始模型对话打包成一个 JSON写到forecast_traces/下命名形如07_adversarial_debate_时间戳_run_id.json打印保存的模型调用数和 token 总量。这份文件就是可交给审阅者回放Agent 到底看到了什么、说了什么的持久记录。改参数后重跑即得到一次新的独立捕获与旧捕获可并排比较。框架自身的边界Notebook 的 Key Takeaways 一节列出了这套机制的诚实定位照用之前应知道辩论是诊断工具先于它是聚合器。gap 收窄才意味着分歧是信息性的、值得更新gap 不变而中点没动时把中点折进聚合只会产出一个看起来更新了、实际没有的数字不如把聚合值和开放的 gap 并排报告。对抗角色是 prompt不是机制。bull 和 bear 是同一个模型被要求从同一份证据论证相反立场gap 收窄是两条 prompt 在收敛不是两个独立分析者互相说服——这是一个便宜的压测不构成独立第二意见。双方看到的是 agent 摘要不是底层证据任何一方都无法核对对方引用的具体出处。DEBATE_WEIGHT是约定不是拟合参数且没有任何打分结果证明混合预测优于它调整的聚合值本身。固化捕获只有一个问题、三轮对话不构成 gap 会反复如此表现的证据。下一步08_forecasting_pipeline.ipynb 把研究 Agent、聚合、辩论和 supervisor 审查接成一条完整可运行的 pipelineAIA Forecaster构建SupervisorAgent与AIAForecaster在多个已结算问题上跑全流程并输出完整 trace09_evaluation_and_governance.ipynb 则用 Brier、log、ECE 等 proper scoring rules 给这些概率打分并做消融实验——想确认辩论阶段是否真的提升了预测质量应该到这两个 notebook 里看而不是只看 gap 曲线。【免费下载链接】machine-learning-for-tradingCode for Machine Learning for Trading, 3rd edition — from data sourcing to live execution.项目地址: https://gitcode.com/GitHub_Trending/ma/machine-learning-for-trading创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考