本项目用于批量处理上市公司年报/独立董事述职报告 JSON,完成以下核心目标:
- 将报告结构化内容入库(MySQL + SQLAlchemy)。
- 为报告文本/表格与指标关键词生成向量。
- 按指标体系自动检索证据、分配任务、调用大模型问答。
- 产出
indicators_result指标结果表,并导出为 Excel。
该仓库以“跑批脚本 + 业务模块”方式组织,主入口是:
run_script_年报.py:年报指标跑批。run_script_独董.py:独立董事述职报告指标跑批。
logic_folder/:核心业务逻辑(检索、问答、表格处理、ORM 模型)。operation_folder/:业务操作流水(文件入库、指标入库、指标批量收集)。ian_evolution/:LLM 客户端管理与 API 封装。模块工具/:工具层(API 调用、语义增强、OCR/报告 JSON 处理等)。uploads/:指标表、名单等输入文件。downloads/、downloads_0630_下午_年报/:知识图谱 JSON 中间产物。output/、output_year_report/:结果 Excel 与统计脚本。测试/、独立董事报告pdf/、年报json/:测试数据/样本数据目录。
run_script_年报.py:年报全流程(建表 -> 指标入库 -> 报告入库 -> 向量化 -> 任务分发 -> 指标收集 -> 导出 Excel)。run_script_独董.py:独董全流程(与年报类似,但输入过滤与任务执行层级更多)。logic_folder/数据库表格.py:所有核心 ORM 模型定义。operation_folder/文件录入.py:报告 JSON 预处理、知识图谱存储、库表写入。operation_folder/指标表录入.py:指标体系入库与关键词向量化。operation_folder/指标批量收集.py:单指标/批量指标的问答与结果入库。logic_folder/语义增强包.py:指标词语分类、关键词拆分、单字过滤等大模型增强逻辑。ian_evolution/client_manager.py:各大模型客户端初始化(Qwen/DeepSeek/Minimax/SiliconFlow)。
- Python 3.10+(建议与历史运行环境保持一致)。
- MySQL + PyMySQL。
- SQLAlchemy ORM。
- pandas(Excel 读写与数据清洗)。
- OpenAI 兼容接口(主要通过 DashScope/Qwen)。
- 并发执行:
ProcessPoolExecutor。
模型定义位于 logic_folder/数据库表格.py,主要表如下:
company:公司主数据。reports:报告元信息(公司、年份、入库状态、person_name 等)。sections/sentences/charts/headers/key_index/table_value/description:报告结构化内容。vector:文本、表格、指标关键词等向量。indicators:指标定义与配置(类型、关键词、规则、任务层级等)。indicators_result:最终结果(value/reference/table_reference/original_answer)。missions:待执行任务队列。fail_reports:失败记录。statistic:调用成本统计。
项目通过 .env 读取配置。建议使用无空格、无多余引号的写法:
DB_HOST=localhost
DB_PORT=3306
DB_USERNAME=root
DB_PASSWORD=your_password
DB_NAME=your_database
DASHSCOPE_API_KEY=sk-xxxx
DEEPSEEK_API_KEY=sk-xxxx
MINIMAX_API_KEY=xxxx
SILICONFLOW_API_KEY=sk-xxxx注意:
run_script_年报.py会在脚本开头强制覆盖DB_NAME为zsx_年报指标跑批_0617。run_script_独董.py默认使用.env中DB_NAME。
flowchart TD
A["准备环境(.env/DB/API Key)"] --> B["准备输入(指标表+报告JSON)"]
B --> C["运行脚本(run_script_年报.py 或 run_script_独董.py)"]
C --> D["建表(Base.metadata.create_all)"]
D --> E["指标入库(indicators_sheet_to_db)"]
E --> F["报告入库(report_to_db)"]
F --> G["报告结构化与知识图谱落盘"]
G --> H["向量化(pre_road_map_embedding_convert)"]
H --> I["任务分配(group_searching_within_report_v2 -> missions)"]
I --> J["任务执行(single_data_collection)"]
J --> K["结果入库(indicators_result)"]
K --> L["导出Excel(indicators_年报_*.xlsx)"]
J --> M{"失败?"}
M -->|是| N["写入fail_reports并补跑"]
M -->|否| K
核心阶段:
- 设置数据库名并建表。
- 读取指标 Excel,执行
indicators_sheet_to_db。 - 遍历输入名单,匹配
测试/下报告 JSON,调用report_to_db入库。 - 执行
pre_road_map_embedding_convert完成向量化。 - 依据报告和指标生成
missions。 - 并发执行
single_data_collection写入indicators_result。 - 从数据库导出结果到带时间戳的 Excel。
运行示例:
cd /Users/linxuanxuan/Desktop/zsx_独立董事指标跑批
python3 run_script_年报.py与年报主链路相似,差异点:
- 使用独董名单与任职周期筛选。
- 任务执行分
execute_level == 1与execute_level == 2两层。 - 对
report_name + person_name的任务按批次分组执行。
运行示例:
cd /Users/linxuanxuan/Desktop/zsx_独立董事指标跑批
python3 run_script_独董.pyuploads/指标表/...xlsx:指标体系表、公司-人员名单。测试/或0616独立董事述职报告json/:报告 JSON 文件。
- 数据库表:
indicators_result、fail_reports、missions等。 - Excel 导出:
indicators_年报_<DB_NAME>_<timestamp>.xlsx。 - 中间产物:
downloads_0630_下午_年报/<类型>/知识图谱_*.json。
脚本中存在较多硬编码路径,迁移环境时要重点检查:
run_script_年报.py中root_folder、df_file、indicator_file。run_script_独董.py中root_folder、df_file、indicator_file、筛选逻辑。operation_folder/文件录入.py中folder = 'downloads_0630_下午_年报'。
建议把以上路径抽取为配置项(.env 或 yaml),避免改代码才能换批次。
症状:日志出现 Incorrect API key provided,随后关键词生成/嵌入失败并产生连锁告警。
排查:
- 检查
.env的DASHSCOPE_API_KEY是否有效。 - 确认运行脚本使用的 Python 环境与
.env所在目录一致。 - 验证
ian_evolution/client_manager.py的qwen_client读取的是期望变量。
常见来源:
operation_folder/指标表录入.py中函数返回True, {}。- 关键词抽取失败时,
weight_keywords回退为字符串'{}'。
这通常是“空结果占位”,不是独立异常。
常见原因:
- 名单中的
company_code/person_name在root_folder找不到匹配 JSON 文件。 db_report_name为空时会被跳过。report.in_db != 1导致后续收集未执行。
- 检查
DB_HOST/PORT/USERNAME/PASSWORD。 - 检查连接数上限与长事务。
- 并发较高时可调小
ProcessPoolExecutor(max_workers=...)。
- 将硬编码文件路径、年份、批次名统一配置化。
- 对
401、429、超时增加“快速失败 + 明确错误提示”,减少无效重试。 - 把“指标入库/报告入库/任务执行/导出”拆成可单独运行的 CLI 子命令。
- 为关键函数增加最小回归测试(至少覆盖:关键词生成失败、mission 执行失败、导出成功)。
- 增加一个
requirements.txt,固定依赖版本,降低环境漂移问题。
运行前建议逐项确认:
.env中 DB 与 API Key 正确。- MySQL 实例可连通,目标库有权限创建/写入。
- 输入 Excel 路径、报告 JSON 路径存在。
run_script_*.py中年份与本次批次一致。- 先小样本(如 10-50 条)试跑再全量。
如果要继续完善,我建议下一步补两份文档:
docs/字段字典.md:对indicators_result各字段含义和取值规范做统一定义。docs/运行手册.md:按“日常跑批/补跑/失败重试/结果对账”给出标准操作流程。