基于 LangGraph 的智能工作流,用于从 PDF 投资研究报告中提取结构化数据。该系统采用多智能体协作架构,能够自动分析研报内容并提取关键投资信息。
flowchart TD
A[开始] --> B[质量评估]
B --> C{质量检查}
C -->|通过| D[线索分析]
C -->|通过| E[表格提取]
C -->|失败| F[结束]
D --> G[逻辑提取]
G --> H[观点总结]
E --> F[结束]
H --> F[结束]
style A fill:#e1f5fe
style B fill:#f3e5f5
style C fill:#e8f5e8
style D fill:#fff3e0
style E fill:#fce4ec
style F fill:#f1f8e9
style G fill:#ffebee
style H fill:#e1f5fe
备注:表格提取会并行启动多个worker,每个worker处理一页
- ResearchAgent (
src/agents/research_agent.py): 主控制器,协调整个分析流程 - QualityAssessor (
src/agents/quality_assessor.py): 评估研报质量和完整性 - ClueAnalyzer (
src/agents/clue_analyzer.py): 提取投资线索和关键信息 - TableExtractor (
src/agents/table_extractor.py): 识别和提取财务表格数据 - LogicExtractor (
src/agents/logic_extractor.py): 分析投资逻辑和推理链 - Summarizer (
src/agents/summarizer.py): 生成观点总结 - Prompts (
src/prompts): 提示词
- OpenAI API 密钥
pip install -r requirements.txt- 复制环境配置文件:
cp .env.example .env- 编辑
.env文件,配置必要的环境变量:
# LLM 配置
OPENAI_API_KEY=your_openai_api_key
OPENAI_BASE_URL=https://api.openai.com/v1
# 其他配置...python main.py single -i path/to/report.pdfpython main.py batch -i data/ -o output/single: 分析单个研报batch: 批量分析研报-i: 指定单个PDF文件或目录路径-o: 指定输出目录
import asyncio
from pathlib import Path
from src.agents.research_agent import ResearchAgent
async def analyze_report():
# 初始化智能体
agent = ResearchAgent()
# 分析研报
pdf_path = Path("path/to/report.pdf")
result = await agent.analyze_report(pdf_path)
if result:
print(f"分析完成: {result.report_info.title}")
print(f"投资评级: {result.investment_clues.rating}")
print(f"目标价格: {result.investment_clues.target_price}")
# 运行分析
asyncio.run(analyze_report())系统输出结构化的 JSON 数据,包含以下主要字段:
{
"report_info": {
"title": "研报标题",
"date": "2024-01-01T00:00:00",
"institution": "券商名称",
"stock_name": "股票名称",
"stock_code": "股票代码",
"file_name": "文件名"
},
"quality_assessment": {
"score": 0.85,
"completeness": "高",
"reliability": "高",
"decision": "pass"
},
"investment_clues": {
"analyst": ["分析师姓名"],
"rating": "买入",
"current_price": 20,
"target_price": 25.5,
"profit_summary": [{...}],
"market_share": {...}
},
"investment_logic": {
"main_logic": "主要投资逻辑",
"supporting_factors": ["支撑因素1", "支撑因素2"],
"risk_factors": ["风险因素1", "风险因素2"],
"confidence_score": 0.8
},
"tables": [
{
"table_name": "财务数据表",
"headers": ["年份", "营收", "净利润"],
"data": [["2023", "100亿", "10亿"]]
}
],
"viewpoints": {
"summary": "观点总结",
"key_points": ["要点1", "要点2"]
}
}ReportSummarizer/
├── src/
│ ├── agents/ # 智能体模块
│ │ ├── research_agent.py # 主控制器
│ │ ├── quality_assessor.py # 质量评估
│ │ ├── clue_analyzer.py # 线索分析
│ │ ├── table_extractor.py # 表格提取
│ │ ├── logic_extractor.py # 逻辑提取
│ │ └── summarizer.py # 总结生成
│ ├── config/ # 配置模块
│ │ ├── models.py # 数据模型
│ │ └── settings.py # 系统设置
│ ├── llms/ # LLM 接口
│ ├── processors/ # 文档处理
│ ├── prompts/ # 提示词模板
│ └── utils/ # 工具函数
├── data/ # 输入数据目录
├── output/ # 输出结果目录
├── main.py # 主程序入口
├── requirements.txt # 依赖列表
└── README.md # 项目文档
提示词模板位于 src/prompts/ 目录下,可以根据需要修改:
quality_assessment.py: 质量评估提示词clue_analysis.py: 线索分析提示词table_extraction.py: 表格提取提示词logic_extraction.py: 逻辑提取提示词summarization.py: 总结生成提示词
数据结构定义在 src/config/models.py 中,可以根据业务需求调整输出字段。
LLM 配置在 src/config/settings.py 和 .env 文件中,支持OpenAI Compatible的模型提供商。
为了正确解析研报信息,建议 PDF 文件按以下格式命名:
YYYYMMDD-券商名称-股票名称-股票代码-报告标题.pdf
示例:
20240115-中信证券-贵州茅台-600519-2024年投资策略报告.pdf
- API 配额: 大批量处理时注意 LLM API 的调用限制
- 文件格式: 目前仅支持 PDF 格式的研报文件
- 内容质量: 系统会自动过滤低质量内容,但建议输入高质量的研报文件
- 处理时间: 单个文件处理时间取决于文件大小和 LLM 响应速度
- 表格提取: 目前默认使用gpt-4.1提取表格,为了进一步提升准确率可以换用专门的OCR模型如nanonets/Nanonets-OCR-s