1. 개요
Document AI란?
Document AI API는 문서, 이메일 등과 같은 구조화되지 않은 데이터를 가져와 데이터의 이해, 분석, 사용을 쉽게 만들어 주는 문서 이해 솔루션입니다. 이 API는 콘텐츠 분류, 항목 추출, 고급 검색 등을 통해 구조를 제공합니다.
이 튜토리얼에서는 Node.js와 함께 Document AI API를 사용하는 데 중점을 둡니다. 이 튜토리얼에서는 간단한 의료 섭취 양식을 파싱하는 방법을 보여줍니다.
학습 내용
- Document AI API를 사용 설정하는 방법
- API 요청을 인증하는 방법
- Node.js용 클라이언트 라이브러리를 설치하는 방법
- 스캔한 양식에서 데이터를 파싱하는 방법
필요한 사항
설문조사
이 튜토리얼을 어떻게 사용하실 계획인가요?
귀하의 Node.js 사용 경험을 평가해 주세요.
귀하의 Google Cloud 서비스 사용 경험을 평가해 주세요.
<ph type="x-smartling-placeholder">2. 설정 및 요구사항
자습형 환경 설정
- Cloud Console에 로그인하고 새 프로젝트를 만들거나 기존 프로젝트를 다시 사용합니다. (Gmail 또는 G Suite 계정이 없으면 만들어야 합니다.)
모든 Google Cloud 프로젝트에서 고유한 이름인 프로젝트 ID를 기억해 두세요. (위의 이름은 이미 사용 중이므로 사용할 수 없습니다.) 나중에 이 ID를 PROJECT_ID
로 제공해야 합니다.
- 그런 후 Google Cloud 리소스를 사용할 수 있도록 Cloud 콘솔에서 결제를 사용 설정해야 합니다.
'삭제' 섹션의 안내를 따르세요. 이 섹션에서는 이 튜토리얼을 마친 후 비용이 결제되지 않도록 리소스를 종료하는 방법을 알려줍니다 Google Cloud 새 사용자에게는 미화 $300 상당의 무료 체험판 프로그램에 참여할 수 있는 자격이 부여됩니다.
Cloud Shell 시작
노트북에서 Google를 원격으로 운영할 수도 있지만, 이 Codelab에서는 클라우드에서 실행되는 명령줄 환경인 Google Cloud Shell을 사용합니다.
Cloud Shell 활성화
- Cloud Console에서 Cloud Shell 활성화를 클릭합니다.
이전에 Cloud Shell을 시작하지 않았으면 설명이 포함된 중간 화면(스크롤해야 볼 수 있는 부분)이 제공됩니다. 이 경우 계속을 클릭합니다(이후 다시 표시되지 않음). 이 일회성 화면은 다음과 같습니다.
Cloud Shell을 프로비저닝하고 연결하는 데 몇 분 정도만 걸립니다.
Cloud Shell은 클라우드에 호스팅된 가상 머신에 대한 터미널 액세스를 제공합니다. 필요한 모든 개발 도구는 가상 머신에 포함되어 있습니다. 영구적인 5GB 홈 디렉터리를 제공하고 Google Cloud에서 실행되므로 네트워크 성능과 인증이 크게 개선됩니다. 이 Codelab에서 대부분의 작업은 브라우저나 Chromebook만 사용하여 수행할 수 있습니다.
Cloud Shell에 연결되면 인증이 완료되었고 프로젝트가 해당 프로젝트 ID로 이미 설정된 것을 볼 수 있습니다.
- Cloud Shell에서 다음 명령어를 실행하여 인증되었는지 확인합니다.
gcloud auth list
명령어 결과
Credentialed Accounts ACTIVE ACCOUNT * <my_account>@<my_domain.com> To set the active account, run: $ gcloud config set account `ACCOUNT`
gcloud config list project
명령어 결과
[core] project = <PROJECT_ID>
또는 다음 명령어로 설정할 수 있습니다.
gcloud config set project <PROJECT_ID>
명령어 결과
Updated property [core/project].
3. Cloud Document AI API 사용 설정
Document AI 사용을 시작하려면 우선 API를 사용 설정해야 합니다. 브라우저에서 Cloud 콘솔을 엽니다.
- 탐색 메뉴 > API 및 서비스 > 라이브러리 를 클릭합니다.
- 'Document AI API'를 검색한 후 사용 설정을 클릭하여 Google Cloud 프로젝트에서 API를 사용합니다.
4. 프로세서 만들기 및 테스트
먼저 이 튜토리얼의 Document AI Platform에서 사용할 양식 파서 프로세서의 인스턴스를 만들어야 합니다.
- 콘솔에서 Document AI Platform 개요로 이동합니다.
- 프로세서 만들기를 클릭하고 양식 파서를 선택합니다.
- 프로세서 이름을 지정하고 목록에서 리전을 선택합니다.
- 만들기를 클릭하여 프로세서를 만듭니다.
- 프로세서 ID를 복사합니다. 나중에 코드에서 이 ID를 사용해야 합니다.
(선택사항) 콘솔에서 문서를 업로드하여 프로세서를 테스트할 수 있습니다. 문서 업로드를 클릭하고 파싱할 양식을 선택합니다. 사용할 수 있는 샘플 양식이 없는 경우 이 샘플 양식을 다운로드하여 사용할 수 있습니다.
출력은 다음과 같이 표시됩니다.
5. API 요청 인증
Document AI API에 요청을 수행하려면 서비스 계정을 사용해야 합니다. 서비스 계정은 프로젝트에 속하며 Google 클라이언트 Node.js 라이브러리에서 API 요청을 하는 데 사용됩니다. 다른 사용자 계정과 마찬가지로 서비스 계정은 이메일 주소로 표현됩니다. 이 섹션에서는 Cloud SDK를 사용하여 서비스 계정을 만든 후 서비스 계정으로 인증하는 데 필요한 사용자 인증 정보를 만듭니다.
먼저 이 Codelab 전체에서 사용할 PROJECT_ID
로 환경 변수를 설정합니다.
export GOOGLE_CLOUD_PROJECT=$(gcloud config get-value core/project)
그런 후, 다음을 사용하여 Document AI API에 액세스할 새 서비스 계정을 만듭니다.
gcloud iam service-accounts create my-docai-sa \
--display-name "my-docai-service-account"
다음으로 Node.js 코드가 새 서비스 계정으로 로그인하는 데 사용하는 사용자 인증 정보를 만듭니다. 이러한 사용자 인증 정보를 만들고, 다음 명령어를 사용하여 JSON 파일 '~/key.json'으로 저장합니다.
gcloud iam service-accounts keys create ~/key.json \
--iam-account my-docai-sa@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com
마지막으로, 라이브러리에서 사용자 인증 정보를 찾는 데 사용하는 GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정합니다. 이 양식 인증에 대한 자세한 내용은 가이드를 참고하세요. 다음과 같이 앞에서 만든 사용자 인증 정보 JSON 파일의 전체 경로로 환경 변수를 설정해야 합니다.
export GOOGLE_APPLICATION_CREDENTIALS="/path/to/key.json"
6. 샘플 양식 다운로드
공개 Google Cloud Storage 샘플 버킷에 저장된 사용 샘플 양식이 있습니다. 다음 명령어를 사용하여 작업 디렉터리에 다운로드합니다.
gsutil cp gs://cloud-samples-data/documentai/form.pdf .
아래 명령어를 사용하여 파일이 클라우드 셸에 다운로드되었는지 확인합니다.
ls -ltr form.pdf
7. 클라이언트 라이브러리 설치
다음으로 작업 디렉터리에 코드를 설정합니다.
새 Node.js 패키지를 초기화합니다.
npm init
Document AI 클라이언트 라이브러리를 설치합니다.
npm install @google-cloud/documentai
8. 동기 프로세스 문서 요청
이 단계에서는 동기 엔드포인트를 사용하여 프로세스 문서를 호출합니다. 한 번에 많은 양의 문서를 처리하는 경우 비동기 API를 사용할 수도 있습니다. 양식 파서 API 사용에 대해 자세히 알아보려면 여기에서 가이드를 읽어보세요.
index.js
파일을 만들고 다음 코드를 붙여넣습니다. 해당하는 변수에 프로세서 정보를 입력합니다.
const { DocumentProcessorServiceClient } = require('@google-cloud/documentai').v1;
const fs = require('fs');
/**
* Runs the sample document through Document AI to get key/value pairs and
* confidence scores.
*/
async function processDocument(projectId, location, processorId, filePath, mimeType) {
// Instantiates a client
const documentaiClient = new DocumentProcessorServiceClient();
// The full resource name of the processor, e.g.:
// projects/project-id/locations/location/processor/processor-id
// You must create new processors in the Cloud Console first
const resourceName = documentaiClient.processorPath(projectId, location, processorId);
// Read the file into memory.
const imageFile = fs.readFileSync(filePath);
// Convert the image data to a Buffer and base64 encode it.
const encodedImage = Buffer.from(imageFile).toString('base64');
// Load Binary Data into Document AI RawDocument Object
const rawDocument = {
content: encodedImage,
mimeType: mimeType,
};
// Configure ProcessRequest Object
const request = {
name: resourceName,
rawDocument: rawDocument
};
// Use the Document AI client to process the sample form
const [result] = await documentaiClient.processDocument(request);
return result.document;
}
/**
* Run the codelab.
*/
async function main() {
const projectId = 'YOUR_PROJECT_ID';
const location = 'YOUR_PROJECT_LOCATION'; // Format is 'us' or 'eu'
const processorId = 'YOUR_PROCESSOR_ID'; // Should be a Hexadecimal string
// Supported File Types
// https://cloud.google.com/document-ai/docs/processors-list#processor_form-parser
filePath = 'form.pdf'; // The local file in your current working directory
mimeType = 'application/pdf';
const document = await processDocument(projectId, location, processorId, filePath, mimeType);
console.log("Document Processing Complete");
// Print the document text as one big string
console.log(`Text: ${document.text}`);
}
main(...process.argv.slice(2)).catch(err => {
console.error(err);
process.exitCode = 1;
});
이제 코드를 실행하면 콘솔에 다음 텍스트가 출력됩니다.
Text: FakeDoc M.D. HEALTH INTAKE FORM Please fill out the questionnaire carefully. The information you provide will be used to complete your health profile and will be kept confidential. Name: Date: Sally Walker DOB: 09/04/1986 Address: 24 Barney Lane City: Towalo State: NJ Zip: 07082 Email: Sally, waller@cmail.com Phone #: (906) 917-3486 Gender: Marital Status: Single Occupation: Software Engineer Referred By: None Emergency Contact: Eva Walker Emergency Contact Phone: (906) 334-8926 Describe your medical concerns (symptoms, diagnoses, etc): Runny nose, mucas in throat, weakness, aches, chills, tired Are you currently taking any medication? (If yes, please describe): Vyvanse (25mg) daily for attention
다음 단계에서는 데이터베이스에 더 쉽게 저장하거나 다른 애플리케이션에서 사용할 수 있는 구조화된 데이터를 추출합니다.
9. 양식 키/값 쌍 추출
이제 양식에서 키-값 쌍과 해당하는 신뢰도 점수를 추출할 수 있습니다. Document 응답 객체에는 입력 문서의 페이지 목록이 포함됩니다. 각 page
객체에는 양식 입력란 목록과 텍스트 내 위치가 포함되어 있습니다.
다음 코드는 각 페이지를 반복하여 각 키, 값, 신뢰도 점수를 추출합니다.
코드에 다음 함수를 추가합니다.
/**
* Extract form data and confidence from processed document.
*/
function extractFormData(document) {
// Extract shards from the text field
function getText(textAnchor, document) {
if (!textAnchor.textSegments || textAnchor.textSegments.length === 0) {
return '';
}
// First shard in document doesn't have startIndex property
const startIndex = textAnchor.textSegments[0].startIndex || 0;
const endIndex = textAnchor.textSegments[0].endIndex;
return document.text.substring(startIndex, endIndex);
}
var formData = [];
const pages = document.pages;
pages.forEach((page) => {
const formFields = page.formFields;
formFields.forEach((field) => {
// Get the extracted field names and remove extra space from text
const fieldName = getText(field.fieldName.textAnchor, document);
// Confidence - How "sure" the API is that the text is correct
const nameConfidence = field.fieldName.confidence.toFixed(4);
const fieldValue = getText(field.fieldValue.textAnchor, document);
const valueConfidence = field.fieldValue.confidence.toFixed(4);
formData.push({
fieldName: fieldName,
fieldValue: fieldValue,
nameConfidence: nameConfidence,
valueConfidence: valueConfidence
});
});
});
return formData;
}
기본 함수 내에서 extractFormData()
함수 호출을 추가하고 결과 객체를 테이블로 출력합니다.
/**
* Run the codelab.
*/
async function main() {
const projectId = 'YOUR_PROJECT_ID';
const location = 'YOUR_PROJECT_LOCATION'; // Format is 'us' or 'eu'
const processorId = 'YOUR_PROCESSOR_ID'; // Should be a Hexadecimal string
// Supported File Types
// https://cloud.google.com/document-ai/docs/processors-list#processor_form-parser
filePath = 'form.pdf'; // The local file in your current working directory
mimeType = 'application/pdf';
const document = await processDocument(projectId, location, processorId, filePath, mimeType);
const formData = extractFormData(document);
console.log('\nThe following form key/value pairs were detected:');
console.table(formData);
}
이제 코드를 실행합니다. 샘플 문서를 사용하는 경우 다음과 같이 출력됩니다.
The following form key/value pairs were detected: ┌─────────┬────────────────────────────────────────────────────────────────┬──────────────────────────────────────────────────────────────────┬────────────────┬─────────────────┐ │ (index) │ fieldName │ fieldValue │ nameConfidence │ valueConfidence │ ├─────────┼────────────────────────────────────────────────────────────────┼──────────────────────────────────────────────────────────────────┼────────────────┼─────────────────┤ │ 0 │ 'Marital Status: ' │ 'Single ' │ '1.0000' │ '1.0000' │ │ 1 │ 'DOB: ' │ '09/04/1986\n' │ '0.9999' │ '0.9999' │ │ 2 │ 'City: ' │ 'Towalo ' │ '0.9996' │ '0.9996' │ │ 3 │ 'Address: ' │ '24 Barney Lane ' │ '0.9994' │ '0.9994' │ │ 4 │ 'Referred By: ' │ 'None\n' │ '0.9968' │ '0.9968' │ │ 5 │ 'Phone #: ' │ '(906) 917-3486\n' │ '0.9961' │ '0.9961' │ │ 6 │ 'State: ' │ 'NJ ' │ '0.9960' │ '0.9960' │ │ 7 │ 'Emergency Contact Phone: ' │ '(906) 334-8926\n' │ '0.9925' │ '0.9925' │ │ 8 │ 'Name:\n' │ 'Sally\nWalker\n' │ '0.9922' │ '0.9922' │ │ 9 │ 'Occupation: ' │ 'Software Engineer\n' │ '0.9914' │ '0.9914' │ │ 10 │ 'Zip: ' │ '07082\n' │ '0.9904' │ '0.9904' │ │ 11 │ 'Email: ' │ 'Sally, waller@cmail.com ' │ '0.9681' │ '0.9681' │ │ 12 │ 'Emergency Contact: ' │ 'Eva Walker ' │ '0.9430' │ '0.9430' │ │ 13 │ 'Describe your medical concerns (symptoms, diagnoses, etc):\n' │ 'Runny nose, mucas in throat, weakness,\naches, chills, tired\n' │ '0.7817' │ '0.7817' │ └─────────┴────────────────────────────────────────────────────────────────┴──────────────────────────────────────────────────────────────────┴────────────────┴─────────────────┘
10. 축하합니다.
수고하셨습니다. Document AI API를 사용하여 필기 입력 양식에서 데이터를 추출했습니다. 다른 양식 이미지를 사용해 보시기 바랍니다.
삭제
이 튜토리얼에서 사용한 리소스 비용이 Google Cloud 계정에 청구되지 않도록 하려면 다음 안내를 따르세요.
- Cloud 콘솔에서 리소스 관리 페이지로 이동합니다.
- 프로젝트 목록에서 해당 프로젝트를 선택한 후 삭제를 클릭합니다.
- 대화상자에서 프로젝트 ID를 입력한 후 종료를 클릭하여 프로젝트를 삭제합니다.