1. 项目概述与核心价值

最近在折腾一个挺有意思的东西,想和大家聊聊。起因是看到不少朋友在讨论用大模型做金融分析,但大多停留在简单的问答层面,比如“帮我看看某只股票怎么样”。这种回答往往流于表面,缺乏深度推理和结构化分析。作为一个在量化领域摸爬滚打了十来年的老手,我总觉得这事儿能做得更“硬核”一些。于是,我花了几周时间,用 DeepSeek LangGraph 这两个当前最火的技术栈,捣鼓出了一个 革命性的个股分析助手

这个助手不是简单的聊天机器人。它的核心在于,能够模拟一个专业分析师的研究流程:从获取实时数据,到进行多维度财务分析、技术面研判、舆情监控,再到综合推理并生成结构化的投资建议报告。整个过程是自动化的、可追溯的,并且每一步都有逻辑支撑。简单说,它把“拍脑袋”变成了“有据可依的决策流”。项目已经开源,所有源码和详细的实现笔记都附在后面,你可以直接拿去跑起来,或者基于它构建更复杂的系统。

为什么说它有点“颠覆性”?传统的金融分析工具要么是冰冷的数字图表(如Wind、同花顺),需要使用者有极强的专业背景去解读;要么是过于泛泛的AI聊天,给不出实质性的洞见。而这个助手,试图在两者之间架起一座桥:利用 DeepSeek 强大的推理和代码能力处理复杂问题,再用 LangGraph 将整个分析过程编排成一个可视化的、可调试的“工作流”。这意味着,即使你不是金融科班出身,也能通过这个工具,获得一个接近专业水平的、动态的个股分析框架。它解决的核心问题是: 如何将散乱、多源的金融信息,通过智能体(Agent)工作流,转化为结构化、可执行的洞察。

2. 技术选型:为什么是DeepSeek + LangGraph?

工欲善其事,必先利其器。在开始动手前,技术栈的选择至关重要。市面上大模型和框架那么多,为什么偏偏选中了 DeepSeek LangGraph 这个组合?这背后是一系列针对金融分析场景的深度考量。

2.1 核心大脑:DeepSeek模型的优势与考量

DeepSeek 最近风头正劲,尤其是其最新版本,在多项基准测试中表现抢眼。但对于我们这个项目,我主要看中它以下几点不可替代的优势:

  1. 强大的推理与代码能力 :金融分析涉及大量的计算、指标推导和逻辑判断。比如,计算一家公司的杜邦分析体系,或者根据历史价格序列生成技术指标,本质上都是在“写代码”和“执行代码”。 DeepSeek 在代码生成和执行方面的能力是第一梯队的,它能理解“请计算这家公司过去五年的营收复合增长率”这样的指令,并准确地写出 Python 代码来执行。相比之下,一些纯文本模型可能会直接给一个估算值,而 DeepSeek 会尝试去获取真实数据并计算,结果更可靠。

  2. 超长的上下文与精准的指令跟随 :一份完整的个股分析报告,需要处理公司简介、多年财务数据、新闻文本、技术图表等多种信息,上下文非常长。 DeepSeek 支持128K甚至更长的上下文,足以容纳一次分析所需的全部原材料。更重要的是,它的指令跟随能力非常强。在复杂工作流中,我们需要模型严格遵循预设的步骤和格式输出,比如“第一步,提取关键财务指标;第二步,进行同业对比…”, DeepSeek 能够很好地理解并遵守这些结构化指令,这对于构建稳定可靠的工作流至关重要。

  3. 极高的性价比与API稳定性 :作为个人开发者或小团队,成本是必须考虑的因素。 DeepSeek 的API定价在当前第一梯队模型中极具竞争力,几乎是以“普惠”的价格提供了顶级的能力。同时,其API的稳定性和响应速度在实测中也表现良好,这对于需要串联多个步骤的在线分析服务来说,是基础保障。我们不需要在项目初期就为高昂的API费用发愁。

注意 :在调用 DeepSeek API 时,务必确认你使用的模型名称。根据最新的API文档,支持的模型名可能是 deepseek-v4-pro deepseek 等。如果遇到 400 错误提示 “the supported api model names are...”,请检查代码中传入的模型参数是否正确。这是我初期调试时踩过的一个坑。

2.2 流程骨架:LangGraph的核心概念与优势

如果说 DeepSeek 是负责思考和执行的大脑,那么 LangGraph 就是协调全身动作的中枢神经系统。 LangGraph 是基于 LangChain 的一个库,但它解决了一个更核心的问题: 如何构建有状态、多步骤、可循环的智能体(Agent)工作流

传统的 LangChain 链(Chain)是线性的,A->B->C,一旦执行就无法回头。但真实的分析流程充满分支和循环。例如:

  • 条件判断 :如果市盈率过高,则转入“风险分析”分支;否则,继续“成长性分析”。
  • 循环迭代 :在舆情分析中,可能需要持续监控最新的几条新闻,直到找到与公司直接相关的信息为止。
  • 并行处理 :技术面分析和基本面分析可以同时进行,最后再汇总结果。

LangGraph 使用“图”(Graph)的概念来建模这个过程。节点(Node)代表一个执行单元(比如调用一次 DeepSeek ,或者执行一个数据获取函数),边(Edge)代表节点之间的流转条件。这使得我们可以清晰地设计出包含判断、循环、并行的复杂工作流。

LangGraph vs LangChain: 很多人会混淆两者。简单说, LangChain 是一个构建LLM应用的工具包,提供了连接各种组件(模型、向量数据库、工具等)的“链”。而 LangGraph LangChain 生态中专门用于构建 有状态、多智能体协作工作流 的库。你可以把它理解为 LangChain 的“高级工作流引擎”。对于我们这个需要严谨步骤和状态管理的个股分析项目, LangGraph 是更自然、更强大的选择。

另一个巨大优势是可视化与可调试性。 LangGraph 天然地将工作流定义为图,这让我们可以非常直观地看到整个分析流程的脉络。市面上也有一些工具(虽然 LangGraph Studio 的访问有时会遇到问题),但即使只用代码定义,其逻辑结构也远比一堆线性调用的函数清晰。当某个分析环节出错时,你可以精确地定位到是图中的哪个节点出了问题,状态数据是什么,极大地提升了开发调试效率。

3. 系统架构与核心工作流设计

有了趁手的工具,接下来就要设计系统的骨架。这个个股分析助手不是一个简单的脚本,而是一个微型的系统。它的设计目标是: 高内聚、低耦合、模块化、可扩展 。这样,未来无论是增加新的分析维度(如ESG评分),还是替换数据源,都能轻松完成。

3.1 整体架构图(概念层面)

整个系统可以划分为四个核心层次:

  1. 交互层 :负责接收用户输入的股票代码或公司名称,并以清晰、友好的形式(如Markdown报告、HTML页面)输出最终的分析结果。我实现了一个简单的 Streamlit Web界面作为演示,代码非常简洁,主要起展示作用。核心逻辑都在后端。
  2. 智能体工作流层(核心) :这是 LangGraph 大显身手的地方。我设计了一个名为 StockAnalysisGraph 的主工作流。它定义了从开始到结束的完整分析路径,包括状态(State)的管理和节点(Node)的跳转逻辑。
  3. 工具与能力层 :工作流中的每个节点,都需要具体的能力来执行任务。这一层包含了多个“工具”(Tool):
    • 数据获取工具 :调用金融数据API(如 akshare yfinance 或专业的付费API)获取实时行情、财务数据、公司公告等。
    • 专业分析工具 :这是一系列 Python 函数,例如计算财务比率、绘制技术分析图表、进行文本情感分析等。 DeepSeek 模型可以通过“函数调用”(Function Calling)的能力来主动使用这些工具。
    • 模型调用工具 :封装了与 DeepSeek API 的交互,负责将问题、上下文和工具描述发送给模型,并解析返回的思考和行动指令。
  4. 数据与知识层 :存储原始数据和加工后的知识。对于这个项目,我们主要以实时API调用为主,暂未引入复杂的向量数据库。但架构上预留了接口,未来可以轻松接入公司的历史公告、研报库,进行更深度的知识检索。

3.2 核心工作流(StockAnalysisGraph)拆解

这是整个项目的灵魂。我设计的工作流模拟了一个理性投资者的分析步骤,共包含6个主要节点,它们通过状态(State)串联起来。状态是一个 Pydantic 模型,包含了 input (用户输入)、 financial_data technical_insight sentiment report 等字段,随着工作流推进,这些字段被逐步填充。

工作流步骤如下:

  1. 节点1:路由与初始化 :接收用户输入(如“000001.SZ”)。首先判断输入是否有效(是否是合法的股票代码或名称)。如果是,则初始化状态,并进入“数据收集”节点;否则,返回错误信息。
  2. 节点2:并行数据收集 :这是提升效率的关键。在此节点,系统会 并行 触发两个异步任务:
    • 任务A:获取基本面数据 。调用数据工具,获取公司简介、资产负债表、利润表、现金流量表的关键科目,以及市盈率、市净率等市场数据。
    • 任务B:获取技术面与市场数据 。获取近一年的日级股价数据、交易量,同时抓取近期与该股票相关的新闻标题或摘要。 并行执行大大减少了等待时间。所有获取到的原始数据会被存储到状态中。
  3. 节点3:基本面分析 :此节点调用 DeepSeek ,并赋予它“财务分析师”的角色。我们将上一步获取的财务数据(如营收、净利润、负债、现金流)提供给模型,并要求它:
    • 计算关键财务比率(毛利率、净利率、资产负债率、ROE等)。
    • 进行趋势分析(近三年增长情况)。
    • 进行简单的同业对比(如果数据允许)。
    • 指出财务上的亮点和潜在风险点。 DeepSeek 的思考过程会被记录,其输出的结构化分析文本将存入 state.financial_insight
  4. 节点4:技术面与舆情分析 :此节点同样调用 DeepSeek ,但角色转换为“量化交易员”。我们提供股价序列和新闻摘要,要求模型:
    • 识别关键的技术位(支撑、阻力)。
    • 判断当前趋势(使用模型内置知识,或调用工具计算MA、RSI等指标)。
    • 对近期新闻进行情感分析(正面、负面、中性),并评估其对股价的潜在影响。 输出存入 state.technical_insight state.sentiment
  5. 节点5:综合推理与报告生成 :这是最考验模型能力的环节。我们将前两步产生的深度分析( financial_insight technical_insight )以及市场情绪,一并提交给 DeepSeek 。此时模型扮演“首席投资官”的角色。指令是:“请综合基本面、技术面和市场情绪,生成一份简洁的投资建议。必须包含:总体观点(看多/看空/中性)、核心逻辑、关键风险、建议关注价位。输出格式为JSON。” 这个节点迫使模型进行高阶的推理、权衡和决策,而不是简单的信息汇总。输出的JSON结构化数据存入 state.report
  6. 节点6:结果格式化与输出 :将 state.report 中的JSON内容,渲染成易于阅读的Markdown格式报告。同时,可以调用图表工具,将财务趋势图、股价走势图等一并生成,嵌入到最终输出中。

整个工作流是一个有向无环图(DAG),状态像流水一样经过每个节点,被逐步加工增值,最终形成一份全面的分析报告。 LangGraph StateGraph 让我们可以非常优雅地定义这个过程。

4. 关键实现细节与源码解析

理论说再多,不如一行代码。接下来,我挑几个最核心、也最容易踩坑的实现细节,结合部分源码,给大家深入讲解一下。完整源码已开源,这里主要解释设计思路和关键代码段。

4.1 状态(State)的定义与管理

状态是 LangGraph 工作流的“记忆载体”,它必须在整个流程中保持一致性和可序列化。我使用 Pydantic BaseModel 来定义,这是最佳实践。

from typing import TypedDict, List, Optional, Annotated
from langgraph.graph.message import add_messages
import operator

class GraphState(TypedDict):
    """
    定义工作流的状态。
    使用TypedDict更轻量,与LangGraph的注解系统配合更好。
    """
    # 用户输入
    input: str
    # 原始数据
    raw_financial_data: Optional[dict]
    raw_price_data: Optional[dict]
    raw_news_data: Optional[List[dict]]
    # 分析结果
    financial_insight: Optional[str]
    technical_insight: Optional[str]
    sentiment: Optional[str]
    # 最终报告 (结构化)
    report: Optional[dict]
    # 错误信息
    error: Optional[str]

关键点:

  • 使用 TypedDict :虽然 Pydantic BaseModel 更强大,但在 LangGraph 中,使用 TypedDict 并结合 Annotated 注解(如 Annotated[list, add_messages] )来管理消息列表是更常见的模式,尤其是涉及多轮对话时。我们这个分析流更偏向数据处理,所以用 TypedDict 定义清晰的数据结构即可。
  • 字段清晰分层 :我刻意将 raw_* (原始数据)、 *_insight (模型分析结果)、 report (最终输出)分开。这符合数据流水线的思维,也便于调试。当最终报告不合理时,我可以回溯查看是原始数据有问题,还是模型分析环节出了偏差。
  • 可选类型 :所有字段初始为 None ,随着节点执行逐步填充。这符合工作流从无到有的过程。

4.2 工具(Tool)的封装与模型调用

DeepSeek 需要通过“函数调用”来使用外部工具。我们需要精确定义工具,并让模型知道在什么情况下使用它们。

首先,定义一个获取股票数据的工具(使用 akshare 库示例):

from langchain.tools import tool
import akshare as ak

@tool
def get_stock_financial_indicators(symbol: str) -> dict:
    """
    获取股票的关键财务指标和行情数据。
    
    Args:
        symbol: 股票代码,例如 '000001' 或 '000001.SZ'
    
    Returns:
        包含市盈率、市净率、每股收益等指标的字典。
    """
    try:
        # 清理代码,假设使用akshare的接口
        # 注意:akshare接口可能变动,需根据实际情况调整
        stock_info = ak.stock_zh_a_spot_em(symbol=symbol)
        # 这里应包含更健壮的错误处理和数据处理
        if not stock_info.empty:
            # 提取关键字段,这里仅为示例
            pe_ratio = stock_info.iloc[0]['市盈率']
            pb_ratio = stock_info.iloc[0]['市净率']
            return {
                "symbol": symbol,
                "pe_ratio": pe_ratio,
                "pb_ratio": pb_ratio,
                "data_source": "akshare"
            }
        else:
            return {"error": f"未找到股票 {symbol} 的数据"}
    except Exception as e:
        return {"error": f"获取数据失败: {str(e)}"}

然后,在构建模型时,将这些工具绑定给它:

from langchain_openai import ChatOpenAI
from langchain.agents import create_tool_calling_agent, AgentExecutor

# 注意:这里需要将DeepSeek的API配置成兼容OpenAI的格式
llm = ChatOpenAI(
    model="deepseek-chat", # 根据实际API要求填写,如 deepseek-v4-pro
    openai_api_key="your_deepseek_api_key",
    base_url="https://api.deepseek.com/v1" # DeepSeek的API端点
)

tools = [get_stock_financial_indicators, get_stock_price_history, analyze_news_sentiment] # 其他工具

# 创建Agent
agent = create_tool_calling_agent(llm, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)

实操心得:

  • 工具描述要精准 :模型的函数调用能力依赖于工具的描述。 Args Returns 的文档字符串(docstring)必须清晰、准确。模型会根据描述来决定是否以及如何调用它。
  • 错误处理要健壮 :金融数据API可能不稳定,返回的数据格式也可能变化。工具函数内部必须有完善的 try-except 和数据验证逻辑,返回统一的格式(如包含 error 字段),避免工作流因单个节点异常而崩溃。
  • API兼容性 DeepSeek 的API通常兼容 OpenAI 格式,这让我们可以直接使用 LangChain ChatOpenAI 类来调用,非常方便。但务必确认 base_url model 参数正确。

4.3 工作流图的构建与编译

这是 LangGraph 最核心的部分,我们将定义好的节点和边组装起来。

from langgraph.graph import StateGraph, END

# 初始化图
workflow = StateGraph(GraphState)

# 添加节点 (每个节点是一个函数)
workflow.add_node("validate_input", validate_input_node)
workflow.add_node("fetch_data", fetch_data_node) # 这个节点内部实现并行
workflow.add_node("analyze_fundamental", analyze_fundamental_node)
workflow.add_node("analyze_technical", analyze_technical_node)
workflow.add_node("synthesize_report", synthesize_report_node)
workflow.add_node("format_output", format_output_node)

# 设置入口点
workflow.set_entry_point("validate_input")

# 添加边,定义流程逻辑
workflow.add_edge("validate_input", "fetch_data")
workflow.add_edge("fetch_data", "analyze_fundamental")
workflow.add_edge("analyze_fundamental", "analyze_technical")
workflow.add_edge("analyze_technical", "synthesize_report")
workflow.add_edge("synthesize_report", "format_output")
workflow.add_edge("format_output", END)

# 编译图,得到可执行对象
app = workflow.compile()

关键点:

  • add_node :每个节点对应一个函数,这个函数接收当前 state ,执行操作(如调用模型、处理数据),然后返回更新后的 state
  • 条件边 :上面的例子是线性边。如果需要条件分支,可以使用 add_conditional_edges 。例如,在 validate_input 后,如果验证失败,直接跳转到错误处理节点,而不是 fetch_data
  • compile() :这一步将图定义编译成一个可调用的对象 app 。之后,我们通过 app.invoke({"input": "000001.SZ"}) 来启动整个工作流。

4.4 实现并行数据获取

fetch_data_node 节点中实现并行,可以显著提升效率。我们使用 asyncio 来并发调用多个数据获取工具。

import asyncio

async def fetch_data_node(state: GraphState) -> GraphState:
    """
    并行获取基本面、技术面和舆情数据。
    """
    symbol = state["input"]
    
    # 定义异步任务
    async def get_financial():
        return get_stock_financial_indicators.invoke({"symbol": symbol})
    async def get_technical():
        return get_stock_price_history.invoke({"symbol": symbol})
    async def get_news():
        return get_stock_news.invoke({"symbol": symbol})
    
    # 并发执行
    financial_task = asyncio.create_task(get_financial())
    technical_task = asyncio.create_task(get_technical())
    news_task = asyncio.create_task(get_news())
    
    # 等待所有任务完成
    raw_financial, raw_price, raw_news = await asyncio.gather(
        financial_task, technical_task, news_task, return_exceptions=True
    )
    
    # 处理结果,更新状态
    new_state = state.copy()
    if not isinstance(raw_financial, Exception):
        new_state["raw_financial_data"] = raw_financial
    # ... 类似处理其他数据
    return new_state

提示 :并行化时,一定要做好异常处理。某个数据源失败不应导致整个流程中止。 return_exceptions=True 选项可以让 asyncio.gather 在任务异常时返回异常对象而不是抛出,让我们能在后续统一处理。

5. 部署、优化与避坑指南

项目跑起来只是第一步,要让它稳定、可用、高效,还需要很多工程化的工作。这里分享我在部署和优化过程中积累的经验和踩过的坑。

5.1 环境配置与依赖管理

强烈推荐使用 Miniconda Poetry 来管理项目环境,尤其是 LangGraph DeepSeek 的依赖可能与其他项目冲突。

# 使用Miniconda创建环境
conda create -n stock-ai python=3.11
conda activate stock-ai

# 安装核心依赖
pip install langgraph langchain langchain-openai
pip install akshare pandas numpy matplotlib streamlit
# 安装其他你可能需要的库,如yfinance, requests-cache等

避坑指南:

  • Python版本 :建议使用 3.10 3.11 3.12 可能对一些库的兼容性支持尚不完善。
  • akshare 版本 :这个库更新非常频繁,接口有时会变化。最好在代码中锁定一个已知稳定的版本( pip install akshare==1.12.xx ),并在文档中注明。否则,今天能跑的代码,明天可能就报错了。
  • 网络问题 akshare 和一些数据源在国内访问可能不稳定。考虑为你的请求添加重试机制和超时设置,或者使用缓存(如 requests-cache )来避免重复请求失败,同时提升响应速度。

5.2 性能优化与成本控制

这个工作流会多次调用 DeepSeek API ,每次调用都涉及成本和延迟。优化至关重要。

  1. 上下文长度优化 DeepSeek Tokens 收费和计算上下文。不要一股脑把所有原始数据(比如十年财务数据的所有科目)都塞给模型。

    • 策略 :在数据获取节点后,先做一个“数据精炼”的预处理。例如,只提取最近三年的核心财务指标(营收、净利润、毛利率等),或者将股价数据聚合成周线再传入。这样可以大幅减少 Tokens 消耗。
    • 代码示例 :在 fetch_data_node analyze_fundamental_node 之间,可以插入一个 preprocess_data_node ,用 Pandas 进行数据清洗和聚合。
  2. 异步流式处理 :对于不严格依赖前后顺序的节点,尽量用异步并行。我们已经对数据获取做了并行,其实在“基本面分析”和“技术面分析”节点,如果它们之间没有数据依赖,理论上也可以并行执行。这需要更精细的图设计(使用 LangGraph SEND RECV 机制实现更复杂的并行),但对于复杂分析,收益明显。

  3. 缓存策略 :对于同一只股票,其基本面数据在一天内变化不大。可以引入一个简单的缓存(如 Redis SQLite ),将 symbol 和分析结果缓存起来,设置一个合理的过期时间(如1小时)。这样,短时间内对同一只股票的重复查询,可以直接返回缓存结果,节省大量 API 调用和计算时间。

5.3 常见错误排查与调试技巧

开发过程中,你肯定会遇到各种报错。这里列几个我遇到的典型问题:

  • API Error: 400 :这是最常见的错误之一。

    • 可能原因1 :模型名称不对。确认你的 model 参数是 DeepSeek 官方支持的名称,如 deepseek-chat deepseek-v4-pro
    • 可能原因2 API Key 无效或余额不足。去 DeepSeek 平台检查。
    • 可能原因3 :请求格式不符合 API 要求。确保你使用的 LangChain 或直接 HTTP 请求的 headers body 格式正确。使用 LangChain 封装可以避免大部分此类问题。
  • LangGraph 状态更新失败

    • 症状 :节点执行了,但 state 里的值没变。
    • 排查 LangGraph 要求节点函数返回一个 字典 ,这个字典中的键值对会自动更新到 state 中。确保你的函数返回的是类似 {"financial_insight": analysis_text} 这样的字典,而不是直接赋值 state[“financial_insight”] = analysis_text 然后返回 state 。后一种写法在某些情况下可能不生效。
  • 工具调用被模型忽略

    • 症状 :你定义了工具,但模型在回答时从不调用它,而是尝试自己“编造”答案。
    • 排查
      1. 检查工具的描述是否足够清晰,模型是否能理解何时该调用它。
      2. 检查传递给模型的 prompt 是否明确包含了工具的描述。 create_tool_calling_agent 会帮你处理,但如果自定义 prompt ,千万别忘了这部分。
      3. AgentExecutor 中设置 verbose=True ,观察模型的思考过程( ReAct 模式),看它是否在正确思考使用工具。
  • 工作流陷入死循环或逻辑错误

    • 调试神器 :利用 LangGraph 的可视化。你可以将编译后的 app 保存为 PNG
      from langchain_core.runnables.graph import draw_mermaid
      image_data = draw_mermaid(app.get_graph())
      with open(“stock_analysis_graph.png”, “wb”) as f:
          f.write(image_data)
      
    • 通过生成的流程图,可以清晰地看到节点和边的连接关系,帮助你发现逻辑设计上的疏漏。

6. 项目扩展与未来展望

这个“个股分析助手”目前还是一个功能相对集中的 MVP (最小可行产品)。它的架构是模块化的,意味着有巨大的扩展潜力。如果你对这个项目感兴趣,以下是一些可以深入探索的方向:

  1. 接入更多元的数据源

    • 宏观数据 :集成利率、CPI、PMI等宏观经济指标,让分析具备宏观视野。
    • 产业链数据 :获取上下游公司的数据,进行产业链景气度分析。
    • 另类数据 :如社交媒体情绪、搜索引擎关注度、供应链物流数据等,提供独特的市场洞察。
  2. 引入多智能体(Multi-Agent)协作 :目前的工作流是“单线程”的,虽然节点有分工,但本质是一个智能体在不同阶段扮演不同角色。可以升级为真正的多智能体系统:

    • Agent A(财务专家) :专职处理财务报表和比率分析。
    • Agent B(技术分析师) :专职研究价格图表和量价关系。
    • Agent C(舆情监控员) :持续扫描新闻和社交媒体。
    • Agent D(首席策略师) :负责召集以上专家开会( Agent 间通信),综合各方意见,做出最终决策。 LangGraph 非常适合构建这种多智能体协作系统,每个 Agent 可以作为图中的一个子图或节点。
  3. 实现长期记忆与持续学习 :当前分析是“一次性”的。可以引入向量数据库(如 Chroma , Weaviate ),将每次分析的报告、使用的数据、推理过程存储下来。当下次分析同一家公司时,可以先检索历史记录,看看之前的判断和现在的变化,实现“有记忆”的分析,甚至能评估自己过去预测的准确性。

  4. 构建量化信号与回测 :将最终生成的“投资建议”和“关键价位”转化为量化的交易信号(例如,当综合看多分数高于阈值,且股价接近建议支撑位时,产生买入信号)。然后,可以接入历史数据,对这些信号进行回测,用数据来验证和优化整个 AI 分析系统的有效性。

  5. 打造更友好的交互界面 :目前的 Streamlit 演示版比较简单。可以基于 FastAPI 构建更强大的后端 API ,然后开发一个功能完善的 Web 前端或桌面应用( Electron ),甚至集成到 ChatGPT Slack 等聊天工具中。

这个项目的源码我已经放在了 GitHub 上,包含了完整的实现、详细的代码注释和一个可以直接运行的 Streamlit app.py 。它不仅仅是一个工具,更是一个如何将 LLM 与工作流引擎结合来解决复杂领域问题的 范式 。金融分析只是一个起点,同样的架构可以迁移到法律文书审阅、医疗报告分析、市场竞品调研等任何需要结构化、多步骤推理的场景。希望这个项目和我的这些经验,能为你打开一扇门,让你也能动手构建属于自己的、智能的“行业专家助手”。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐