当前健康报告(菌群检测 PDF)解析在 Java 侧通过 PdfParseService(PDFBox + 规则解析)实现,但存在以下问题:
StringIndexOutOfBoundsExceptionextract_full_report_v5.py 覆盖 13 个分组,Java 版只有 8 个用户上传 PDF
↓
Java HealthReportController
├─ 保存文件到磁盘
├─ 调 LangGraph /api/v1/report/parse
└─ 返回结构化数据给前端
↓
LangGraph report_parse_agent
├─ Python 算法解析(复用 extract_full_report_v5.py)
│ ├─ 成功 → 返回结构化 JSON
│ └─ 失败 → LLM 兜底解析
└─ 返回结构化数据给 Java
HealthReportController)/tmp/uploads/ 或配置路径)/api/v1/report/parse)ParsedReportPayload.Payloadreport_parse_agent)extract_full_report_v5.py 提取核心逻辑)POST /api/v1/report/parse
Content-Type: application/json
Request:
{
"file_path": "/tmp/uploads/xxx.pdf",
"family_id": 123,
"user_id": 456
}
Response:
{
"code": 200,
"data": {
"summary": { ... },
"disease_risks": [ ... ],
"indicators": [ ... ],
"gut_flora": [ ... ],
"probiotic_species": [ ... ],
"food_suitability": [ ... ],
"extracted_name": "某人",
"extracted_gender": "male",
"extracted_age": 53
}
}
Java HealthReportController.parsePreview()POST /api/v1/report/parse?file_path=...extract_full_report_v5.py 核心逻辑)
b. 算法成功 → 返回结构化数据
c. 算法失败 → 调用 LLM(GPT-4o 等)提取结构化数据ParsedReportPayload.Payload,后续流程不变从 extract_full_report_v5.py 提取核心逻辑,封装为可调用的 Python 函数:
def parse_report_pdf(file_path: str) -> dict:
"""解析菌群报告 PDF,返回结构化数据"""
# 1. 读取 PDF 文本(PyPDF2)
# 2. 检测格式(triplet / inline)
# 3. 提取各分组数据
# 4. 返回统一格式字典
当算法解析失败时(返回空数据或关键字段缺失),调用 LLM:
async def parse_with_llm(file_path: str) -> dict:
"""LLM 兜底解析"""
# 1. 提取 PDF 文本
# 2. 构造 prompt,要求 LLM 按指定 JSON Schema 输出
# 3. 解析 LLM 输出
# 4. 返回结构化数据
report_parse_agent(算法 + LLM 兜底)POST /api/v1/report/parse 接口HealthReportController.parsePreview(),先调 LangGraph,失败时回退到本地 Java 解析PdfParseService