1. 项目背景与需求分析
在职业技能等级鉴定考试场景中,考评文档通常包含复杂的表格结构,如"考评内容结构表"和多个"试题表"。传统的人工解析方式效率低下,且容易出错。我们团队最近接到一个需求:将职业技能鉴定考试文档中的表格信息自动提取并转换为结构化JSON数据。
这个需求的核心痛点在于:
- 文档中的表格具有多级表头结构(如模块→试题→考核项目)
- 需要从后续试题表格中提取考核内容、考核要点等详细信息
- 输出格式必须严格遵循给定的JSON模板规范
2. 技术选型与方案设计
2.1 大模型选择
我们最终选择了阿里云的QWEN-LONG大模型,主要基于以下考虑:
- 长文本处理能力:QWEN-LONG支持超长上下文(最高达10万tokens),非常适合处理包含多个表格的文档
- 文档解析专长:相比通用模型,QWEN-LONG在表格识别和结构化提取方面表现更优
- API兼容性:提供与OpenAI兼容的接口,便于集成到现有系统中
提示:如果预算充足,可以考虑性能更强的Qwen-Doc-Turbo版本,处理速度更快,但成本也更高。
2.2 系统架构设计
整个解决方案的架构分为三个核心模块:
- 文档上传模块:将用户上传的Word/PDF文档传至阿里云百炼平台
- 大模型交互模块:通过精心设计的prompt指导模型解析文档
- 结果处理模块:对模型输出进行清洗和格式校验
mermaid复制graph TD
A[用户上传文档] --> B[文档上传至阿里云]
B --> C[构造prompt调用大模型]
C --> D[获取并处理JSON结果]
D --> E[返回结构化数据]
3. 核心实现细节
3.1 文档上传实现
文档上传采用阿里云百炼的OpenAI兼容接口,关键代码如下:
java复制// 创建客户端
OpenAIClient client = OpenAIOkHttpClient.builder()
.apiKey(System.getenv("DASHSCOPE_API_KEY"))
.baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1")
.build();
// 上传文件
Path filePath = Paths.get("阿里云百炼系列手机产品介绍.docx");
FileCreateParams fileParams = FileCreateParams.builder()
.file(filePath)
.purpose(FilePurpose.of("file-extract"))
.build();
FileObject fileObject = client.files().create(fileParams);
String fileID = fileObject.id(); // 获取文件ID
注意事项:
- 文件大小限制为150MB以内
- 支持格式:.docx和.pdf
- 上传后务必保存fileID,这是后续对话的关键
3.2 Prompt设计艺术
Prompt的质量直接决定输出效果,我们的prompt包含以下关键要素:
java复制String prompt = "读取到的附件是职业技能等级鉴定实操技能考试的题库...";
// 完整prompt见原始代码
设计要点:
- 明确层级关系:清晰定义"模块→试题→考核项目"的三级结构
- 字段约束:严格规定JSON字段名称(必须使用中文)
- 特殊处理说明:如评分标准需要拆分为"标准"和"分值"对象数组
- 错误预防:强调"不能添加模板中没有的字段"
3.3 模型调用与结果处理
核心调用逻辑:
java复制ChatCompletionCreateParams chatParams = ChatCompletionCreateParams.builder()
.addSystemMessage("你是一名专业的文档解析专家...")
.addSystemMessage("fileid://" + fileID)
.addUserMessage(prompt)
.model("qwen-long")
.build();
// 流式获取结果
StringBuilder fullResponse = new StringBuilder();
try (StreamResponse<ChatCompletionChunk> streamResponse =
client.chat().completions().createStreaming(chatParams)) {
// 处理流式响应...
}
// 结果清洗
String json = fullResponse.toString()
.replace("json", "")
.replace("```", "");
4. 实战问题与解决方案
4.1 常见错误排查
| 错误现象 | 可能原因 | 解决方案 |
|---|---|---|
| 返回JSON字段名变成英文 | Prompt约束力不足 | 在prompt中强调"必须使用中文键名" |
| 缺少某些字段 | 文档表格结构不规范 | 添加字段存在性检查,缺失时设为空字符串 |
| 文件上传失败 | 超过150MB限制 | 前端增加文件大小校验 |
4.2 性能优化技巧
- 文件清理策略:每次处理完成后主动删除云端文件
java复制FileDeleteParams params = FileDeleteParams.builder()
.fileId(fileID)
.build();
client.files().delete(params);
-
缓存机制:对相同文件内容进行MD5校验,避免重复处理
-
超时控制:设置合理的socketTimeout和connectTimeout
5. 完整代码结构
项目采用Spring Boot架构,主要类说明:
code复制├── ReviewWordAction.java // 控制器层
├── ReviewWordService.java // 业务逻辑层
├── FileService.java // 文件处理服务
└── config/
└── QwenConfig.java // 大模型配置
核心业务流程:
- 用户上传文档
- 校验文件格式和大小
- 调用阿里云API上传文档
- 构造prompt调用大模型
- 处理并返回JSON结果
6. 效果展示与验证
成功解析后的JSON结构示例:
json复制{
"工种": "广告设计师",
"级别": "三级/高级工",
"模块": [
{
"模块名称": "创意设计",
"考核权重": "45",
"考试时间": "30",
"考核形式": "实操/笔试",
"试题": [
{
"名称": "绘制草图",
"选考方式": "必考",
"考核项目": [
{
"序号": 1,
"考核内容": "职业素养",
"考核要点": "衣着要符合工作岗位要求...",
"配分": "2",
"评分标准": [
{"标准": "衣着是否符合工作岗位要求", "分值": "1"}
]
}
]
}
]
}
]
}
验证要点:
- 检查层级关系是否正确
- 验证所有必填字段是否存在
- 确认评分标准是否按要求拆分
7. 扩展应用场景
该方案稍作调整即可应用于:
- 标准化考试试卷分析
- 企业技能评估文档处理
- 培训课程大纲结构化
未来优化方向:
- 增加对扫描件PDF的OCR支持
- 实现批量文档自动处理
- 开发可视化结果校验工具
通过这个项目,我们验证了大模型在文档结构化处理中的强大能力。关键在于三点:清晰的prompt设计、严格的输出约束和合理的结果校验机制。在实际应用中,这种方案相比传统规则引擎,开发效率提升了5倍以上,准确率也达到了95%+。