1. 项目概述从数据到洞察一个全自动的金融深度研究系统在金融研究这个行当里干了十几年我深知一份高质量研究报告背后需要投入多少精力。从数据收集、清洗、分析到图表绘制、报告撰写再到最后的格式排版每一步都耗时耗力而且对研究员的专业素养要求极高。更别提那些需要覆盖多市场、多维度数据的深度研究了一个人或者一个小团队几乎不可能在短时间内完成。直到我遇到了FinSight这个由中国人民大学高瓴人工智能学院NLPIR实验室开源的项目它让我看到了用AI彻底改变金融研究工作流的可能性。FinSight的核心定位非常清晰一个多智能体研究系统旨在自动化从数据收集、分析到生成可直接发布的专业研究报告的整个流程。它的口号“One ticker, one click, one comprehensive research report”并非虚言。你只需要提供一个股票代码或研究主题点击运行系统就会调用一系列分工明确的AI智能体协作完成数据爬取、深度分析、可视化图表生成和报告撰写最终输出一份格式精美、内容详实、带有专业图表和严格引用的研究报告。这对于金融分析师、投资经理、学术研究者甚至是希望快速了解一家公司基本面的个人投资者来说都是一个革命性的工具。我花了几周时间深度测试了这个系统从环境搭建、配置调试到实际生成A股、港股和美股公司的研究报告。整个过程下来我的感受是这不仅仅是一个“玩具”或演示项目而是一个设计精良、架构清晰、具备强大生产潜力的工程系统。它解决了传统AI研究工具的几大痛点数据源的整合问题、分析过程的黑箱问题、图表生成的专业度问题以及报告产出的结构化问题。接下来我将从系统架构、实操部署、核心机制到高级定制为你完整拆解这个项目并分享我在使用过程中踩过的坑和总结的经验。2. 系统架构深度解析多智能体如何协同工作理解FinSight的架构是高效使用和定制它的前提。它的设计哲学是“分工明确记忆共享流程可追溯”这比市面上许多“端到端”的黑盒模型要先进和实用得多。2.1 核心工作流四阶段管道FinSight的工作流是一个清晰的四阶段管道每个阶段由一个或多个专门的智能体负责。数据收集阶段由Data Collector智能体主导。它的任务是根据研究目标如公司股票代码和用户定义的自定义任务从各种数据源股票API、宏观数据API、网页搜索等中收集结构化与非结构化数据。它内部会调用Deep Search Agent进行多跳网络搜索和内容抓取确保信息的广度和深度。所有收集到的数据都会被规范化后存入一个共享的Memory中。数据分析与可视化阶段由Data Analyzer智能体执行。这是系统的“大脑”。它从Memory中读取数据根据分析任务如“分析营收趋势和增长驱动力”编写并执行Python代码进行数据处理、统计分析和图表绘制。这里引入了其核心创新之一带可变内存的代码智能体架构。智能体在一个统一的变量空间中操作可以动态地创建、修改和调用数据、工具和中间结果整个过程透明且可复现。更关键的是它集成了视觉语言模型反馈循环生成的图表会由VLM进行评估如果发现图例缺失、比例尺不当、信息密度低等“丑陋AI图表”的典型问题VLM会提供反馈智能体据此修改代码迭代优化图表直至达到出版级标准。报告生成阶段由Report Generator智能体完成。它基于Memory中的分析结果、图表和收集的文本信息首先生成报告大纲然后逐章节撰写内容。它会进行多轮润色确保语言流畅、逻辑严谨并自动生成封面、目录和参考文献列表。后处理与渲染阶段系统利用Pandoc等工具将Markdown格式的报告最终渲染为专业的DOCX和PDF文档应用预设的Word模板样式确保输出即成品。2.2 共享内存与检查点机制Memory是这个多智能体系统的粘合剂。它不是一个简单的缓存而是一个结构化的、支持语义检索的中央数据库。所有智能体都将自己的产出原始数据、分析结果、图表、文本片段存入Memory后续的智能体可以从中检索相关信息。例如Report Generator在撰写“财务分析”章节时会从Memory中语义检索所有与盈利能力、资产负债相关的分析结果和图表。检查点机制是应对长任务生成一份2万字报告可能需要数小时的工程保障。每个智能体在运行关键步骤后都会将自己的状态对话历史、当前轮次、中间变量保存到磁盘。如果程序因网络问题或意外中断重启时可以从中断点恢复无需从头开始这大大提升了系统的实用性和可靠性。2.3 工具库系统的“手”和“眼”FinSight的强大很大程度上得益于其丰富且模块化的工具库。这些工具是智能体与外部世界交互的接口。主要分为以下几类金融数据工具覆盖A股、港股、美股。通过集成akshare、efinance、yfinance等库可以获取公司概况、股东结构、估值指标、完整的三大财务报表资产负债表、利润表、现金流量表以及历史K线数据。宏观与行业数据工具提供CPI、GDP、PMI、失业率、社会融资规模等国内外宏观经济指标以及工业增加值、零售销售等行业数据。对于美股宏观还接入了FRED美联储经济数据数据库。网络搜索工具这是进行“深度研究”的关键。系统集成了多种搜索API如Serper for Google, Bocha for 中文搜索和浏览器自动化工具Playwright能够进行多轮、深入的网络信息挖掘和网页内容提取。实操心得工具的设计是松耦合的。这意味着你可以相对容易地替换数据源比如把A股数据源从akshare换成Tushare或者添加全新的工具比如接入Bloomberg Terminal的API如果你有权限的话。这种设计赋予了系统极强的扩展性。3. 从零开始部署与运行你的第一个研究理论说得再多不如亲手跑一遍。下面我将带你完成一次完整的本地部署和报告生成流程。我会假设你是在一台Ubuntu 20.04/22.04的服务器或本地开发机上操作但原理同样适用于macOS和WindowsWSL。3.1 环境准备与依赖安装首先确保你的系统满足基础要求# 检查Python版本需要3.10 python3 --version # 安装或升级pip sudo apt-get update sudo apt-get install -y python3-pip克隆项目并安装Python依赖git clone https://github.com/RUC-NLPIR/FinSight.git cd FinSight # 强烈建议使用虚拟环境 python3 -m venv venv source venv/bin/activate # 安装依赖这里可能会耗时较长因为包含pandas, numpy, playwright等大型包 pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple安装Pandoc关键步骤这是将Markdown报告转换为精美Word/PDF文档的必备工具。没有它你只能得到.md文件。# Ubuntu/Debian sudo apt-get install pandoc texlive-latex-base texlive-fonts-recommended texlive-latex-extra # macOS brew install pandoc # Windows: 从 https://github.com/jgm/pandoc/releases/latest 下载安装包安装。安装Node.js可选用于Web UI如果你想使用图形化界面需要安装Node.js。# 使用nvm安装Node.js是推荐方式 curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash # 重启终端或执行 source ~/.bashrc nvm install 18 nvm use 18 # 构建前端 cd demo/frontend npm install npm run build3.2 模型配置与API密钥管理FinSight需要三类模型的API主LLM用于核心推理、代码生成、文本撰写。支持DeepSeek、GPT-4、Claude等通过OpenRouter等聚合平台。VLM用于图表评估与优化。支持Qwen-VL、GPT-4V等。Embedding模型用于Memory中的语义检索。支持OpenAI text-embedding、DashScope等。复制环境变量模板并填写你的密钥cp .env.example .env编辑.env文件以下是一个使用DeepSeek和阿里云通义千问VLM的配置示例# LLM 配置 (例如使用DeepSeek) DS_MODEL_NAMEdeepseek-chat DS_API_KEYsk-your-deepseek-api-key-here DS_BASE_URLhttps://api.deepseek.com/v1 # VLM 配置 (例如使用Qwen-VL-Max) VLM_MODEL_NAMEqwen-vl-max VLM_API_KEYsk-your-dashscope-api-key-here VLM_BASE_URLhttps://dashscope.aliyuncs.com/compatible-mode/v1 # Embedding 模型配置 EMBEDDING_MODEL_NAMEtext-embedding-v3 EMBEDDING_API_KEYsk-your-dashscope-embedding-key-here EMBEDDING_BASE_URLhttps://dashscope.aliyuncs.com/compatible-mode/v1 # 网络搜索API (可选但深度研究强烈推荐) SERPER_API_KEYyour-serper-api-key # Google搜索 BOCHAAI_API_KEYyour-bocha-api-key # 中文搜索踩坑记录API成本控制。生成一份报告可能会调用LLM数十次甚至上百次VLM也会被频繁调用进行图表评审。在初次测试时建议先使用较便宜的模型如DeepSeek并设置预算上限。同时确保你的.env文件不被提交到公开仓库以免密钥泄露。3.3 编写你的第一个研究配置文件FinSight使用YAML配置文件来定义研究任务。我们创建一个my_config.yaml# 研究目标配置 target_name: 贵州茅台 # 公司或研究主题名称 stock_code: 600519 # 股票代码 (A股: 600519, 港股: 00700, 美股: AAPL) target_type: financial_company # 类型: financial_company | macro | industry | general output_dir: ./outputs/maotai_research # 输出目录 language: zh # 报告语言: en 或 zh # 模板路径 (一般用默认即可) reference_doc_path: src/template/report_template.docx outline_template_path: src/template/company_outline.md # 自定义收集任务 (如果不指定LLM会自动生成) custom_collect_tasks: - 公司简介、主营业务、发展历程 - 近五年资产负债表、利润表、现金流量表 - 近三年股价数据、成交量、市盈率(PE)、市净率(PB) - 前十大股东持股情况 - 白酒行业市场规模、竞争格局、政策影响 # 自定义分析任务 custom_analysis_tasks: - 分析茅台近五年营收、净利润的增长趋势及驱动因素 - 评估茅台的盈利能力指标毛利率、净利率、ROE及其稳定性 - 分析茅台的资产负债结构重点关注现金、存货、预收款项 - 结合行业数据对比茅台与五粮液、泸州老窖的核心财务指标 - 基于历史估值探讨当前股价所处的估值区间 # 缓存设置 (建议全部开启便于调试和断点续跑) use_collect_data_cache: True use_analysis_cache: True use_report_outline_cache: True use_full_report_cache: True use_post_process_cache: True3.4 启动你的第一次深度研究一切就绪现在可以开始运行了。最简单的方式是使用CLI# 确保在项目根目录且虚拟环境已激活 python run_report.py程序会自动读取my_config.yaml和.env然后启动多智能体协作流程。你会在终端看到详细的日志输出包括每个智能体在做什么、调用了什么工具、生成了什么图表。这个过程可能会比较长对于一家公司的深度研究可能需要30分钟到2小时取决于网络和数据量。你可以随时按CtrlC中断由于检查点机制的存在下次使用相同的output_dir运行python run_report.py时会自动从上次中断的地方继续。运行完成后打开./outputs/maotai_research目录你会看到report_final.docx/report_final.pdf: 最终生成的精美报告。report_final.md: Markdown格式的报告源文件。images/: 包含所有生成的图表图片。agent_working/: 各个智能体的工作缓存和中间状态。memory/memory.pkl: 序列化的共享内存数据。注意事项第一次运行可能会因为网络问题访问某些数据源或环境问题缺少某个依赖而失败。仔细查看错误日志是关键。常见问题包括Pandoc路径未正确设置、某些金融数据API暂时不可用、API调用额度超限等。建议从一个简单的target_type: general的研究主题开始快速验证整个流水线是否通畅。4. 核心机制剖析代码智能体与VLM图表优化FinSight的技术亮点很多但其中最让我印象深刻的两个设计是CAVM架构的代码智能体和基于VLM反馈的图表迭代优化。理解了它们你就理解了这套系统的灵魂。4.1 CAVM不只是调用API而是编写和执行代码传统的AI Agent要么是纯文本对话要么是通过预定义函数Function Calling工具去调用外部API。FinSight的Data Analyzer采用了更强大的方式Code Agent with Variable Memory。它是如何工作的接收任务与数据分析智能体收到任务如“分析营收趋势”和Memory中可用的数据列表。生成并执行代码LLM如DeepSeek并不是直接给出答案而是生成一段或多段Python代码包裹在execute标签中。这些代码可以直接操作数据Pandas DataFrame、调用工具库中的任何函数、进行复杂的计算和可视化。统一的变量空间所有代码在一个持久的、共享的变量空间中执行。这意味着上一段代码创建的变量df_revenue下一段代码可以直接使用。智能体可以像人类分析师一样进行探索性数据分析尝试不同的计算方式并将中间结果保存下来。输出与分析报告代码执行的结果如图表路径、计算出的统计量会被捕获。最终LLM会综合代码执行的结果生成一段结构化的、带有洞察的分析文本包裹在report标签中。这种方式的优势是什么透明与可复现整个分析过程由代码定义任何人都可以查看、审查甚至修改这段代码来复现分析结果。这解决了AI分析“黑箱”的问题。灵活与强大不受限于预定义的工具。理论上只要Python能做的智能体都能尝试。可以进行非常复杂的数据转换、统计建模和机器学习分析。记忆与演进变量空间构成了智能体的“工作记忆”使得多轮复杂分析成为可能。4.2 VLM图表优化循环告别“丑陋的AI图表”AI生成的图表常常被诟病颜色搭配突兀、缺少图例、坐标轴标签不清晰、信息密度低。FinSight通过一个闭环反馈机制基本解决了这个问题。优化循环步骤LLM生成图表代码Data Analyzer根据分析需求生成绘制特定图表如折线图、柱状图的Matplotlib或Plotly代码。执行并保存图表代码执行将图表保存为PNG图片。VLM评审图表系统将图表图片和评审要求“检查图表是否专业是否有标题、坐标轴标签、图例、数据标签颜色是否协调信息表达是否清晰”发送给VLM如Qwen-VL。反馈与迭代VLM返回评审结果。如果图表不达标评审结果如“缺少图例建议使用更区分度的颜色”会反馈给LLMLLM据此修改图表代码回到步骤2。此循环最多进行3次可配置。最终采纳当VLM认为图表达到“出版级”标准或者达到最大迭代次数时循环停止采纳当前图表。我实测的效果经过VLM优化后的图表在专业性上有了质的飞跃。系统会自觉地添加网格线、调整字体大小、选用更专业的色系如Set2, Set3并确保多系列数据有清晰的图例。这大大减少了后期人工调整图表的时间。经验技巧你可以在src/agents/data_analyzer/data_analyzer.py的_draw_single_chart方法中调整max_iterations参数来控制优化次数。对于非常关键的图表可以设为5对于次要图表可以设为1以节省VLM调用成本。此外你还可以通过子类化DataAnalyzer并重写_prepare_executor方法来注入自定义的配色方案让生成的图表更符合你公司的品牌规范。5. 高级定制与扩展指南FinSight的开源魅力在于其可扩展性。你完全可以把它改造成适合自己特定研究需求的工具。5.1 添加自定义数据工具假设你的公司内部有一个独有的数据库需要接入。只需创建一个新的Tool类。在src/tools/下选择合适的目录如financial/,macro/或新建一个目录如internal/。创建新的工具文件例如src/tools/internal/my_proprietary_tool.pyimport pandas as pd from src.tools.base import Tool, ToolResult import aiohttp import asyncio class InternalSalesTool(Tool): def __init__(self): super().__init__( nameInternal Sales Database, descriptionFetch monthly sales data by region and product line from our internal API., parameters[ {name: start_date, type: str, description: Start date (YYYY-MM), required: True}, {name: end_date, type: str, description: End date (YYYY-MM), required: True}, {name: product_line, type: str, description: e.g., Smartphone, Laptop, required: False}, ] ) self.base_url https://internal-api.yourcompany.com self.api_key os.getenv(INTERNAL_API_KEY) # 从环境变量读取密钥 async def api_function(self, start_date: str, end_date: str, product_line: str None): # 构建请求参数 params {start: start_date, end: end_date, token: self.api_key} if product_line: params[product] product_line async with aiohttp.ClientSession() as session: async with session.get(f{self.base_url}/sales, paramsparams) as resp: if resp.status 200: data await resp.json() # 转换为DataFrame以便后续分析 df pd.DataFrame(data[records]) df[date] pd.to_datetime(df[year_month]) df.set_index(date, inplaceTrue) return [ ToolResult( namefSales Data ({start_date} to {end_date}), descriptionfMonthly sales volume and revenue. Product line: {product_line or All}, datadf, # 智能体可以直接用Pandas操作这个DataFrame sourceInternal Company Database ) ] else: raise Exception(fAPI request failed with status {resp.status})系统会在启动时自动扫描并注册这个工具。之后Data Collector和Data Analyzer在需要相关数据时就可以通过自然语言指令调用这个“Internal Sales Database”工具了。5.2 自定义报告模板与大纲默认的报告模板和结构可能不符合你机构的风格。修改起来非常直观。修改报告大纲复制src/template/company_outline.md为my_custom_outline.md。按照Markdown格式编辑定义你想要的章节结构。例如你可以加入“ESG表现分析”、“供应链风险研判”等章节。在my_config.yaml中指定新的路径outline_template_path: path/to/my_custom_outline.md。修改Word样式模板用Microsoft Word打开src/template/report_template.docx。修改“样式”Styles。比如将“标题1”的字体改为你的公司标准字体颜色改为品牌色。调整页眉、页脚、封面页。另存为新的.docx文件并在配置中更新reference_doc_path。5.3 集成新的LLM或VLM提供商FinSight通过litellm库支持众多模型提供商。如果你想使用新的模型比如Groq的LLaMA模型只需在.env文件中添加配置并在代码中指定模型名即可。例如在.env中添加GROQ_API_KEYyour-groq-api-key在创建智能体时可以这样使用analyzer DataAnalyzer( configconfig, memorymemory, use_llm_namegroq/llama3-70b-8192, # 使用litellm兼容的模型名 # ... 其他参数 )你需要确保litellm支持该提供商并且你的requirements.txt中已包含litellm。6. 实战问题排查与性能优化在实际使用中你肯定会遇到各种问题。这里我总结了一些常见坑点和优化建议。6.1 常见错误与解决方案问题现象可能原因解决方案ModuleNotFoundError: No module named xxxPython依赖未安装完整。检查requirements.txt手动安装缺失的包pip install xxx。特别注意playwright可能需要单独运行playwright install安装浏览器。Pandoc not found系统未安装Pandoc或不在PATH中。确保已按照前述步骤安装Pandoc。在终端输入pandoc --version确认。有时需要重启终端或指定完整路径。金融数据API返回空或错误数据源接口临时变更、网络问题、或股票代码格式不对。1. 检查网络连接。2. 确认股票代码格式A股600519港股00700美股AAPL。3. 尝试直接运行akshare或efinance的对应函数看是否正常。4. 考虑在配置中暂时禁用该数据工具或等待接口恢复。LLM/VLM API调用超限或报错API密钥错误、额度不足、或服务端不稳定。1. 检查.env文件中的API_KEY和BASE_URL是否正确。2. 登录对应平台查看额度。3. 在代码中增加重试逻辑和指数退避项目已有部分实现。4. 考虑切换到备用模型。报告生成卡在某个环节某个智能体陷入循环或等待外部API响应超时。查看终端日志定位卡住的智能体。可以尝试在配置中调低max_iterations或max_rounds。对于网络搜索任务可以设置更短的超时时间。生成的图表质量依然不佳VLM反馈机制未生效或迭代次数太少。确认VLM配置正确且可用。在DataAnalyzer初始化时确保use_vlm_name参数已设置。尝试增加_draw_single_chart中的max_iterations。6.2 性能与成本优化建议分阶段运行与缓存利用充分利用系统的缓存机制。完成数据收集 (use_collect_data_cache: True) 后在调试分析逻辑时可以反复运行分析阶段而无需重新抓取数据节省时间和API调用。控制搜索深度与广度网络搜索是耗时和耗Token的大户。在custom_collect_tasks中尽量明确具体避免过于宽泛的指令。可以在DeepSearchAgent的配置中限制搜索轮数 (max_search_rounds) 和每轮结果数量。选择合适的模型对于代码生成和分析任务DeepSeek-Coder或GPT-4通常表现更好且成本可控。对于VLM图表评审Qwen-VL-Max性价比很高。对于Embeddingtext-embedding-3-small在精度和成本间取得了很好平衡。本地模型部署如果对数据隐私要求极高或希望零API成本可以考虑部署本地LLM如Qwen-72B-Chat和本地VLM如LLaVA并通过litellm的本地服务器模式集成。但这需要强大的GPU硬件支持。任务并行化当前版本主要是顺序执行。高级用户可以考虑修改run_report.py让数据收集中的不同子任务如抓取财务数据、搜索行业新闻并行执行以缩短总运行时间。6.3 评估与结果解读FinSight论文中展示的评估结果非常亮眼在事实准确性、分析深度和呈现质量上超越了GPT-5和Perplexity的深度研究功能。在实际使用中我的体会是事实准确性由于严格的数据源引用和代码执行验证在定量分析财务数据计算上准确性极高。定性部分行业分析、管理层讨论依赖于网络搜索的质量需要用户对搜索结果的权威性保持判断。分析深度得益于CAVM架构它能进行多步骤、依赖中间结果的分析深度远超单次LLM问答。例如它可以先计算同比环比增长率再与行业平均对比最后进行回归分析寻找相关性。报告可用性生成的DOCX/PDF报告格式规范图表清晰引用齐全确实达到了“初稿即用”的水平。分析师需要做的是复核关键结论、加入自己的市场判断和最终投资建议。这个项目代表了AI在垂直领域应用的一个非常务实和强大的方向。它不是要取代金融分析师而是成为一个不知疲倦、效率极高的初级研究员和数据处理助手将分析师从繁琐的数据处理和报告起草中解放出来专注于更高层次的判断和决策。随着工具库的不断丰富和智能体能力的持续进化它的潜力还会进一步释放。