1. 为什么“模型数量”是个伪命题
这两年我接触过不少做投研工具的朋友,也帮几个团队做过技术选型和架构评审。一个特别普遍的现象是:大家坐下来聊方案,前三句话必然绕到“你们接了几个模型”“用的是不是最新的那个”“参数规模多大”。好像模型接得越多、版本越新,产品就越有竞争力。但真正把工具推到用户面前、跑上几个月之后,你会发现一个很尴尬的事实——用户根本不关心你背后用了几个模型,他们只关心结论准不准、快不快、能不能解释清楚。
我自己就踩过这个坑。早期做一个财报解读的小工具,为了“显得专业”,硬生生接了三个不同厂商的大模型做投票集成,结果响应时间从3秒涨到11秒,成本翻了四倍,而准确率的提升在统计上几乎可以忽略。后来把架构砍到“一个主模型+一套规则校验”,用户满意度反而上去了。这件事让我彻底想明白一个道理:AI投研工具的竞争力,从来不在模型层,而在模型之外的那一整套工程体系。
那这套体系到底包含什么?我把它拆成四块:数据管道、任务编排、结果校验、交互设计。模型只是其中最容易被替换的一环,就像做菜,食材(模型)固然重要,但真正决定这道菜好不好吃的是火候控制、调味顺序和摆盘。下面我按这个思路,把每一块拆开讲透。
1.1 投研场景到底特殊在哪
要理解为什么模型不是核心,得先搞清楚投研这个场景和普通问答有什么本质区别。普通聊天机器人答错一句话,用户笑一笑就过去了;但投研工具给出的一个数字、一个判断,可能直接影响一笔资金的去向。这就带来三个硬性约束:
- 可追溯性:每个结论必须能回溯到原始数据源,不能是模型“编”出来的。
- 时效性:财报、公告、行情数据都是分钟级变化的,模型的知识截止日期根本靠不住。
- 一致性:同一个问题今天问和明天问,答案不能因为模型随机性而天差地别。
这三个约束决定了,单纯堆模型是解决不了问题的。你需要的是一套能把模型“框住”的工程架构,让它在可控的范围内发挥语言理解和推理能力,而不是让它自由发挥。
1.2 一个反直觉的观察
我做过一个小范围的对比测试:用同一个投研任务(比如“提取某公司近三年营收并计算复合增长率”),分别用“单一大模型直接回答”和“小模型+结构化数据管道+规则计算”两种方案跑100次。结果前者准确率大概在72%左右,后者稳定在96%以上。更关键的是,前者有大约15%的情况会给出“看起来很像但实际错误”的数字,这种错误最危险,因为用户很难一眼看出来。
这个测试让我更加确信:投研工具的核心竞争力,是把不确定性关进笼子的能力。模型负责理解和生成,但数字和逻辑必须由确定性的代码来兜底。这也是为什么我后面会花大量篇幅讲数据管道和校验层——它们才是真正拉开差距的地方。
2. 数据管道:被低估的胜负手
如果说模型是发动机,那数据管道就是整辆车的底盘和传动系统。发动机再强,底盘散了照样跑不起来。我在实际项目里观察到,团队花在数据管道上的时间,往往和最终产品的可用性成正比。
2.1 数据源的分层处理策略
投研数据大致可以分成三层,每层的处理方式完全不同:
| 数据层级 | 典型来源 | 更新频率 | 处理方式 | 对模型依赖度 |
|---|---|---|---|---|
| 结构化数据 | 行情、财务指标 | 实时/日频 | 直接入库,代码计算 | 极低 |
| 半结构化数据 | 公告、研报PDF | 事件驱动 | 解析+抽取+校验 | 中等 |
| 非结构化数据 | 新闻、社交媒体 | 实时流 | 摘要+情感+关联 | 较高 |
我见过太多团队把这三层混在一起,全部丢给大模型处理,结果就是又慢又贵还不准。正确的做法是分层治理:结构化数据坚决不让模型碰,半结构化数据让模型做抽取但必须过校验,非结构化数据才让模型发挥理解和归纳能力。
举个具体例子。财报里的营收数字,它就在PDF的表格里,位置固定、格式规范。你完全可以用规则+小模型做表格识别,抽出来之后和数据库里的历史值做交叉验证。如果模型抽出来是“1,234.5百万”,而数据库里同期是“1234.5百万”,那就对上了。这种校验逻辑比让大模型“理解”财报可靠得多。
2.2 数据清洗里的那些坑
数据清洗听起来是脏活累活,但它直接决定了上层模型能不能好好工作。我整理了几个投研数据清洗中最容易翻车的地方:
- 单位陷阱:中文财报里“万元”“亿元”“千元”混用是常态,模型很容易忽略单位直接抄数字。我的做法是在解析层强制统一到“元”,并在元数据里记录原始单位。
- 时间对齐:不同数据源的时间戳格式五花八门,有的用财年、有的用自然年、有的用季度末。必须建立统一的时间轴映射表,否则做同比环比时全是错的。
- 缺失值语义:财报里的“-”和“0”和空白,含义完全不同。“-”通常表示不适用,“0”是真实为零,空白可能是未披露。这个区别如果丢了,后续分析全废。
- 实体消歧:同一家公司有简称、全称、股票代码、曾用名。我一般会维护一张实体映射表,用代码做归一化,而不是指望模型去猜。
提示:数据清洗阶段产生的所有中间结果都要落盘保存,不要只在内存里过一遍。投研场景经常需要回溯“这个数字到底怎么来的”,没有中间记录你会很被动。
2.3 增量更新与版本管理
投研数据是活的,每天都在变。我建议从一开始就设计增量更新机制,而不是每次全量重跑。具体做法是给每条数据打上“数据版本号”和“入库时间戳”,当新数据到来时,只处理变化的部分。
版本管理这块,我用过一个很土但很有效的办法:把每次数据快照存成带日期的文件,比如financials_20240115.parquet。这样任何时候都能回到历史某一天的数据状态,做回测或者排查问题时特别有用。别小看这个习惯,我靠它定位过好几次“为什么昨天的结论和今天不一样”的诡异问题。
3. 任务编排:让模型各司其职
模型不是越多越好,而是分工越清晰越好。一个投研任务往往包含多个子步骤,每个步骤对模型能力的要求完全不同。把所有步骤塞给一个大模型,就像让一个博士生去做录入和校对,浪费且容易出错。
3.1 任务拆解的基本框架
我通常把一个投研任务拆成四类子任务,每类用不同的处理策略:
- 抽取类任务:从文本里找特定信息。这类任务用小模型甚至规则就够了,关键是准和快。
- 计算类任务:涉及数字运算。坚决用代码,模型只负责把自然语言转成计算表达式。
- 推理类任务:需要多步逻辑。这类才真正需要大模型,但必须给它提供充分的上下文和约束。
- 生成类任务:把结果组织成人话。可以用大模型,但要给它明确的模板和事实清单,防止它自由发挥。
这个框架的好处是,你能清楚地知道每个环节该用什么工具,而不是一股脑全上大模型。我实测下来,按这个框架重构之后,整体成本能降60%以上,响应速度提升2到3倍。
3.2 模型路由的实操细节
所谓模型路由,就是根据任务类型自动选择合适的模型。这里有个关键点:路由决策要基于任务特征,而不是基于模型名气。我一般会看几个维度:
- 输入长度:短文本用轻量模型,长文档才上长上下文模型。
- 任务复杂度:简单抽取用规则或小模型,复杂推理才用大模型。
- 延迟要求:实时交互场景优先用快模型,后台批处理可以用慢模型。
- 成本预算:给每个任务设一个成本上限,超了就降级处理。
具体实现上,我会写一个简单的路由函数,输入是任务描述和上下文,输出是模型标识和参数配置。这个函数不需要很复杂,几十行代码就能覆盖大部分场景。关键是把路由逻辑显式化,而不是散落在各个业务代码里。
3.3 多模型协作的正确姿势
热词里提到“多AI协作”,这个概念本身没错,但很多人理解偏了。多模型协作不是让几个模型同时回答然后投票,而是让它们串行接力。比如:
- 第一个模型负责把用户问题拆成子问题;
- 第二个模型负责为每个子问题检索相关数据;
- 第三个模型负责基于检索结果做推理;
- 第四个模型负责把推理结果组织成回答。
每个模型只做自己最擅长的事,前一个的输出是后一个的输入。这种串行架构比并行投票更可控,也更容易排查问题。当然,串行会带来延迟累积,所以每个环节都要做超时控制和降级预案。
注意:多模型协作时,模型之间的接口要定义清楚,最好用结构化的JSON传递,而不是自然语言。自然语言在模型之间传递会不断损失信息,几轮下来就面目全非了。
4. 结果校验:把不确定性关进笼子
这一块是我认为整个体系里最核心、也最容易被忽视的部分。模型输出天然带有不确定性,而投研场景对错误的容忍度极低。所以你必须建立一套校验机制,在结果送到用户面前之前,把明显错误拦下来。
4.1 三层校验体系
我一般会设计三层校验,从粗到细:
第一层:格式校验。检查模型输出是否符合预期结构。比如要求输出JSON,那就验证JSON是否合法、字段是否齐全、类型是否正确。这一层能拦掉大约30%的低级错误。
第二层:逻辑校验。检查输出内容是否符合业务逻辑。比如营收增长率不可能超过1000%,毛利率不可能大于100%,资产负债率不可能为负。这些规则用代码写死,模型输出必须过这一关。
第三层:交叉校验。用独立的数据源或计算方法验证模型结论。比如模型说某公司营收增长20%,那就用数据库里的原始数据自己算一遍,对不上就标记为可疑。
这三层下来,能把绝大多数错误挡在门外。剩下的漏网之鱼,就需要人工复核或者给用户明确的置信度提示。
4.2 置信度评分的设计
与其给用户一个非黑即白的答案,不如给一个带置信度的结果。我通常从几个维度计算置信度:
- 数据完整性:所需数据是否齐全,缺失越多置信度越低。
- 模型一致性:多次采样或不同模型的结果是否一致。
- 校验通过率:三层校验中通过了多少。
- 历史准确率:该模型在该类任务上的历史表现。
把这些维度加权求和,得到一个0到1之间的置信度分数。低于某个阈值的结果,要么不展示,要么明确标注“仅供参考”。这个做法虽然不能保证100%准确,但能让用户对结果的可信程度有个预期,比盲目相信要好得多。
4.3 人工反馈闭环
再好的自动校验也有盲区,所以人工反馈闭环必不可少。我的做法是在界面上给每个结论加一个“反馈”按钮,用户觉得不对可以一键标记。这些反馈数据定期汇总,用来:
- 发现校验规则的漏洞,补充新规则;
- 识别模型的系统性偏差,调整路由策略;
- 积累高质量标注数据,用于后续微调。
这个闭环跑起来之后,系统的准确率会随着使用量增长而持续提升。这也是为什么我说竞争力不在模型——模型是买来的,但反馈闭环是自己养出来的,这才是护城河。
5. 交互设计:让用户信任你的结论
技术做得再好,如果用户看不懂、不敢信,那也白搭。投研工具的交互设计有个核心原则:让用户能自己验证结论。不是把答案喂到用户嘴边,而是把推理过程摊开给用户看。
5.1 结论的可解释性呈现
我一般会要求每个结论都附带三样东西:
- 数据来源:这个结论基于哪些数据,点开能看到原始出处。
- 计算过程:如果是计算得出的,展示计算步骤和中间结果。
- 推理链条:如果是推理得出的,展示推理的逻辑步骤。
这三样东西不需要默认全部展开,但必须一键可达。用户可能90%的时间不看,但只要有10%的情况他需要验证,你能提供,信任感就建立起来了。
5.2 不确定性的可视化
前面提到的置信度,不能只藏在后台,要用用户能理解的方式呈现出来。我的做法是用颜色和文案双重提示:
- 高置信度:正常显示,绿色标识;
- 中置信度:黄色标识,附一句“建议结合原始数据复核”;
- 低置信度:红色标识,明确写“该结论可靠性较低,请谨慎参考”。
这种设计看起来简单,但能极大降低用户误用的风险。我见过太多工具把不确定的结果包装得和确定的结果一样,这是对用户不负责任。
5.3 响应速度的取舍
投研用户对速度很敏感,但速度和质量往往矛盾。我的策略是分级响应:
- 简单查询走缓存或轻量模型,秒级返回;
- 复杂分析走完整管道,明确告知预计耗时,并展示进度;
- 超长任务转为后台执行,完成后通知用户。
关键是不要让用户干等,也不要为了快而牺牲准确性。把预期管理好,用户是能接受等待的。
6. 常见问题与排查实录
在实际落地过程中,我遇到过各种各样的问题。这里整理一份速查表,都是真实踩过的坑。
| 问题现象 | 可能原因 | 排查思路 | 解决方案 |
|---|---|---|---|
| 同一问题答案不稳定 | 模型温度参数过高 | 检查temperature设置 | 投研场景建议设为0或接近0 |
| 数字经常出错 | 模型直接做算术 | 检查是否让模型算数 | 改为代码计算,模型只做抽取 |
| 响应越来越慢 | 上下文无限累积 | 检查对话历史长度 | 设置上下文窗口上限,超长做摘要 |
| 成本失控 | 所有任务都用大模型 | 统计各任务模型调用量 | 引入路由,简单任务降级 |
| 结论无法追溯 | 中间结果未保存 | 检查日志和落盘策略 | 全链路记录,保留中间产物 |
| 新数据不生效 | 缓存未失效 | 检查缓存更新机制 | 数据变更时主动清缓存 |
6.1 模型“幻觉”的针对性处理
模型幻觉在投研场景特别危险,因为它编造的数字往往看起来很合理。我的应对策略是事实锚定:在让模型生成之前,先把所有相关事实以结构化形式喂给它,并要求它只能基于给定事实回答。如果它生成了事实清单之外的内容,校验层直接拦截。
具体实现上,我会在prompt里明确写:“以下是你可用的全部事实,你的回答不得引入任何未列出的事实。”然后在输出校验时,检查生成内容中的数字和实体是否都能在事实清单里找到。找不到的就标记为可疑。
6.2 长文档处理的性能优化
投研经常要处理几百页的研报或财报。直接把全文塞给模型,既慢又贵还容易丢信息。我的做法是分层摘要+关键段落定位:
- 先用轻量模型对每个章节做摘要;
- 根据任务需求,定位到相关章节;
- 只把相关章节的原文喂给大模型做精细处理。
这样能把输入长度压缩到原来的十分之一甚至更低,速度和成本都大幅改善。热词里提到的“滑动窗口”思路在这里也适用,对于超长文本,可以用滑动窗口分段处理,再对结果做融合。
6.3 本地部署的取舍
有些团队出于数据安全考虑,希望本地部署模型。这个方向没问题,但要算清楚账。本地部署的挑战主要在:
- 硬件成本:推理需要GPU,好的GPU不便宜;
- 运维成本:模型更新、监控、扩缩容都要人;
- 效果差距:开源模型和顶级闭源模型在复杂推理上仍有差距。
我的建议是混合部署:敏感数据用本地模型处理,非敏感任务用云端模型。这样既满足合规要求,又不牺牲整体效果。具体哪些任务放本地,要根据数据敏感度和任务复杂度做矩阵分析。
7. 我个人的一些经验体会
做了这么多项目,最大的体会是:投研工具的技术选型,本质上是在准确、速度、成本三者之间找平衡点。模型只是这个平衡方程里的一个变量,而且往往不是最关键的那个。真正决定产品成败的,是数据管道的健壮性、任务编排的合理性、校验体系的严密性,以及交互设计的友好度。
我见过太多团队把80%的精力花在模型选型和调参上,结果数据管道一塌糊涂,校验层形同虚设,最后产品根本没法用。反过来,有些团队用的模型很普通,但工程体系扎实,产品反而口碑很好。这个反差值得每个做AI投研的人深思。
最后分享一个我一直在用的小技巧:每次上线新功能之前,先自己当用户跑100个真实case。不要只看demo,不要只测happy path,要专门找那些边界情况、异常输入、模糊表述去试。这100个case跑下来,你能发现的问题比任何测试报告都多。这个习惯帮我避免了好几次线上事故,也让我对系统的真实能力边界有了清醒的认识。
投研这个领域,慢就是快,稳就是赢。模型会一代代更新,但扎实的工程体系会一直为你创造价值。