目录
- 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)是阿里云推出的专门用于处理长文本的大语言模型,具有以下特点:
-
超长上下文支持
- 支持高达100万token的上下文长度
- 可以同时处理多个完整的研究报告
- 保持长文本的连贯性理解
-
多文档并行处理
- 支持多个PDF文件的同时分析
- 能够综合多份报告的信息
- 提供跨文档的关联分析
-
专业领域适应
- 对金融研报格式有良好的理解
- 能准确提取报告中的关键数据
- 支持专业术语和行业分析
-
智能分析能力
- 提供深度的内容理解和总结
- 支持多角度的对比分析
- 能够提炼出有价值的投资见解
这些特性使得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 主要功能特点
-
智能路径处理
- 自动将相对路径转换为绝对路径
- 自动创建不存在的目录
- 提供清晰的路径错误提示
-
文件验证机制
- 检查PDF文件是否存在
- 验证文件是否可读且非空
- 支持批量处理多个文件
-
错误处理与恢复
- 详细的错误提示信息
- 文件上传失败自动跳过
- 异常情况优雅降级
-
资源管理
- 自动清理上传的文件
- 内存使用优化
- 避免资源泄露
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 错误处理机制
系统提供了多层次的错误处理:
-
目录级别
- 自动创建不存在的目录
- 提供目录路径提示
-
文件级别
- 跳过无效文件
- 详细的文件错误提示
-
API级别
- 处理API调用异常
- 提供具体错误信息
4.3 最佳实践
-
路径管理
- 建议优先使用绝对路径
- 运行代码可创建目录并提示目录路径
- 确保目录权限正确
-
文件处理
- 预先验证PDF文件有效性
- 控制单次处理文件数量
- 目录下的所有pdf文件都会被传输给AI
-
API使用
- 合理设置AI人设提示词工程
- 构造清晰的问题
5. 总结
通过使用通义千问大模型,我们实现了一个强大的PDF研报分析工具。该工具具有以下优势:
-
功能完整
- 支持单文件和多文件分析
- 提供灵活的API调用方式
- 完整的错误处理机制
-
使用便捷
- 简单的函数调用
- 清晰的参数设置
- 友好的错误提示
-
可靠性高
- 自动处理异常情况
- 资源自动清理
- 稳定的运行表现
这个解决方案适合在实际项目中使用,可以高效地处理大量PDF研究报告,为投资决策提供有力支持。
基于本文代码思路,金融资产组合模型的实战落地:
7. 马科维茨资产组合模型+金融研报AI长文本智能体(Qwen-Long)增强方案(理论+Python实战)