QESEM: Qedma의 Qiskit 함수
API 참조 보기
이 페이지의 코드는 다음 요구 사항을 바탕으로 개발되었습니다. 이 버전이나 그 이후 버전을 사용하시기를 권장합니다.
qiskit[all]~=2.5.0 qiskit-ibm-runtime~=0.47.0
키스킷 기능은 IBM 퀀텀 프리미엄 요금제, 플렉스 요금제 및 온프레미스( IBM 퀀텀 플랫폼 API를 통해) 요금제 사용자에게만 제공되는 실험적 기능입니다. 프리뷰 릴리스 상태이며 변경될 수 있습니다.
개요
양자 처리 장치는 최근 몇 년간 크게 발전했지만, 기존 하드웨어의 잡음과 불완전성으로 인한 오류는 여전히 양자 알고리즘 개발자들에게 핵심적인 과제이다. 유틸리티 규모의 양자 계산이 고전적으로 검증할 수 없는 수준에 접근함에 따라, 보장된 정확도로 노이즈를 상쇄하는 솔루션의 중요성이 점점 더 커지고 있다. 이러한 과제를 극복하기 위해 Qedma는 양자 오류 완화(QESEM) 를 개발하였으며, 이는 Qiskit 함수로서 IBM Quantum Platform 에 원활하게 통합되었습니다.
QESEM을 사용하면 사용자는 노이즈가 있는 QPU에서 양자 회로를 실행하여, QPU 시간 오버헤드를 매우 효율적으로 관리하면서도 기본 한계에 근접한, 오류가 없는 고도로 정확한 결과를 얻을 수 있습니다. 이를 달성하기 위해 QESEM은 특성 분석 및 오류 감소를 위해 Qedma가 개발한 일련의 독자적인 기법을 활용합니다. 오류 감소 기법으로는 게이트 최적화, 노이즈 고려 트랜스필레이션, 오류 억제(ES), 그리고 편향 없는 오류 완화(EM) 등이 있습니다. 이러한 특성 분석 기반 방법들을 결합함으로써, 사용자는 일반적인 대용량 양자 회로에 대해 신뢰할 수 있고 오류가 없는 결과를 얻을 수 있으며, 이를 통해 다른 방법으로는 달성할 수 없었던 응용 분야를 개척할 수 있습니다.
기본 구성 요소에 대한 전체 설명과 유틸리티 규모 실증 사례는 논문 '유틸리티 규모 양자 회로를 위한 신뢰성 높은 고정밀 오류 완화'를 참조하십시오.
설명
오류 억제 및 완화를 통해 회로를 쉽게 예측하고 실행하여 더 큰 회로 볼륨과 더 높은 정확도를 달성할 수 있는 Qedma의 QESEM 기능을 사용할 수 있습니다. QESEM을 사용하려면 양자 회로, 측정할 관측 변수 세트, 각 관측 변수에 대한 목표 통계 정확도, 선택한 QPU를 제공하면 됩니다. 목표 정확도로 회로를 실행하기 전에 회로 실행이 필요 없는 분석 계산을 기반으로 필요한 QPU 시간을 예측할 수 있습니다. QPU 시간 추정에 만족하면 QESEM으로 회로를 실행할 수 있습니다.
회로를 실행할 때 QESEM은 해당 회로에 맞춤화된 장치 특성 분석 프로토콜을 실행하여 회로에서 발생하는 오류에 대한 신뢰할 수 있는 잡음 모델을 제공합니다. 특성화에 기반하여 QESEM은 먼저 노이즈 인식 트랜스파일레이션을 구현하여 입력 회로를 물리적 큐비트 및 게이트 집합에 매핑함으로써, 목표 관측량에 영향을 미치는 노이즈를 최소화합니다. 여기에는 기본적으로 제공되는 게이트( IBM® 장치의 CX/CZ)와 QESEM이 최적화한 추가 게이트가 포함되며, 이를 통해 QESEM의 확장 게이트 세트가 구성됩니다. QESEM은 QPU에서 특성화 기반 ES 및 EM 회로 세트를 실행하고 측정 결과를 수집합니다. 그런 다음 이를 고전적인 후처리 과정을 거쳐 각 관측량에 대해 요청된 정확도에 상응하는 편향 없는 기대값과 오차 막대를 제공합니다.
QESEM은 다양한 양자 애플리케이션과 오늘날 달성 가능한 최대 규모의 회로에 대해 높은 정확도의 결과를 제공하는 것으로 입증되었습니다. 아래 벤치마크 섹션에서 설명하는 QESEM은 다음과 같은 사용자 친화적인 기능을 제공합니다:
- 정확도 보장: QESEM은 관측 가능한 양의 기대값에 대해 편향 없는 추정값을 산출합니다. 해당 EM 방식은 이론적 보증을 갖추고 있으며, 이는 Qedma의 첨단 특성 분석과 결합되어 사용자가 지정한 정확도 수준까지 노이즈 없는 회로 출력으로 감쇠가 수렴되도록 보장합니다. 체계적 오류나 편향에 취약한 많은 휴리스틱 EM 방법과 달리, QESEM의 보장된 정확도는 일반적인 양자 회로 및 관측량에서 신뢰할 수 있는 결과를 보장하는 데 필수적이다.
- 대규모 QPU로의 확장성: QESEM의 QPU 소요 시간은 회로 부피에 따라 달라지지만, 큐비트 수와는 무관합니다. Qedma는 현재 이용 가능한 최대 규모의 양자 장치들, 즉 퀀텀 컴퓨팅 연구소( IBM Quantum )의 127큐비트 Eagle 장치와 133큐비트 Heron 장치를 포함하여 QESEM을 시연했습니다.
- 애플리케이션에 구애받지 않습니다: QESEM은 해밀턴 시뮬레이션, VQE, QAOA, 진폭 추정 등 다양한 애플리케이션에서 그 성능이 입증되었습니다. 사용자는 측정할 양자 회로와 관측 가능한 모든 것을 입력하고 오류 없는 정확한 결과를 얻을 수 있습니다. 유일한 제한은 하드웨어 사양과 할당된 QPU 시간에 따라 액세스 가능한 회로 볼륨과 출력 정확도가 결정됩니다. 반면, 많은 오류 감소 솔루션은 애플리케이션에 따라 다르거나 제어되지 않는 휴리스틱을 포함하므로 일반적인 양자 회로 및 애플리케이션에는 적용할 수 없습니다.
- 확장 게이트 세트: QESEM은 분수각도 게이트를 지원하며, IBM Quantum Heron 및 Eagle 장치에서 Qedma로 최적화된 분수각도 양자 게이트( )를 제공합니다. 이 확장된 게이트 세트는 더 효율적인 컴파일을 가능하게 하며, 기본 CX/CZ 컴파일 대비 최대 2배까지 큰 회로 볼륨을 활용할 수 있게 합니다.
- 다중 베이스 관측 변수: QESEM은 일반 해밀토니안과 같은 많은 비교대 폴리 문자열로 구성된 입력 관측값을 지원합니다. 그런 다음 측정 기준의 선택과 QPU 리소스 할당(샷 및 회로)의 최적화가 QESEM에 의해 자동으로 수행되어 요청된 정확도에 필요한 QPU 시간을 최소화합니다. 하드웨어 충실도와 실행 속도를 고려한 이 최적화를 통해 더 깊은 회로를 실행하고 더 높은 정확도를 얻을 수 있습니다.
벤치마크
QESEM은 다양한 사용 사례와 애플리케이션에서 테스트를 거쳤습니다. 다음 예제는 QESEM으로 실행할 수 있는 워크로드 유형을 평가하는 데 도움이 될 수 있습니다.
주어진 회로와 관측 가능성에 대한 오류 완화 및 고전적 시뮬레이션의 경도를 정량화하는 데 중요한 수치는 활성 볼륨, 즉 회로에서 관측 가능성에 영향을 미치는 CNOT 게이트의 수입니다. 활성 볼륨은 회로 깊이와 너비, 관측 가능한 무게, 관측 가능한 라이트 콘을 결정하는 회로 구조에 따라 달라집니다. 자세한 내용은 2024년 퀀텀 서밋( IBM ) 의 강연을 참조하세요. QESEM은 특히 대용량 영역에서 큰 가치를 제공하며, 일반 회로와 관측 가능성에 대해 신뢰할 수 있는 결과를 제공합니다.
애플리케이션 | 큐비트 수 | 디바이스 | 회로 설명 | 정확도 | 총 시간 | 런타임 사용 |
|---|---|---|---|---|---|---|
| VQE 회로 | 8 | Eagle ( r3 ) | 총 21개 레이어, 9개 측정 베이스, 1D 체인 | 98% | 35분 | 최소 14 |
| 킥 이싱 | 28 | Eagle ( r3 ) | 3개의 고유 레이어 x 3단계, 2D 헤비헥스 토폴로지 | 97% | 22분 | 4분 |
| 킥 이싱 | 28 | Eagle ( r3 ) | 3개의 고유 레이어 x 8단계, 2D 헤비헥스 토폴로지 | 97% | 116분 | 23분 |
| 트로터화된 해밀턴 시뮬레이션 | 40 | Eagle ( r3 ) | 고유 레이어 2개 x 트로터 스텝 10개, 1D 체인 | 97% | 3시간 | 25분 |
| 트로터화된 해밀턴 시뮬레이션 | 119 | Eagle ( r3 ) | 3개의 고유 레이어 x 9개의 트로터 스텝, 2D 헤비헥스 토폴로지 | 95% | 6.5 시간 | 45분 |
| 킥 이싱 | 136 | 헤론 ( r2 ) | 고유 레이어 3개 x 15단계, 2D 헤비헥스 토폴로지 | 99%의 | 52분 | 9분 |
여기서 정확도는 관측 가능한 이상적인 값을 기준으로 측정됩니다: 여기서 ' '는 (사용자 입력으로 설정된) 완화의 절대 정밀도이고, 은 노이즈 없는 회로에서 관측 가능한 값입니다. '런타임 사용량'은 배치 모드(개별 작업의 사용량 합계)에서 벤치마크의 사용량을 측정하는 반면, '총 시간'은 세션 모드(실험 벽 시간)에서 사용량을 측정하며, 여기에는 추가 클래식 및 통신 시간이 포함됩니다. QESEM은 두 가지 모드 모두에서 실행할 수 있으므로 사용자는 사용 가능한 리소스를 최대한 활용할 수 있습니다.
28-큐비트 킥 아이싱 회로는 신조 등이 연구한 이산 시간 준결정을 시뮬레이션합니다 arXiv 2403.16718 및 Q2B24 Tokyo 참조)를 3개의 연결된 ibm_kawasaki 루프에서 시뮬레이션합니다. 여기서 사용된 회로 파라미터는 , 강자성 초기 상태 입니다. 측정된 관측 가능 값은 자화의 절대값 입니다. 이 특정 벤치마크는 활성 볼륨이 회로 깊이에 따라 천천히 증가하는 클리포드 각도 에서 실행되었으며, 높은 장치 충실도와 함께 짧은 런타임에 높은 정확도를 가능하게 하는 ibm_fez의 136개 최고 큐비트에서 유틸리티 규모의 Kicked Ising 실험이 실행되었습니다.
트로터화된 해밀턴 시뮬레이션 회로는 분수 각도에서 횡장 필드 아이싱 모델을 위한 것입니다: 및 ( Q2B24 도쿄 참조). 유틸리티 규모의 회로는 ibm_brisbane의 119개 최고의 큐비트에서 실행되었고, 40큐비트 실험은 사용 가능한 최고의 체인에서 실행되었습니다. 자화에 대한 정확도가 보고되었으며, 더 높은 가중치의 관측물에 대해서도 높은 정확도의 결과를 얻었습니다.
VQE 회로는 도이치일렉트로넨싱크로트론(DESY)의 양자 기술 및 응용 센터 연구진과 함께 개발했습니다. 여기서 대상 관측 가능성은 많은 수의 비교대 폴리 문자열로 구성된 해밀턴으로, 다중 기준 관측 가능성에 최적화된 QESEM의 성능을 강조했습니다. 완화는 고전적으로 최적화된 안사츠에 적용되었으며, 이러한 결과는 아직 공개되지 않았지만 유사한 구조적 특성을 가진 다른 회로에 대해서도 동일한 품질의 결과를 얻을 수 있습니다.
시작하기
IBM Quantum Platform API 키를 사용하여 인증한 후, 다음과 같이 QESEM Qiskit 함수를 선택하십시오. (이 코드 조각은 이미 계정을 로컬 환경에 저장해 두었다고 가정합니다.)
import qiskit
from qiskit_ibm_catalog import QiskitFunctionsCatalog
catalog = QiskitFunctionsCatalog(channel="ibm_quantum_platform")
# verify that you have access to the function
catalog.list()# load the function
qesem_function = catalog.load("qedma/qesem")예
시간 추산 작업 예시
backend_name시간 추정 작업은 주어진 pub 및 에 대해 필요한 QPU 시간을 추정하는 데 유용합니다. backend_name 또한 임의의 시뮬레이터 백엔드로 설정할 수 있습니다. 예를 들어, fake_fez.
QESEM은 준확률론적 특성 기반 EM 방법을 사용합니다. 이 방법에는 대략 다음과 같은 비율로 증가하는 QPU 시간 오버헤드가 있습니다:
여기서 는 회로의 활성 부피, 는 목표 정밀도, 는 기본 게이트의 불확실성을 나타낸다.
참고로, "estimate_time_only": "empirical" 이 작업은 작업에 소요될 시간을 추정하기 위해 몇 분의 QPU 시간을 사용합니다(백엔드가 실제 장치인 경우; 시뮬레이터인 경우에는 QPU 시간이 사용되지 않습니다). 이 작업은 보통 5분 정도 걸리지만, 10분을 넘지는 않습니다. 실증적 시간 추정 작업과 완화 작업 사이에 불확실성이 급격히 변하면, QPU 소요 시간도 급격히 변하게 됩니다.
시작하려면 주어진 pub 에 대해 QESEM을 실행하는 데 필요한 QPU 시간을 추정하는 기본 예제를 사용해 보세요:
backend_name = "fake_fez"
circ = qiskit.QuantumCircuit(5)
circ.cx(0, 1)
circ.cx(2, 3)
circ.cx(1, 2)
circ.cx(3, 4)
avg_magnetization = qiskit.quantum_info.SparsePauliOp.from_sparse_list(
[("Z", [q], 1 / 5) for q in range(5)], num_qubits=5
)
other_observable = qiskit.quantum_info.SparsePauliOp.from_sparse_list(
[("ZZ", [0, 1], 1.0), ("XZ", [1, 4], 0.5)], num_qubits=5
)
time_estimation_job = qesem_function.run(
pubs=[(circ, [avg_magnetization, other_observable])],
options={
"estimate_time_only": "empirical",
},
backend_name=backend_name, # example: "fake_fez", "ibm_fez"
)time_estimate_result = (
time_estimation_job.result()
) # a list of results per pub (circuit)다음 코드 조각은 시간 추정 작업에서 다양한 실행 메트릭을 가져오는 방법을 설명합니다(estimate_time_only 설정됨):
pub_result = time_estimate_result[0]
print(
f"The estimated QPU time for mitigation for this PUB is: {pub_result.metadata['time_estimation_sec']}"
)
print(
f"The QPU time that this time estimation job took is (here it is 0 because we used fake_fez): {pub_result.metadata['total_qpu_time']}"
)
print(
f"Gates fidelity measured during the experiment: {pub_result.metadata['gate_fidelities']}"
)
print(f"Total shots: {pub_result.metadata['total_shots']}")
print(f"Resource usage breakdown: {pub_result.metadata['resource_usage']}")Output:
The estimated QPU time for mitigation for this PUB is: 300
The QPU time that this time estimation job took is (here it is 0 because we used fake_fez): 0
Gates fidelity measured during the experiment: {'CZ': 0.9951354916722668, 'ID1Q': 0.9991246627329172}
Total shots: 220000
Resource usage breakdown: {'RUNNING: MAPPING': {'CPU_TIME': 33.6066133165732, 'GPU_TIME': 0.0, 'QPU_TIME': 0.0}, 'RUNNING: OPTIMIZING_FOR_HARDWARE': {'CPU_TIME': 184.53575124032795, 'GPU_TIME': 0.0, 'QPU_TIME': 0.0}, 'RUNNING: WAITING_FOR_QPU': {'CPU_TIME': 0.0, 'GPU_TIME': 0.0, 'QPU_TIME': 0.0}, 'RUNNING: EXECUTING_QPU': {'CPU_TIME': 0.0, 'GPU_TIME': 0.0, 'QPU_TIME': 0.0}, 'RUNNING: POST_PROCESSING': {'CPU_TIME': 0.0, 'GPU_TIME': 0.0, 'QPU_TIME': 0.0}}
경험적 시간 추정이 활성화되면, QESEM은 소수의 회로를 실행하여 더 정확한 QPU 시간 추정치를 제공합니다. 이러한 회로의 완화 결과는 작업의 [필드 empirical_estimation_mitigation_results ]에서 확인할 수 있습니다.
이러한 결과는 제한된 수의 회로 샘플을 바탕으로 도출된 것이므로, 전체 QESEM 완화 작업에서 얻은 최종 결과에 비해 정확도가 상당히 떨어집니다. 그러나 회로가 작거나 목표 정밀도가 낮은 경우, 경험적 시간 추정 과정에서 수행되는 완화 조치만으로도 원하는 정밀도에 도달하기에 충분할 수 있으며, 이 경우 전체 완화 작업이 필요하지 않을 수도 있다.
이 empirical_estimation_mitigation_results 필드는 입력 매개변수당 객체 목록입니다 PrimitiveResult . 회로에 매개변수가 지정되지 않은 경우, 목록의 길이는 1이 됩니다.
empirical_estimation_mitigation_results = time_estimate_result[0].metadata[
"empirical_estimation_mitigation_results"
][0] # a list per parameterprint("Partial results for the observables:")
print(
f" Mitigated expectation values: {empirical_estimation_mitigation_results.data.evs}"
)
print(
f" Mitigated error bars: {empirical_estimation_mitigation_results.data.stds}"
)
print(
f" Number of shots used for mitigation: {empirical_estimation_mitigation_results.metadata['mitigation_shots']}"
)
transpiled_circ = empirical_estimation_mitigation_results.metadata[
"transpiled_circ"
]
print(f" Qubit mapping: {transpiled_circ['qubit_maps']}")
print(
f" Number of measurement bases: {transpiled_circ['num_measurement_bases']}\n"
)
# results per obs
emp_obs_results = empirical_estimation_mitigation_results.metadata["results"][
0
]
# print(f"Results for each observable: {results}")
print("Results for each observable:")
for i, (obs_array, result_dict) in enumerate(emp_obs_results):
# obs_array, result_dict = results
print(f"Observable {i+1}: {obs_array}")
print(
f" QESEM mitigated value: {result_dict['qesem']['value']} \u00b1 {result_dict['qesem']['error_bar']}"
)Output:
Partial results for the observables:
Mitigated expectation values: [1.00347302 1.00693905]
Mitigated error bars: [0.00304061 0.00714276]
Number of shots used for mitigation: 180000
Qubit mapping: [[[0, 136], [1, 143], [2, 142], [3, 141], [4, 140]]]
Number of measurement bases: 2
Results for each observable:
Observable 1: ObservablesArray({'IIIIZ': 0.2, 'IIIZI': 0.2, 'IIZII': 0.2, 'IZIII': 0.2, 'ZIIII': 0.2}, shape=())
QESEM mitigated value: 1.003473015776871 ± 0.0030406128032204015
Observable 2: ObservablesArray({'IIIZZ': 1.0, 'ZIIXI': 0.5}, shape=())
QESEM mitigated value: 1.0069390542613554 ± 0.0071427606736885925
QESEM 완화 작업 예시
다음 예제에서는 QESEM 작업을 실행합니다:
sample_job = qesem_function.run(
pubs=[(circ, [avg_magnetization, other_observable])],
backend_name=backend_name, # example: "ibm_fez"
# options = {
# "estimate_time_only": "empirical",
# "default_precision": 0.2, # Default precision is applied to all pubs that don't have a precision specified, see API reference for more details
# "max_execution_time": 3600, # You can specify a maximum QPU time in seconds, see API reference for more details
# "transpilation_level": "standard", # "minimal_with_layout_opt" for minimal transpilation, see API reference for more details
# "parallel_execution": True, # True for parallel execution, see API reference for more details
# },
)각 입력 필드 및 옵션에 대한 자세한 설명은 QESEM API 참조 문서를 참조하십시오.
익숙한 키스킷 서버리스 API를 사용하여 키스킷 함수 워크로드의 상태를 확인하거나 결과를 반환할 수 있습니다:
# Print the ID so you can use it later, if necessary
print(sample_job.job_id)
print(sample_job.status())
sample_result = sample_job.result()Output:
3ac6b2df-15b0-4dc0-8f48-cf14bd20a1c8
DONE
다음 코드 예제는 완화 조치 결과와 실행 메트릭을 가져오는 방법을 보여줍니다. 이 자료에는 다양한 매개변수가 QESEM 실행에 어떤 영향을 미치는지 더 깊이 이해할 수 있게 해주는 필수적인 데이터가 포함되어 있습니다. 또한 여러분의 연구를 바탕으로 논문을 작성할 때도 유용할 수 있습니다.
for pub_idx, pub_result in enumerate(
sample_result
): # each element in the list is a result for a different pub, here we sent only one pub
print(f"\nPUB {pub_idx}:")
print(
f" The QPU time that this job took is (here it is 0 because we used fake_fez): {pub_result.metadata['total_qpu_time']}"
)
print(
f" Gates fidelity measured during the experiment: {pub_result.metadata['gate_fidelities']}"
)
print(f" Total shots: {pub_result.metadata['total_shots']}")
print(
f" Number of shots used for mitigation: {pub_result.metadata['mitigation_shots']}"
)
print(
f" Resource usage breakdown: {pub_result.metadata['resource_usage']}"
)Output:
PUB 0:
The QPU time that this job took is (here it is 0 because we used fake_fez): 0.0
Gates fidelity measured during the experiment: {'CZ': 0.9953704216147041, 'ID1Q': 0.9991834123567518}
Total shots: 446000
Number of shots used for mitigation: 194000
Resource usage breakdown: {'RUNNING: MAPPING': {'CPU_TIME': 32.52745003718883, 'GPU_TIME': 0.0, 'QPU_TIME': 0.0}, 'RUNNING: OPTIMIZING_FOR_HARDWARE': {'CPU_TIME': 257.850521848537, 'GPU_TIME': 0.0, 'QPU_TIME': 0.0}, 'RUNNING: WAITING_FOR_QPU': {'CPU_TIME': 0.0, 'GPU_TIME': 0.0, 'QPU_TIME': 0.0}, 'RUNNING: EXECUTING_QPU': {'CPU_TIME': 0.0, 'GPU_TIME': 0.0, 'QPU_TIME': 0.0}, 'RUNNING: POST_PROCESSING': {'CPU_TIME': 0.0, 'GPU_TIME': 0.0, 'QPU_TIME': 0.0}}
metadata["results"]에서 결과는 먼저 회로 인스턴스별로, 그 다음에는 관측 변수별로 그룹화됩니다.
print("Full QESEM mitigation results:")
for pub_idx, pub_result in enumerate(sample_result):
print(f"\nPUB {pub_idx}:")
print(f" Mitigated expectation values: {pub_result.data.evs}")
print(f" Mitigated error bars: {pub_result.data.stds}")
noisy_results = pub_result.metadata.get("noisy_results")
print(f" Unmitigated expectation values: {noisy_results.evs}")
print(f" Unmitigated error bars: {noisy_results.stds}")
print(" Transpiled circuits:")
for circ_idx, transpiled_circ in enumerate(
pub_result.metadata["transpiled_circs"]
):
print(f" Circuit {circ_idx}:")
# print(f" Circuit: \n {transpiled_circ['circuit']}") # not printing it because it's long but you can see the transpiled circuit itself
print(f" Qubit mapping: {transpiled_circ['qubit_maps']}")
print(
f" Measurement bases: {transpiled_circ['num_measurement_bases']}"
)
print(" Results for each observable:")
for circ_idx, circ_results in enumerate(pub_result.metadata["results"]):
print(f" Circuit {circ_idx}:")
for obs_idx, (obs_array, result_dict) in enumerate(circ_results):
print(f" Observable {obs_idx}: {obs_array}")
print(
f" QESEM mitigated value: {result_dict['qesem']['value']} ± {result_dict['qesem']['error_bar']}"
)
print(
f" Unmitigated value: {result_dict['unmitigated']['value']} ± {result_dict['unmitigated']['error_bar']}"
)Output:
Full QESEM mitigation results:
PUB 0:
Mitigated expectation values: [1.00648343 1.00636289]
Mitigated error bars: [0.00253812 0.00693586]
Unmitigated expectation values: [0.98031429 0.96357143]
Unmitigated error bars: [0.00124128 0.00578812]
Transpiled circuits:
Circuit 0:
Qubit mapping: [[[0, 140], [1, 141], [2, 142], [3, 143], [4, 136]]]
Measurement bases: 2
Results for each observable:
Circuit 0:
Observable 0: ObservablesArray({'IIIIZ': 0.2, 'IIIZI': 0.2, 'IIZII': 0.2, 'IZIII': 0.2, 'ZIIII': 0.2}, shape=())
QESEM mitigated value: 1.0064834305181962 ± 0.002538119914534849
Unmitigated value: 0.9803142857142859 ± 0.0012412835813609938
Observable 1: ObservablesArray({'IIIZZ': 1.0, 'ZIIXI': 0.5}, shape=())
QESEM mitigated value: 1.0063628870614818 ± 0.006935859820870656
Unmitigated value: 0.9635714285714285 ± 0.005788121870526659
주요 결과 분석:
mitigated: 완전히 완화된 QESEM 기대값.unmitigated: 오차 완화 처리를 적용하지 않은 원시 물리적 잡음 결과.
QESEM 휴리스틱 외삽 결과
단일 precision 플로트를 사용하는 표준 QESEM 실행의 경우, 결과에는 QESEM 휴리스틱에 사용되는 자동으로 제공되는 노이즈 스케일링 포인트도 포함됩니다. 이러한 점수는 별도의 QPU 리소스를 사용하지 않고 계산됩니다.
‘scale’은 1.0 판독 잡음 저감(REM)이 적용된 물리적 장치의 잡음 수준을 나타내며, ‘scale’은 2.0 REM이 적용된 상태에서 잡음이 증폭된 상응점을 나타냅니다. 이러한 점들을 바탕으로 결과가 qesem_heuristic 도출됩니다.
qesem_heuristic: 이용 가능한 잡음 보정 데이터를 바탕으로 산출된 ZNE 방식의 추정값. 현재 이 기능은 지수 외삽법을 사용하고 있습니다.noise_scaling.results_with_REM: 다양한 잡음 규모에서의 기대값으로, 모두 판독 완화(REM)가 적용된 경우입니다.
미묘하지만 중요한 점은, 스케일 1.0 결과가 결과와 unmitigated 같지 않다는 것입니다. 두 값 모두 물리적 장치의 잡음 수준에 해당하지만, 점의 척도에는 1.0 판독 잡음 저감 효과가 반영된 반면 unmitigated , 점의 척도에는 반영되지 않습니다.
print("QESEM heuristic results:")
for pub_idx, pub_result in enumerate(sample_result):
print(f"\nPUB {pub_idx}:")
for circ_idx, circ_results in enumerate(pub_result.metadata["results"]):
print(f" Circuit {circ_idx}:")
for obs_idx, (obs_array, result_dict) in enumerate(circ_results):
print(f" Observable {obs_idx}: {obs_array}")
qesem_heuristic = result_dict["qesem_heuristic"][0]
print(" QESEM heuristic:")
print(
f" Value: {qesem_heuristic['value']} ± {qesem_heuristic['error_bar']}"
)
print(
f" Extrapolation: {qesem_heuristic['extrapolation']}"
)
print(
f" Scale factors: {qesem_heuristic['scale_factors']}"
)
noise_scaling = result_dict["noise_scaling"]
print(" Noise scaling results:")
print(
f" Scaling method: {noise_scaling['scaling_method']}"
)
print(" Results with Readout mitigation (REM):")
for rem_result in sorted(
(
item
for item in noise_scaling["results_with_REM"]
if item["scale"] != 0.0
),
key=lambda item: item["scale"],
):
print(
f" Scale factor {rem_result['scale']}: {rem_result['value']} ± {rem_result['error_bar']}"
)Output:
QESEM heuristic results:
PUB 0:
Circuit 0:
Observable 0: ObservablesArray({'IIIIZ': 0.2, 'IIIZI': 0.2, 'IIZII': 0.2, 'IZIII': 0.2, 'ZIIII': 0.2}, shape=())
QESEM heuristic:
Value: 1.0008161638888535 ± 0.0038859458884403964
Extrapolation: exponential
Scale factors: [1.0, 2.0]
Noise scaling results:
Scaling method: QESEM
Results with Readout mitigation (REM):
Scale factor 1.0: 0.9918395459270772 ± 0.0012565417579355634
Scale factor 2.0: 0.982943441922748 ± 0.0028919278067695018
Observable 1: ObservablesArray({'IIIZZ': 1.0, 'ZIIXI': 0.5}, shape=())
QESEM heuristic:
Value: 0.9960853148925298 ± 0.013811635038961175
Extrapolation: exponential
Scale factors: [1.0, 2.0]
Noise scaling results:
Scaling method: QESEM
Results with Readout mitigation (REM):
Scale factor 1.0: 0.9902860583785115 ± 0.005921236914723409
Scale factor 2.0: 0.984520565414274 ± 0.006909522262347639
다음 예제들은 특정 기능에 대한 입력과 결과에 중점을 두고 있으므로, 매번 전체 실행 메트릭을 출력하지는 않습니다. 앞서 소개한 총 QPU 시간, gate_fidelities, 총 샷 수, 완화_샷, 자원 사용량 와 같은 최상위 메타데이터는 이 작업들에서도 확인할 수 있습니다.
간결성을 위해 백엔드, 관측 가능 변수, 기본 회로 매개변수 등 이전 예제에서 사용된 일부 변수들을 아래에서 재사용합니다.
다음의 모든 예제는 경험적 시간 추정을 사용하여 실행할 수도 있습니다. 이 기능을 활성화하려면 함수 옵션에 <code>"estimate_time_only": "경험적"</code>를 전달하세요.
매개변수화된 회로 예시
많은 알고리즘이 동일한 회로를 여러 매개변수 값에서 평가합니다. 매개변수가 지정된 회로를 하나의 QESEM 작업으로 전송하면, QESEM이 회로 인스턴스 간에 특성 분석 및 보정 결과를 공유할 수 있어, 별도의 작업을 실행하는 것에 비해 QPU 처리 시간의 오버헤드를 줄일 수 있습니다.
매개변수화된 회로를 제출하려면 트랜스파일레이션 레벨을 "minimal_with_layout_opt" 사용해야 합니다.
이 단계에서 제출되는 회로는 백엔드에 따라 이미 해당 백엔드의 기본 게이트를 사용하여 표현되어 있어야 합니다. 이 단계에서 QESEM은 제출된 구조를 입력 회로에 최대한 가깝게 유지하며, 레이어화(연산을 병렬 2-큐비트 게이트 레이어로 그룹화하는 과정) 과정에서 장벽을 준수하면서도, 고충실도 큐비트에 대한 하드웨어 매핑과 장치 연결을 자동으로 처리합니다.
실제로 이는 제출 전에 회로를 대상 백엔드의 기본 게이트로 변환해야 함을 의미합니다. 아래에는 간단한 베이스-게이트 변환 예시가 나와 있습니다.
QESEM은 현재 매개변수 세트당 하나의 관측값만 지원합니다. other_observable``avg_magnetization아래의 두 매개변수 행은 두 관측 가능 변수와 결합됩니다. 첫 번째 행은 로 측정되고, 두 번째 행은 로 측정됩니다.
# Transpile to the backend basis gates only. With minimal_with_layout_opt, QESEM handles hardware mapping/connectivity and observable layout internally.
from qiskit_ibm_runtime.fake_provider import FakeFez
backend = FakeFez()
basis = backend.operation_names
print(basis)
param0 = qiskit.circuit.Parameter("param0")
param1 = qiskit.circuit.Parameter("param1")
parametrized_circ = qiskit.QuantumCircuit(5)
parametrized_circ.rx(param0, 0)
parametrized_circ.rx(param1, 1)
parametrized_circ.cx(0, 1)
parametrized_circ.cx(2, 3)
parametrized_circ.cx(1, 2)
parametrized_circ.cx(3, 4)
parametrized_circ = qiskit.transpile(
parametrized_circ, basis_gates=basis, optimization_level=1
)
parametrized_parameter_values = [[0.5, 0.1], [0.0, 0.6]]
parametrized_observables = [avg_magnetization, other_observable]
parametrized_job = qesem_function.run(
pubs=[
(
parametrized_circ,
parametrized_observables,
parametrized_parameter_values,
0.1,
)
],
backend_name=backend_name,
options={
"max_execution_time": 300,
"transpilation_level": "minimal_with_layout_opt",
},
)print(parametrized_job.job_id)
print(parametrized_job.status())Output:
d1b0e29b-196c-4896-aec6-44a268ebd874
DONE
parametrized_result = parametrized_job.result()print("Parameterized circuit QESEM results:")
for pub_idx, pub_result in enumerate(parametrized_result):
print(f"\nPUB {pub_idx}:")
print(f" Mitigated expectation values: {pub_result.data.evs}")
print(f" Mitigated error bars: {pub_result.data.stds}")
noisy_results = pub_result.metadata["noisy_results"]
print(f" Unmitigated expectation values: {noisy_results.evs}")
print(f" Unmitigated error bars: {noisy_results.stds}")
print(" Results for each parameter value:")
for param_idx, param_results in enumerate(pub_result.metadata["results"]):
print(
f" Parameter set {param_idx}: {parametrized_parameter_values[param_idx]}"
)
for obs_idx, (obs_array, result_dict) in enumerate(param_results):
print(f" Observable {obs_idx}: {obs_array}")
print(
f" QESEM mitigated value: {result_dict['qesem']['value']} ± {result_dict['qesem']['error_bar']}"
)
print(
f" Unmitigated value: {result_dict['unmitigated']['value']} ± {result_dict['unmitigated']['error_bar']}"
)Output:
Parameterized circuit QESEM results:
PUB 0:
Mitigated expectation values: [0.92392021 0.82517653]
Mitigated error bars: [0.00565281 0.00616016]
Unmitigated expectation values: [0.9028 0.78771429]
Unmitigated error bars: [0.00335142 0.00925413]
Results for each parameter value:
Parameter set 0: [0.5, 0.1]
Observable 0: ObservablesArray({'IIIIZ': 0.2, 'IIIZI': 0.2, 'IIZII': 0.2, 'IZIII': 0.2, 'ZIIII': 0.2}, shape=())
QESEM mitigated value: 0.923920210615709 ± 0.005652811570890183
Unmitigated value: 0.9028 ± 0.0033514176105045447
Parameter set 1: [0.0, 0.6]
Observable 0: ObservablesArray({'IIIZZ': 1.0, 'ZIIXI': 0.5}, shape=())
QESEM mitigated value: 0.8251765289285893 ± 0.006160161743353999
Unmitigated value: 0.7877142857142858 ± 0.009254130564027902
다중 펍 예시
다중 퍼브 실행은 하나의 QESEM 작업에서 여러 개의 관련 회로를 실행하고자 할 때 유용합니다. 매개변수화된 실행과 마찬가지로, QESEM은 별도의 작업에서 특성 분석 및 보정 과정을 반복하는 대신 여러 회로 인스턴스 간에 이를 공유할 수 있으므로 오버헤드를 줄일 수 있습니다.
이는 특히 트로터(Trotter)형 워크로드와 같이 서로 다른 회로가 동일한 고유 레이어를 재사용하는, 레이어를 공유하는 구조를 가진 회로에 특히 유용합니다. 이 경우, 두 작업을 함께 수행하면 개별 QESEM 작업에 비해 특성 분석 비용을 절감할 수 있습니다.
"transpilation_level": "minimal_with_layout_opt"여러 펍에서 근무하는 일자리는 다음을 요구합니다. 매개변수화된 예제와 마찬가지로, 회로는 제출 전에 대상 백엔드의 기본 게이트로 변환되어야 합니다. 그런 다음 QESEM은 장치 연결, 레이아웃 및 고정밀 큐비트 매핑을 내부적으로 처리합니다.
아래의 각 PUB 에는 하나의 회로와 이 노트북의 앞부분에서 사용했던 것과 동일한 두 개의 관측 가능한 변수가 포함되어 있으므로, 반환된 PrimitiveResult 값에는 입력 회로 하나당 하나씩 PubResult 포함됩니다.
아래 예시에서는 동일한 레이어 패턴을 가진 두 개의 간단한 트로터 회로를 사용합니다. circ_a 에는 트로터 레이어가 하나 있고, 에는 circ_b 동일한 레이어 패턴이 두 번 반복됩니다. 이를 통해 공유 구조가 명확해집니다.
def make_trotter_circuit(num_qubits, num_layers, zz_angle=0.2, x_angle=0.1):
trotter_circ = qiskit.QuantumCircuit(num_qubits)
for _ in range(num_layers):
for q in range(num_qubits):
trotter_circ.rx(x_angle, q)
trotter_circ.barrier()
for q in range(0, num_qubits - 1, 2):
trotter_circ.rzz(zz_angle, q, q + 1)
trotter_circ.barrier()
for q in range(1, num_qubits - 1, 2):
trotter_circ.rzz(zz_angle, q, q + 1)
trotter_circ.barrier()
return trotter_circ
circ_a = make_trotter_circuit(num_qubits=5, num_layers=1)
circ_b = make_trotter_circuit(num_qubits=5, num_layers=2)multi_pubs = [
(
qiskit.transpile(qci, basis_gates=basis, optimization_level=1),
[avg_magnetization, other_observable],
)
for qci in [circ_a, circ_b]
]
multi_circ_job = qesem_function.run(
pubs=multi_pubs,
backend_name=backend_name,
options={
"max_execution_time": 300,
"transpilation_level": "minimal_with_layout_opt",
"default_precision": 0.1,
},
)print(multi_circ_job.job_id)
print(multi_circ_job.status())Output:
e34565b8-7262-4133-a120-de42ce624a99
DONE
multi_circ_result = multi_circ_job.result()print("Multi-pub QESEM results:")
for pub_idx, pub_result in enumerate(multi_circ_result):
print(f"\nPUB {pub_idx}:")
print(f" Mitigated expectation values: {pub_result.data.evs}")
print(f" Mitigated error bars: {pub_result.data.stds}")
noisy_results = pub_result.metadata["noisy_results"]
print(f" Unmitigated expectation values: {noisy_results.evs}")
print(f" Unmitigated error bars: {noisy_results.stds}")
print(" Results for each observable:")
for circ_idx, circ_results in enumerate(pub_result.metadata["results"]):
print(f" Circuit {circ_idx}:")
for obs_idx, (obs_array, result_dict) in enumerate(circ_results):
print(f" Observable {obs_idx}: {obs_array}")
print(
f" QESEM mitigated value: {result_dict['qesem']['value']} ± {result_dict['qesem']['error_bar']}"
)
print(
f" Unmitigated value: {result_dict['unmitigated']['value']} ± {result_dict['unmitigated']['error_bar']}"
)Output:
Multi-pub QESEM results:
PUB 0:
Mitigated expectation values: [0.99502406 1.02209332]
Mitigated error bars: [0.00483819 0.00707488]
Unmitigated expectation values: [0.96934286 0.97271429]
Unmitigated error bars: [0.00124855 0.00617294]
Results for each observable:
Circuit 0:
Observable 0: ObservablesArray({'IIIIZ': 0.2, 'IIIZI': 0.2, 'IIZII': 0.2, 'IZIII': 0.2, 'ZIIII': 0.2}, shape=())
QESEM mitigated value: 0.9950240647925642 ± 0.004838188086259301
Unmitigated value: 0.9693428571428573 ± 0.0012485470362492692
Observable 1: ObservablesArray({'IIIZZ': 1.0, 'ZIIXI': 0.5}, shape=())
QESEM mitigated value: 1.0220933230604674 ± 0.007074884384355636
Unmitigated value: 0.9727142857142859 ± 0.006172939375512439
PUB 1:
Mitigated expectation values: [0.98850017 1.02555188]
Mitigated error bars: [0.0077912 0.01672652]
Unmitigated expectation values: [0.93682857 0.95371429]
Unmitigated error bars: [0.00156245 0.00665735]
Results for each observable:
Circuit 0:
Observable 0: ObservablesArray({'IIIIZ': 0.2, 'IIIZI': 0.2, 'IIZII': 0.2, 'IZIII': 0.2, 'ZIIII': 0.2}, shape=())
QESEM mitigated value: 0.988500171577252 ± 0.007791203181151346
Unmitigated value: 0.9368285714285716 ± 0.001562451883089579
Observable 1: ObservablesArray({'IIIZZ': 1.0, 'ZIIXI': 0.5}, shape=())
QESEM mitigated value: 1.02555188098689 ± 0.016726524388086233
Unmitigated value: 0.9537142857142858 ± 0.006657345655544263
준확률적 오차 조정(QET) 예시
준확률적 오차 조정(QET)은 선택된 노이즈 스케일 계수에서 기대값을 요구합니다. 이는 사용자 정의 노이즈 스케일링 연구 및 제로 노이즈 외삽 워크플로우에 유용합니다. 스케일은 1.0 물리적 소음 수준을 나타내며, 와 1.0 사이의 0.0 값은 소음을 부분적으로 줄여주고, 보다 1.0 큰 값은 소음을 증폭시킵니다.
Qiskit 함수와 함께 QET를 사용하려면, PUB 정밀도 매개변수로 사전(dictionary)을 전달하십시오. 이 사전은 요청된 각 노이즈 척도를 해당 목표 정밀도와 매핑합니다. 반환된 스케일 팩터 결과는 에 noise_scaling.results_with_REM 저장되며, 판독 오차 보정이 포함됩니다. 따라서 스케일 1.0 포인트는 순수한 값과 동일하지 않습니다. 왜냐하면 1.0 전자는 판독 오차 보정을 포함하는 반면 unmitigated , 후자는 그렇지 않기 때문입니다.
스케일이 요청되면, QESEM은 추가적인 QPU 사용량 없이 주변의 1.0 보완 스케일도 함께 반환합니다. 0.7``1.5예를 들어, 를 요청하면 0.5 가 반환될 수도 있고, 를 요청하면 1.3 가 반환될 수도 있습니다. 보완 눈금의 정확도는 보장되지 않습니다.
noise_scale_precision = {0.5: 0.15, 1.3: 0.2}
qet_job = qesem_function.run(
pubs=[
(
circ,
[avg_magnetization, other_observable],
None,
noise_scale_precision,
)
],
backend_name=backend_name,
options={"max_execution_time": 300},
)print(qet_job.job_id)
print(qet_job.status())Output:
8195fa58-f037-4651-8715-36ce1cdc5521
DONE
qet_result = qet_job.result()print("QET noise-scaling results:")
for pub_idx, pub_result in enumerate(qet_result):
print(f"\nPUB {pub_idx}:")
noisy_results = pub_result.metadata["noisy_results"]
print(f" Unmitigated expectation values: {noisy_results.evs}")
print(f" Unmitigated error bars: {noisy_results.stds}")
print(" Results for each observable:")
for circ_idx, circ_results in enumerate(pub_result.metadata["results"]):
print(f" Circuit {circ_idx}:")
for obs_idx, (obs_array, result_dict) in enumerate(circ_results):
print(f" Observable {obs_idx}: {obs_array}")
noise_scaling = result_dict["noise_scaling"]
print(
f" Scaling method: {noise_scaling['scaling_method']}"
)
print(" Results with Readout mitigation (REM):")
for rem_result in sorted(
(
item
for item in noise_scaling["results_with_REM"]
if item["scale"] != 0.0
),
key=lambda item: item["scale"],
):
print(
f" Scale factor {rem_result['scale']}: {rem_result['value']} ± {rem_result['error_bar']}"
)Output:
QET noise-scaling results:
PUB 0:
Unmitigated expectation values: [0.97822857 0.96171429]
Unmitigated error bars: [0.00123812 0.00672958]
Results for each observable:
Circuit 0:
Observable 0: ObservablesArray({'IIIIZ': 0.2, 'IIIZI': 0.2, 'IIZII': 0.2, 'IZIII': 0.2, 'ZIIII': 0.2}, shape=())
Scaling method: QESEM
Results with Readout mitigation (REM):
Scale factor 0.5: 0.9938730340199383 ± 0.0032116907357568275
Scale factor 0.7: 0.9963976191853445 ± 0.00036300258869586616
Scale factor 1.0: 0.9898115079506586 ± 0.0012525947426560995
Scale factor 1.3: 0.9864667065580341 ± 0.002633221613518526
Scale factor 1.5: 0.9838755527197551 ± 0.002948417797996015
Observable 1: ObservablesArray({'IIIZZ': 1.0, 'ZIIXI': 0.5}, shape=())
Scaling method: QESEM
Results with Readout mitigation (REM):
Scale factor 0.5: 1.0006538544450332 ± 0.002121742014777343
Scale factor 0.7: 1.0004159801523036 ± 0.0021671375357823794
Scale factor 1.0: 0.9898058846339917 ± 0.00690183710903159
Scale factor 1.3: 0.9948946719997267 ± 0.002146532859610311
Scale factor 1.5: 0.9927220368192772 ± 0.0020875057190323882
오류 메시지 가져오기
워크로드 상태가 ERROR인 경우, 다음과 같이 를 사용하여 job.result() 오류 메시지를 확인하십시오:
# Get the result and truncate for readability
result = sample_job.result()
result_str = str(result)
max_length = 500 # Adjust this value as necessary
if len(result_str) > max_length:
truncated = (
result_str[:max_length]
+ f"... (truncated {len(result_str) - max_length} characters)"
)
else:
truncated = result_str
print(truncated)Output:
PrimitiveResult([PubResult(data=DataBin(evs=np.ndarray(<shape=(2,), dtype=float64>), stds=np.ndarray(<shape=(2,), dtype=float64>), shape=(2,)), metadata={'gate_fidelities': {'CZ': 0.9979444718552628, 'ID1Q': 0.9991994239814883}, 'total_shots': 498600, 'mitigation_shots': 223400, 'transpiled_circs': [{'circuit': 'OPENQASM 3.0;\ninclude "stdgates.inc";\nbit[76] c0;\nqubit[76] q0;\nrx(0) q0[54];\nrx(0) q0[59];\nrx(0) q0[75];\nrz(pi/2) q0[54];\nrz(pi/2) q0[59];\nrz(pi/2) q0[75];\nrx(pi/2) q0[54];\nr... (truncated 3771 characters)
지원 받기
Qedma 지원팀이 도와드리겠습니다! QESEM 키스킷 기능 사용에 문제가 발생하거나 궁금한 점이 있으면 주저하지 마시고 문의해 주세요. 지식이 풍부하고 친절한 지원 담당자가 기술적인 문제나 문의 사항에 대해 도움을 드릴 준비가 되어 있습니다.
다음 주소로 이메일을 보내 [email protected] 으로 이메일을 보내 도움을 요청하세요. 신속하고 정확한 답변을 제공할 수 있도록 발생한 문제에 대해 최대한 자세히 알려주시기 바랍니다. 이메일이나 전화로 Qedma POC 전담 담당자에게 문의할 수도 있습니다.
보다 효율적인 지원을 위해 문의 시 다음 정보를 제공해 주시기 바랍니다:
- 문제에 대한 자세한 설명
- 작업 ID
- 관련 오류 메시지 또는 코드
저희는 사용자가 키스킷 기능을 최대한 잘 사용할 수 있도록 신속하고 효과적인 지원을 제공하기 위해 최선을 다하고 있습니다.
저희는 항상 제품 개선을 위해 노력하고 있으며, 여러분의 제안을 환영합니다! 서비스 개선 방안이나 추가를 원하는 기능에 대한 아이디어가 있으시면 [email protected] 으로 의견을 보내주시기 바랍니다.
다음 단계
- Qedma QESEM에 대한 접근 권한을 요청합니다.
- 이 Qiskit 함수에 대한 API 참조 를 확인해 보세요.
- QESEM 함수를 사용한 ‘ 2D ’ 기울어진 자기장 이징 모델 시뮬레이션 튜토리얼을 직접 체험해 보세요.
- 리뷰 아하로노프, D., 등 (2025). 유틸리티 규모 양자 회로를 위한 신뢰할 수 있는 고정밀 오류 완화 기술. arXiv 사전 인쇄본 arXiv:2508.10997.
- 리뷰 아하로노프, D., 등 (2025). 증후군을 고려한 논리적 오류 완화. arXiv 사전 출판본 arXiv:2508.10997.
- 리뷰 아하로노프, D., 등 (2025). 양자 계산에서 오류 완화 조치의 중요성에 대하여. arXiv 사전 출판본 arXiv:2512.23810.
- 바우만, N. P. 검토 등 (2025). 양자 하드웨어 상의 화학계 시뮬레이션에 적용된 결합 클러스터 다운폴딩 이론. arXiv 사전 인쇄본 arXiv:2507.01199.
- 리뷰 골닥, M., 등 (2026). 현재의 양자 하드웨어를 활용한 속도장의 통계적 특성 계산. arXiv 사전 출판본 arXiv:2601.10166.
- 리뷰 사쿠마, R., 등 (2026). 양자 컴퓨터를 이용한 다전자 파동함수의 점군 대칭성 분석 arXiv 사전 출판본 arXiv:2605.24824.