面包屑图标 当前位置: 首页
AI资讯
热点详情

探秘AI如何颠覆财报分析:Dify案例打造酷炫HTML可视化

AI热点日报
AI热点日报时间:2026-06-06
热点解读

上市公司财报,说白了就是公司定期向市场交的一份“成绩单”。里面详细记录了公司的家底、赚了多少钱、现金流怎么样,是投资者做决策时绕不开的核心依据。 下面这些,是财报里最需要盯紧的几个关键指标。 眼下,各大上市公司2024年年报和2025年一季报基本都出齐了。面对动辄上百页的PDF,如果手动去翻、去算,

上市公司财报,说白了就是公司定期向市场交的一份“成绩单”。里面详细记录了公司的家底、赚了多少钱、现金流怎么样,是投资者做决策时绕不开的核心依据。

下面这些,是财报里最需要盯紧的几个关键指标。

眼下,各大上市公司2024年年报和2025年一季报基本都出齐了。面对动辄上百页的PDF,如果手动去翻、去算,工作量相当可观。那么,有没有办法让AI来帮我们快速分析,并且生成一份漂亮的、可视化的报表呢?今天就来拆解一下这个工作流。

先看最终效果:

生成的报告页面:

效果相当不错,那么3分钟搞定这样一份可视化报表,需要几步?接下来我们直接上手。

先看看这个工作流里都用了哪些组件。核心链条是:开始 -> MinerU插件 -> 大语言模型LLM -> 参数提取器 -> 代码处理生成HTML -> 直接回复。

开始节点

开头的节点很简单,就是让用户上传财报文件。目前只设了一个参数:file。

那么财务文件从哪来?以比亚迪为例,可以从行情网站下载其财报PDF。下载下来存到本地备用。

在开始节点里,我们设置成单个文件上传模式。

MinerU 插件

这是关键一步,我们需要一个叫 MinerU 的插件。它的本职工作就是高质量地从PDF、网页、电子书里提取内容,转成Markdown或JSON等机器好读的格式。这个项目由上海人工智能实验室 OpenDataLab 团队开发,对文本、图片、表格、公式都能很好地处理。

可能有朋友会问:Dify工作流里自带的文档提取器不行吗?也能提取文本,但考虑到上市公司财报数据的复杂性和准确性要求,还是建议用MinerU这种专用工具,解析更靠谱。

MinerU 插件安装

在Dify的插件市场里搜一下“mineru”,直接安装就行。

MinerU 注册与授权

用插件之前,得去 https://mineru.net 注册一个账号,申请授权。审核通过后,就能拿到API Token了。

当然,如果手头有显卡资源,也可以自己部署MinerU,具体步骤这里就不展开了。

MinerU 工作流配置

回到Dify工作流,添加一个节点,类型选“工具” -> “mineru”。

配置一下。输入参数就是开始节点传过来的file。解析方法选OCR,开启公式识别,布局检测模型用doclayout-yolo,文档语言auto,OCR识别也要打开。

大语言模型 LLM

模型我们选阿里通义千问最近开源的 Qwen3-235B-A22B。这里用的是魔搭社区提供的免费版本。

系统提示词是整个工作流的“灵魂”,需要告诉模型要做什么、怎么做:

# 角色:上市公司财报数据HTML页面生成专家
## 简介:
-作者:周辉
-版本:3.0
-语言:中文
-描述:专业的财报数据分析师和HTML动态网页设计专家,擅长创建符合现代设计趋势和技术要求的财报展示页面。
## 背景:
你是一位资深的财务分析师和网页设计专家,专门将上市公司财报数据转化为视觉吸引力强的HTML动态网页。你熟悉各种现代web技术和设计趋势,尤其擅长BemtoGrid布局和GSAP动效。

## 目标:
生成一个完整的、可直接使用的HTML页面,用于展示上市公司财报数据,该页面应符合所有技术和设计要求。

## 技术要求:
1.使用BemtoGrid布局系统
2.集成GSAP动效和FramerMotion
3.基于HTML5和TailwindCSS开发
4.响应式设计和大小字体对比应用
## 设计规范:
1.根据公司特性选择适当的背景颜色和主题色调
2.应用超大字体和视觉元素突出重点,创造视觉对比
3.中英文混排,大字体为主,英文小字点题
4.使用简洁的矩形元素进行数据可视化
5.高亮色透明效果用于边框,避免不同高亮色互相覆盖
6.所有数据图表采用脚注样式,保持主题一致性
7.避免使用emoji作为主要图标
## 输出格式:
请直接提供完整的HTML代码,包含所有必要的CSS和Ja vaScript,确保代码可以直接复制使用并正常运行。代码应包含:

1.完整的HTML结构
2.内联或外部引用的CSS(包括TailwindCSS)
3.必要的Ja vaScript(包括GSAP和FramerMotion)
4.CDN引用和其他必要的资源链接
## 初始化:
作为上市公司财报数据HTML页面生成专家,我已准备好为您创建一个完整的HTML页面。请提供您想要分析的上市公司及其最新财报的关键信息,我将直接为您生成可用的HTML代码。

用户提示词就简洁多了,直接把MinerU解析出来的文本内容塞进去:

根据{{#1747105471978.text#}}最新财报内容和补充内容以及财报数据分析内容,生成一个 HTML 动态网页

参数提取器

这个组件的作用,是从LLM的输出中,把HTML代码干净地摘出来。可能有人不理解:上面不是让模型只返回HTML吗?为什么还要多此一举?这就要说到大模型的“幻觉”问题了。虽然我们在提示词里强调只输出HTML,但有些模型不听话,它可能还会加上一堆“根据您的要求,我生成了以下网页……”之类的废话。如果不把这些杂音去掉,后面生成文件时就会出错。

这里我们选Google的gemini2.5-flash模型。输入变量是从上一个LLM节点传过来的输出。然后定义一个提取参数,比如叫“html”。

指令就写一句话:请提取大模输出的html部分代码,其他的不需要

代码处理:生成HTML并调用

到这一步,参数提取器已经把干净的HTML代码拿出来了。接下来需要把它转成一个真正能在浏览器里访问的HTML文件。这里就要用到后端代码的能力了。这部分可以分为两块:服务端代码和客户端代码。

1. 服务端代码

服务端我们用 FastAPI 写了一个HTTP接口,它的作用是接收HTML内容,保存成文件,然后上传到腾讯云的COS存储上,再把生成的访问链接返回。

# makehtmlapi.py
from fastapi import FastAPI, HTTPException,Depends, Header
from pydantic import BaseModel
import logging
import time
import uvicorn
import configparser
import os
import json
import datetime
import random
from qcloud_cos import CosConfig
from qcloud_cos import CosS3Client

app = FastAPI()

# 读取配置文件中的API密钥
config = configparser.ConfigParser()
config.read('config.ini', encoding='utf-8')

# Tencent Cloud COS configuration
region = config.get('common', 'region')
secret_id = config.get('common', 'secret_id')
secret_key = config.get('common', 'secret_key')
bucket = config.get('common', 'bucket')

# 设置输出路径
output_path = config.get('html', 'output_path', fallback='html_output')

# 确保输出目录存在
os.makedirs(output_path, exist_ok=True)

# 设置日志
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

class HTMLRequest(BaseModel):
    html_content: str
    filename: str = None

def verify_auth_token(authorization: str = Header(None)):
    """验证 Authorization Header 中的 Bearer Token"""
    if not authorization:
        raise HTTPException(status_code=401, detail="Missing Authorization Header")
    
    scheme, _, token = authorization.partition(" ")
    if scheme.lower() != "bearer":
        raise HTTPException(status_code=401, detail="Invalid Authorization Scheme")
    
    valid_tokens = json.loads(config.get('auth', 'valid_tokens'))
    if token not in valid_tokens:
        raise HTTPException(status_code=403, detail="Invalid or Expired Token")
    
    return token

def generate_timestamp_filename(extension='html'):
    timestamp = datetime.datetime.now().strftime("%Y%m%d%H%M%S")
    random_number = random.randint(1000, 9999)
    filename = f"{timestamp}_{random_number}.{extension}"
    return filename

def sa ve_html_file(html_content, filename=None, output_dir=None):
    if not filename:
        filename = generate_timestamp_filename()
    if not output_dir:
        output_dir = output_path
    os.makedirs(output_dir, exist_ok=True)
    file_path = os.path.join(output_dir, filename)
    with open(file_path, 'w', encoding='utf-8') as file:
        file.write(html_content)
    return filename, file_path

def upload_cos(region, secret_id, secret_key, bucket, file_name, base_path):
    config = CosConfig(
        Region=region,
        SecretId=secret_id,
        SecretKey=secret_key
    )
    client = CosS3Client(config)
    file_path = os.path.join(base_path, file_name)
    response = client.upload_file(
        Bucket=bucket,
        LocalFilePath=file_path,
        Key=file_name,
        PartSize=10,
        MAXThread=10,
        EnableMD5=False
    )
    if response['ETag']:
        url = f"https://{bucket}.cos.{region}.myqcloud.com/{file_name}"
        return url
    else:
        return None

@app.post("/generate-html/")
async def generate_html(request: HTMLRequest, auth_token: str = Depends(verify_auth_token)):
    try:
        logger.info("开始处理HTML生成请求")
        start_time = time.time()
        filename, file_path = sa ve_html_file(request.html_content, request.filename)

        html_url = upload_cos(region, secret_id, secret_key, bucket, filename, output_path)

        elapsed_time = time.time() - start_time
        logger.info(f"HTML生成和上传完成,耗时 {elapsed_time:.2f} 秒,返回 URL: {html_url}")

        if html_url:
            return {
                "success": True,
                "html_url": html_url,
                "filename": filename
            }
        else:
            raise HTTPException(status_code=500, detail="上传HTML文件到COS失败")
    except Exception as e:
        logger.error(f"处理HTML生成请求时发生错误: {str(e)}")
        raise HTTPException(status_code=500, detail=str(e))

if __name__ == "__main__":
    uvicorn.run(app, host="0.0.0.0", port=8088)

代码里有个config.ini配置文件,用来存COS密钥、接口Token等信息:

[html]
output_path = E:\work\code\2024pythontest\makehtml\html_output

[common]
region = xxx
secret_id = xxx
secret_key = xxx
bucket = xxx

[auth]
valid_tokens = ["sk-zhouhui1xxx", "zhouhui112xxx"]

把上面的服务端代码在服务器或本地跑起来,对外提供8088端口就行了。

2. 客户端代码

然后在Dify里加一个“代码执行”节点,用来调用刚才的服务端接口。

这个节点有4个输入参数:

  • json_html:参数提取器拿到的HTML代码。
  • apiurl:服务端接口地址。
  • apikey:调用接口的密钥。
  • strtype:固定写死(比如“上市公司”),用来生成文件名。

其中apiurlapikey用环境变量的方式引入,这样更安全。如果服务端在本地,URL可以是127.0.0.1或局域网IP;如果在服务器上,用公网IP也行。需要注意的是,客户端和服务端的apikey必须保持一致,客户端的key要存在于服务端config.ini的valid_tokens列表里。

客户端代码如下:

import json
import re
import time
import requests

def main(json_html: str, apikey: str, apiurl: str, strtype: str) -> dict:
    try:
        html_content = re.sub(r'^```htmls*|s*```$', '', json_html, flags=re.DOTALL).strip()
        timestamp = int(time.time())
        filename = f"{strtype}_{timestamp}.html"
        url = f"{apiurl}"
        payload = {
            "html_content": html_content,
            "filename": filename
        }
        headers = {
            "Authorization": f"Bearer {apikey}",
            "Content-Type": "application/json"
        }
        try:
            response = requests.post(url, json=payload, headers=headers)
            if response.status_code == 200:
                result = response.json()
                html_url = result.get("html_url", "")
                generated_filename = result.get("filename", "")
                return {
                    "html_url": html_url,
                    "filename": generated_filename,
                    "markdown_result": f"[点击查看]({html_url})"
                }
            else:
                raise Exception(f"HTTP Error: {response.status_code}, Message: {response.text}")
        except requests.exceptions.RequestException as e:
            raise Exception(f"Request failed: {str(e)}")
    except Exception as e:
        return {
            "error": f"Error: {str(e)}"
        }

这个节点会返回3个值:html_urlfilenamemarkdown_result

到这里,服务端和客户端的联动就配好了。

直接回复

最后是“直接回复”节点,用来把结果展示给用户。我们设置回两个内容:一个是MinerU插件解析出来的原始文本,一个是最终生成的HTML页面链接。

验证与测试

打开工作流预览,点击从本地文件上传,找到之前下载好的比亚迪财报PDF。

跑一下,就能看到最终效果了。

总结

今天这个方案,核心思路就是通过Dify串联起PDF解析、大模型分析和代码执行这几个环节,把一份枯燥的PDF财报,快速变成一份视觉上清晰、美观的HTML报表。相比传统的手工翻看和计算,效率提升是显而易见的。对于投资者和分析师来说,这算是一个挺实用的提效工具。

热点追踪提示词
你是一名 AI 行业编辑,请围绕下面这条热点输出一份资讯解读:
热点:探秘AI如何颠覆财报分析:Dify案例打造酷炫HTML可视化要求:
1. 先用一句话解释这条热点在讲什么
2. 再总结它为什么重要
3. 说明会影响哪些 AI 产品或内容方向
4. 最后给出 3 个适合资讯站使用的标题
来源:https://www.53ai.com/news/zhinenghuagaizao/2025051906923.html
ai 人工智能

游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

相关热点
AI热点2026-06-06 22:59
AISEO人性化文本提升内容质量与SEO优化

AI SEO产品全面解析与功能指南AI SEO平台的核心价值在于解决一个常见痛点:AI生成的内容往往带有明显的机器痕迹,读起来生硬枯燥,难以获得搜索引擎的青睐。该平台提供了一整套工具与服务,能够将机械感十足的文本转化为自然流畅、如同人类撰写的优质文章。听起来很贴合实际需求,不是吗?下面我们来详细了解

AI热点2026-06-06 22:59
AI办公提效工具Goodlookup怎么样

对于经常处理电子表格的用户来说,Goodlookup这款工具确实值得深入了解。它巧妙地将AI语言模型的智能能力融入常见的表格操作流程,即使是普通用户也能轻松调用AI辅助功能,从而显著提升日常办公效率与数据处理体验。

AI热点2026-06-06 22:59
ResearchBuddy.app

ResearchBuddy app是什么 对于从事学术研究的学者或学生而言,文献综述往往是最耗时耗力的环节。海量论文需要筛选,光是阅读摘要就可能消耗大半天。ResearchBuddy app正是为解决这一痛点而生的AI辅助工具,由专业团队开发,专为研究人员、学生及需要系统梳理文献的专业人士设计。其核

AI热点2026-06-06 22:59
Writecream AI写作工具高效生成个性化营销邮件内容

Writecream产品介绍 Writecream这个AI写作工具,说实话,在同类产品里算是一把好手。它的核心卖点就一个字:快。无论是冷邮件、营销文案还是社交媒体帖子,几秒钟就能给你整出一篇像样的东西。这意味着什么?意味着你花在内容创作上的时间成本和金钱成本都能大幅压缩。下面具体看看它都有哪些拿手好

延伸阅读