Text Analytics for health 컨테이너 사용

컨테이너를 사용하면 자체 인프라에서 Text Analytics for health API를 호스팅할 수 있습니다. Text Analytics for health를 원격으로 호출하여 충족할 수 없는 보안 또는 데이터 거버넌스 요구 사항이 있는 경우 컨테이너가 좋은 옵션일 수 있습니다.

Azure 구독이 아직 없는 경우 시작하기 전에 체험 계정을 만듭니다.

필수 조건

Text Analytics for health 컨테이너를 사용하려면 다음 사전 요구 사항을 충족해야 합니다. Azure 구독이 없는 경우 시작하기 전에 체험 계정을 만듭니다.

  • 호스트 컴퓨터에 설치된 Docker. Docker는 컨테이너에서 Azure에 연결하여 청구 데이터를 보낼 수 있도록 구성해야 합니다.
    • Windows에서 Docker는 Linux 컨테이너를 지원하도록 구성해야 합니다.
    • Docker 개념에 대한 기본적으로 이해하고 있어야 합니다.
  • 무료(F0) 또는 표준(S) 가격 책정 계층으로 언어 리소스

필수 매개 변수 수집

모든 Azure AI 컨테이너에는 세 가지 기본 매개 변수가 필요합니다. Microsoft Software 사용 조건에는 동의 값이 있어야 합니다. 엔드포인트 URI 및 API 키도 필요합니다.

엔드포인트 URI

{ENDPOINT_URI} 값은 해당 Azure AI 서비스 리소스의 Azure Portal 개요 페이지에서 확인할 수 있습니다. 개요 페이지로 이동하여 마우스로 엔드포인트 위를 가리키면 클립보드로 복사 아이콘이 표시됩니다. 필요한 경우 엔드포인트를 복사하여 사용합니다.

Screenshot that shows gathering the endpoint URI for later use.

구성

{API_KEY} 값은 컨테이너를 시작하는 데 사용되며 해당 Azure AI 서비스 리소스에 대한 Azure portal의 페이지에서 사용할 수 있습니다. 페이지로 이동하여 클립보드로 복사 아이콘을 선택합니다.

Screenshot that shows getting one of the two keys for later use.

Important

이러한 구독 키는 Azure AI 서비스 API에 액세스하는 데 사용됩니다. 키를 공유하지 마세요. 안전하게 저장하세요. 예를 들어 Azure Key Vault를 사용합니다. 또한 이러한 키를 정기적으로 다시 생성하는 것이 좋습니다. API 호출을 수행하는 데는 키가 하나만 필요합니다. 첫 번째 키를 다시 생성하는 경우 두 번째 키를 사용하여 서비스에 계속 액세스할 수 있습니다.

호스트 컴퓨터 요구 사항 및 권장 사항

호스트는 Docker 컨테이너를 실행하는 x64 기반 컴퓨터입니다. 다음과 같이 Azure에서 컴퓨터 온-프레미스 또는 Docker 호스팅 서비스일 수 있습니다.

다음 표에서는 Text Analytics for health 컨테이너의 최소 및 권장 사양을 설명합니다. 각 CPU 코어는 속도가 2.6GHz 이상이어야 합니다. 허용되는 TPS(초당 트랜잭션 수)도 나열됩니다.

최소 호스트 사양 권장 호스트 사양 최소 TPS 최대 TPS
1개 문서/요청 4개 코어, 12GB 메모리 6코어, 12GB 메모리 15 30
10개 문서/요청 6코어, 16GB 메모리 8코어, 20GB 메모리 15 30

docker run 명령의 일부로 사용되는 --cpus--memory 설정에 해당하는 CPU 코어 및 메모리.

docker pull을 사용하여 컨테이너 이미지 가져오기

상태 컨테이너 이미지에 대한 Text Analytics는 컨테이너 레지스트리 신디케이트에서 mcr.microsoft.com 찾을 수 있습니다. azure-cognitive-services/textanalytics/ 리포지토리 내에 있으며 이름은 healthcare입니다. 정규화된 컨테이너 이미지 이름은 입니다. mcr.microsoft.com/azure-cognitive-services/textanalytics/healthcare

최신 버전의 컨테이너를 사용하려면 latest 태그를 사용할 수 있습니다. MCR에서 태그의 전체 목록을 찾을 수도 있습니다.

docker pull 명령을 사용하여 Microsoft 퍼블릭 컨테이너 레지스트리에서 이 컨테이너 이미지를 다운로드합니다. Microsoft Container Registry에서 추천 태그를 찾을 수 있습니다.

docker pull mcr.microsoft.com/azure-cognitive-services/textanalytics/healthcare:<tag-name>

docker images 명령을 사용하여 다운로드한 컨테이너 이미지를 나열할 수 있습니다. 예를 들어 다음 명령은 다운로드한 각 컨테이너 이미지의 ID, 리포지토리 및 태그를 테이블 형식으로 나열합니다.

docker images --format "table {{.ID}}\t{{.Repository}}\t{{.Tag}}"

IMAGE ID         REPOSITORY                TAG
<image-id>       <repository-path/name>    <tag-name>

docker run을 사용하여 컨테이너 실행

컨테이너가 호스트 컴퓨터에 있으면 docker run 명령을 사용하여 컨테이너를 실행합니다. 컨테이너는 중지할 때까지 계속 실행됩니다.

Important

  • 다음 섹션에서 Docker 명령은 줄 연속 문자 같은 백 슬래시, \을 사용합니다. 호스트 운영 체제의 요구 사항에서 이 기준을 바꾸거나 제거합니다.
  • 컨테이너를 인스턴스화하려면 Eula, BillingApiKey 옵션을 지정해야 합니다. 그렇지 않으면 컨테이너가 시작되지 않습니다. 자세한 내용은 Billing을 참조하세요.
  • 감정 분석 및 언어 감지 컨테이너는 API v3을 사용하며 출시되었습니다. 핵심 구 추출 컨테이너는 API의 v2를 사용하며 미리 보기 상태입니다.

상태 컨테이너용 Text Analytics를 설치하고 실행할 수 있는 여러 가지 방법이 있습니다.

  • Azure Portal을 사용하여 언어 리소스를 만들고 Docker를 사용하여 컨테이너를 가져옵니다.
  • Docker와 함께 Azure VM을 사용하여 컨테이너를 실행합니다.
  • 다음 PowerShell 및 Azure CLI 스크립트를 사용하여 리소스 배포 및 컨테이너 구성을 자동화합니다.

Text Analytics for health 컨테이너를 사용하는 경우 API 요청 및 응답에 포함된 데이터는 Microsoft에 표시되지 않으며 데이터에 적용된 모델을 학습하는 데 사용되지 않습니다.

컨테이너를 로컬로 실행

컨테이너 이미지를 다운로드한 후 사용자 고유의 환경에서 컨테이너를 실행하려면 다음 docker run 명령을 실행합니다. 다음 자리 표시자를 고유한 값으로 바꿉니다.

자리 표시자 형식 또는 예
{API_KEY} 언어 리소스의 키입니다. Azure Portal의 리소스 키 및 엔드포인트 페이지에서 이 값을 찾을 수 있습니다. xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
{ENDPOINT_URI} API에 액세스하기 위한 엔드포인트입니다. Azure Portal의 리소스 키 및 엔드포인트 페이지에서 이 값을 찾을 수 있습니다. https://<your-custom-subdomain>.cognitiveservices.azure.com
docker run --rm -it -p 5000:5000 --cpus 6 --memory 12g \
mcr.microsoft.com/azure-cognitive-services/textanalytics/healthcare:<tag-name> \
Eula=accept \
rai_terms=accept \
Billing={ENDPOINT_URI} \
ApiKey={API_KEY} 

이 명령은 다음을 수행합니다.

  • 컨테이너 이미지에서 Text Analytics for Health 컨테이너를 실행합니다.
  • 6코어 CPU 및 12GB(기가바이트) 메모리를 할당합니다.
  • 5000 TCP 포트 표시 및 컨테이너에 의사-TTY 할당
  • EULA(최종 사용자 사용권 계약) 및 RAI(책임 있는 AI) 사용 약관에 동의합니다.
  • 종료 후 자동으로 컨테이너를 제거합니다. 컨테이너 이미지는 호스트 컴퓨터에서 계속 사용할 수 있습니다.

출력을 시각화하는 데모 UI

컨테이너는 REST 기반 쿼리 예측 엔드포인트 API를 제공합니다. 컨테이너의 엔드포인트에 추가하여 /demo 액세스할 수 있는 시각화 도구도 컨테이너에 제공했습니다. 예시:

http://<serverURL>:5000/demo

아래 예제 cURL 요청을 사용하여 변수를 적절한 값으로 대체 serverURL 하여 배포한 컨테이너에 쿼리를 제출합니다.

curl -X POST 'http://<serverURL>:5000/text/analytics/v3.1/entities/health' --header 'Content-Type: application/json' --header 'accept: application/json' --data-binary @example.json

컨테이너용 Azure Web App을 사용하여 컨테이너 설치

컨테이너용 Azure Web App은 클라우드에서 컨테이너를 실행하는 데 전념하는 Azure 리소스입니다. 자동 크기 조정, Docker 컨테이너 및 Docker Compose 지원, HTTPS 지원 등의 기본 기능을 제공합니다.

참고 항목

Azure Web App을 사용하면 자동으로 할 일기본<appservice_name>.azurewebsites.net

Azure CLI를 사용하여 이 PowerShell 스크립트를 실행하여 HTTPS를 통해 구독 및 컨테이너 이미지를 사용하여 컨테이너용 웹앱을 만듭니다. 첫 번째 요청을 제출하기 전에 스크립트가 완료될 때까지 기다립니다(약 25~30분).

$subscription_name = ""                    # THe name of the subscription you want you resource to be created on.
$resource_group_name = ""                  # The name of the resource group you want the AppServicePlan
                                           #    and AppSerivce to be attached to.
$resources_location = ""                   # This is the location you wish the AppServicePlan to be deployed to.
                                           #    You can use the "az account list-locations -o table" command to
                                           #    get the list of available locations and location code names.
$appservice_plan_name = ""                 # This is the AppServicePlan name you wish to have.
$appservice_name = ""                      # This is the AppService resource name you wish to have.
$TEXT_ANALYTICS_RESOURCE_API_KEY = ""      # This should be taken from the Language resource.
$TEXT_ANALYTICS_RESOURCE_API_ENDPOINT = "" # This should be taken from the Language resource.
$DOCKER_IMAGE_NAME = "mcr.microsoft.com/azure-cognitive-services/textanalytics/healthcare:latest"

az login
az account set -s $subscription_name
az appservice plan create -n $appservice_plan_name -g $resource_group_name --is-linux -l $resources_location --sku P3V2
az webapp create -g $resource_group_name -p $appservice_plan_name -n $appservice_name -i $DOCKER_IMAGE_NAME 
az webapp config appsettings set -g $resource_group_name -n $appservice_name --settings Eula=accept rai_terms=accept Billing=$TEXT_ANALYTICS_RESOURCE_API_ENDPOINT ApiKey=$TEXT_ANALYTICS_RESOURCE_API_KEY

# Once deployment complete, the resource should be available at: https://<appservice_name>.azurewebsites.net

Azure Container Instance를 사용하여 컨테이너 설치

또한 ACI(Azure 컨테이너 인스턴스)를 사용하여 보다 간편하게 배포할 수 있습니다. ACI는 관리형 서버리스 Azure 환경에서 주문형 Docker 컨테이너를 실행할 수 있는 리소스입니다.

Azure Portal을 사용하여 ACI 리소스를 배포하는 단계는 Azure Container Instances를 사용하는 방법을 참조하세요. Azure CLI를 사용하여 아래 PowerShell 스크립트를 사용할 수도 있습니다. 그러면 컨테이너 이미지를 사용하여 구독에서 ACI를 만듭니다. 첫 번째 요청을 제출하기 전에 스크립트가 완료될 때까지 기다립니다(약 25~30분). ACI 리소스당 최대 CPU 수 제한이 있으므로 요청당 5개 이상의 큰 문서(각각 약 5,000자)를 전송하려는 경우 이 옵션을 선택하지 마세요. 가용성 정보는 ACI 지역 지원 문서를 참조하세요.

참고 항목

Azure Container Instances에는 기본 제공 do기본에 대한 HTTPS 지원이 포함되지 않습니다. HTTPS가 필요한 경우 인증서를 만들고 도메인을 등록하는 등 수동으로 구성해야 합니다. NGINX를 사용하여 이 작업을 수행하는 지침은 아래에서 찾을 수 있습니다.

$subscription_name = ""                    # The name of the subscription you want you resource to be created on.
$resource_group_name = ""                  # The name of the resource group you want the AppServicePlan
                                           # and AppService to be attached to.
$resources_location = ""                   # This is the location you wish the web app to be deployed to.
                                           # You can use the "az account list-locations -o table" command to
                                           # Get the list of available locations and location code names.
$azure_container_instance_name = ""        # This is the AzureContainerInstance name you wish to have.
$TEXT_ANALYTICS_RESOURCE_API_KEY = ""      # This should be taken from the Language resource.
$TEXT_ANALYTICS_RESOURCE_API_ENDPOINT = "" # This should be taken from the Language resource.
$DNS_LABEL = ""                            # This is the DNS label name you wish your ACI will have
$DOCKER_IMAGE_NAME = "mcr.microsoft.com/azure-cognitive-services/textanalytics/healthcare:latest"

az login
az account set -s $subscription_name
az container create --resource-group $resource_group_name --name $azure_container_instance_name --image $DOCKER_IMAGE_NAME --cpu 4 --memory 12 --port 5000 --dns-name-label $DNS_LABEL --environment-variables Eula=accept rai_terms=accept Billing=$TEXT_ANALYTICS_RESOURCE_API_ENDPOINT ApiKey=$TEXT_ANALYTICS_RESOURCE_API_KEY

# Once deployment complete, the resource should be available at: http://<unique_dns_label>.<resource_group_region>.azurecontainer.io:5000

보안 ACI 연결

기본적으로 컨테이너 API와 함께 ACI를 사용하는 경우에는 보안이 제공되지 않습니다. 일반적으로 컨테이너는 네트워크 브리지에 의해 외부로부터 보호되는 Pod의 일부로 실행되기 때문입니다. 그러나 프런트 연결 구성 요소를 사용하여 컨테이너를 수정하면 컨테이너 엔드포인트를 비공개로 유지할 수 있습니다. 다음 예제에서는 NGINX를 수신 게이트웨이로 사용하여 HTTPS/SSL 및 클라이언트 인증서 인증을 지원합니다.

참고 항목

NGINX는 오픈 소스 고성능 HTTP 서버 및 프록시입니다. NGINX 컨테이너를 사용하여 단일 컨테이너에 대한 TLS 연결을 종료할 수 있습니다. 더 복잡한 NGINX 수신 기반 TLS 종료 솔루션도 가능합니다.

NGINX를 수신 게이트웨이로 설정

NGINX는 구성 파일을 사용하여 런타임에 기능을 사용하도록 설정합니다. 다른 서비스에 TLS 종료를 사용하도록 설정하려면 SSL 인증서를 지정하여 TLS 연결을 종료하고 proxy_pass를 사용하여 서비스에 대한 주소를 지정해야 합니다. 샘플은 다음과 같습니다.

참고 항목

ssl_certificate 에서는 NGINX 컨테이너의 로컬 파일 시스템 내에 경로가 지정되어야 합니다. 지정된 proxy_pass 주소는 NGINX 컨테이너의 네트워크 내에서 사용할 수 있어야 합니다.

NGINX 컨테이너는 /etc/nginx/conf.d/ 아래에 탑재된 _.conf_의 모든 파일을 HTTP 구성 경로에 로드합니다.

server {
  listen              80;
  return 301 https://$host$request_uri;
}
server {
  listen              443 ssl;
  # replace with .crt and .key paths
  ssl_certificate     /cert/Local.crt;
  ssl_certificate_key /cert/Local.key;

  location / {
    proxy_pass http://cognitive-service:5000;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Real-IP  $remote_addr;
  }
}

Docker 작성 파일 예제

아래 예는 NGINX 및 상태 컨테이너를 배포하기 위해 docker compose 파일을 만드는 방법을 보여 줍니다.

version: "3.7"
services:
  cognitive-service:
    image: {IMAGE_ID}
    ports:
      - 5000:5000
    environment:
      - eula=accept
      - billing={ENDPOINT_URI}
      - apikey={API_KEY}
    volumes:
        # replace with path to logs folder
      - <path-to-logs-folder>:/output
  nginx:
    image: nginx
    ports:
      - 443:443
    volumes:
        # replace with paths for certs and conf folders
      - <path-to-certs-folder>:/cert
      - <path-to-conf-folder>:/etc/nginx/conf.d/

이 Docker 작성 파일을 시작하려면 파일의 루트 수준에서 콘솔에서 다음 명령을 실행합니다.

docker-compose up

자세한 내용은 NGINX 설명서에서 NGINX SSL 종료를 참조하세요.

동일한 호스트에서 여러 컨테이너 실행

노출된 포트로 여러 컨테이너를 실행하려는 경우, 각 컨테이너를 다른 노출된 포트로 실행해야 합니다. 예를 들어 첫 번째 컨테이너는 포트 5000에서 실행하고 두 번째 컨테이너는 포트 5001에서 실행합니다.

이 컨테이너와 다른 Azure AI 서비스 컨테이너를 HOST에서 함께 실행할 수 있습니다. 동일한 Azure AI 서비스 컨테이너의 여러 컨테이너를 실행할 수도 있습니다.

컨테이너의 예측 엔드포인트 쿼리

컨테이너는 REST 기반 쿼리 예측 엔드포인트 API를 제공합니다.

컨테이너 API에 대한 호스트 http://localhost:5000을 사용합니다.

컨테이너가 실행 중인지 확인

컨테이너가 실행되고 있는지 확인하는 방법은 여러 가지가 있습니다. 확인 대상인 컨테이너의 외부 IP 주소 및 노출된 포트를 찾고 즐겨 찾는 웹 브라우저를 엽니다. 아래의 다양한 요청 URL을 사용하여 컨테이너가 실행되는지 확인합니다. 여기에 나열된 예제 요청 URL은 http://localhost:5000이지만, 특정 컨테이너는 다를 수 있습니다. 컨테이너의 외부 IP 주소 및 공개된 포트를 사용해야 합니다.

요청 URL 용도
http://localhost:5000/ 컨테이너는 홈페이지를 제공합니다.
http://localhost:5000/ready GET을 사용하여 요청된 이 URL에서 컨테이너가 모델에 대한 쿼리를 수락할 준비가 되었음을 확인합니다. 이 요청은 Kubernetes 활동성 및 준비 상태 프로브에 사용될 수 있습니다.
http://localhost:5000/status 또한 GET을 사용하여 요청된 이 URL은 컨테이너를 시작하는 데 사용된 API 키가 엔드포인트 쿼리를 수행하지 않고 유효한지 확인합니다. 이 요청은 Kubernetes 활동성 및 준비 상태 프로브에 사용될 수 있습니다.
http://localhost:5000/swagger 컨테이너는 엔드포인트에 대한 전체 설명서 세트와 사용해 보기 기능을 제공합니다. 이 기능을 사용하면 웹 기반 HTML 양식으로 설정을 입력할 수 있고 코드 작성 없이 쿼리를 만들 수 있습니다. 쿼리가 반환되면 필요한 HTTP 헤더 및 본문 형식을 보여주기 위해 예제 CURL 명령이 제공됩니다.

Container's home page

컨테이너에 대한 API 요청 구조화

Postman 또는 아래 예제 cURL 요청을 사용하여 배포한 컨테이너에 쿼리를 제출하여 변수를 serverURL 적절한 값으로 바꿀 수 있습니다. 컨테이너의 URL에 있는 API 버전은 호스트된 API와 다릅니다.

참고 항목

FHIR(전자 의료 기록 교환) 기능은 최신 컨테이너에서 사용할 수 있으며 새로운 언어 REST API를 통해 노출됩니다.

curl -i -X POST 'http://<serverURL>:5000/language/analyze-text/jobs?api-version=2022-04-01-preview' --header 'Content-Type: application/json' --header --data-binary @example.json

다음 JSON은 언어 요청의 POST 본문에 첨부된 JSON 파일의 예입니다.

example.json

{
    "analysisInput": {
        "documents": [
            {
                "text": "The doctor prescried 200mg Ibuprofen.",
                "language": "en",
                "id": "1"
            }
        ]
    },
    "tasks": [
        {
            "taskName": "analyze 1",
            "kind": "Healthcare",
            "parameters": {
                "fhirVersion": "4.0.1"
            }
        }
    ]
}

컨테이너 응답 본문

다음 JSON은 컨테이너화된 동기 호출의 언어 응답 본문의 예입니다.

{
  "jobId": "{JOB-ID}",
  "lastUpdateDateTime": "2022-04-18T15:50:16Z",
  "createdDateTime": "2022-04-18T15:50:14Z",
  "expirationDateTime": "2022-04-19T15:50:14Z",
  "status": "succeeded",
  "errors": [],
  "tasks": {
    "completed": 1,
    "failed": 0,
    "inProgress": 0,
    "total": 1,
    "items": [
      {
        "kind": "HealthcareLROResults",
        "taskName": "analyze 1",
        "lastUpdateDateTime": "2022-04-18T15:50:16.7046515Z",
        "status": "succeeded",
        "results": {
          "documents": [
            {
              "id": "1",
              "entities": [
                {
                  "offset": 4,
                  "length": 6,
                  "text": "doctor",
                  "category": "HealthcareProfession",
                  "confidenceScore": 0.76
                },
                {
                  "offset": 21,
                  "length": 5,
                  "text": "200mg",
                  "category": "Dosage",
                  "confidenceScore": 0.99
                },
                {
                  "offset": 27,
                  "length": 9,
                  "text": "Ibuprofen",
                  "category": "MedicationName",
                  "confidenceScore": 1.0,
                  "name": "ibuprofen",
                  "links": [
                    { "dataSource": "UMLS", "id": "C0020740" },
                    { "dataSource": "AOD", "id": "0000019879" },
                    { "dataSource": "ATC", "id": "M01AE01" },
                    { "dataSource": "CCPSS", "id": "0046165" },
                    { "dataSource": "CHV", "id": "0000006519" },
                    { "dataSource": "CSP", "id": "2270-2077" },
                    { "dataSource": "DRUGBANK", "id": "DB01050" },
                    { "dataSource": "GS", "id": "1611" },
                    { "dataSource": "LCH_NW", "id": "sh97005926" },
                    { "dataSource": "LNC", "id": "LP16165-0" },
                    { "dataSource": "MEDCIN", "id": "40458" },
                    { "dataSource": "MMSL", "id": "d00015" },
                    { "dataSource": "MSH", "id": "D007052" },
                    { "dataSource": "MTHSPL", "id": "WK2XYI10QM" },
                    { "dataSource": "NCI", "id": "C561" },
                    { "dataSource": "NCI_CTRP", "id": "C561" },
                    { "dataSource": "NCI_DCP", "id": "00803" },
                    { "dataSource": "NCI_DTP", "id": "NSC0256857" },
                    { "dataSource": "NCI_FDA", "id": "WK2XYI10QM" },
                    { "dataSource": "NCI_NCI-GLOSS", "id": "CDR0000613511" },
                    { "dataSource": "NDDF", "id": "002377" },
                    { "dataSource": "PDQ", "id": "CDR0000040475" },
                    { "dataSource": "RCD", "id": "x02MO" },
                    { "dataSource": "RXNORM", "id": "5640" },
                    { "dataSource": "SNM", "id": "E-7772" },
                    { "dataSource": "SNMI", "id": "C-603C0" },
                    { "dataSource": "SNOMEDCT_US", "id": "387207008" },
                    { "dataSource": "USP", "id": "m39860" },
                    { "dataSource": "USPMG", "id": "MTHU000060" },
                    { "dataSource": "VANDF", "id": "4017840" }
                  ]
                }
              ],
              "relations": [
                {
                  "relationType": "DosageOfMedication",
                  "entities": [
                    {
                      "ref": "#/results/documents/0/entities/1",
                      "role": "Dosage"
                    },
                    {
                      "ref": "#/results/documents/0/entities/2",
                      "role": "Medication"
                    }
                  ]
                }
              ],
              "warnings": [],
              "fhirBundle": {
                "resourceType": "Bundle",
                "id": "bae9d4e0-191e-48e6-9c24-c1ff6097c439",
                "meta": {
                  "profile": [
                    "http://hl7.org/fhir/4.0.1/StructureDefinition/Bundle"
                  ]
                },
                "identifier": {
                  "system": "urn:ietf:rfc:3986",
                  "value": "urn:uuid:bae9d4e0-191e-48e6-9c24-c1ff6097c439"
                },
                "type": "document",
                "entry": [
                  {
                    "fullUrl": "Composition/9044c2cc-dcec-4b9d-b005-bfa8be978aa8",
                    "resource": {
                      "resourceType": "Composition",
                      "id": "9044c2cc-dcec-4b9d-b005-bfa8be978aa8",
                      "status": "final",
                      "type": {
                        "coding": [
                          {
                            "system": "http://loinc.org",
                            "code": "11526-1",
                            "display": "Pathology study"
                          }
                        ],
                        "text": "Pathology study"
                      },
                      "subject": {
                        "reference": "Patient/5c554347-4290-4b05-83ac-6637ff3bfb40",
                        "type": "Patient"
                      },
                      "encounter": {
                        "reference": "Encounter/6fe12f5b-e35c-4c92-a492-96feda5a1a3b",
                        "type": "Encounter",
                        "display": "unknown"
                      },
                      "date": "2022-04-18",
                      "author": [
                        {
                          "reference": "Practitioner/fb5da4d8-e0f0-4434-8d29-4419b065c4d7",
                          "type": "Practitioner",
                          "display": "Unknown"
                        }
                      ],
                      "title": "Pathology study",
                      "section": [
                        {
                          "title": "General",
                          "code": {
                            "coding": [
                              {
                                "system": "",
                                "display": "Unrecognized Section"
                              }
                            ],
                            "text": "General"
                          },
                          "text": {
                            "div": "<div>\r\n\t\t\t\t\t\t\t<h1>General</h1>\r\n\t\t\t\t\t\t\t<p>The doctor prescried 200mg Ibuprofen.</p>\r\n\t\t\t\t\t</div>"
                          },
                          "entry": [
                            {
                              "reference": "List/db388912-b5fb-4073-a74c-2751fd3374dd",
                              "type": "List",
                              "display": "General"
                            }
                          ]
                        }
                      ]
                    }
                  },
                  {
                    "fullUrl": "Practitioner/fb5da4d8-e0f0-4434-8d29-4419b065c4d7",
                    "resource": {
                      "resourceType": "Practitioner",
                      "id": "fb5da4d8-e0f0-4434-8d29-4419b065c4d7",
                      "extension": [
                        {
                          "extension": [
                            { "url": "offset", "valueInteger": -1 },
                            { "url": "length", "valueInteger": 7 }
                          ],
                          "url": "http://hl7.org/fhir/StructureDefinition/derivation-reference"
                        }
                      ],
                      "name": [{ "text": "Unknown", "family": "Unknown" }]
                    }
                  },
                  {
                    "fullUrl": "Patient/5c554347-4290-4b05-83ac-6637ff3bfb40",
                    "resource": {
                      "resourceType": "Patient",
                      "id": "5c554347-4290-4b05-83ac-6637ff3bfb40",
                      "gender": "unknown"
                    }
                  },
                  {
                    "fullUrl": "Encounter/6fe12f5b-e35c-4c92-a492-96feda5a1a3b",
                    "resource": {
                      "resourceType": "Encounter",
                      "id": "6fe12f5b-e35c-4c92-a492-96feda5a1a3b",
                      "meta": {
                        "profile": [
                          "http://hl7.org/fhir/us/core/StructureDefinition/us-core-encounter"
                        ]
                      },
                      "status": "finished",
                      "class": {
                        "system": "http://terminology.hl7.org/CodeSystem/v3-ActCode",
                        "display": "unknown"
                      },
                      "subject": {
                        "reference": "Patient/5c554347-4290-4b05-83ac-6637ff3bfb40",
                        "type": "Patient"
                      }
                    }
                  },
                  {
                    "fullUrl": "MedicationStatement/24e860ce-2fdc-4745-aa9e-7d30bb487c4e",
                    "resource": {
                      "resourceType": "MedicationStatement",
                      "id": "24e860ce-2fdc-4745-aa9e-7d30bb487c4e",
                      "extension": [
                        {
                          "extension": [
                            { "url": "offset", "valueInteger": 27 },
                            { "url": "length", "valueInteger": 9 }
                          ],
                          "url": "http://hl7.org/fhir/StructureDefinition/derivation-reference"
                        }
                      ],
                      "status": "active",
                      "medicationCodeableConcept": {
                        "coding": [
                          {
                            "system": "http://www.nlm.nih.gov/research/umls",
                            "code": "C0020740",
                            "display": "Ibuprofen"
                          },
                          {
                            "system": "http://www.nlm.nih.gov/research/umls/aod",
                            "code": "0000019879"
                          },
                          {
                            "system": "http://www.whocc.no/atc",
                            "code": "M01AE01"
                          },
                          {
                            "system": "http://www.nlm.nih.gov/research/umls/ccpss",
                            "code": "0046165"
                          },
                          {
                            "system": "http://www.nlm.nih.gov/research/umls/chv",
                            "code": "0000006519"
                          },
                          {
                            "system": "http://www.nlm.nih.gov/research/umls/csp",
                            "code": "2270-2077"
                          },
                          {
                            "system": "http://www.nlm.nih.gov/research/umls/drugbank",
                            "code": "DB01050"
                          },
                          {
                            "system": "http://www.nlm.nih.gov/research/umls/gs",
                            "code": "1611"
                          },
                          {
                            "system": "http://www.nlm.nih.gov/research/umls/lch_nw",
                            "code": "sh97005926"
                          },
                          { "system": "http://loinc.org", "code": "LP16165-0" },
                          {
                            "system": "http://www.nlm.nih.gov/research/umls/medcin",
                            "code": "40458"
                          },
                          {
                            "system": "http://www.nlm.nih.gov/research/umls/mmsl",
                            "code": "d00015"
                          },
                          {
                            "system": "http://www.nlm.nih.gov/research/umls/msh",
                            "code": "D007052"
                          },
                          {
                            "system": "http://www.nlm.nih.gov/research/umls/mthspl",
                            "code": "WK2XYI10QM"
                          },
                          {
                            "system": "http://ncimeta.nci.nih.gov",
                            "code": "C561"
                          },
                          {
                            "system": "http://www.nlm.nih.gov/research/umls/nci_ctrp",
                            "code": "C561"
                          },
                          {
                            "system": "http://www.nlm.nih.gov/research/umls/nci_dcp",
                            "code": "00803"
                          },
                          {
                            "system": "http://www.nlm.nih.gov/research/umls/nci_dtp",
                            "code": "NSC0256857"
                          },
                          {
                            "system": "http://www.nlm.nih.gov/research/umls/nci_fda",
                            "code": "WK2XYI10QM"
                          },
                          {
                            "system": "http://www.nlm.nih.gov/research/umls/nci_nci-gloss",
                            "code": "CDR0000613511"
                          },
                          {
                            "system": "http://www.nlm.nih.gov/research/umls/nddf",
                            "code": "002377"
                          },
                          {
                            "system": "http://www.nlm.nih.gov/research/umls/pdq",
                            "code": "CDR0000040475"
                          },
                          {
                            "system": "http://www.nlm.nih.gov/research/umls/rcd",
                            "code": "x02MO"
                          },
                          {
                            "system": "http://www.nlm.nih.gov/research/umls/rxnorm",
                            "code": "5640"
                          },
                          {
                            "system": "http://snomed.info/sct",
                            "code": "E-7772"
                          },
                          {
                            "system": "http://snomed.info/sct/900000000000207008",
                            "code": "C-603C0"
                          },
                          {
                            "system": "http://snomed.info/sct/731000124108",
                            "code": "387207008"
                          },
                          {
                            "system": "http://www.nlm.nih.gov/research/umls/usp",
                            "code": "m39860"
                          },
                          {
                            "system": "http://www.nlm.nih.gov/research/umls/uspmg",
                            "code": "MTHU000060"
                          },
                          {
                            "system": "http://hl7.org/fhir/ndfrt",
                            "code": "4017840"
                          }
                        ],
                        "text": "Ibuprofen"
                      },
                      "subject": {
                        "reference": "Patient/5c554347-4290-4b05-83ac-6637ff3bfb40",
                        "type": "Patient"
                      },
                      "context": {
                        "reference": "Encounter/6fe12f5b-e35c-4c92-a492-96feda5a1a3b",
                        "type": "Encounter",
                        "display": "unknown"
                      },
                      "dosage": [
                        {
                          "text": "200mg",
                          "doseAndRate": [{ "doseQuantity": { "value": 200 } }]
                        }
                      ]
                    }
                  },
                  {
                    "fullUrl": "List/db388912-b5fb-4073-a74c-2751fd3374dd",
                    "resource": {
                      "resourceType": "List",
                      "id": "db388912-b5fb-4073-a74c-2751fd3374dd",
                      "status": "current",
                      "mode": "snapshot",
                      "title": "General",
                      "subject": {
                        "reference": "Patient/5c554347-4290-4b05-83ac-6637ff3bfb40",
                        "type": "Patient"
                      },
                      "encounter": {
                        "reference": "Encounter/6fe12f5b-e35c-4c92-a492-96feda5a1a3b",
                        "type": "Encounter",
                        "display": "unknown"
                      },
                      "entry": [
                        {
                          "item": {
                            "reference": "MedicationStatement/24e860ce-2fdc-4745-aa9e-7d30bb487c4e",
                            "type": "MedicationStatement",
                            "display": "Ibuprofen"
                          }
                        }
                      ]
                    }
                  }
                ]
              }
            }
          ],
          "errors": [],
          "modelVersion": "2022-03-01"
        }
      }
    ]
  }
}

클라이언트 라이브러리 지원으로 컨테이너 실행

컨테이너 버전 3.0.017010001-onprem-amd64(또는 latest 컨테이너를 사용하는 경우)부터 클라이언트 라이브러리를 사용하여 Text Analytics for health 컨테이너를 실행할 수 있습니다. 이렇게 하려면 docker run 명령에 다음 매개 변수를 추가합니다.

enablelro=true

이후에 클라이언트 개체를 인증할 때 컨테이너가 실행 중인 엔드포인트를 사용합니다.

http://localhost:5000

예를 들어 C#을 사용하는 경우 다음 코드를 사용합니다.

var client = new TextAnalyticsClient("http://localhost:5000", "your-text-analytics-key");

컨테이너 중지

컨테이너를 종료하려면 컨테이너를 실행하는 명령줄 환경에서 Ctrl+C를 선택합니다.

문제 해결

출력 탑재 및 활성화된 로깅을 사용하여 컨테이너를 실행하는 경우 컨테이너는 컨테이너를 시작 또는 실행하는 동안 발생하는 문제를 해결하는 데 도움이 되는 로그 파일을 생성합니다.

자세한 문제 해결 정보 및 지침은 Azure AI 컨테이너 FAQ(자주 묻는 질문)를 참조하세요.

결제

Text Analytics for health 컨테이너는 Azure 계정의 Language 리소스를 사용하여 청구 정보를 Azure로 보냅니다.

컨테이너에 대한 쿼리는 ApiKey 매개 변수에 사용되는 Azure 리소스의 가격 책정 계층으로 청구됩니다.

Azure AI 서비스 컨테이너는 측정 또는 청구 엔드포인트에 연결하지 않고 실행할 수 있는 라이선스가 부여되지 않습니다. 사용자는 컨테이너가 항상 청구 엔드포인트와 청구 정보를 통신할 수 있도록 설정해야 합니다. Azure AI 서비스 컨테이너는 분석 중인 이미지나 텍스트와 같은 고객 데이터를 Microsoft에 보내지 않습니다.

Azure에 연결

컨테이너에는 실행할 청구 인수 값이 필요합니다. 이러한 값을 통해 컨테이너는 청구 엔드포인트에 연결할 수 있습니다. 컨테이너는 약 10 ~ 15분마다 사용량을 보고합니다. 컨테이너가 허용되는 시간 내에서 Azure에 연결되지 않으면 컨테이너는 계속 실행되지만 청구 엔드포인트가 복원될 때까지 쿼리를 처리하지 않습니다. 10 ~ 15분 간격으로 동시에 10회 동안 연결이 시도됩니다. 10회 시도 안에 청구 엔드포인트에 연결할 수 없는 경우 컨테이너는 요청 처리를 중지합니다. 청구를 위해 Microsoft로 전송되는 정보의 예는 Azure AI 서비스 컨테이너 FAQ를 참조하세요.

청구 인수

다음 세 가지 옵션 모두에 유효한 값이 제공되면 docker run 명령이 컨테이너를 시작합니다.

옵션 설명
ApiKey 청구 정보를 추적하는 데 사용되는 Azure AI 서비스 리소스의 API 키입니다.
이 옵션의 값은 Billing에 지정된 프로비전된 리소스의 API 키로 설정해야 합니다.
Billing 청구 정보를 추적하는 데 사용되는 Azure AI 서비스 리소스의 엔드포인트입니다.
이 옵션의 값은 프로비저닝된 Azure 리소스의 엔드포인트 URI로 설정해야 합니다.
Eula 컨테이너에 대한 라이선스에 동의했음을 나타냅니다.
이 옵션의 값은 동의로 설정해야 합니다.

요약

이 문서에서 Text Analytics for health 컨테이너를 다운로드, 설치 및 실행하기 위한 개념과 워크플로를 알아보았습니다. 요약:

  • Text Analytics for health는 Docker용 Linux 컨테이너를 제공합니다.
  • 컨테이너 이미지는 Microsoft 컨테이너 레지스트리(MCR)에서 다운로드됩니다.
  • 컨테이너 이미지는 Docker에서 실행됩니다.
  • REST API 또는 SDK를 사용하여 컨테이너의 호스트 URI를 지정하여 Text Analytics for health 컨테이너의 작업을 호출할 수 있습니다.
  • 컨테이너를 인스턴스화할 때 청구 정보를 지정해야 합니다.

Important

Azure AI 컨테이너는 측정을 위해 Azure에 연결하지 않고 실행할 수 있는 라이선스가 부여되지 않습니다. 고객은 컨테이너에서 항상 계량 서비스와 청구 정보를 통신할 수 있도록 설정해야 합니다. Azure AI 컨테이너는 고객 데이터(예: 분석 중인 텍스트)를 Microsoft에 보내지 않습니다.

다음 단계