Бөлісу құралы:


Включение обработки документов с помощью Azure Cognitive Services

Использование Azure Cognitive Services

Azure Cognitive Services — это набор облачных API, которые можно использовать в приложениях ИИ и потоках данных. Он предоставляет предварительно обученные модели, которые готовы к использованию в приложениях, не требуя данных и обучения моделей с вашей стороны. Их можно легко интегрировать в приложения с помощью интерфейсов REST HTTP.

Вы уже узнали, как использовать веб-перехватчики с приложением для получения уведомлений при каждом обновлении существующего файла или отправке нового файла в учебнике Использование веб-перехватчиков. В этом руководстве рассматривается подключение к Azure Cognitive Services для извлечения данных из счетов.

Чтобы настроить автоматическую обработку ИИ в текущем приложении SharePoint после изменения в контейнере, выполните следующие действия :

  1. Получение разностных изменений контейнера. В настоящее время вы можете получать уведомление о любых изменениях в нашем контейнере. Теперь вы получите добавленные или обновленные файлы.
  2. Вызовите API службы аналитики документов Azure Cognitive Services. Вам потребуется создать ресурс ИИ Azure, чтобы использовать API для извлечения полей из образа и получения извлеченных файлов. Вы можете хранить их, как показано в этом руководстве, или обрабатывать их по мере того, как вам нравится. схема обработки документов

Совет

Дополнительные сведения об API Microsoft Graph, используемых в этом руководстве, см. в разделах Отслеживание изменений для диска, Получение ресурса DriveItem и Отправка или замена содержимого DriveItem.

Получение разностных изменений контейнера

Откройте GraphProvider.ts и реализуйте метод getDriveChanges для получения списка измененных элементов:

public static async getDriveChanges(driveId: string): Promise<any[]> {
  let changedItems: any[] = [];
  const driveDeltaBasePath: string = `/drives/${driveId}/items/root/delta`;
  let driveDeltaTokenParams: string = "";
  let hasMoreChanges: boolean = true;
  try{
    do {
      if (this.changeTokens.has(driveId)) {
        driveDeltaTokenParams = `?token=${this.changeTokens.get(driveId)}`
      }
      const response = await this.graphClient.api(driveDeltaBasePath + driveDeltaTokenParams).get();
      changedItems.push(...response.value);
      if (response['@odata.nextLink']) {
        const token = new URL(response['@odata.nextLink']).searchParams.get('token');
        this.changeTokens.set(driveId, token);
      } else {
        hasMoreChanges = false;
        const token = new URL(response['@odata.deltaLink']).searchParams.get('token');
        this.changeTokens.set(driveId, token);
      }
      console.log(this.changeTokens.get(driveId));
    } while (hasMoreChanges);
  }
  catch(err){
    console.log(err);
  }
  return changedItems;
}

Реализуйте метод getDriveItem для получения файла из контейнера:

public static async getDriveItem(driveId: string, itemId: string): Promise<any> {
  return await this.graphClient.api(`/drives/${driveId}/items/${itemId}`).get();
}

Создайте файл ReceiptProcessor.ts и реализуйте метод processDrive:

export abstract class ReceiptProcessor {

  public static async processDrive(driveId: string): Promise<void> {
    const changedItems = await GraphProvider.getDriveChanges(driveId);
    for (const changedItem of changedItems) {
      try {
        const item = await GraphProvider.getDriveItem(driveId, changedItem.id);
        const extension = this.getFileExtension(item.name);
        if (this.SUPPORTED_FILE_EXTENSIONS.includes(extension.toLowerCase())) {
          console.log(item.name);
          const url = item["@microsoft.graph.downloadUrl"];
          const receipt = await this.analyzeReceiptStream(await this.getDriveItemStream(url));
          const receiptString = JSON.stringify(receipt, null, 2)
          const fileName = this.getFileDisplayName(item.name) + "-extracted-fields.json";
          const parentId = item.parentReference.id;
          await GraphProvider.addDriveItem(driveId, parentId, fileName, receiptString);
        }
      } catch (error) {
        console.log(error);
      }
    }
  }
}

На этом этапе при перезапуске приложения вместе с туннелированием и подпиской вы увидите недавно добавленные или обновленные файлы, перечисленные в консоли.

Вызов API службы аналитики документов Azure Cognitive Services

Чтобы использовать API аналитики документов Azure Cognitive Services, необходимо создать ресурс Multi-Service или Document Intelligence для Службы ИИ Azure. Чтобы создать ресурс, ознакомьтесь со следующими учебниками:

После этого шага у вас должна быть конечная точка и ключ, готовые к использованию.

Теперь откройте ReceiptProcessor.ts для создания метода dac для хранения учетных данных Azure Cognitive Services:

private static dac = new DocumentAnalysisClient(
  `${process.env["DAC_RESOURCE_ENDPOINT"]}`,
  new AzureKeyCredential(`${process.env["DAC_RESOURCE_KEY"]}`)
);

Создайте метод getDriveItemStream.

private static async getDriveItemStream(url: string): Promise<Readable> {
  const token = GraphProvider.graphAccessToken;
  const config: AxiosRequestConfig = {
    method: "get",
    url: url,
    headers: {
      "Authorization": `Bearer ${token}`
    },
    responseType: 'stream'
  };
  const response = await axios.get<Readable>(url, config);
  return response.data;
}

Создайте метод analyzeReceiptStream для получения полей OCR через обработку Azure Cognitive Services. Здесь мы берем prebuilt-invoice модель, но можно выбрать другие модели:

private static async analyzeReceiptStream(stream: Readable): Promise<any> {
  const poller = await this.dac.beginAnalyzeDocument("prebuilt-invoice", stream, {
    onProgress: ({ status }) => {
      console.log(`status: ${status}`);
    },
  });

  const {
    documents: [result] = [],
  } = await poller.pollUntilDone();

  const fields = result?.fields;
  this.removeUnwantedFields(fields);
  return fields;
}

Создайте метод removeUnwantedFields для удаления нежелательных полей в ответе Azure Cognitive Services:

private static removeUnwantedFields(fields: any) {
  for (const prop in fields) {
    if (prop === 'boundingRegions' || prop === 'content' || prop === 'spans') {
      delete fields[prop];
    }
    if (typeof fields[prop] === 'object') {
      this.removeUnwantedFields(fields[prop]);
    }
  }
}

Наконец, откройте GraphProvider.ts , чтобы добавить addDriveItem метод в конце GraphProvider класса .

public static async addDriveItem(driveId: string, parentId: any, fileName: string, receiptString: string) {
  await this.graphClient.api(`/drives/${driveId}/items/${parentId}:/${fileName}:/content`).put(receiptString);
}

Теперь перезапустите демонстрационную версию приложения и снова настройте туннелирование с помощью ngrok и подписки на разностное изменение в контейнере.

Если вы добавите или обновите любой файл (поддерживаемые форматы JPEG, JPG, PNG, BMP, TIFF, PDF) в этом контейнере, вы увидите новый JSON-файл, созданный и содержащий поля, извлеченные из файла.