ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

用多Agent辩论架构给A股装个AI分析师:提示词工程与实操复盘

用多Agent辩论架构给A股装个AI分析师:提示词工程与实操复盘 1. 从“会辩论的 AI”说起这个项目到底在做什么第一次看到“他给 A 股装了个会辩论的 AI”这个标题我脑子里蹦出来的第一个画面不是量化交易也不是什么高频套利而是一个很朴素的场景一个人对着屏幕左边是看多逻辑右边是看空逻辑两边吵得不可开交最后逼着你在中间做决策。这个项目本质上就是把这种“左右互搏”的思考过程自动化了——用多个 AI 角色分别扮演多头和空头针对同一只股票、同一份财报、同一条消息面各自给出论证然后交叉质询最后汇总成一个相对平衡的判断。它解决的核心痛点其实很明确单一大模型做投资分析时天然存在“立场漂移”和“过度自信”的问题。你问它某只票能不能买它往往给你一个四平八稳的答案既说利好也说风险最后来一句“投资需谨慎”。这种回答对实操毫无帮助。而“会辩论的 AI”通过强制对抗把模糊的中间态逼成了明确的观点碰撞让你能看到分歧点到底在哪里。这个内容适合谁看如果你是做量化研究的、对 AI Agent 编排感兴趣的、或者单纯想给自己搭一个辅助复盘工具的散户都能从中拿到可复用的思路。它不需要你有很深的机器学习背景核心工作量在于流程设计和提示词工程代码层面反而是最轻的那部分。我下面会把这个项目的整体架构、关键细节、实操步骤和踩坑经验完整拆一遍尽量让你看完就能自己搭一套。2. 整体架构与方案选型为什么是“辩论”而不是“投票”2.1 单模型分析的三个致命缺陷在动手之前我先说说为什么不能简单地调一次 API 就完事。我实测过用单个模型分析财报连续跑十次同一份数据结论的倾向性会出现明显波动。这不是模型不行而是自回归生成的本质决定了它会沿着最先激活的路径一路走下去。具体表现为三个问题锚定效应如果提示词里先提到“营收增长”模型后续的分析会不自觉地围绕正面因素展开风险部分被弱化。一致性压力模型倾向于让整段输出逻辑自洽一旦开头定了调后面很难自我推翻。信息覆盖不全单次生成受限于上下文窗口和注意力分配容易漏掉财报附注里的关键细节。“辩论”机制恰好能对冲这三点。多空双方各自独立生成互不干扰锚定效应被打破对抗性质强制双方寻找对方论据的漏洞一致性压力转化为攻击动力多轮质询相当于多次采样信息覆盖面自然更广。2.2 多 Agent 对抗架构的选型对比市面上做多 Agent 协作的框架不少我对比了几种常见方案方案核心机制适合场景本项目适配度顺序链式调用A 输出给 BB 输出给 C流程固定的任务低缺乏对抗性投票集成多模型独立输出后投票分类任务中但无法深挖分歧辩论对抗正反方多轮质询需要深度论证的分析高辩论裁判对抗后由裁判模型裁决需要明确结论最高我最终选的是辩论裁判的混合架构。原因很简单纯辩论容易陷入“为了反对而反对”的循环双方都在找角度攻击对方最后可能离原始问题越来越远。加一个裁判角色负责在每轮辩论后判断“当前争议焦点是否已经充分讨论”并决定是否进入下一轮这样既能保证深度又能控制成本。2.3 角色分工与职责边界整个系统我设计了四个核心角色每个角色的系统提示词都经过反复调优多头分析师只负责寻找支撑股价上涨的证据包括业绩超预期、行业景气度回升、政策利好、技术面突破等。它的输出必须包含具体数据引用禁止空泛表述。空头分析师只负责寻找看空逻辑包括估值泡沫、业绩不及预期、竞争格局恶化、大股东减持等。同样要求数据支撑。质询官不站队专门负责挑刺。它会检查多空双方的论据是否存在数据错误、逻辑跳跃、以偏概全等问题并把问题抛回给对应方要求补充。裁判综合多轮辩论内容输出最终判断包括核心分歧点、当前证据强度对比、以及一个明确的操作倾向看多/看空/观望。注意角色提示词里一定要明确“禁止编造数据”。我早期版本没加这条空头分析师为了凑论据把某公司“毛利率下降 2 个百分点”夸大成“盈利能力大幅恶化”虽然方向没错但程度失真直接影响裁判判断。3. 核心细节解析提示词工程与数据管线的关键设计3.1 提示词的分层结构这个项目里最值钱的部分不是代码而是提示词。我把每个角色的提示词拆成四层身份层定义角色是谁、立场是什么、说话风格如何。任务层明确本轮要完成什么具体动作比如“针对 2024 年 Q3 财报中的应收账款周转天数变化给出你的解读”。约束层规定输出格式、数据引用要求、禁止行为。上下文层注入当前股票的基础数据、历史辩论记录、质询官的最新问题。这种分层的好处是可维护性强。比如我想调整空头分析师的攻击性只需要改身份层的一句话不用动整个提示词。实测下来分层后的提示词在角色一致性上比“一大段话”的写法稳定得多。3.2 数据注入的粒度控制A 股的数据源很杂财报、公告、研报、股吧情绪、龙虎榜、北向资金……如果一股脑全塞给模型上下文直接爆炸而且噪音会淹没信号。我的做法是按辩论轮次动态注入第一轮只给基础财务数据营收、利润、毛利率、ROE、现金流和最近一期财报的核心指标变化。第二轮根据第一轮双方提到的争议点针对性补充相关数据。比如空头提到“存货积压”我就把存货明细和周转天数拉出来。第三轮引入外部信息包括行业新闻、政策动态、可比公司估值。这样每一轮的信息密度都是可控的模型不会被无关数据干扰。我试过一次性注入全部数据结果多头和空头都在引用同一组数据的不同侧面辩论变成了“各说各话”质询官也找不到真正的矛盾点。3.3 辩论轮次的终止条件辩论不能无限进行下去否则 API 账单会教你做人。我设了三个终止条件满足任一即停止轮次上限默认 3 轮最多 5 轮。超过 3 轮后边际信息增量明显下降。分歧收敛如果质询官连续两轮没有提出新的有效质疑说明双方论据已经充分暴露继续下去只是重复。裁判判定裁判可以在任意轮次后宣布“证据已充分可以裁决”。实测下来大部分标的在 2 到 3 轮就能收敛。真正需要 5 轮的往往是那些基本面特别复杂、多空逻辑都很强的公司比如处于行业周期拐点或者有重大重组预期的票。3.4 输出结构化与可读性处理模型原始输出是一大段文字直接看很累。我在裁判环节加了一个结构化输出要求最终结果按固定格式呈现【核心分歧】 - 多头认为... - 空头认为... - 分歧本质... 【证据强度对比】 | 维度 | 多头证据 | 空头证据 | 当前倾向 | |------|---------|---------|---------| | 业绩 | ... | ... | 多/空/中性 | | 估值 | ... | ... | ... | | 资金面 | ... | ... | ... | 【裁判结论】 倾向看多/看空/观望 理由... 风险提示...这种格式的好处是你扫一眼就能抓住重点不用在文字堆里找结论。而且表格形式天然适合对比多空双方的论据强弱一目了然。4. 实操过程从零搭建一套辩论分析系统4.1 环境准备与依赖安装我用的技术栈很轻核心就是 Python 一个大模型 API。没有用 LangChain 之类的重型框架因为这种固定流程的编排自己写循环反而更可控。pip install openai pandas akshare requestsopenai调用大模型 API兼容大多数主流模型服务。pandas处理财务数据。akshare获取 A 股公开数据免费且接口稳定。requests抓取公告和新闻。提示如果你用的是其他模型服务把openai的base_url改掉就行接口格式基本兼容。我试过切换不同模型辩论质量差异主要体现在质询官的挑刺能力上裁判环节反而对模型要求没那么高。4.2 数据获取与预处理A 股数据获取有几个坑我一个个说。财务数据用akshare的stock_financial_abstract接口拿主要指标但要注意报告期和公告期的区别。比如 Q3 财报可能 10 月底才公告你在 10 月初跑分析用的是 Q2 数据这个时间差必须在提示词里说明否则模型会误判。行情数据日线数据用stock_zh_a_hist前复权处理。我建议把最近 60 个交易日的量价数据做成一个简表包括涨跌幅、换手率、成交额变化这些是技术面分析的基础。公告与新闻stock_notice_report可以拿公告列表但正文需要另外抓取。我的做法是只取最近 30 天的重要公告标题和摘要全文太长模型处理起来性价比低。预处理阶段最关键的一步是数据清洗。A 股财报里经常有“不适用”“--”这类占位符直接喂给模型会导致它胡乱解读。我写了一个简单的清洗函数把非数值字段统一替换成“数据缺失”并在提示词里注明“遇到数据缺失时不要猜测直接说明该维度无法判断”。4.3 辩论主循环的实现核心逻辑就是一个for循环每轮依次调用多头、空头、质询官最后裁判汇总。伪代码如下def debate_analysis(stock_code, max_rounds3): data fetch_data(stock_code) history [] for round_num in range(max_rounds): bull_arg call_llm(BULL_PROMPT, data, history) bear_arg call_llm(BEAR_PROMPT, data, history) challenge call_llm(CHALLENGER_PROMPT, bull_arg, bear_arg, history) history.append({ round: round_num 1, bull: bull_arg, bear: bear_arg, challenge: challenge }) if should_stop(challenge, history): break verdict call_llm(JUDGE_PROMPT, history) return verdictshould_stop函数判断质询官是否提出了新的有效质疑。我的实现很简单如果质询内容里包含“无新增质疑”或者连续两轮质疑的语义相似度超过阈值就停止。4.4 参数选择与成本控制大模型调用成本主要取决于 token 消耗。我实测了一组数据轮次平均输入 token平均输出 token单次分析总 token1 轮3200180050002 轮68003600104003 轮10500540015900按主流模型的价格算单次完整分析的成本在几毛钱到一块钱之间。如果你每天分析 10 只票一个月下来也就一两百块比很多付费工具便宜。注意输入 token 的大头是历史辩论记录。我试过把历史记录压缩成摘要再注入能省 30% 左右的 token但质询官偶尔会丢失细节。折中方案是只保留最近一轮的完整记录更早的轮次只保留结论。4.5 结果输出与复盘记录每次分析完我会把结果存成 JSON 和 Markdown 两份。JSON 用于后续统计比如跟踪裁判判断的准确率Markdown 用于人工阅读。文件名按股票代码_日期_轮次命名方便回溯。复盘的时候我会重点看两个东西一是裁判的“核心分歧”是否抓住了要害二是质询官提出的问题是否在后续行情中得到了验证。这个反馈循环对优化提示词非常重要。我大概跑了两个月调整了十几版提示词才把质询官的“挑刺命中率”提到一个可用的水平。5. 常见问题与排查技巧实录5.1 模型输出立场漂移怎么办这是最常见的问题。多头分析师说着说着开始提示风险空头分析师突然来一句“但也不排除超预期可能”。这种“端水”行为会严重削弱辩论效果。排查思路先检查身份层提示词是否足够强硬。我早期写的是“你是一位看多的分析师”后来改成“你是一位只关注上涨逻辑的多头分析师你的任务是找出所有支撑股价上涨的证据禁止提及任何风险因素风险由空头负责”。加了“禁止”和“职责划分”之后立场稳定性明显提升。另一个技巧在约束层加一句“如果你找不到足够的看多理由直接说‘当前证据不足以支撑看多逻辑’不要编造”。这样模型在确实没料的时候会老实承认而不是硬凑。5.2 质询官提不出有效问题质询官如果只会说“双方都有道理建议进一步观察”那这个角色就废了。我遇到过质询官连续三轮都在复述多空观点的情况。解决方法给质询官一个明确的检查清单让它按项核对数据引用是否准确有没有把“同比下降”说成“环比下降”逻辑链条是否完整从 A 到 B 的推导有没有跳跃是否存在以偏概全用单个季度的数据推断长期趋势有没有忽略反例比如多头说“营收增长”但应收账款增速更快这个矛盾有没有被提及把这个清单写进质询官的提示词后它的提问质量有了质的飞跃。实测下来每轮至少能提出 2 到 3 个有效质疑。5.3 裁判结论模棱两可裁判如果给出“建议观望”但不说清楚为什么那这个分析就白做了。我要求裁判必须输出“倾向 理由 风险提示”三件套而且理由必须引用辩论中的具体论据不能空泛。速查表问题现象可能原因解决方向多头/空头立场漂移身份层提示词不够强硬加“禁止”条款明确职责边界质询官提问空泛缺乏检查清单注入结构化质询模板裁判结论模糊输出格式约束不足强制三件套输出要求引用具体论据数据引用错误数据清洗不彻底统一缺失值标记提示词注明处理规则辩论轮次过多终止条件太宽松收紧收敛判定阈值设硬性轮次上限token 消耗过大历史记录全量注入压缩早期轮次为摘要5.4 数据时效性与公告滞后A 股的数据时效性是个大坑。财报有公告滞后龙虎榜是盘后数据北向资金有延迟。如果你在盘中跑分析用的可能是昨天的数据但模型不知道它会当成实时数据分析。我的做法在上下文层明确标注每个数据的“数据截止时间”并在提示词里加一句“当前分析基于 X 月 X 日收盘后的公开数据盘中变化未纳入考量”。这样模型在给结论时会自动加上时间限定不会给出过于激进的即时操作建议。5.5 过度依赖单一模型的偏见即使有多空对抗如果双方用的是同一个模型某些系统性偏见仍然存在。比如这个模型对某个行业特别乐观那多头和空头可能都会不自觉地带上这个倾向。缓解方案我试过用两个不同厂商的模型分别扮演多头和空头效果确实更好分歧更真实。但成本翻倍而且两个模型的输出风格差异太大质询官有时候会抓不住重点。折中方案是主力用一个模型但在质询环节换一个模型来挑刺这样既能引入外部视角成本也可控。6. 这套系统还能怎么扩展跑通基础版本之后我陆续加了一些扩展功能这里挑几个实用的说说。历史辩论归档与检索把每次辩论的完整记录存进本地数据库支持按股票、按日期、按关键词检索。这样当某只票再次触发分析时可以把上次的辩论结论调出来让模型对比“上次的判断和这次有什么变化”。这个功能对跟踪基本面拐点特别有用。多股票并行对比同一行业内选 3 到 5 只票同时跑辩论分析然后让裁判做一个横向对比。这样能看出同一逻辑在不同标的上的强度差异避免“单票分析很看好但放到行业里其实一般”的误判。情绪面数据接入股吧和雪球的热门讨论可以抓取关键词频率和情感倾向作为辩论的补充材料。但要注意情绪数据噪音极大我一般只把它作为“市场关注度”的参考不直接作为多空论据。回测验证把裁判的历史判断和后续股价走势做对比统计准确率。我跑了大概 200 个样本裁判给出明确倾向的案例中方向正确的比例在 55% 到 60% 之间。这个数字不算高但考虑到它只用了公开数据和有限轮次的辩论我觉得还有优化空间。关键是它能把分歧点清晰地列出来这对人工决策的帮助比一个单纯的准确率数字更大。提示词版本管理每次调整提示词都存一个版本号记录改动内容和对应的回测表现。这样能清楚地知道哪个改动带来了提升哪个改动其实是负优化。我踩过的坑是同时改了好几个地方结果效果变差了却不知道是哪个改动导致的。7. 一些实操心得这套系统我前后迭代了大概三个月从最开始的“单模型问一句”到现在的多角色辩论中间踩的坑比预想的多。最大的体会是辩论机制的价值不在于让 AI 替你决策而在于把决策所需的信息和分歧点结构化地摆在你面前。它不会告诉你“买”还是“卖”但它会告诉你“现在多空双方在争什么”“哪边的证据更扎实”“哪些风险还没被充分定价”。另一个心得是提示词的调优没有终点。我到现在还在根据每天的复盘结果微调质询官的检查清单。有时候加一条新的检查项就能让辩论质量上一个台阶。比如最近加的一条“检查双方是否混淆了同比和环比”直接堵住了一个高频错误。最后分享一个小技巧如果你刚开始搭不要一上来就追求多轮辩论。先用单轮跑通全流程确保数据获取、提示词调用、结果解析都没问题再逐步加轮次和角色。我见过不少人卡在“架构设计”阶段其实先跑起来比什么都重要。
返回列表