{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "a6b14680-ac41-4c91-8187-b6deb5b5e2ce",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"Qiskit Functions 시작하기\"\n",
        "description: \"설치 및 인증부터 작업 상태 확인 및 오류 메시지 조회까지, 일반적인 작업을 수행하는 방법\"\n",
        "---\n",
        "\n",
        "{/* cspell:ignore Jarman, HIVQE, Cadavid, Chandarana, Leclerc, Sachdeva, HUBO, Filippov, Downfolding, Aharonov, Mundada, Yamauchi, supersymmetric, Paterakis, Gharibyan, Jaffali, Pellow */}\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "1c65b1af-e404-4588-8e1e-d3d7fd8eb189",
      "metadata": {
        "tags": [
          "version-info"
        ]
      },
      "source": [
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "d86e0b16-1fe6-4a5c-8b32-6cf1a3c2436c",
      "metadata": {},
      "source": [
        "<span id=\"get-started-with-qiskit-functions\" />\n",
        "\n",
        "# Qiskit Functions 시작하기\n",
        "\n",
        "Premium, Flex 및 On-Prem ( IBM Quantum Platform API를 통해 제공) 요금제 사용자는 IBM Qiskit Functions 에서 무료로 서비스를 시작할 수 있으며, 카탈로그에 기능을 제공한 파트너사 중 한 곳에서 라이선스를 구매할 수도 있습니다.\n",
        "\n",
        "<span id=\"request-a-free-trial-for-third-party-qiskit-functions\" />\n",
        "\n",
        "## 타사 제품인 ‘ Qiskit Functions ’의 무료 체험판을 신청하세요\n",
        "\n",
        "무료 체험을 신청하려면 ‘ [Qiskit Functions Catalog](/functions) ’로 이동하여 세부 정보 패널을 확인해 보세요. `AccessGroupId`를 `Request a free trial` 클릭하고, IBM Cloud 를 포함하여 Functions 파트너가 요구하는 정보를 입력하십시오:\n",
        "\n",
        "1. [IBM Cloud 의 IAM](http://cloud.ibm.com/iam/groups) 으로 이동합니다.\n",
        "2. 자격 요건을 확인하십시오.\n",
        "   * 헤더의 메뉴 바에서 계정을 다음 형식과 같은 계정으로 변경하세요: `XXXXXXX - [Organization Name]`\n",
        "   * 해당 조직이 귀하의 프리미엄 계정에 연결된 조직과 동일한지 확인하십시오.\n",
        "   * \\[“귀하의 이름] 계정”이 표시된다면, 현재 *개인* 계정을 사용하고 있는 것이며, 이 계정은 프리미엄 이용 자격이 없습니다.\n",
        "3. 사용자 액세스 그룹 ID를 확인하세요.\n",
        "   * 그룹 이름을 클릭하세요.\n",
        "   * **‘상세 정보’를** 클릭하세요.\n",
        "   * 액세스 그룹 ID를 복사하십시오. `AccessGroup-`.로 시작해야 합니다.\n",
        "\n",
        "<span id=\"install-qiskit-functions-catalog-client\" />\n",
        "\n",
        "<span id=\"install-the-qiskit-functions-catalog-client\" />\n",
        "\n",
        "## Qiskit Functions Catalog 클라이언트 설치\n",
        "\n",
        "1. Qiskit Functions 를 사용하려면 IBM Qiskit Functions Catalog 클라이언트를 설치하십시오:\n",
        "\n",
        "   ```python\n",
        "   pip install qiskit-ibm-catalog\n",
        "   ```\n",
        "2. [IBM Quantum Platform](/) 대시보드에서 API 키를 확인한 후, Python 가상 환경을 활성화하세요.  아직 가상 환경을 설정하지 않았다면 [설치](/docs/guides/install-qiskit#local) 안내를 참조하십시오.\n",
        "\n",
        "   <span id=\"save-account\" />**신뢰할 수 있는 Python 환경에서 작업하는 경우(예: 개인 노트북이나 워크스테이션),** 방법을 `save_account()` 사용하여 자격 증명을 로컬에 저장하십시오. (공유 컴퓨터나 공용 컴퓨터와 같이 신뢰할 수 없는 환경에서 IBM Quantum Platform 에 인증하는 경우, [다음 단계로 건너뛰십시오](#functions-untrusted).)\n",
        "\n",
        "   인증에 사용하는 인스턴스에는 ‘ Qiskit Functions ’ 액세스 권한이 활성화되어 있어야 합니다. 기존 인스턴스에서 이를 구성하려면 [‘인스턴스에서 Qiskit Functions 액세스 구성’을](/docs/guides/access-instances-platform-apis#configure-qiskit-functions-access-on-an-instance) 참조하십시오.\n",
        "\n",
        "   `save_account()`이 기능을 사용하려면 셸에서 를 `python` 실행한 다음, 다음 명령을 입력하세요:\n",
        "\n",
        "   ```python\n",
        "   from qiskit_ibm_catalog import QiskitFunctionsCatalog\n",
        "\n",
        "   QiskitFunctionsCatalog.save_account(channel=\"ibm_quantum_platform\", token=\"<your-token>\", instance=\"<instance-crn>\")\n",
        "   ```\n",
        "\n",
        "   `exit()`입력하세요. 이제부터 서비스에 인증이 필요할 때마다 다음 코드를 사용하여 인증 정보를 불러올 수 있습니다:\n",
        "\n",
        "   ```python\n",
        "   from qiskit_ibm_catalog import QiskitFunctionsCatalog\n",
        "   catalog = QiskitFunctionsCatalog()\n",
        "   ```\n",
        "\n",
        "   예를 들어,\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "9a04fb77-e675-4478-93ae-1bc17be820ee",
      "metadata": {},
      "outputs": [],
      "source": [
        "# Load saved credentials\n",
        "from qiskit_ibm_catalog import QiskitFunctionsCatalog\n",
        "\n",
        "catalog = QiskitFunctionsCatalog(channel=\"ibm_quantum_platform\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "963ac31e-ac68-468e-a046-0399dd9f2b25",
      "metadata": {},
      "source": [
        "<span id=\"functions-untrusted\" />**보안 위험을 최소화하기 위해 신뢰할 수 없는 시스템이나 외부 클라우드 Python 환경에서 코드를 실행하지 마십시오.** 신뢰할 수 없는 환경(예: 공용 컴퓨터)을 사용해야 하는 경우, 위험을 줄이기 위해 매번 사용 후 [IBM Cloud](https://cloud.ibm.com/iam/apikeys) 의 API 키 페이지에서 해당 키를 삭제하여 API 키를 변경하십시오. 자세한 내용은 [‘사용자 API 키 관리](https://cloud.ibm.com/docs/account?topic=account-userapikey\\&interface=ui) ’ 항목에서 확인하세요. 이러한 상황에서 서비스를 초기화하려면 다음 코드를 사용하십시오:\n",
        "\n",
        "```python\n",
        "from qiskit_ibm_catalog import QiskitFunctionsCatalog\n",
        "\n",
        "# After using the following code, delete your API key on the\n",
        "# IBM Quantum Platform home dashboard\n",
        "catalog = QiskitFunctionsCatalog(token=\"<YOUR_API_KEY>\") # Use the 44-character\n",
        "# API_KEY you created and saved from the IBM Quantum Platform Home dashboard\n",
        "```\n",
        "\n",
        "<Admonition type=\"danger\" title=\"API 키를 안전하게 보호하세요\">\n",
        "  **소스 코드, Python 스크립트 또는 노트북 파일에 절대로 비밀번호를 포함하지 마십시오.** 다른 사람과 코드를 공유할 때는 Python 스크립트 내에 API 키가 직접 포함되지 않도록 주의하십시오. 대신, 키를 제외한 스크립트를 공유하고, 이를 안전하게 설정하는 방법을 안내해 주세요.\n",
        "\n",
        "  실수로 키를 다른 사람과 공유했거나 Git 와 같은 버전 관리 시스템에 키를 포함시킨 경우, 위험을 줄이기 위해 [IBM Cloud](https://cloud.ibm.com/iam/apikeys) 의 API 키 페이지에서 해당 키를 삭제하여 즉시 키를 취소하십시오. 자세한 내용은 [‘사용자 API 키 관리](https://cloud.ibm.com/docs/account?topic=account-userapikey\\&interface=ui) ’ 항목에서 확인하세요.\n",
        "</Admonition>\n",
        "\n",
        "<span id=\"list-the-functions-you-can-access\" />\n",
        "\n",
        "## 사용할 수 있는 함수를 나열하세요\n",
        "\n",
        "인증 후에는 Qiskit Functions Catalog 에서 자신이 접근 권한을 가진 함수 목록을 확인할 수 있습니다:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "id": "752c42ab-4076-4ea8-ad54-2b2b0fd959c4",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "[QiskitFunction(qunova/hivqe-chemistry),\n",
              " QiskitFunction(global-data-quantum/quantum-portfolio-optimizer),\n",
              " QiskitFunction(algorithmiq/tem),\n",
              " QiskitFunction(qedma/qesem),\n",
              " QiskitFunction(multiverse/singularity),\n",
              " QiskitFunction(ibm/circuit-function),\n",
              " QiskitFunction(q-ctrl/optimization-solver),\n",
              " QiskitFunction(colibritd/quick-pde),\n",
              " QiskitFunction(q-ctrl/performance-management),\n",
              " QiskitFunction(kipu-quantum/iskay-quantum-optimizer)]"
            ]
          },
          "execution_count": 2,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "catalog.list()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "84321725-3288-4b11-be61-72b6d65aea2f",
      "metadata": {},
      "source": [
        "<span id=\"run-enabled-functions\" />\n",
        "\n",
        "## 활성화된 함수 실행\n",
        "\n",
        "`catalog.load(\"<provider/function-name>\")`카탈로그 객체가 인스턴스화된 후에는 다음을 사용하여 함수를 선택할 수 있습니다:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "cae45a22-190c-4538-9603-9478162afad1",
      "metadata": {},
      "outputs": [],
      "source": [
        "qesem_function = catalog.load(\"qedma/qesem\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "11d5c19f-c445-451f-b812-511146edfa8b",
      "metadata": {},
      "source": [
        "각 Qiskit 함수에는 고유한 입력, 옵션 및 출력이 있습니다. 자세한 내용은 실행하려는 함수에 대한 관련 문서 페이지를 확인하십시오. 기본적으로 모든 사용자는 한 번에 하나의 함수 작업만 실행할 수 있습니다:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "8d935bfb-f5ee-4224-85c8-31f6507a4569",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "'7f08c9d5-471b-4da2-92e7-4f2cb94c23a8'"
            ]
          },
          "execution_count": 5,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit.quantum_info import SparsePauliOp\n",
        "\n",
        "avg_magnetization = SparsePauliOp.from_sparse_list(\n",
        "    [(\"Z\", [q], 1 / 5) for q in range(5)], num_qubits=5\n",
        ")\n",
        "\n",
        "job = qesem_function.run(\n",
        "    pubs=[(circuit, [avg_magnetization, observable])],\n",
        "    backend_name=backend_name,  # example: \"ibm_fez\"\n",
        "    # options = {\n",
        "    #     \"estimate_time_only\": \"empirical\",\n",
        "    #     \"default_precision\": 0.2,  # Default precision is applied to all pubs that don't have a precision specified, see API reference for more details\n",
        "    #     \"max_execution_time\": 3600,  # You can specify a maximum QPU time in seconds, see API reference for more details\n",
        "    #     \"transpilation_level\": \"standard\",  # \"minimal_with_layout_opt\" for minimal transpilation, see API reference for more details\n",
        "    #     \"parallel_execution\": True,  # True for parallel execution, see API reference for more details\n",
        "    # },\n",
        ")\n",
        "job.job_id"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "89628078-5ea4-4e22-a89f-490b127d5fbe",
      "metadata": {},
      "source": [
        "<Admonition type=\"tip\">\n",
        "  `run()` 작업 제출 전에 남은 용량과 백엔드 접근 권한을 확인합니다. 인스턴스의 용량이 부족하거나 지정한 백엔드에 접속할 수 없는 경우, `run()` 작업이 큐에서 실패하도록 방치하지 않고 즉시 오류를 발생시킵니다. 용량이 부족할 때 경고 메시지를 표시합니다. `run()` ‘Pass’를 `suppress_low_usage_warning=True` 눌러 소리를 끄세요.\n",
        "</Admonition>\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "4177e329-b7b4-4ef5-98ef-3e7a29e0cc46",
      "metadata": {},
      "outputs": [],
      "source": [
        "job = qesem_function.run(\n",
        "    pubs=[(circuit, [avg_magnetization, observable])],\n",
        "    backend_name=backend_name,  # example: \"ibm_fez\"\n",
        "    suppress_low_usage_warning=True,\n",
        "    # options = {\n",
        "    #     \"estimate_time_only\": \"empirical\",\n",
        "    #     \"default_precision\": 0.2,  # Default precision is applied to all pubs that don't have a precision specified, see API reference for more details\n",
        "    #     \"max_execution_time\": 3600,  # You can specify a maximum QPU time in seconds, see API reference for more details\n",
        "    #     \"transpilation_level\": \"standard\",  # \"minimal_with_layout_opt\" for minimal transpilation, see API reference for more details\n",
        "    #     \"parallel_execution\": True,  # True for parallel execution, see API reference for more details\n",
        "    # },\n",
        ")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "1f13060f-f66b-4a48-9c69-e662d9806858",
      "metadata": {},
      "source": [
        "<span id=\"check-job-status\" />\n",
        "\n",
        "<span id=\"check-job-status\" />\n",
        "\n",
        "## 작업 상태 점검(O)\n",
        "\n",
        "`job_id`Qiskit Function을 사용하면 실행 중인 작업의 상태를 확인할 수 있습니다. 여기에는 다음과 같은 상태가 포함됩니다:\n",
        "\n",
        "* **`QUEUED`**: 원격 프로그램이 Qiskit 함수 대기열에 있습니다. 대기열 우선순위는 Qiskit Functions 을 얼마나 많이 이용했는지에 따라 결정됩니다.\n",
        "* **`INITIALIZING`**: 원격 프로그램이 시작되고 있습니다. 여기에는 원격 환경 설정 및 종속성 설치가 포함됩니다.\n",
        "* **`RUNNING`**: 프로그램이 실행 중입니다. 또한 특정 기능에서 지원하는 경우, 이에 더해 몇 가지 더 상세한 상태 정보도 포함됩니다.\n",
        "  * **`RUNNING: MAPPING`**: 이 함수는 현재 고전적 입력값을 양자 입력값으로 매핑하고 있습니다.\n",
        "  * **`RUNNING: OPTIMIZING_FOR_HARDWARE`**: 이 함수는 선택된 QPU에 최적화되어 있습니다. 여기에는 회로 트랜스필레이션, QPU 특성 분석, 관측 가능한 역전파 등이 포함될 수 있습니다.\n",
        "  * **`RUNNING: WAITING_FOR_QPU`**: 이 함수는 IBM Quantum 컴퓨트 서비스에 작업을 제출했으며, 현재 대기열에서 대기 중입니다.\n",
        "  * **`RUNNING: EXECUTING_QPU`**: 이 함수에는 실행 중인 양자 컴퓨팅 작업이 있습니다.\n",
        "  * **`RUNNING: POST_PROCESSING`**: 이 함수는 결과 후처리 기능을 수행하며, 여기에는 오차 완화, 양자 결과를 고전적 결과로 매핑하는 작업 등이 포함될 수 있습니다.\n",
        "* **`DONE`**: 프로그램이 완료되었으며,.을 사용하여 결과 데이터를 가져올 수 있습니다 `job.result()`.\n",
        "* **`ERROR`**: 문제가 발생하여 프로그램이 중단되었습니다. 오류 메시지를 확인하려면 를 사용하세요 `job.result()` .\n",
        "* **`CANCELED`**: 해당 프로그램은 사용자, 서비스 또는 서버에 의해 취소되었습니다.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 6,
      "id": "763f00fb-3fa4-45fe-a2f0-9a4dec7eecd0",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "'QUEUED'"
            ]
          },
          "execution_count": 6,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "job.status()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "c76c2044-9663-4bab-b903-aacdf530e54d",
      "metadata": {},
      "source": [
        "<span id=\"retrieve-results\" />\n",
        "\n",
        "<span id=\"retrieve-results\" />\n",
        "\n",
        "## 검색 결과\n",
        "\n",
        "프로그램이 실행된 `DONE`후에는 를 `job.result()` 사용하여 결과를 가져올 수 있습니다. 이 출력 형식은 함수마다 다르므로, 해당 함수의 설명서를 반드시 확인하시기 바랍니다:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 7,
      "id": "e82c9628-71e9-4b87-be41-a479369a2bf6",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "PrimitiveResult([PubResult(data=DataBin(evs=np.ndarray(<shape=(), dtype=float64>), stds=np.ndarray(<shape=(), dtype=float64>), ensemble_standard_error=np.ndarray(<shape=(), dtype=float64>)), metadata={'shots': 4096, 'target_precision': 0.015625, 'circuit_metadata': {}, 'resilience': {}, 'num_randomizations': 32})], metadata={'dynamical_decoupling': {'enable': True, 'sequence_type': 'XX', 'extra_slack_distribution': 'middle', 'scheduling_method': 'alap'}, 'twirling': {'enable_gates': False, 'enable_measure': True, 'num_randomizations': 'auto', 'shots_per_randomization': 'auto', 'interleave_randomizations': True, 'strategy': 'active-accum'}, 'resilience': {'measure_mitigation': True, 'zne_mitigation': False, 'pec_mitigation': False}, 'version': 2})\n"
          ]
        }
      ],
      "source": [
        "result = job.result()\n",
        "print(result)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "c804e735-3dfd-46ac-99d7-a9aec5ea1db0",
      "metadata": {},
      "source": [
        "또한 언제든지 작업을 취소할 수 있습니다:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 8,
      "id": "6975de6d-0b8b-4e2a-a0ef-0ea9a12f1fe0",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "'Job has been stopped.'"
            ]
          },
          "execution_count": 8,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "job.cancel()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "1dd7333a-c320-4e5a-b220-99f416e27c66",
      "metadata": {},
      "source": [
        "<span id=\"access-the-associated-quantum-compute-jobs\" />\n",
        "\n",
        "## 관련된 양자 컴퓨팅 작업에 액세스하기\n",
        "\n",
        "Qiskit 함수는 실행 중에 하나 이상의 양자 컴퓨팅 작업을 QPU에 제출할 수 있습니다. 해당 런타임 작업의 ID를 가져오려면 다음을 사용하십시오 `job.runtime_jobs()`. 이 ID를 사용하여 `QiskitRuntimeService` 인스턴스에서 런타임 작업 객체를 가져오거나, IBM Quantum® Platform 대시보드에서 워크로드를 찾을 수 있습니다.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "ca1c87ce-5bbf-4a62-b9a1-2ccd8fd64e02",
      "metadata": {},
      "outputs": [],
      "source": [
        "runtime_job_ids = job.runtime_jobs()\n",
        "runtime_job_ids"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "f26a65dc-6c35-4963-90f6-11eb678c2d62",
      "metadata": {},
      "source": [
        "함수가 실행 중인 작업을 세션이나 배치로 묶는 경우, 를 사용하여 세션 ID를 나열하십시오 `job.runtime_sessions()` . 특정 세션 ID를 전달하여 해당 세션의 런타임 작업만 반환하려면 `job.runtime_jobs()` :\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "edc0ff70-ce3b-409e-a44e-40fbc0b2800b",
      "metadata": {},
      "outputs": [],
      "source": [
        "sessions = job.runtime_sessions()\n",
        "if sessions:\n",
        "    session_runtime_jobs = job.runtime_jobs(runtime_session=sessions[0])\n",
        "    print(session_runtime_jobs)\n",
        "else:\n",
        "    print(\"No runtime sessions for this job.\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "8357a0b0-c2be-4d36-8a5c-91c1b9541df7",
      "metadata": {},
      "source": [
        "<Admonition type=\"note\">\n",
        "  리턴된 목록은 빈 목록일 수 있습니다. 함수는 실행 시점에 할당받은 런타임 서비스를 통해 런타임 작업을 제출할 때만 해당 작업을 보고하며, 일부 함수는 런타임 작업을 직접 제출하지 않습니다.\n",
        "</Admonition>\n",
        "\n",
        "<span id=\"view-job-logs\" />\n",
        "\n",
        "## 작업 로그 보기\n",
        "\n",
        "를 사용하여 함수가 실행되는 동안 생성하는 로그 출력을 가져옵니다 `job.logs()` . 로그는 진행 상황을 추적하고, 특정 `ERROR` 상태로 종료된 작업의 오류를 진단하는 데 유용합니다.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "35421a9b-9523-4b2e-a013-41e23179bb17",
      "metadata": {},
      "outputs": [],
      "source": [
        "print(job.logs().splitlines())"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "b043acf9-d3d0-4259-9c23-b65778ea1c8d",
      "metadata": {},
      "source": [
        "로그 행이 많이 생성되는 장시간 실행되는 작업의 경우, 를 사용하여 원하는 행만 반환하십시오 `job.filtered_logs()` . 정규 표현식을 에 전달하여 일치하는 줄을 `include` 유지하거나, 에 전달하여 `exclude` 일치하는 줄을 제외하려면:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "a4d9ff1a-d105-4db8-befc-879be3c8ae75",
      "metadata": {},
      "outputs": [],
      "source": [
        "print(job.filtered_logs(include=\"iteration\"))"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "cb8e3864-8b62-4354-bfcb-31c4fe7b38c8",
      "metadata": {},
      "source": [
        "<span id=\"list-previously-run-qiskit-functions-jobs\" />\n",
        "\n",
        "## 이전에 실행된 Qiskit Functions 작업 목록\n",
        "\n",
        "Qiskit Functions 에 제출된 모든 작업을 나열하려면 다음 명령을 사용할 `jobs()` 수 있습니다:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 9,
      "id": "af663a6c-1be0-431f-b572-5c42c4091408",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "[<Job | f6c29f49-4d5f-4fff-aca6-2e9a115b9763>,\n",
              " <Job | 7f08c9d5-471b-4da2-92e7-4f2cb94c23a8>,\n",
              " <Job | 62fe9176-d1e5-467e-b2bd-7a3f3c7be4e5>,\n",
              " <Job | af525b2e-16b1-45a1-80bb-dbd94ce30258>,\n",
              " <Job | b95a7a57-c1ad-4958-b7ac-953e4e1ee824>,\n",
              " <Job | 7bfa33da-0f17-4e67-84b6-f556f7eeb436>,\n",
              " <Job | ca46c191-9eb9-4de6-bfa7-b60d7eb29b5e>,\n",
              " <Job | 6ac0ba93-3831-43fb-9fb9-760da2225e06>,\n",
              " <Job | f0e38071-060d-47e8-988d-9cc1f69358e3>,\n",
              " <Job | 629cf110-e490-4675-8a07-f6d298d166b0>]"
            ]
          },
          "execution_count": 9,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "old_jobs = catalog.jobs()\n",
        "old_jobs"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "bcc00ca4-aa01-449b-af75-cae3095ceea8",
      "metadata": {},
      "source": [
        "검색 결과를 좁히려면 필터를 적용하세요. 을 사용하여 기능별로 `function`, 을 사용하여 상태별로 `status`, 을 사용하여 제출 날짜별로 필터링하세요 `created_after`. 와 `limit` : 키를 사용하여 결과를 넘겨보세요 `offset`:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "a158999b-031e-44f7-b158-ee5e88f6c3ae",
      "metadata": {},
      "outputs": [],
      "source": [
        "recent_errors = catalog.jobs(\n",
        "    function=qesem_function,\n",
        "    status=\"ERROR\",\n",
        "    created_after=\"2024-01-01T00:00:00Z\",\n",
        "    limit=5,\n",
        ")\n",
        "recent_errors"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "5159b57a-9642-4230-8c76-c72d8b470195",
      "metadata": {},
      "source": [
        "특정 작업의 작업 ID를 이미 알고 있다면, 다음 명령어를 사용하여 해당 작업을 조회할 수 있습니다 `catalog.job()`:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 18,
      "id": "9d93f965-7f3f-4d79-a84f-c8b613170f8c",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "f6c29f49-4d5f-4fff-aca6-2e9a115b9763\n"
          ]
        }
      ],
      "source": [
        "# First, get the most recent job that has been executed.\n",
        "latest_job = old_jobs[0]\n",
        "\n",
        "# We can also get that same job with `catalog.job`\n",
        "job_by_id = catalog.job(latest_job.job_id)\n",
        "\n",
        "# Verify that the job is the same using both retrieval methods.\n",
        "assert job_by_id.job_id == latest_job.job_id\n",
        "\n",
        "# Print the job_id for this job.\n",
        "print(job_by_id.job_id)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "5ce83696-3eb5-406a-bcdd-ca6c723c9a73",
      "metadata": {},
      "source": [
        "<span id=\"fetch-error-messages\" />\n",
        "\n",
        "## 오류 메시지 가져오기\n",
        "\n",
        "`ERROR`프로그램 상태가 인 경우, 다음과 같이 를 사용하여 `job.error_message()` 오류 메시지를 가져옵니다:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "id": "e1925c2b-517c-473b-9d77-2391d134f802",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "qiskit.exceptions.QiskitError: 'Workflow execution failed -- https://docs.quantum.ibm.com/errors#9999'\n"
          ]
        }
      ],
      "source": [
        "job.error_message()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "9ce63c00-7ddd-4adf-96aa-aec9fb9bb26f",
      "metadata": {},
      "source": [
        "<span id=\"next-steps\" />\n",
        "\n",
        "## 다음 단계\n",
        "\n",
        "<Admonition type=\"info\" title=\"권장사항\">\n",
        "  * 트랜스파일링이나 오류 처리를 직접 관리할 필요 없이, [회로 기능을](/docs/guides/algorithmiq-tem) 활용하여 새로운 알고리즘과 애플리케이션을 구축해 보세요.\n",
        "  * 고전적인 입력과 출력을 사용하여 도메인별 과제를 해결하는 [애플리케이션 기능을 살펴보세요](/docs/guides/q-ctrl-optimization-solver).\n",
        "  * Qiskit Functions 에 대한 [API 참조 문](/docs/api/functions/index) 서를 참조하십시오.\n",
        "  * 실습을 해보고 싶다면, ‘ Qiskit Functions ’를 다루는 [튜토리얼을](/docs/tutorials/index#leverage-qiskit-capabilities) 몇 가지 따라해 보세요.\n",
        "</Admonition>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "id": "a1b8767d",
      "source": "© IBM Corp., 2017-2026"
    }
  ],
  "metadata": {
    "kernelspec": {
      "display_name": "Python 3",
      "language": "python",
      "name": "python3"
    },
    "language_info": {
      "codemirror_mode": {
        "name": "ipython",
        "version": 3
      },
      "file_extension": ".py",
      "mimetype": "text/x-python",
      "name": "python",
      "nbconvert_exporter": "python",
      "pygments_lexer": "ipython3",
      "version": "3"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 4
}