Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Использование Azure Cognitive Services
Azure Cognitive Services — это набор облачных API, которые можно использовать в приложениях ИИ и потоках данных. Он предоставляет предварительно обученные модели, которые готовы к использованию в приложениях, не требуя данных и обучения моделей с вашей стороны. Их можно легко интегрировать в приложения с помощью интерфейсов REST HTTP.
Вы уже узнали, как использовать веб-перехватчики с приложением для получения уведомлений при каждом обновлении существующего файла или отправке нового файла в учебнике Использование веб-перехватчиков. В этом руководстве рассматривается подключение к Azure Cognitive Services для извлечения данных из счетов.
Чтобы настроить автоматическую обработку ИИ в текущем приложении SharePoint после изменения в контейнере, выполните следующие действия :
- Получение разностных изменений контейнера. В настоящее время вы можете получать уведомление о любых изменениях в нашем контейнере. Теперь вы получите добавленные или обновленные файлы.
- Вызовите 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. Чтобы создать ресурс, ознакомьтесь со следующими учебниками:
- Краткое руководство. Создание ресурса с несколькими службами для служб ИИ 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-файл, созданный и содержащий поля, извлеченные из файла.