本项目处理金融类 PDF、Word、Excel 和 CSV:先抽取通用 query 并检索 Top 20, 再由 Pi CLI 通过自定义工具和 Skill 选择最终附件、生成辅助文件并反向构建题目, 最后生成并验收 Golden Solution。
代码按负责人拆成三个可独立运行的阶段:
workflows/
├── stage1_query_retrieval/ # 负责人 A:query + Top 20
│ ├── run.py
│ ├── rename_attachments.py
│ └── README.md
├── stage2_task_builder/ # 负责人 B:Pi CLI 选附件和反向出题
│ ├── run.py
│ ├── prepare_workspace.py
│ ├── run_pi_task.sh
│ ├── pi_tool_backend.py
│ ├── pi-agent/ # 自定义模型、Extension 和 Skill
│ ├── validate_task_output.py
│ └── README.md
└── stage3_golden_solution/ # 负责人 C:Golden Solution
├── run.py
├── run_pi_golden_solution.sh
├── validate_golden_solution.py
└── README.md
阶段之间只通过文件交接,不导入其他阶段的实现:
- Stage 1 输出
queries.json和retrieval/manifest.json。 - Stage 2 读取检索清单,输出
task_NNN/final/。 - Stage 3 读取最终题目与附件,输出
task_NNN/golden solution/。
详细输入输出契约见 workflows/README.md 和各阶段 README。
scripts/run_end_to_end.py 仅负责依次调用三个公共入口,不放阶段业务逻辑。
腾讯_GDPval金法医/
├── data/
│ └── source_documents/ # 本地原始文件,不上传 Git
├── financial-analysis/ # 六个真实 Word/Excel 结构模板
├── financial-analysis-report-skill/ # 自然财务写作与 Word 生成 Skill
├── prompts/ # Stage 1/3 中文提示词
├── src/finance_forensics/ # 文档抽取、编目、query 和检索核心库
├── workflows/ # 三个隔离工作流
├── scripts/
│ └── run_end_to_end.py # 跨阶段总编排器
├── tests/
├── docs/
└── output/ # 全部业务输出
data/source_documents/ 用于在本地存放原始文件。Git 仓库只提交该
目录的 .gitkeep 占位文件,不上传原始文档。
现有 output/tasks/task_001、task_002 及其最终产物保持原位置不变。
cd /home/ghpan/project/腾讯_GDPval金法医
source .venv/bin/activateInferera Base URL、模型和 API 密钥从权限为 600 的 .env 读取。Stage 2
和 Stage 3 的 Pi CLI 均使用 .env 中配置的模型;密钥不写入 Skill、
提示词、代码或输出。
粗 query 生成会读取对应源文件的正文抽样,默认使用独立的
QUERY_LLM_TEMPERATURE=0.7 增加题目方向差异;LLM_TEMPERATURE 仍用于
文档编目,二者互不影响。检索前由同一 Inferera 模型为每条 query 动态提取
关键词,默认使用 KEYWORD_LLM_TEMPERATURE=0.1。
Stage 1 和 Stage 3 的提示词集中在 prompts/:
文档编目.md文档编目输入模板.md通用查询生成.md通用查询输入模板.md检索关键词提取.md检索关键词输入模板.mdClaude黄金答案生成.md
Stage 2 的规则已经迁入
workflows/stage2_task_builder/pi-agent/skills/gdpval-task-builder/SKILL.md。
# 查看输入,不调用模型
finance-forensics inventory
# 本地抽取单个文件,不调用模型
finance-forensics inspect data/source_documents/0001_20220309110518725.pdf
# 显式执行全量编目
finance-forensics run --workers 4编目输出位于 output/catalog/document_catalog.json 和 .jsonl。
从一个或多个已编目文件生成通用 query,再进行检索:
.venv/bin/python workflows/stage1_query_retrieval/run.py \
--source-file 0050_54e6ee7d4a7c74b71d8ea7502bfc5416.pdf \
--output-dir output/stage1_query_retrieval使用已有 query JSON:
.venv/bin/python workflows/stage1_query_retrieval/run.py \
--queries output/queries/query_test.json \
--output-dir output/stage1_query_retrieval使用本地完整编目检索:
.venv/bin/python workflows/stage1_query_retrieval/run.py \
--queries output/queries/query_test.json \
--catalog output/catalog/catalog/document_catalog.json \
--input-dir data/unzip_202607282110_source_documents/source_documents \
--output-dir output/stage1_query_retrieval_full从全量 query 中按语义多样性随机抽样,再为每条检索 Top 20:
.venv/bin/python workflows/stage1_query_retrieval/select_diverse_queries.py \
--input output/queries_satge1/full_corpus/queries.json \
--output output/stage1_query_retrieval_200/queries.json \
--manifest output/stage1_query_retrieval_200/selection_manifest.json \
--count 200 \
--seed 20260729
.venv/bin/python workflows/stage1_query_retrieval/run.py \
--queries output/stage1_query_retrieval_200/queries.json \
--catalog output/catalog/catalog/document_catalog.json \
--input-dir data/unzip_202607282110_source_documents/source_documents \
--output-dir output/stage1_query_retrieval_200 \
--workers 100 \
--resume抽样使用固定随机种子和随机化最远点算法,在保留随机性的同时降低所选
query 之间的语义相似度。检索结果会按内容 document_id 去重,保证每组
包含 20 份不同文档。
输出:
output/stage1_query_retrieval/
├── queries.json
└── retrieval/
├── query_keywords.json
├── manifest.json
└── query_NNN/files/ # 每条 query 恰好 20 个候选
检索只使用两类信号:完整 query 与 catalog summary 的中文向量相似度,以及
大模型动态提取关键词与文档摘要、业务主题和编目关键词的字符短语匹配。默认
权重分别为 0.75 和 0.25;不使用固定题型词表、文档类型加权或生成式
大模型逐个阅读候选文件。
首次运行安装固定版本的 Pi CLI:
npm ci --ignore-scripts.venv/bin/python workflows/stage2_task_builder/run.py \
--manifest output/stage1_query_retrieval/retrieval/manifest.json \
--tasks-dir output/tasks只准备工作区、暂不调用 Pi:
.venv/bin/python workflows/stage2_task_builder/run.py \
--manifest output/stage1_query_retrieval/retrieval/manifest.json \
--tasks-dir output/tasks \
--task-index 2 \
--stop-after prepare每题只访问自己的20个候选文件。Pi 先比较并保存题目方向,再选择候选,并生成
且实际选用1至3个辅助附件;最终固化10至17个 attachments 后,按最终顺序
重新编号,
再分别反向编写 workflow.md 和 query。Pi 禁用通用 shell/write/edit,只能
调用 Stage 2 的受控工具。workflow 至少包含12个工作步骤;query 固定为
“任务背景、具体任务、交付要求”三段,其中“具体任务”只能用一个整体叙述
段落,不列步骤或具体分析方法,交付文件不超过5个。
合成附件生成前,Pi 必须读取财务报告 Skill 和真实模板资源清单。每个合成文件 记录模板 ID 与适配理由;工具只借鉴结构、版式、sheet 分层和职业文档习惯, 不复制模板中的主体、数据或结论。
验收已有题目:
.venv/bin/python workflows/stage2_task_builder/validate_task_output.py \
--workspace output/tasks \
--task 002.venv/bin/python workflows/stage3_golden_solution/run.py \
--tasks-dir output/tasks \
--task-index 2Stage 3 同时加载 Golden Solution Skill 与财务分析报告 Skill,按真实模板组织 Word/Excel 文件,并实际创建 query 指定的交付物。校验覆盖文件可打开性、内容 完整性、Excel 公式、来源追踪、模板使用记录和哈希。验收已有结果:
.venv/bin/python workflows/stage3_golden_solution/validate_golden_solution.py \
--workspace output/tasks \
--task 002总编排器只是依次运行三个阶段:
.venv/bin/python scripts/run_end_to_end.py \
--queries output/queries/query_test.json \
--run-id finance_batch_001也可以从单条 query 或源文件开始:
.venv/bin/python scripts/run_end_to_end.py \
--query "需要分析的初始金融工作任务" \
--run-id finance_single_001
.venv/bin/python scripts/run_end_to_end.py \
--source-file 0050_54e6ee7d4a7c74b71d8ea7502bfc5416.pdf \
--run-id finance_source_001新运行目录:
output/pipeline_runs/<run_id>/
├── stage1/
│ ├── queries.json
│ └── retrieval/
├── stage2/
│ └── tasks/
└── pipeline_manifest.json
Stage 3 的结果写在 stage2/tasks/task_NNN/golden solution/,与对应题目保持
在同一个任务目录。中断后使用相同参数并增加 --resume。可用
--stop-after stage1|stage2|stage3 或 --dry-run 控制执行。
.venv/bin/pytest -q