Azure AI 文档智能是一种 Azure AI 服务,可让用户使用机器学习技术构建自动化数据处理软件。 使用文档智能,可以从文档中识别并提取文本、键值对、选择标记、表数据等内容。 结果以结构化数据的形式提供,其中包含原始文件中的关系。 容器仅处理提供给它们的数据,并仅利用它们有权访问的资源。 容器无法处理来自其他区域的数据。
以下代码示例是独立的docker compose示例,用于运行文档智能布局容器。 利用 docker compose,可以使用 YAML 文件来配置应用程序服务。 然后,通过 docker-compose up 命令基于配置创建并启动所有服务。 为布局容器实例输入 {FORM_RECOGNIZER_ENDPOINT_URI} 和 {FORM_RECOGNIZER_KEY} 值。
version: "3.9"
services:
  azure-form-recognizer-read:
    container_name: azure-form-recognizer-read
    image: mcr.microsoft.com/azure-cognitive-services/form-recognizer/read-3.1
    environment:
      - EULA=accept
      - billing={FORM_RECOGNIZER_ENDPOINT_URI}
      - apiKey={FORM_RECOGNIZER_KEY}
    ports:
      - "5000:5000"
    networks:
      - ocrvnet
networks:
  ocrvnet:
    driver: bridge
现在,则可以通过 docker compose 命令启动该服务:
docker-compose up
以下代码示例是独立的docker compose示例,用于运行常规文档容器。 利用 docker compose,可以使用 YAML 文件来配置应用程序服务。 然后,通过 docker-compose up 命令基于配置创建并启动所有服务。 为常规文档和布局容器实例输入 {FORM_RECOGNIZER_ENDPOINT_URI} 和 {FORM_RECOGNIZER_KEY} 值。
version: "3.9"
services:
  azure-cognitive-service-document:
    container_name: azure-cognitive-service-document
    image: mcr.microsoft.com/azure-cognitive-services/form-recognizer/document-3.0
    environment:
        - EULA=accept
        - billing={FORM_RECOGNIZER_ENDPOINT_URI}
        - apiKey={FORM_RECOGNIZER_KEY}
        - AzureCognitiveServiceLayoutHost=http://azure-cognitive-service-layout:5000
    ports:
      - "5000:5050"
  azure-cognitive-service-layout:
     container_name: azure-cognitive-service-layout
     image: mcr.microsoft.com/azure-cognitive-services/form-recognizer/layout-3.0
     environment:
         - EULA=accept
         - billing={FORM_RECOGNIZER_ENDPOINT_URI}
         - apiKey={FORM_RECOGNIZER_KEY}
现在,则可以通过 docker compose 命令启动该服务:
docker-compose up
鉴于计算机上的资源,常规文档容器可能需要一些时间才能启动。
以下代码示例是独立的docker compose示例,用于运行文档智能布局容器。 利用 docker compose,可以使用 YAML 文件来配置应用程序服务。 然后,通过 docker-compose up 命令基于配置创建并启动所有服务。 为布局容器实例输入 {FORM_RECOGNIZER_ENDPOINT_URI} 和 {FORM_RECOGNIZER_KEY} 值。
version: "3.9"
services:
  azure-form-recognizer-layout:
    container_name: azure-form-recognizer-layout
    image: mcr.microsoft.com/azure-cognitive-services/form-recognizer/layout-3.1
    environment:
      - EULA=accept
      - billing={FORM_RECOGNIZER_ENDPOINT_URI}
      - apiKey={FORM_RECOGNIZER_KEY}
    ports:
      - "5000:5000"
    networks:
      - ocrvnet
networks:
  ocrvnet:
    driver: bridge
现在,则可以通过 docker compose 命令启动该服务:
docker-compose up
以下代码示例是独立的docker compose示例,用于运行文档智能发票容器。 利用 docker compose,可以使用 YAML 文件来配置应用程序服务。 然后,通过 docker-compose up 命令基于配置创建并启动所有服务。 为发票和布局容器实例输入 {FORM_RECOGNIZER_ENDPOINT_URI} 和 {FORM_RECOGNIZER_KEY} 值。
必须将 3.1 GA 布局映像用作 3.0 GA 和 3.1 GA 发票模型的上游。
version: "3.9"
services:
  azure-cognitive-service-invoice:
    container_name: azure-cognitive-service-invoice
    image: mcr.microsoft.com/azure-cognitive-services/form-recognizer/invoice-3.1
    environment:
        - EULA=accept
        - billing={FORM_RECOGNIZER_ENDPOINT_URI}
        - apiKey={FORM_RECOGNIZER_KEY}
        - AzureCognitiveServiceLayoutHost=http://azure-cognitive-service-layout:5000
    ports:
      - "5000:5050"
  azure-cognitive-service-layout:
    container_name: azure-cognitive-service-layout
    image: mcr.microsoft.com/azure-cognitive-services/form-recognizer/layout-3.1
    environment:
        - EULA=accept
        - billing={FORM_RECOGNIZER_ENDPOINT_URI}
        - apiKey={FORM_RECOGNIZER_KEY}
现在,则可以通过 docker compose 命令启动该服务:
docker-compose up
以下代码示例是独立的docker compose示例,用于运行常规文档容器。 利用 docker compose,可以使用 YAML 文件来配置应用程序服务。 然后,通过 docker-compose up 命令基于配置创建并启动所有服务。 为发票和读取容器实例输入 {FORM_RECOGNIZER_ENDPOINT_URI} 和 {FORM_RECOGNIZER_KEY} 值。
可以使用 3.1 GA 布局映像代替读取映像作为上游。
version: "3.9"
services:
  azure-cognitive-service-receipt:
    container_name: azure-cognitive-service-receipt
    image: mcr.microsoft.com/azure-cognitive-services/form-recognizer/receipt-3.1
    environment:
        - EULA=accept
        - billing={FORM_RECOGNIZER_ENDPOINT_URI}
        - apiKey={FORM_RECOGNIZER_KEY}
        - AzureCognitiveServiceReadHost=http://azure-cognitive-service-read:5000
    ports:
          - "5000:5050"
    azure-cognitive-service-read:
      container_name: azure-cognitive-service-read
      image: mcr.microsoft.com/azure-cognitive-services/form-recognizer/read-3.1
      environment:
          - EULA=accept
          - billing={FORM_RECOGNIZER_ENDPOINT_URI}
          - apiKey={FORM_RECOGNIZER_KEY}
现在,则可以通过 docker compose 命令启动该服务:
docker-compose up
以下代码示例是独立的docker compose示例,用于运行常规文档容器。 利用 docker compose,可以使用 YAML 文件来配置应用程序服务。 然后,通过 docker-compose up 命令基于配置创建并启动所有服务。 为 ID 和读取容器实例输入 {FORM_RECOGNIZER_ENDPOINT_URI} 和 {FORM_RECOGNIZER_KEY} 值。
可以使用 3.1 GA 布局映像代替读取映像作为上游。
version: "3.9"
services:
  azure-cognitive-service-id-document:
      container_name: azure-cognitive-service-id-document
      image: mcr.microsoft.com/azure-cognitive-services/form-recognizer/id-document-3.1
      environment:
          - EULA=accept
          - billing={FORM_RECOGNIZER_ENDPOINT_URI}
          - apiKey={FORM_RECOGNIZER_KEY}
          - AzureCognitiveServiceReadHost=http://azure-cognitive-service-read:5000
      ports:
          - "5000:5050"
  azure-cognitive-service-read:
      container_name: azure-cognitive-service-read
      image: mcr.microsoft.com/azure-cognitive-services/form-recognizer/read-3.1
      environment:
          - EULA=accept
          - billing={FORM_RECOGNIZER_ENDPOINT_URI}
          - apiKey={FORM_RECOGNIZER_KEY}
现在,则可以通过 docker compose 命令启动该服务:
docker-compose up
version: "3.9"
services:
  azure-cognitive-service-invoice:
    container_name: azure-cognitive-service-businesscard
    image: mcr.microsoft.com/azure-cognitive-services/form-recognizer/businesscard-3.0
    environment:
        - EULA=accept
        - billing={FORM_RECOGNIZER_ENDPOINT_URI}
        - apiKey={FORM_RECOGNIZER_KEY}
        - AzureCognitiveServiceLayoutHost=http://azure-cognitive-service-layout:5000
    ports:
      - "5000:5050"
  azure-cognitive-service-layout:
    container_name: azure-cognitive-service-layout
    image: mcr.microsoft.com/azure-cognitive-services/form-recognizer/layout-3.0
    environment:
        - EULA=accept
        - billing={FORM_RECOGNIZER_ENDPOINT_URI}
        - apiKey={FORM_RECOGNIZER_KEY}
除了先决条件之外,还需要执行以下操作才能处理自定义文档:
创建一个文件夹并存储以下文件
- 将此文件夹命名为 files。
- 我们将以 {FILE_MOUNT_PATH} 形式引用此文件夹的文件路径。
- 将文件路径复制到方便的位置,需要将其添加到 .env 文件。 例如,如果文件夹名为“文件”(与 docker-compose文件位于同一文件夹中),则 .env 文件条目为FILE_MOUNT_PATH="./files"
在本地计算机上创建文件夹,用于存储由文档智能服务写入的日志
- 将此文件夹命名为 output。
- 我们将以 {OUTPUT_MOUNT_PATH} 形式引用此文件夹的文件路径。
- 将文件路径复制到方便的位置,需要将其添加到 .env 文件。 例如,如果文件夹名为“输出”(与 docker-compose文件位于同一文件夹中),则 .env 文件条目为OUTPUT_MOUNT_PATH="./output"
创建一个文件夹,用于存储容器之间共享的内部处理
- 将此文件夹命名为 shared。
- 我们将以 {SHARED_MOUNT_PATH} 形式引用此文件夹的文件路径。
- 将文件路径复制到方便的位置,需要将其添加到 .env 文件。 例如,如果文件夹名为“共享”(与 docker-compose文件位于同一文件夹中),则 .env 文件条目为SHARED_MOUNT_PATH="./share"
- 将此文件夹命名为 db。
- 我们将以 {DB_MOUNT_PATH} 形式引用此文件夹的文件路径。
- 将文件路径复制到方便的位置,需要将其添加到 .env 文件。 例如,如果文件夹名为“db”(与 docker-compose文件位于同一文件夹中),则 .env 文件条目为DB_MOUNT_PATH="./db"
创建环境文件
- 将此文件命名为 .env。 
- 声明以下环境变量: 
SHARED_MOUNT_PATH="./share"
OUTPUT_MOUNT_PATH="./output"
FILE_MOUNT_PATH="./files"
DB_MOUNT_PATH="./db"
FORM_RECOGNIZER_ENDPOINT_URI="YourFormRecognizerEndpoint"
FORM_RECOGNIZER_KEY="YourFormRecognizerKey"
NGINX_CONF_FILE="./nginx.conf"
创建一个 nginx 文件
- 将此文件命名为 nginx.conf。 
- 输入以下配置: 
worker_processes 1;
events { worker_connections 1024; }
http {
    sendfile on;
    client_max_body_size 90M;
    upstream docker-custom {
        server azure-cognitive-service-custom-template:5000;
    }
    upstream docker-layout {
        server  azure-cognitive-service-layout:5000;
    }
    server {
        listen 5000;
        location = / {
            proxy_set_header Host $host:$server_port;
            proxy_set_header Referer $scheme://$host:$server_port;
            proxy_pass http://docker-custom/;
        }
        location /status {
            proxy_pass http://docker-custom/status;
        }
        location /test {
            return 200 $scheme://$host:$server_port;
        }
        location /ready {
            proxy_pass http://docker-custom/ready;
        }
        location /swagger {
            proxy_pass http://docker-custom/swagger;
        }
        location /formrecognizer/documentModels/prebuilt-layout {
            proxy_set_header Host $host:$server_port;
            proxy_set_header Referer $scheme://$host:$server_port;
            add_header 'Access-Control-Allow-Origin' '*' always;
            add_header 'Access-Control-Allow-Headers' 'cache-control,content-type,ocp-apim-subscription-key,x-ms-useragent' always;
            add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS' always;
            add_header 'Access-Control-Expose-Headers' '*' always;
            if ($request_method = 'OPTIONS') {
                return 200;
            }
            proxy_pass http://docker-layout/formrecognizer/documentModels/prebuilt-layout;
        }
        location /formrecognizer/documentModels {
            proxy_set_header Host $host:$server_port;
            proxy_set_header Referer $scheme://$host:$server_port;
            add_header 'Access-Control-Allow-Origin' '*' always;
            add_header 'Access-Control-Allow-Headers' 'cache-control,content-type,ocp-apim-subscription-key,x-ms-useragent' always;
            add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, DELETE' always;
            add_header 'Access-Control-Expose-Headers' '*' always;
            if ($request_method = 'OPTIONS') {
                return 200;
            }
            proxy_pass http://docker-custom/formrecognizer/documentModels;
        }
        location /formrecognizer/operations {
            add_header 'Access-Control-Allow-Origin' '*' always;
            add_header 'Access-Control-Allow-Headers' 'cache-control,content-type,ocp-apim-subscription-key,x-ms-useragent' always;
            add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE, PATCH' always;
            add_header 'Access-Control-Expose-Headers' '*' always;
            if ($request_method = OPTIONS ) {
                return 200;
            }
            proxy_pass http://docker-custom/formrecognizer/operations;
        }
    }
}
 创建 docker 编译文件
- 将此文件命名为 docker-compose.yml 
- 以下代码示例是独立的 - docker compose示例,可以同时运行文档智能布局、Studio 和自定义模板容器。 利用- docker compose,可以使用 YAML 文件来配置应用程序服务。 然后,通过- docker-compose up命令基于配置创建并启动所有服务。
 
version: '3.3'
services:
  nginx:
    image: nginx:alpine
    container_name: reverseproxy
    depends_on:
      - layout
      - custom-template  
    volumes:
      - ${NGINX_CONF_FILE}:/etc/nginx/nginx.conf
    ports:
      - "5000:5000"
  layout:
    container_name: azure-cognitive-service-layout
    image: mcr.microsoft.com/azure-cognitive-services/form-recognizer/layout-3.1:latest
    environment:
      eula: accept
      apikey: ${FORM_RECOGNIZER_KEY}
      billing: ${FORM_RECOGNIZER_ENDPOINT_URI}
      Logging:Console:LogLevel:Default: Information
      SharedRootFolder: /share
      Mounts:Shared: /share
      Mounts:Output: /logs
    volumes:
      - type: bind
        source: ${SHARED_MOUNT_PATH}
        target: /share
      - type: bind
        source: ${OUTPUT_MOUNT_PATH}
        target: /logs
    expose:
      - "5000"
  custom-template:
    container_name: azure-cognitive-service-custom-template
    image: mcr.microsoft.com/azure-cognitive-services/form-recognizer/custom-template-3.1:latest
    restart: always
    depends_on:
      - layout
    environment:
      AzureCognitiveServiceLayoutHost: http://azure-cognitive-service-layout:5000
      eula: accept
      apikey: ${FORM_RECOGNIZER_KEY}
      billing: ${FORM_RECOGNIZER_ENDPOINT_URI}
      Logging:Console:LogLevel:Default: Information
      SharedRootFolder: /share
      Mounts:Shared: /share
      Mounts:Output: /logs
    volumes:
      - type: bind
        source: ${SHARED_MOUNT_PATH}
        target: /share
      - type: bind
        source: ${OUTPUT_MOUNT_PATH}
        target: /logs
    expose:
      - "5000"
  studio:
    container_name: form-recognizer-studio
    image: mcr.microsoft.com/azure-cognitive-services/form-recognizer/studio:3.0
    environment:
      ONPREM_LOCALFILE_BASEPATH: /onprem_folder
      STORAGE_DATABASE_CONNECTION_STRING: /onprem_db/Application.db
    volumes:
      - type: bind
        source: ${FILE_MOUNT_PATH} # path to your local folder
        target: /onprem_folder
      - type: bind
        source: ${DB_MOUNT_PATH} # path to your local folder
        target: /onprem_db
    ports:
      - "5001:5001"
    user: "1000:1000" # echo $(id -u):$(id -g)
自定义模板容器和布局容器可以使用 Azure 存储队列或内存队列。 仅当使用 Azure 存储队列时,才需要设置 Storage:ObjectStore:AzureBlob:ConnectionString 和 queue:azure:connectionstring 环境变量。 在本地运行时,请删除这些变量。
确保该服务正在运行
确保该服务已启动并正在运行。 在 Ubuntu shell 中运行这些命令。
$cd <folder containing the docker-compose file>
$source .env
$docker-compose up
自定义模板容器需要几个不同的配置,并支持其他可选配置。
| 设置 | 必需 | 说明 | 
| EULA | 是 | 许可证接受示例:Eula=accept | 
| 计费 | 是 | FR 资源的计费终结点 URI | 
| ApiKey | 是 | FR 资源的终结点密钥 | 
| Queue:Azure:ConnectionString | 否 | Azure 队列连接字符串 | 
| Storage:ObjectStore:AzureBlob:ConnectionString | 否 | Azure Blob 连接字符串 | 
| HealthCheck:MemoryUpperboundInMB | 否 | 用于报告运行不正常的内存阈值。 默认值:与建议的内存相同 | 
| StorageTimeToLiveInMinutes | 否 | 删除所有中间文件和最终文件的 TTL持续时间。 默认值:两天,TTL可设置的值为 5 分钟到 7 天 | 
| Task:MaxRunningTimeSpanInMinutes | 否 | 将请求视为超时的最大运行时间。 默认值:60 分钟 | 
| HTTP_PROXY_BYPASS_URLS | 否 | 指定绕过代理的 URL 示例:HTTP_PROXY_BYPASS_URLS = abc.com,xyz.com | 
| AzureCognitiveServiceReadHost (收据,仅 IdDocument 容器) | 是 | 指定读取容器 uri 示例:AzureCognitiveServiceReadHost=http://onprem-frread:5000 | 
| AzureCognitiveServiceLayoutHost (文档,仅发票容器) | 是 | 指定布局容器 uri 示例:AzureCognitiveServiceLayoutHost=http://onprem-frlayout:5000 | 
使用文档智能工作室训练模型
- 收集至少有五个相同类型的表单。 使用此数据训练模型并测试表单。 可使用示例数据集(下载并提取 sample_data.zip)。 
- 确认容器正在运行后,打开浏览器并导航到部署了容器的终结点。 如果此部署是本地计算机,则终结点为 - [http://localhost:5001](http://localhost:5001)。
 
- 选择自定义提取模型磁贴。 
- 选择- Create project选项
 
- 提供项目名称和说明(可选) 
- 在“配置资源”步骤中,提供自定义模板模型的终结点。 如果在本地计算机上部署了容器,请使用此 URL - [http://localhost:5000](http://localhost:5000)。
 
- 为训练数据在 files 文件夹中的位置提供子文件夹。 
- 最后,创建项目 
现在应已创建了一个项目,并准备好进行标记。 上传训练数据并开始标记。 如果你不熟悉标记,请参阅生成和训练自定义模型。
使用 API 进行训练
如果打算直接调用 API 来训练模型,则自定义模板模型训练 API 需要 base64 编码的 zip 文件,该文件是标记项目的内容。 可以省略 PDF 或图像文件,并仅提交 JSON 文件。
标记数据并将 *.ocr.json、*.labels.json 和 fields.json 文件添加到 zip 后,请使用 PowerShell 命令生成 base64 编码的字符串。
$bytes = [System.IO.File]::ReadAllBytes("<your_zip_file>.zip")
$b64String = [System.Convert]::ToBase64String($bytes, [System.Base64FormattingOptions]::None)
使用生成模型 API 发布请求。
POST http://localhost:5000/formrecognizer/documentModels:build?api-version=2023-07-31
{
    "modelId": "mymodel",
    "description": "test model",
    "buildMode": "template",
    "base64Source": "<Your base64 encoded string>",
    "tags": {
       "additionalProp1": "string",
       "additionalProp2": "string",
       "additionalProp3": "string"
     }
}
 
容器需要计费参数值才能运行。 这些值使容器可以连接到计费终结点。 容器约每 10 到 15 分钟报告一次使用情况。 如果容器未在允许的时间范围内连接到 Azure,容器将继续运行,但不会为查询提供服务,直到计费终结点恢复。 尝试连接按 10 到 15 分钟的相同时间间隔进行 10 次。 如果无法在 10 次尝试内连接到计费终结点,容器会停止处理请求。