AI 慧眼功能指南

AI 慧眼是基于视觉大模型的智能 OCR(光学字符识别)系统,通过 AI 模型的视觉理解能力,实现非标准化图片的结构化数据提取。相比传统 OCR 接口,AI 慧眼具有更强的灵活性和适应性,可自定义识别字段,适用于各类票据、证件、表单等场景。

核心优势

支持自定义字段提取、灵活的模板配置、可视化标注编辑、双模型协同识别

OCR功能入口

快速开始

前置准备

系统需要配置两类 AI 模型:

模型类型作用推荐模型
视觉模型识别图片中的文字内容Qwen-VL、GPT-4V、Claude-3
聊天模型结构化数据提取(高级模式)GPT-4、Claude-3.5、Qwen-Plus
模型配置

在使用 AI 慧眼前,请先在「模型管理」中配置好视觉模型和聊天模型

使用流程

创建 OCR 配置

以营业执照识别为例:

  1. 点击「新增」按钮
  2. 填写基本信息
字段说明示例
标题OCR 配置名称营业执照识别
描述识别内容说明从给定的图片中获取企业名称、成立时间信息
新增 OCR 配置

配置识别模板

维护底图界面
  1. 上传底图

上传与待识别图片类似的模板图(如营业执照样本)

上传底图
  1. 定义字段

在底图上标注需要提取的字段区域

字段定义界面

支持的字段类型:

  • 文本字段(String)
  • 布尔字段(Boolean)
  • 自定义类型
  1. 测试解析

上传实际图片进行测试,验证识别效果

测试解析结果

技术架构

前端实现

前端页面位于 pigx-ui-pro/src/views/knowledge/ocr/,采用卡片列表展示 OCR 配置。

核心组件

主页面 (index.vue)

卡片式展示所有 OCR 配置,支持:

  • 查看已标注的字段信息
  • 编辑底图和字段配置
  • 测试图片识别
  • 导出配置

可视化标注页面 (KonvaPage.vue)

基于分屏布局实现图片标注功能:

// 图片缩放和旋转
function handleWheel(event: WheelEvent) {
  const delta = -Math.sign(event.deltaY) * SCALE_FACTOR
  const newScale = scale.value + delta
  // 限制缩放范围 0.1 - 10
  scale.value = Math.max(MIN_SCALE, Math.min(MAX_SCALE, newScale))
}

function rotateImage(angle: number) {
  rotation.value = (rotation.value + angle + 360) % 360
}

控制面板 (components/ControlPanel.vue)

  • 保存配置按钮
  • 解析图片按钮
  • 清空底图按钮
  • 高级解析模式切换

数据展示 (components/DataDisplay.vue)

  • 字段列表展示
  • 添加/编辑/删除字段
  • 字段类型选择

API 接口定义

// src/api/knowledge/ocr.ts

// 分页查询 OCR 配置列表
export function fetchList(query?: Object) {
  return request({
    url: '/knowledge/ocr/page',
    method: 'get',
    params: query,
  })
}

// 解析图片
export function parseObj(obj?: Object) {
  return request({
    url: '/knowledge/ocr/parse',
    method: 'post',
    data: obj,
    timeout: 100000, // 100秒超时
  })
}

// 新增配置
export function addObj(obj?: Object) {
  return request({
    url: '/knowledge/ocr',
    method: 'post',
    data: obj,
  })
}

后端实现

后端服务位于 pigx-knowledge 模块,支持两种识别模式。

请求处理流程

graph LR
  A[前端上传图片] --> B[AiOcrConfController]
  B --> C[AiOcrConfService]
  C --> D{识别模式}
  D -->|普通模式| E[视觉模型直接识别]
  D -->|高级模式| F[视觉模型OCR]
  F --> G[聊天模型结构化]
  E --> H[JSONRepairUtil修复]
  G --> H
  H --> I[返回JSON结果]

核心代码

控制器 (AiOcrConfController.java)

@PostMapping("/parse")
@HasPermission("knowledge_ocr_add")
public R parse(@RequestBody AiOcrConfEntity aiOcrConf) {
  return aiOcrConfService.parseImage(aiOcrConf);
}

服务层 (AiOcrConfServiceImpl.java)

识别逻辑分为两种模式:

1. 普通模式(依赖视觉模型的结构化能力)

if (YesNoEnum.NO.getCode().equals(aiOcrConf.getHigherAnalyze())) {
  // 构建 JSON Schema 用户消息
  UserMessage userJsonMessage = UserMessage.from(
    PromptBuilder.render(OCR_IMAGE_USER_JSON,
      Map.of("jsonSchema", getJsonSchema(aiOcrConf, fieldDTOList))
    )
  )

  // 使用视觉模型进行 OCR 识别
  Pair<ChatModel, AiAssistantService> visionModel =
    modelProvider.getAiVisionAssistant()
  ChatResponse response = visionModel.getKey()
    .chat(systemMessage, userJsonMessage, userMessage)

  // 修复 JSON 格式
  return R.ok(JSONRepairUtil.repair(response.aiMessage().text()))
}

2. 高级模式(双模型协同)

// 第一步:视觉模型进行 OCR 文字识别
Pair<ChatModel, AiAssistantService> visionModel =
  modelProvider.getAiVisionAssistant()
ChatResponse ocrResponse = visionModel.getKey()
  .chat(systemMessage, userMessage)

// 第二步:文本模型按 JSON Schema 提取结构化数据
Triple<ChatModel, AiAssistantService, String> jsonModel =
  modelProvider.getAiJSONAssistant(aiOcrConf.getChatModelName())

ChatResponse structuredResponse = jsonModel.getLeft()
  .chat(buildChatRequest(confEntity, ocrResponse.aiMessage().text(),
    fieldDTOList, jsonModel.getRight()))

return R.ok(JSONRepairUtil.repair(structuredResponse.aiMessage().text()))
双模型协同优势

高级模式将 OCR 识别和结构化提取分离,可以使用不同模型的优势,提高识别准确率和字段提取精度

JSON Schema 构建

系统根据用户定义的字段自动构建 JSON Schema:

private JsonSchema getJsonSchema(AiOcrConfEntity confEntity,
    List<LlmOCRFieldDTO> fieldDTOList) {
  JsonObjectSchema.Builder builder = JsonObjectSchema.builder()
    .description(confEntity.getOcrPrompt())

  // 遍历字段列表构建 Schema
  fieldDTOList.forEach(field -> {
    if ("Boolean".equals(field.getType())) {
      builder.addBooleanProperty(field.getKey(), field.getDescription())
    } else {
      builder.addStringProperty(field.getKey(), field.getDescription())
    }
  })

  return builder.build()
}

提示词模板

OCR 系统提示词 (ocr-image.st)

你是一个专业的 OCR 文字识别助手。 请仔细识别图片中的所有文字内容。

OCR 用户 JSON 提示词 (ocr-image-user-json.st)

请从图片中提取以下字段信息,严格按照 JSON Schema 格式返回: {jsonSchema}

OCR 系统 JSON 提示词 (ocr-system-json.st)

你是一个数据提取专家,擅长从文本中提取结构化数据。 请严格按照 JSON Schema 格式输出结果。

进阶功能

高级解析模式

使用单一视觉模型完成识别和结构化,速度快,成本低,适合字段简单的场景

切换方式:在字段配置界面开启「高级解析」开关

字段类型支持

类型说明示例
String文本字段企业名称、地址、联系方式
Boolean布尔字段是否盖章、是否过期

应用场景

营业执照识别

  • 企业名称
  • 统一社会信用代码
  • 法定代表人
  • 成立日期
  • 经营范围

身份证识别

  • 姓名
  • 身份证号
  • 性别
  • 民族
  • 出生日期
  • 住址

发票识别

  • 发票代码
  • 发票号码
  • 开票日期
  • 金额
  • 税额

表单识别

  • 自定义表单字段
  • 手写体识别
  • 表格数据提取

常见问题

识别结果不准确

优化建议
  1. 上传清晰的高分辨率图片
  2. 确保底图模板与实际图片相似
  3. 使用高级解析模式提高准确率
  4. 在字段描述中添加更详细的说明

JSON 格式错误

系统内置 JSONRepairUtil 自动修复常见格式问题,如:

  • 缺少引号
  • 多余逗号
  • 括号不匹配

解析超时

超时处理

默认超时时间为 100 秒,如遇大图片或复杂识别可能超时,建议:

  • 压缩图片大小(推荐 2MB 以内)
  • 使用更快的模型
  • 减少识别字段数量

模型选择建议

场景视觉模型聊天模型说明
简单票据Qwen-VL-普通模式即可
复杂证件GPT-4VGPT-4高级模式,提高准确率
手写表单Claude-3Claude-3.5手写识别能力强
批量处理Qwen-VLQwen-Plus成本优化