1. 从零拆解AI Agent做投研到底靠不靠谱1.1 为什么突然大家都在聊多智能体投研过去两年投研圈子里最热的词从“因子挖掘”慢慢变成了“Agent”。我身边不少做量化和基本面研究的朋友最初对AI写研报这件事是嗤之以鼻的——觉得大模型只会车轱辘话数据还容易编。但今年风向明显变了原因很简单单一大模型搞不定投研这种“信息密度极高、链条极长、容错率极低”的活儿而多智能体架构恰好能把这件事拆开干。投研的本质是什么是把海量、异构、噪声极大的信息压缩成几个可执行的判断。这个过程天然包含几个环节信息采集、信息清洗、逻辑推理、观点生成、风险校验。你让一个模型从头到尾干完它大概率会在中间某一步开始胡编。但如果你把每个环节交给一个专门的Agent再让它们互相校验整个系统的可靠性就上来了。这就是多智能体在智能投研里的核心价值分工、制衡、可追溯。不是让AI替你做决策而是让AI把决策前的脏活累活干完并且每一步都留下痕迹让你能查、能改、能复盘。1.2 这套系统到底解决什么问题我先把话说直白一点这套东西不是用来预测涨跌的任何声称能预测涨跌的AI系统你都要打个问号。它真正解决的是三个痛点。第一信息过载。一个行业一天可能出几十份公告、上百条新闻、若干份研报人工看完不现实。多智能体可以并行处理每个Agent盯一个信息源最后汇总。第二逻辑断层。人写研报容易“结论先行”先有观点再找证据。多智能体架构可以强制要求“证据链完整”推理Agent必须引用信息Agent提供的原始材料不能凭空生成。第三复盘困难。传统研报你很难追溯作者当时为什么这么想。Agent系统每一步的输入输出都结构化存储事后可以完整回放整个推理过程。适合谁来参考我认为三类人最有用一是中小机构的研究员人手有限但信息需求大二是量化团队里想做基本面因子的人三是独立投资者想用系统化方式管理自己的研究流程。不需要你是AI专家但至少要能看懂Python和基本的API调用。1.3 整体架构长什么样我实测下来最稳的架构是四层信息层、分析层、策略层、校验层。每层由若干Agent组成层与层之间通过结构化消息传递。信息层负责采集和清洗包括公告Agent、新闻Agent、财报Agent、舆情Agent。分析层负责推理包括行业分析Agent、财务分析Agent、对比分析Agent。策略层负责生成可执行的观点包括策略生成Agent、仓位建议Agent。校验层负责挑刺包括事实核查Agent、逻辑一致性Agent、风险提示Agent。这个架构的关键在于校验层是独立的不参与生成。很多团队做多智能体失败就是因为让生成观点的Agent自己检查自己那等于没检查。校验Agent必须拿到原始信息独立判断生成Agent的结论是否有依据。2. 核心细节每个Agent到底怎么设计2.1 信息采集Agent的设计要点信息采集看起来简单其实是最容易翻车的地方。我踩过的坑包括新闻源格式不统一、公告PDF解析乱码、时间戳时区混乱。我的做法是每个信息源单独一个Agent统一输出格式。输出结构固定为{source, timestamp, title, content, url, confidence}。confidence字段表示这条信息的可信度比如官方公告给0.95自媒体给0.6。采集Agent的核心不是“抓取”而是“过滤”。投研场景下90%的信息是噪声。我通常会让采集Agent先做一轮粗筛用关键词和规则过滤掉明显无关的内容再交给下游。这一步能省掉后面大量的token消耗。注意采集Agent一定要设置超时和重试机制。我遇到过某个数据源响应极慢导致整个流水线卡死的情况。单个Agent超时时间建议不超过30秒重试不超过2次。2.2 分析Agent的推理链设计分析Agent是整个系统的大脑也是最难调的部分。我的经验是不要让分析Agent直接给结论要让它给推理链。具体做法是要求分析Agent输出结构化的推理步骤每一步包含前提、推理、结论。比如“前提该公司Q3营收同比增长20%推理增速高于行业平均的8%结论市场份额可能在提升”。这样做的好处是校验Agent可以逐步检查。如果某一步的前提在信息层找不到对应来源直接标记为“无依据”。我实测下来这种设计能把幻觉率降低70%以上。分析Agent的prompt里必须包含“不确定时明确说不知道”的指令。很多模型倾向于强行给答案这在投研场景是致命的。我通常会在prompt里加一句“如果信息不足以支撑判断输出‘信息不足’并说明缺少什么信息。”2.3 策略生成Agent的约束条件策略生成Agent最容易失控因为它直接面向“建议”。我的做法是给它加三层约束。第一层是格式约束必须输出{观点, 依据, 置信度, 时间窗口, 风险点}五元组。置信度用0-1表示时间窗口明确是短期、中期还是长期。第二层是逻辑约束观点必须能追溯到分析层的具体推理步骤不能引入新信息。这一条通过引用ID实现每个分析结论都有唯一ID策略Agent只能引用已有ID。第三层是风险约束必须列出至少两个风险点且风险点不能是“市场波动”这种废话要具体到“原材料价格上行”“政策补贴退坡”这种可验证的层面。我试过不加约束让模型自由发挥结果它给出的建议全是“建议关注”“值得研究”这种没有信息量的废话。加了约束之后输出质量明显提升。2.4 校验Agent的独立性与对抗性校验Agent是整个系统的质量守门员。它的设计原则是独立获取信息独立判断不允许参考生成Agent的中间过程。具体来说校验Agent拿到策略Agent的输出后会重新从信息层拉取原始数据独立验证每个依据是否成立。如果发现依据不成立直接标记为“驳回”并说明原因。我还会设置一个“对抗Agent”专门负责找茬。它的prompt是“你的任务是找出这个结论的所有可能漏洞包括数据时效性、样本偏差、逻辑跳跃、反例。”这个Agent不需要给出替代方案只需要挑刺。实测下来对抗Agent能发现大约30%的潜在问题其中一半是生成Agent确实忽略的重要风险。这个比例相当可观。3. 实操落地从环境搭建到跑通全流程3.1 技术选型与依赖安装框架层面我推荐两个方向如果团队有Java背景AgentScope是不错的选择它的多智能体通信机制比较成熟如果偏Python生态Dify或者直接基于LangGraph自建都可以。我这次演示用Python LangGraph因为灵活度高方便调试。核心依赖包括langgraph、langchain、openai或兼容接口、pydantic、httpx、beautifulsoup4、pdfplumber。安装命令如下pip install langgraph langchain openai pydantic httpx beautifulsoup4 pdfplumber模型选择上我建议分析层用能力强的模型采集层和校验层可以用轻量模型。这样能在成本和效果之间取得平衡。我实测下来采集层用7B级别的模型足够分析层建议用70B以上或闭源旗舰模型。3.2 定义Agent之间的通信协议多智能体系统最容易乱的地方就是通信。我的做法是定义一个统一的消息格式所有Agent之间只传这个格式。from pydantic import BaseModel from typing import List, Optional class AgentMessage(BaseModel): msg_id: str sender: str receiver: str msg_type: str # info, analysis, strategy, critique payload: dict timestamp: str parent_id: Optional[str] None confidence: float 1.0parent_id是关键字段用来追溯消息来源。整个推理链条就是通过parent_id串起来的。事后复盘时你可以从最终策略一路回溯到原始信息。消息总线我用的是简单的内存队列生产环境建议换成Redis或者RabbitMQ。小规模测试内存队列够用但要注意并发问题。3.3 信息采集Agent的完整实现采集Agent我以公告为例。核心逻辑是定时拉取、解析、过滤、入库。import httpx from bs4 import BeautifulSoup from datetime import datetime class AnnouncementAgent: def __init__(self, source_url, keywords): self.source_url source_url self.keywords keywords async def fetch(self): async with httpx.AsyncClient(timeout30) as client: resp await client.get(self.source_url) return resp.text def parse(self, html): soup BeautifulSoup(html, html.parser) items [] for node in soup.select(.announcement-item): title node.select_one(.title).text.strip() content node.select_one(.content).text.strip() ts node.select_one(.time).text.strip() items.append({ title: title, content: content, timestamp: ts, source: self.source_url }) return items def filter(self, items): result [] for item in items: if any(kw in item[title] for kw in self.keywords): item[confidence] 0.95 result.append(item) return result async def run(self): html await self.fetch() items self.parse(html) return self.filter(items)这个Agent的关键在于filter方法。关键词列表需要根据你的研究范围动态调整。我通常会把行业术语、公司名、产品名都放进去。提示采集频率不要太高公告类信息一天两次足够。高频采集不仅浪费资源还容易触发对方限流。3.4 分析Agent的推理链实现分析Agent的核心是prompt设计。我用的模板大致如下ANALYSIS_PROMPT 你是一名资深行业分析师。基于以下信息输出结构化的分析推理链。 信息 {info_list} 要求 1. 每条推理必须包含前提、推理过程、结论 2. 前提必须来自上述信息引用时标注信息ID 3. 如果信息不足明确说明缺少什么 4. 输出格式为JSON列表 输出示例 [ {{ premise: 信息ID-001显示Q3营收增长20%, reasoning: 行业平均增速为8%该公司显著高于行业, conclusion: 市场份额可能提升, confidence: 0.75 }} ] 这个模板我调了很多版。早期版本没有要求引用信息ID结果模型经常编造数据。加了引用要求之后幻觉明显减少。分析Agent的输出会存入消息总线供策略Agent和校验Agent使用。每个结论都有唯一ID方便追溯。3.5 策略生成与校验的联动策略Agent拿到分析结论后按五元组格式生成策略。校验Agent独立验证。class StrategyAgent: def generate(self, analysis_results): prompt f 基于以下分析结论生成投资策略。 分析结论{analysis_results} 输出格式 {{ view: 观点, evidence: [引用的分析ID], confidence: 0.0-1.0, horizon: 短期/中期/长期, risks: [风险1, 风险2] }} return call_llm(prompt) class ValidatorAgent: def validate(self, strategy, raw_info): prompt f 独立验证以下策略是否成立。 策略{strategy} 原始信息{raw_info} 检查项 1. 每个evidence是否能在原始信息中找到 2. 是否存在逻辑跳跃 3. 风险点是否具体可验证 4. 置信度是否合理 输出{{pass: true/false, issues: [...]}} return call_llm(prompt)校验不通过时系统会打回策略Agent重新生成最多重试3次。3次仍不通过则标记为“无法生成可靠策略”输出给人工处理。3.6 完整流水线的编排用LangGraph编排整个流程核心是定义状态和节点。from langgraph.graph import StateGraph, END from typing import TypedDict, List class ResearchState(TypedDict): raw_info: List[dict] analysis: List[dict] strategy: dict validation: dict retry_count: int def build_graph(): graph StateGraph(ResearchState) graph.add_node(collect, collect_node) graph.add_node(analyze, analyze_node) graph.add_node(strategize, strategize_node) graph.add_node(validate, validate_node) graph.set_entry_point(collect) graph.add_edge(collect, analyze) graph.add_edge(analyze, strategize) graph.add_edge(strategize, validate) graph.add_conditional_edges( validate, lambda s: strategize if not s[validation][pass] and s[retry_count] 3 else END ) return graph.compile()这个编排逻辑清晰每个节点职责单一。实测下来单次完整流程耗时约2-5分钟取决于信息量和模型响应速度。4. 踩坑实录那些文档不会告诉你的问题4.1 信息时效性导致的误判我遇到最严重的一次问题是采集Agent抓到了一篇两年前的旧闻但时间戳解析错误被当成了最新信息。结果分析Agent基于旧闻得出了完全错误的结论。排查过程很痛苦因为整个链条看起来都正常。最后是校验Agent的“时效性检查”发现了问题——它发现信息中的事件日期和采集日期差距过大。解决方案是在采集层强制校验时间戳任何超过设定窗口比如7天的信息直接丢弃。同时在分析Agent的prompt里明确要求“注意信息时效性”。注意时间戳解析一定要用标准库不要自己写正则。我见过太多因为时区、格式问题导致的时间错乱。4.2 模型幻觉的三种典型表现幻觉在投研场景特别危险我总结了三类。第一类是数据幻觉编造不存在的财务数据。这类通过强制引用信息ID可以基本解决。第二类是逻辑幻觉推理过程看似合理但前提错误。这类需要校验Agent独立验证前提。第三类是置信度幻觉模型对错误结论给出高置信度。这类最难处理我的做法是引入“置信度校准”——如果校验Agent发现依据不足强制降低置信度。实测下来三类幻觉的出现频率大约是数据幻觉30%逻辑幻觉50%置信度幻觉20%。校验层能拦截其中约80%。4.3 多Agent死循环的预防多智能体系统一个经典问题是死循环策略Agent生成校验Agent驳回策略Agent再生成再驳回无限循环。我的解决方案是设置硬性重试上限同时记录每次驳回的原因。如果连续两次驳回原因相同说明策略Agent无法理解校验意见直接终止并转人工。另一个技巧是让校验Agent在驳回时给出“修改建议”而不是只说“不通过”。这样策略Agent有明确的修改方向能提高通过率。4.4 成本控制的实战经验多智能体系统token消耗是单Agent的数倍。我实测下来一次完整投研流程大约消耗5万-15万token取决于信息量。控制成本的手段有几个采集层用轻量模型、分析层做信息压缩、校验层只传必要信息。其中信息压缩最有效——把原始信息压缩成结构化摘要再传给分析层能省掉60%以上的token。我通常会在采集层和分析层之间加一个“摘要Agent”专门负责把长文本压缩成关键要点。这个Agent用轻量模型即可成本很低但效果显著。4.5 常见问题速查表问题现象可能原因排查方向解决方案策略输出为空分析层无有效结论检查分析Agent输出放宽采集过滤条件校验一直不通过策略Agent理解偏差查看驳回原因优化prompt增加示例流程卡死某Agent超时查看各节点耗时设置超时和重试结论明显错误信息源污染检查原始信息增加信息源可信度权重token消耗过高信息未压缩统计各层token增加摘要Agent置信度普遍偏高模型校准问题对比校验结果引入置信度校准机制5. 进阶玩法让系统越跑越聪明5.1 记忆机制的引入基础版系统每次运行都是“无状态”的这导致重复劳动。引入记忆机制后系统可以记住历史分析结论避免重复推理。我的做法是给每个Agent加一个向量数据库存储历史输入输出。新任务来时先检索相似历史如果有高度相似的直接复用或微调而不是从头推理。这一步能显著降低成本和延迟。实测下来相似任务的处理时间能缩短50%以上。5.2 反馈闭环的建立系统跑一段时间后会积累大量“策略-校验”记录。这些记录是宝贵的训练数据。我的做法是定期分析这些记录找出高频驳回原因针对性优化prompt。比如如果发现“风险点不具体”是高频问题就在策略Agent的prompt里加强这方面的约束。更进一步可以用这些记录微调一个小模型专门做校验任务。微调后的校验模型比通用模型更懂投研场景的“坑”。5.3 多模态信息的整合投研场景不只有文本还有图表、财报PDF里的表格、电话会议录音。多模态整合是进阶方向。我的做法是图表用视觉模型转成文字描述PDF表格用专用解析库提取录音用语音转文字。所有模态统一转成文本后再进入标准流程。这一步的难点在于格式统一。我的经验是定义一个“标准信息单元”所有模态转换后都填充这个结构下游Agent不需要关心原始模态。5.4 人机协作的接口设计完全自动化的投研系统是不现实的人必须在关键节点介入。我的做法是设置三个介入点。第一个是信息层人工可以标记“重点关注”的信息系统优先处理。第二个是校验层人工可以复核校验Agent的判断纠正误判。第三个是策略层人工可以对最终策略做最终审核和修改。这三个介入点的设计原则是人做判断机器做执行。不要让机器替人做最终决策也不要让人做机器能做的重复劳动。6. 我个人的一些实操体会这套系统我断断续续搭了几个月最大的体会是多智能体的价值不在于“智能”而在于“结构”。单个模型再强也架不住投研这种长链条任务的复杂性。但把任务拆开每个环节用合适的模型再加上严格的校验机制整体可靠性会有质的提升。另一个体会是prompt工程在这个场景下比模型选择更重要。我试过用顶级模型配烂prompt效果远不如中等模型配精心设计的prompt。投研场景对格式和逻辑的要求极高prompt必须把这些约束写死。最后分享一个小技巧如果你刚开始搭不要一上来就搞全套。先从“采集分析”两个Agent跑通确认信息流转没问题再逐步加策略和校验。我见过太多人一上来就搭完整架构结果调试成本高到放弃。小步快跑每一步都验证这才是靠谱的做法。这套东西后续还可以往两个方向扩展一是接入实时行情数据做动态策略调整二是把历史策略和实际表现做关联分析反向优化Agent的prompt。这两个方向我还在摸索有进展再分享。