一开始,我以为用大模型做一个股票分析系统,就是把行情数据和新闻标题丢给API,再让AI编程工具生成一个好看的网页。可真到了动手的时候,问题接二连三地冒出来:模型把“成交量”理解成了“市值”,同一句问话换了种说法就完全答偏,本地跑得好好的页面,部署到服务器之后又因为依赖冲突直接崩溃。
那一刻我才意识到,这个项目真正考验的不是“大模型能不能分析股票”,而是“怎么把一个概率性的模型,稳定地塞进一条需要确定性的工程链路”。
标题里的FDE,在AI应用落地这个圈子里,通常指前沿部署工程师(Forward Deployed Engineer)。它更像是一种工作方式:跑到真实业务环境里,把模型部署好,把数据接进来,把错误处理掉,把整个流程跑通并且让它能持续使用。这篇文章想分享的,就是这样一个“FDE前沿部署实战”视角下的股票分析系统落地过程。
先给一个整体判断:用大模型做股票分析系统的价值,不在于让AI生成一个看起来能跑的Demo,而在于你真正搞清楚一件事——从“模型能回答一个问题”到“系统能持续服务”,中间还隔着数据工程、部署工程和验证工程。
1. 为什么“股票分析系统”是大模型落地的典型样本
1.1 它天然混合了结构化数据和非结构化文本
股票分析这个场景,本身就是两类数据的混合体。
一类是结构化数据:K线、均线、成交量、市盈率、持仓记录。这类数据有明确的数值边界,适合用代码和规则来处理,算得快、误差小。
另一类是非结构化文本:财经新闻、公司公告、机构研报、论坛讨论。这类数据里没有清晰的字段边界,传统程序只能做关键词匹配,很难真正理解句式、语气和上下文。
大模型擅长的是后者,并非前者。所以一个真正能用的股票分析系统,不可能只靠“调一个大模型接口”完成,它必须同时管理两套能力:一套是传统程序的规则运算,另一套是模型的文本理解与生成。
这个特点让股票分析系统成为特别适合练习大模型落地的样本。它比聊天机器人复杂,因为有外部数据和时间维度;又不像自动驾驶那种工业级项目一样难以触碰,个人在可控规模下完全可以做完整实现。
1.2 最容易出现的三个认知落差
第一次动手的人,通常会在三个地方撞墙。
第一个落差是:大模型擅长“理解”和“生成”,但不擅长“精确计算”。你让它计算一只股票的5日均线,它可能给你一个看起来很有道理、实际上经不起验证的数字。正确做法是所有指标用代码计算,模型只负责解读这些指标、判断趋势、生成结论性文字。
第二个落差是:模型的知识截止日期和实时行情之间存在明显时间差。如果不做任何数据接入,直接问“当前市场情绪如何”,它大概率会把训练数据里的旧信息当成今天的情况。必须先用真实代码拉取最新行情,再把它作为上下文喂给模型。
第三个落差是:AI编程工具生成的是代码,不是系统。代码能运行只是起点。数据源是否稳定、接口超时有没有处理、部署环境能不能复现、输出格式有没有约束,这些问题不会自动产生答案。很多人看到AI编程演示很兴奋,真正把它放上服务器才发现,边界问题往往会比功能问题更让人头疼。
1.3 FDE视角:从“能实现”到“能部署”
FDE角色最关注的,不是模型在榜单上多强,而是模型放进真实业务流程之后能不能稳定工作。
具体到股票分析系统,就是前面遇到的那一串问题:数据从哪里来、模型调用失败怎么降级、输出格式不合法怎么兜底、换一台机器怎么快速重建环境。这些问题在Demo阶段不会出现,但在真实使用里每一个都能消耗几个晚上。
所以我会把这类项目当成一个难得的FDE训练场。它的输入时效性强,输出需要可解释,出错的代价也很清晰——结论错了,你很快会自己发现。相比简单的文本分类任务,它更能逼你把“数据、模型、部署、验证”串成一条可控的链路。
2. 开发前先想清楚:模型选型、运行环境与最小目标
2.1 模型选型的四个判断维度
不要一上来就问“哪个模型最强”,而是先问“这个系统到底需要模型做什么”。
第一个维度是上下文长度。股票分析经常要同时输入多只股票的指标、几篇新闻摘要,以及一段历史走势描述。上下文太短的模型放不下这些信息,回答质量会断崖式下降。
第二个维度是输出稳定性。系统往往需要模型返回JSON结构,如果模型总在JSON前后附加一段解释文字,解析层就要做大量兜底,系统越复杂越难维护。
第三个维度是部署成本。本地部署模型依赖显卡内存和显存,API调用则要考虑数据隐私、调用成本和限流问题。不同选择的工程路径完全不同。
第四个维度是生态兼容性。现在很多模型服务都提供兼容接口,选择兼容性好的方案,后续切换模型或者迁移环境会省很多事。
一个粗略的判断标准,可以先用下面这张表感受一下:
| 场景 | 建议方向 | 理由 |
|---|---|---|
| 个人学习、快速验证 | API或本地小模型起步 | 先把流程跑通 |
| 数据敏感、需要离线 | 本地部署开源模型 | 数据不出内网 |
| 核心分析任务 | 较强模型加严格格式校验 | 输出质量优先 |
| 批量、低成本处理 | 小模型加规则和缓存 | 降低成本与延迟 |
注意,“较强模型”和“小模型”都是相对概念。具体选型应该以你能实际获取的算力和模型版本为准,不要迷信测评榜单,最好拿你的真实数据和提示词样例直接试。
2.2 本地部署还是调用API
如果只是学习,我建议先不要急着买高配置设备。当前很多开源模型已经能通过本地工具一键运行,比如社区里常见的Ollama工具,配合DeepSeek、Qwen这些开源模型,能在普通开发机上完成一部分分析任务。本地部署的优点是数据隐私更好,缺点是推理速度和模型能力上限受到硬件限制。
如果本机显存不够,可以先用云端API验证整套逻辑,等流程确认没问题,再评估有没有必要换成本地部署。这里有一个关键原则:先验证,再部署。不要第一天就花大量时间配置GPU环境,结果模型开始跑才发现提示词设计根本不匹配任务,等于把顺序弄反了。
2.3 用最小可用版本定义“成功”
很多项目死在“一开始就想要一个完整产品”。个人股票分析系统,第一阶段我建议明确不做三件事:不做实时高频行情,不做多用户登录,不做自动化交易。
第一版先把目标收窄:
- 固定一个股票池,比如10到20只股票;
- 拉取日K数据和最近的相关新闻;
- 用代码计算常用技术指标;
- 让模型基于这些数据生成个股简评和风险提示;
- 在网页里输入股票代码,看到对应的分析结果。
为什么要这样限制?因为最小版本能让你把“模型输出质量”和“系统稳定性”这两个变量分开。如果输出质量不对,你会知道问题出在提示词或数据输入;如果页面报错,你会知道问题出在部署环境。两者混在一起,排查会非常痛苦。
3. 需求拆解与AI编程:不是一次性生成系统,而是拆开写
3.1 把“股票分析系统”拆成四个可独立验证的模块
在让AI编程工具介入之前,先把系统拆开。我按数据特征和职责,把项目分成四块:
- 行情数据模块:负责拉取日K、成交量等数据,计算均线、RSI、MACD等技术指标。这块逻辑应该是纯代码,不依赖模型。
- 新闻情绪模块:获取财经新闻和公告,清洗、去重、分句,然后交给模型做情绪打分和关键信息抽取。
- 智能问答模块:用户在页面里提问,系统把问题转换成对数据层和指标层的调用,再组合模型生成可读答案。
- 报告生成模块:把指标结果、新闻摘要、模型判断合并成结构化的个股分析报告。
这四块的工程属性完全不同。行情数据侧重规则,新闻情绪侧重模型,问答模块侧重解析和路由,报告生成侧重提示词模板和格式化输出。拆开之后,每一块都能单独调试和验证,而不是混在一个大泥球里。
3.2 AI编程工具能做什么,不能做什么
标题里强调AI编程,但AI编程工具的正确用法,不是“一句话生成完整系统”,而是“把系统拆成小任务,逐个生成、逐个验证”。
我的实际感受是,AI编程特别适合那些重复度高、模式清晰的代码任务,比如:
- FastAPI接口骨架;
- 前端页面布局和基础交互;
- 图表配置对象;
- CSV解析函数;
- 数据清洗正则;
- 单元测试脚手架。
不太适合直接交给AI处理的,是那些依赖真实业务背景的部分:数据源权限与访问方式、金融业务规则(比如除权除息处理)、部署环境中肉眼难以发现的依赖冲突。AI可能给出看起来合理、实际却不符合真实项目约束的代码。
一个可复用的AI编程协作流程是这样的:
- 把模块功能描述拆成一个小任务;
- 在任务描述里附上数据样例和输出要求;
- 让AI生成对应代码;
- 人工审查关键逻辑,尤其是数据字段是否对应;
- 跑一个最小测试样本;
- 通过后再开始下一个任务。
这样,AI始终是协作者,而不是“背锅侠”。代码出了问题,你能快速定位是哪个环节、哪次修改、哪段上下文导致的。
3.3 提示词设计:稳定输出比文采更重要
对真正部署过AI应用的人来说,最让人烦躁的不是模型“不会”,而是“乱说”。让它写一段分析报告,它可以写得很漂亮;让它只输出JSON,它仍然可能随时在前后附上一段解释。
解决办法是给提示词立规矩。我的常见做法是同时限定输入格式和输出格式,并给一个JSON Schema示例:
{ "stock_code": "000001", "analysis": "基于指标和新闻的分析结论,不超过150字", "sentiment": "positive|neutral|negative", "risk_level": "low|medium|high" }提示词里明确要求模型只能输出符合上述结构的JSON,不要添加任何解释。业务层拿到结果后再做一次Schema校验,解析失败就触发重试或降级逻辑。
这个设计看起来很小,但它决定了整个链路能不能稳定。因为后续的缓存、日志、报表展示,全部依赖一个固定结构。模型输出的自由发挥,在聊天场景里是优点,在工程链路里就是故障源。
4. 部署实战:从数据到模型服务,再到前端展示
4.1 结构化数据:给模型看表格,不一定要给长文本
数据进入模型之前,先做一轮“压缩”。股票数据本身是数值型表格,直接把几千行DataFrame塞进提示词,既浪费token,也会分散模型注意力。
我的处理方式,是先用代码计算好需要的指标,只输出最近N个交易日的精简结果,最后把统计摘要或关键指标表作为上下文。比如:
- 股票代码和名称;
- 最新收盘价、涨跌幅;
- 5日均线、20日均线,当前价格与均线位置关系;
- RSI、MACD等指标值;
- 最近几天成交量变化趋势;
- 相关新闻的标题和摘要前几条。
这些信息足够模型做趋势判断和风险提示,又不给它机会去推导它本身不擅长的数值。
4.2 非结构化文本:清洗、截断与摘要前置
财经新闻和公告的原始文本,噪声往往很大。广告、免责声明、页脚、重复新闻、特殊字符,都会干扰模型判断。所以文本进入模型之前,一定要先做清洗:去掉HTML标签、去掉多余空白、过滤重复句子、按发布时间排序。
如果新闻内容很长,不要全量塞给模型。更稳妥的做法是“先摘要、再分析”:先让模型对每篇新闻生成一句话摘要,再把摘要汇总给主分析流程。这样会多一次模型调用,但能显著减少上下文超长的问题,最终结论也会更稳定。
4.3 参考架构和本地模型服务的启动
部署时不需要很复杂的微服务。个人项目用单机部署完全够用,参考架构如下:
数据获取层(定时脚本) ↓ 数据存储层(SQLite / PostgreSQL) ↓ 业务编排层(FastAPI / Flask) ↓ 模型服务层(OpenAI兼容接口 / 本地推理) ↓ 前端展示层(Streamlit / Gradio / Web)模型服务层如果选择本地推理,社区里比较常见的启动方式是通过Ollama拉取模型,再启动一个兼容接口的服务。示意命令如下:
# 常见写法:用 Ollama 启动本地模型服务 ollama serve ollama run qwen2.5:7b应用层只需要配置一个base_url,就能像调用普通API一样访问本地模型。这样代码层不绑定具体模型,后续无论是切换API还是本地模型,都只需要修改配置。
需要提醒的是,如果原始资料没有给出确定的模型版本,落地前最好先确认本地模型版本和接口的兼容性。很多部署问题的根源,就是用新版本代码去对接旧版本模型接口,或者反过来。
4.4 前端交互:让模型生成图表配置,而不是生成图片
一个容易被低估的坑,是让模型直接生成K线走势图。模型生成的是静态图片,不能缩放、不能悬浮、不能联动,作为分析工具几乎不可用。
更好的做法,是让模型返回图表配置,比如ECharts的option对象或Plotly的参数,前端再基于真实数据渲染。模型负责根据用户意图决定展示什么指标、用哪种图表类型;前端负责把最新数据画出来。这样既保留模型的理解能力,又让图表保持交互性。
如果你用Streamlit这类工具,也建议把数据可视化交给专门的绘图组件。模型负责生成绘图所需的字段和标题文字,不要让模型直接输出图片。
5. 把“能跑”变成“能稳定用”:日志、重试、验证与排查
5.1 模型调用失败是常态,不是意外
只要系统运行一段时间,你就会遇到各种异常:网络超时、连接拒绝、返回内容截断、JSON解析失败。所以第一步,就是给所有模型调用加一层统一封装:
- 设置连接超时和读超时;
- 对可重试的错误(比如超时、限流)做指数退避重试;
- 对不可重试的错误(比如参数非法、认证失败)直接记录日志并抛出;
- 重试次数设置上限,绝不无限重试。
很多初学者忽略这一层,导致系统在真实使用中频繁崩溃。如果你肯花时间把这一层封装做好,系统稳定性的提升会非常明显。
5.2 日志是排查问题的唯一依据
在AI应用里,日志的重要性格外高。因为模型输出不是确定性的,同一问题两次调用可能得到不同答案。如果不记录原始请求和原始返回,出错时你很难判断模型到底收到了什么、回了什么、解析层丢掉了什么。
建议至少记录下面这些字段:
| 字段 | 说明 |
|---|---|
| 请求时间 | 判断调用频率与时段 |
| 模型名称和版本 | 定位模型变更带来的影响 |
| 输入摘要 | 观察上下文是否完整 |
| 模型原始返回 | 排查解析失败和输出异常 |
| 解析结果 | 判断业务逻辑是否正确 |
| token消耗和耗时 | 评估成本与性能 |
| 错误类型 | 区分超时、格式、业务错误 |
写完日志你会发现,很多所谓的“模型输出不对”,其实是上游数据没有更新,或者输入里混入了一篇旧闻。
5.3 用回归样例约束大模型输出
大模型不是确定性函数,同一问题可能得到不同结果。为了避免“改了一个提示词,另一个功能悄悄变了”,建议准备一组固定测试样本。
比如准备5只股票的真实历史数据和对应新闻,在每次修改提示词、切换模型或者调整数据结构之后,都跑一遍这些样例,人工判断输出是否还在预期范围内。这不是严格意义上的自动化测试