基于XXL-JOB与DeepSeek实现推送热点新闻和金融数据分析

更新时间:
复制 MD 格式

本文介绍如何通过分布式任务调度XXL-JOB与大模型DeepSeek的深度结合,实现财经热点新闻的定时自动推送和金融数据分析。

背景介绍

随着 AI 大模型能力的不断提升,其在业务实践中的应用场景也日益丰富。许多业务场景,除了由人工主动发起的之外,还可以通过定时任务在后台自动运行,并结合大模型能力进行增强。以下是典型的应用场景:

  • 风险监控:定时监控系统关键指标,结合大模型的智能分析能力,识别潜在风险。

  • 数据分析:定时采集在线金融数据,由大模型进行智能分析,为投资者提出决策建议。

视频演示

MSE 任务调度XXL-JOB版基于AI任务实现每日推送热点新闻,请参见MSE XXL-JOB AI任务演示

前提条件

环境准备

搭建DeepSeek

大模型选择DeepSeek,出于以下考虑:

  • DeepSeek以推理能力出圈,适合做数据分析。并且DeepSeek的母公司幻方量化就是做量化交易的,我们相信DeepSeek在数据分析上有着显著的优势。

  • DeepSeek开源并且很轻量,可以很方便地部署。

您也可以选择阿里云最新开源的QwQ模型,推理能力比肩DeepSeek-R1,在做复杂数据分析上同样能力出众。以下图表展示了QwQ-32B 与其他领先模型在数学推理、编程能力和通用能力上的对比:

image

方案一:本地自建部署

本地部署DeepSeek、QwQ或者其他模型,步骤都是差不多的,下面以DeepSeek为例:

  1. 安装ollama:https://ollama.com/download

    下载页面提供 macOS、Linux、Windows 三个平台选项。macOS 版本要求 macOS 11 Big Sur 及以上,选择对应平台后单击 Download for macOS 按钮下载安装包。

  2. 安装DeepSeek R1模型:R1模型专注于复杂逻辑推理,更适合用于数据分析。

    在 Ollama 模型库的 deepseek-r1 页面可获取运行命令,格式为 ollama run deepseek-r1:7b

    根据机器规格大小选择一个模型,比如我的电脑有16G内存,选择7b,就在命令行输入如下命令安装。

    B-714P6G7P-2008:xxljob-demo armon$ ollama run deepseek-r1:7b
    pulling manifest
    pulling 96c415656d37...  59% ▕████████████████████████                ▏ 2.8 GB/4.7 GB  1.2 MB/s  25m40s

    不同模型对应的硬件要求如下表:

    模型名称

    模型大小

    显存

    内存

    deepseek-r1:1.5b

    1.1GB

    4GB+

    8GB+

    deepseek-r1:7b

    4.7GB

    8GB+

    16GB+

    deepseek-r1:8b

    4.9GB

    10GB+

    18GB+

    deepseek-r1:14b

    9.0GB

    16GB+

    32GB+

    deepseek-r1:32b

    20GB

    24GB+

    64GB+

  3. 部署完成后,我们通过API进行测试(使用兼容OpenAIAPI,端口默认是11434),方便后续写代码。

    curl http://localhost:11434/v1/chat/completions \
         -H "Content-Type: application/json" \
         -d '{
            "model": "deepseek-r1:7b",
            "messages": [
                {
                    "role": "user",
                    "content": "who are you"
                }
            ]
        }'
    {"id":"chatcmpl-87","object":"chat.completion","created":1741339418,"model":"deepseek-r1:7b","system_fingerprint":"fp_ollama","choices":[{"index":0,"message":{"role":"assistant","content":"\u003cthink\u003e\n\n\u003c/think\u003e\n\nGreetings! I'm DeepSeek-R1, an artificial intelligence assistant created by DeepSeek. I'm at your service and would be delighted to assist you with any inquiries or tasks you may have."},"finish_reason":"stop"}],"usage":{"prompt_tokens":6,"completion_tokens":44,"total_tokens":50}}

方案二:使用云产品

我们也可以直接使用云产品,以阿里云百炼为例,只需要开通即可使用,并且有海量的免费额度。使用云产品的话还有个好处,就是可以随时切换模型,体验不同模型的优劣。

在百炼平台左侧导航选择模型广场,通过供应商筛选选中DeepSeek标签,可查看共8个可用模型,包括DeepSeek-R1(推理模型/64K)、DeepSeek-V3(文本生成/64K)及多个蒸馏版本(DeepSeek-R1-Distill-Qwen-1.5B/7B/14B/32B),每个模型卡片提供查看详情API调用示例立即体验操作入口。

搭建XXL-JOB

使用XXL-JOB有如下优势:

  • 可以定时发起AI任务请求。

  • 可以把prompt和返回格式放在任务参数上,动态修改。

  • 可以使用广播分片任务,把大任务拆分成多个小任务,加快AI任务运行速度。

  • 可以使用任务依赖编排,构建一个AI数据分析的流程。

方案一:本地自建部署

XXL-JOB 部署比较简单,详细的步骤可以参考官网,大致步骤如下:

  1. 准备一个数据库并初始化数据库表结构。

    初始化完成后,数据库 xxl_job_2.4.1 中将包含以下表:xxl_job_groupxxl_job_infoxxl_job_lockxxl_job_logxxl_job_log_reportxxl_job_loggluexxl_job_registryxxl_job_user

  2. 把代码导入到IDE中,配置xxl-job-admin的配置文件。

    需要根据实际环境修改数据库连接配置,包括 spring.datasource.urlspring.datasource.usernamespring.datasource.password

    server.servlet.context-path=/xxl-job-admin
    ### actuator
    management.server.servlet.context-path=/actuator
    management.health.mail.enabled=false
    ### resources
    spring.mvc.servlet.load-on-startup=0
    spring.mvc.static-path-pattern=/static/**
    spring.resources.static-locations=classpath:/static/
    ### freemarker
    spring.freemarker.templateLoaderPath=classpath:/templates/
    spring.freemarker.suffix=.ftl
    spring.freemarker.charset=UTF-8
    spring.freemarker.request-context-attribute=request
    spring.freemarker.settings.number_format=0.##########
    spring.freemarker.settings.new_builtin_class_resolver=safer
    ### mybatis
    mybatis.mapper-locations=classpath:/mybatis-mapper/*Mapper.xml
    #mybatis.type-aliases-package=com.xxl.job.admin.core.model
    ### xxl-job, datasource
    spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job_2.4.1?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
    spring.datasource.username=root
    spring.datasource.password=123456
    spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
    ### datasource-pool
    spring.datasource.type=com.zaxxing.hikari.HikariDataSource
    spring.datasource.hikari.minimum-idle=10
    spring.datasource.hikari.maximum-pool-size=30
    spring.datasource.hikari.auto-commit=true
    spring.datasource.hikari.idle-timeout=30000
    spring.datasource.hikari.pool-name=HikariCP-xxl-job
    spring.datasource.hikari.max-lifetime=900000
    spring.datasource.hikari.connection-timeout=10000
    spring.datasource.hikari.connection-test-query=SELECT 1
    spring.datasource.hikari.validation-timeout=1000
    ### datasource-pool
    spring.datasource.type=com.zaxxer.hikari.HikariDataSource
    spring.datasource.hikari.minimum-idle=10
    spring.datasource.hikari.maximum-pool-size=30
    spring.datasource.hikari.auto-commit=true
    spring.datasource.hikari.idle-timeout=30000
    spring.datasource.hikari.pool-name=HikariCP
    spring.datasource.hikari.max-lifetime=900000
    spring.datasource.hikari.connection-timeout=10000
    spring.datasource.hikari.connection-test-query=SELECT 1
    spring.datasource.hikari.validation-timeout=1000
    ### xxl-job, email
    spring.mail.host=smtp.qq.com
  3. 运行XxlJobAdminApplication这个类,然后在浏览器输入http://127.0.0.1:8080/xxl-job-admin 就可以登录了(默认用户名和密码是:admin/123456)。

    登录成功后,进入XXL-JOB任务调度中心管理后台,默认显示运行报表页面,左侧导航包含任务管理调度日志执行器管理等菜单,主内容区展示任务数量调度次数执行器数量统计卡片及调度成功/失败分布图。

方案二:使用云产品

您可以使用托管的阿里云MSE任务调度XXL-JOB版,详情可参见创建XXL-JOB实例,并且可以免费试用

实现推送热点新闻

本案例基于MSE XXL-JOB/自建XXL-JOB阿里云百炼托管的DeepSeek R1为例介绍实现,Demo详情可参见xxljob-demo(SpringBoot)

步骤一:将应用接入任务调度平台XXL-JOB

  1. 登录阿里云容器服务控制台,创建一个ACK Serverless集群。需为当前VPC开启配置SNAT(VPC已配置过则可忽略),以便拉取Demo镜像。

    在集群配置页面,选择集群规格Pro 版,选择所需地域和 Kubernetes 版本;在网络配置区域,选择专有网络使用已有的 VPC,并勾选为专有网络配置 SNAT

  2. 在容器服务控制台的集群列表页,单击目标集群,选择工作负载 > 无状态服务,单击使用YAML创建资源,参考如下YAML配置将应用接入MSE任务调度平台XXL-JOB。其中配置参数-Dxxl.job.admin.addresses-Dxxl.job.executor.appname-Dxxl.job.accessToken-Ddashscope.api.key-Dwebhook.url可参见配置启动参数

    应用部署YAML参考如下:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: xxljob-demo
      labels:
        app: xxljob-demo
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: xxljob-demo
      template:
        metadata:
          labels:
            app: xxljob-demo
        spec:
          containers:
          - name: xxljob-executor
            image: schedulerx-registry.cn-hangzhou.cr.aliyuncs.com/schedulerx3/xxljob-demo:2.4.1
            ports:
            - containerPort: 9999
            env:
              - name: JAVA_OPTS
                value: >-
                  -Dxxl.job.admin.addresses=http://xxljob-xxxxx.schedulerx.mse.aliyuncs.com
                  -Dxxl.job.executor.appname=xxxxx
                  -Dxxl.job.accessToken=xxxxxxx
                  -Ddashscope.api.key=sk-xxx
                  -Dwebhook.url=https://oapi.dingtalk.com/robot/send?access_token=xx

步骤二:配置启动参数

  1. 获取启动参数配置。

    1. 登录MSE XXL-JOB控制台,并在顶部菜单栏选择地域。

    2. 单击进入目标实例,在左侧导航栏的应用管理页面。单击目标应用执行器数量列下的接入

    接入方式1:修改springboot配置文件:

    xxl.job.admin.addresses=http://xxljob-xxx
    xxl.job.accessToken=IMRxxx
    xxl.job.executor.appname=app_test

    接入方式2(推荐):通过-D参数重启应用(不需要修改代码和配置文件):

    java -Dxxl.job.admin.addresses=http://xxljob-xxx \
     -Dxxl.job.accessToken=IMRdMxxx \
     -Dxxl.job.executor.appname=app_test \
     app.jar

    替换为目标实例接入配置后,一键复制参数项至YAML配置:

    -Dxxl.job.admin.addresses=http://xxljob-xxxxx.schedulerx.mse.aliyuncs.com
    -Dxxl.job.executor.appname=xxxxx
    -Dxxl.job.accessToken=xxxxxxx
  2. 登录阿里云百炼平台,单击右上角人像图标中的API-KEY进入管理界面,可以创建或复制一个API-KEY。

    替换API-KEY后,复制参数项至YAML配置:

    -Ddashscope.api.key=sk-xxx
  3. 在钉群Webhook地址,可以在钉钉群设置中添加一个自定义机器人。

    添加机器人后,开启消息推送,单击 Webhook 右侧的复制按钮获取地址。在安全设置中勾选自定义关键词并填入所需关键词。

    替换access_token值后,复制参数项至YAML配置:

    -Dwebhook.url=https://oapi.dingtalk.com/robot/send?access_token=xx

步骤三:创建AI任务并运行

MSE XXL-JOB 控制台
  1. 登录MSE XXL-JOB控制台,并在顶部菜单栏选择地域。单击目标实例,在左侧导航栏的任务管理页面,单击创建任务

  2. 在创建任务面板中配置JobHandler名称sinaNews任务参数配置prompt提示词信息如下,其他配置按默认保存即可。

    任务参数prompt配置示例:

    你是一个新闻资讯助手,需要帮对用户提供的内容做下Unicode解码,并提取出最热门的5条新闻, 最后总结用户提供的内容。
    输出格式参考如下:
    今日热点的财经新闻(按热度排序):
    ---
    #### 1. [**title**](url)
    热度:99,999
    发布方:publisher
    ---
    #### **消息总结**
    分析是否存在与AI相关最新资讯。概要总结今日消息内容。
  3. 任务管理页面,单击创建的sinaNews任务名操作列下的运行一次,等待任务执行成功,钉群即可定时接收AI分析总结的资讯。

    image

自建XXL-JOB Admin
  1. 在自建的XXL-JOB Admin控制台上创建任务,配置JobHandlersinaNews,任务参数可参见任务参数配置示例

    任务参数配置示例:调度类型选择 CRON,Cron 表达式为 0 0 8 * * ?(每天 8 点执行),运行模式选择 BEAN。任务参数中填写 prompt 提示词,指定 AI 作为新闻资讯助手对内容做 Unicode 解码、提取最热门的 3 条新闻并总结;随后指定输出格式模板,包含标题、热度、发布方和消息总结等字段的 Markdown 排版样式。

  2. 在任务管理页面,手动运行一次任务,收到钉钉通知如下。

    image

实现金融数据分析

基于实现推送热点新闻例子中,我们只拉取了新浪财经的新闻,如果想准实时拉取国内外金融新闻和数据,快速做出决策,一个单机任务的时效性肯定是不够的。我们可以使用MSE XXL-JOB的广播分片任务,将大任务拆分成小任务,不同的小任务去拉取不同的数据。再通过MSE XXL-JOB的任务编排能力组成一个流程,一步步去完成我们的任务。流程如下:

image

  1. MSE XXL-JOB上新建3个任务,并建立依赖关系,拉取金融数据 → 数据分析 → 生成报告。其中拉取金融数据任务的路由策略是广播分片。

  2. 拉取金融数据任务开始执行的时候,通过广播分片派发多个子任务给不同的执行器,以获取各大国内外财经新闻和金融数据,并将结果存储起来(比如数据库、Redis或者对象存储)。

  3. 在数据分析任务开始执行的时候,获取当前的金融数据,再调用DeepSeek进行分析,将结果存储起来。

  4. 在数据分析完成后,再通过报告生成任务,将分析完的数据生成一个报告或者报表,通过钉钉或者邮件推送给用户,提供投资建议。