ข้ามไปยังเนื้อหาหลัก

สร้างและรันโปรแกรมควอนตัมแรกของคุณ

บทนำ

ในวิดีโอต่อไปนี้ Olivia Lanes จะพาคุณผ่านเนื้อหาในบทเรียนนี้ หรือจะเปิด วิดีโอ YouTube ของบทเรียนนี้ในหน้าต่างแยกต่างหากก็ได้

ยินดีต้อนรับสู่ ใช้คอมพิวเตอร์ควอนตัมได้วันนี้เลย! เป้าหมายของคอร์สนี้คือให้คุณรันโค้ดบนคอมพิวเตอร์ควอนตัมจริงได้ในเวลาอันสั้นที่สุด โดยไม่ต้องมีพื้นฐานมาก่อน มาเริ่มกันเลย

บทเรียนแรกนี้เป็นการแนะนำการคำนวณควอนตัมแบบลงมือปฏิบัติจริง ที่เหมาะสำหรับทั้งผู้เริ่มต้นที่อยากรู้และผู้บริหารที่มีเวลาจำกัด คุณจะได้เรียนรู้เกี่ยวกับ Circuit ควอนตัม และเขียนโปรแกรมควอนตัมเล็กๆ ที่สร้าง entanglement แล้วรันบนคอมพิวเตอร์ควอนตัม IBM® จริง นอกจากนี้ยังมีตัวเลือกให้รันโปรแกรมเดียวกันบน Simulator หากต้องการข้ามการรันบนคอมพิวเตอร์ควอนตัมจริง

Notebook นี้สามารถรันจากบนลงล่างใน Google Colab runtime ที่เปิดใหม่ หรือรันในเครื่องก็ได้

ตั้งค่าระบบ

ในการรัน Notebook นี้ใน Google Colab คุณต้องมี บัญชี Google เพื่อเปิด Notebook และรัน Cell ในเบราว์เซอร์

ในการรันบนคอมพิวเตอร์ควอนตัม IBM จริง คุณยังต้องมี บัญชี IBM Quantum® Platform (ฟรี) ด้วย สามารถเปิด Instance โดยใช้ Open Plan เพื่อรับเวลา quantum processor unit (QPU) 10 นาทีต่อหน้าต่าง 28 วัน ซึ่งจริงๆ แล้วค่อนข้างมาก! หากมีปัญหากับบัญชี ดูที่ หน้า Support

นอกจากนี้ยังสามารถรัน Notebook นี้ในเครื่องหลังจากติดตั้ง Qiskit โดยทำตามคำแนะนำบน IBM Quantum Platform

การติดตั้งและ Import

ใน Colab เราติดตั้ง dependencies ภายใน Notebook เพื่อให้ทุกคนใช้เครื่องมือชุดเดียวกัน Cell ถัดไปติดตั้ง Qiskit พร้อม visualization module บวกกับสอง Add-on: Aer (Simulator ที่รวดเร็ว) และ IBM Runtime client (สำหรับการรันบนคอมพิวเตอร์ควอนตัม)

จากนั้น เรามี Import หลายรายการ คลาส QuantumCircuit คือที่ที่เราใช้กำหนด Qubit และกำหนดการดำเนินการบน Qubit เหล่านั้น นี่คือคำศัพท์ควอนตัมแรก: Qubit คือองค์ประกอบพื้นฐานของการคำนวณควอนตัม เช่นเดียวกับที่บิตเป็นองค์ประกอบพื้นฐานของการคำนวณแบบคลาสสิก เราจะเรียนรู้เพิ่มเติมเกี่ยวกับคุณสมบัติพิเศษของ Qubit เมื่อสร้าง Circuit ต่อไป plot_histogram จะใช้เพื่อแสดงผลลัพธ์ของ Circuit ควอนตัม AerSimulator ให้เรา Simulate Circuit ควอนตัมบนคอมพิวเตอร์แบบคลาสสิก แต่ Simulator ไม่สามารถรัน Circuit ควอนตัมในระดับเดียวกับคอมพิวเตอร์ควอนตัมจริงได้ นั่นคือเหตุผลที่เราต้องการคอมพิวเตอร์ควอนตัมจริง ซึ่งมีประโยชน์สำหรับการทดสอบ แก้ Bug หรือเพื่อการศึกษา หรือหากใช้เวลา QPU ฟรี 10 นาทีหมดแล้ว preset_passmanagers ช่วยปรับแต่ง Circuit ให้ทำงานบน Hardware ได้อย่างมีประสิทธิภาพ ซึ่งสำคัญมากขึ้นเมื่อ Circuit ซับซ้อนขึ้น Sampler และ QiskitRuntimeService จำเป็นสำหรับการรัน Circuit บนคอมพิวเตอร์ควอนตัมจริง เราจะอธิบายเพิ่มเติมในภายหลัง

# Added by doQumentation — required packages for this notebook
!pip install -q qiskit
!pip install 'qiskit[visualization]' qiskit-ibm-runtime qiskit-aer
# Core Qiskit imports
from qiskit import QuantumCircuit
from qiskit.visualization import plot_histogram
from qiskit_aer import AerSimulator
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager

# IBM Runtime specific imports
from qiskit_ibm_runtime import SamplerV2 as Sampler, QiskitRuntimeService

ต่อไปเราจะทำการตรวจสอบ Environment อย่างรวดเร็ว เราตรวจสอบ Version และยืนยัน Import

หากมีอะไรผิดพลาดที่นี่ มักเป็นปัญหาการติดตั้ง dependency การแก้ไขตอนนี้จะป้องกัน Error ที่น่างงในภายหลัง

import sys

import qiskit
import qiskit_aer
import qiskit_ibm_runtime

print("Python:", sys.version.split()[0])
print("qiskit:", qiskit.__version__)
print("qiskit-aer:", qiskit_aer.__version__)
print("qiskit-ibm-runtime:", qiskit_ibm_runtime.__version__)
Python: 3.12.2
qiskit: 2.2.3
qiskit-aer: 0.17.2
qiskit-ibm-runtime: 0.41.1

แวะเล่น Composer สักครู่

ก่อนเขียนโค้ด การมองเห็น Circuit แบบ Visual จะช่วยได้มาก IBM Quantum Composer ให้คุณสร้าง Circuit โดยลาก Gate มาวางบนสาย เป็นวิธีที่ดีในการเข้าใจว่า Circuit กำลังทำอะไร โดยไม่ต้องสนใจ Syntax

เปิด Composer ที่นี่

เมื่อโหลดเสร็จ เปิด Tutorial แบบนำทางจากเมนู: Help | Build your first circuit ทำในแบบที่คุณถนัด ขณะทำ ให้สังเกตว่า Gate แต่ละอันเปลี่ยนสิ่งที่คุณคาดว่าจะวัดได้อย่างไร

Tutorial นี้จะพาผ่านขั้นตอนการสร้าง Circuit "Hello World" โดยแสดงผ่าน circuit diagram ซึ่ง Qubit แทนด้วยเส้นแนวนอน และ Gate ที่กระทำต่อ Qubit เหล่านั้นแทนด้วยกล่องหรือสัญลักษณ์อื่นบนเส้น Circuit นี้แนะนำคุณสมบัติสำคัญบางอย่างของ Qubit และคอมพิวเตอร์ควอนตัม:

ประการแรก กล่องสีแดงที่มีตัวอักษร "H" คือ Hadamard Gate ซึ่งสร้าง superposition state ของ Qubit 0 ต่างจากบิตที่อยู่ได้แค่สถานะ 1 หรือ 0 สถานะของ Qubit สามารถรวมทั้งสองความเป็นไปได้ไว้พร้อมกัน โดยมีน้ำหนักบางอย่าง (เรียกว่า amplitude) ประกอบกับแต่ละอัน Superposition ไม่ได้หมายความว่าคุณจะเห็นทั้งสองผลลัพธ์ในการวัดครั้งเดียว แต่หมายความว่าสถานะถูกตั้งค่าเพื่อให้ผลลัพธ์ใดก็ตามสามารถเกิดขึ้นได้เมื่อวัด

ประการที่สอง วงกลมและเส้นแนวตั้งที่เชื่อม Qubit สองตัวคือ CNOT Gate ซึ่งสร้าง entanglement ระหว่าง Qubit สองตัว Entanglement คือการเชื่อมต่อพิเศษระหว่าง Qubit เมื่อ Qubit ถูก Entangle ผลลัพธ์ของการวัดจะมีความสัมพันธ์กันอย่างแน่นแฟ้นในแบบที่ไม่ตรงกับสิ่งที่คาดไว้จากการโยนเหรียญอิสระแบบธรรมดา หรือจากความสัมพันธ์แบบคลาสสิกใดๆ เมื่อ Qubit สองตัว Entangle กัน การวัดตัวหนึ่งจะบอกผลลัพธ์ของการวัดอีกตัวได้ทันที

แนวคิดสำคัญอีกอย่างที่จะพบใน Tutorial คือ shots เนื่องจาก measurement คือช่วงเวลาที่ Qubit หยุดทำตัวเป็น quantum state และให้ผลลัพธ์แบบคลาสสิก superposition state จะยุบตัวแบบ probabilistic เป็น 0 หรือ 1 เมื่อถูกวัด ดังนั้น เพื่อเรียนรู้เกี่ยวกับ superposition นั้น คุณต้องวัดหลายครั้งโดยรัน Circuit เดิมซ้ำๆ เพื่อสะสมสถิติ สิ่งเหล่านี้เรียกว่า shots

ทดสอบความเข้าใจ

ลองคิดแต่ละคำถามด้านล่าง แล้วคลิกเพื่อดูคำตอบ

คุณสามารถเห็น superposition โดยตรงจากการวัดครั้งเดียวได้ไหม?

คำตอบ

ไม่ได้ การวัดครั้งเดียวจะได้ค่าแบบคลาสสิกเสมอ: ไม่เป็น 0 ก็ 1 แนวคิดเรื่อง "การผสม" จะปรากฏในสถิติที่เห็นหลังจากรันหลายครั้ง ที่เรียกว่า shots

ในภาษาง่ายๆ entanglement ให้อะไรกับคุณ?

คำตอบ

มันให้ผลลัพธ์ที่เชื่อมโยงกัน การวัด Qubit ตัวหนึ่งบอกบางอย่างเกี่ยวกับอีกตัวหนึ่ง การเชื่อมโยงนี้แข็งแกร่งกว่าความสุ่มอิสระ และแข็งแกร่งกว่าที่ความสัมพันธ์แบบคลาสสิกหรือความสุ่มที่แบ่งปันกันจะอธิบายได้

หาก Qubit อยู่ใน superposition คุณจะเห็นอะไรในการวัดครั้งเดียว และทำไมถึงต้องใช้หลาย shots?

คำตอบ

ในการวัดครั้งเดียวคุณจะเห็นผลลัพธ์แบบคลาสสิกเพียงอย่างเดียว: ไม่เป็น 0 ก็ 1 คุณต้องใช้หลาย shots เพราะ "superposition" ปรากฏเป็น probability distribution ซึ่งคุณสามารถประมาณได้โดยการสะสมสถิติจากการรันซ้ำๆ เท่านั้น

ดู histogram การวัดของ Circuit Hello World ใน Composer คุณเห็นอะไร? ทำไมนี่ถึงเป็นลายเซ็นของ entanglement?

คำตอบ

มันแสดงโอกาส 50% ที่จะอยู่ในสถานะ 00|00\rangle และโอกาส 50% ที่จะอยู่ในสถานะ 11|11\rangle ซึ่งหมายความว่าหากวัดตัวหนึ่งได้ 0 อีกตัวจะเป็น 0 ด้วย และหากวัดตัวหนึ่งได้ 1 อีกตัวก็จะเป็น 1 เช่นกัน นี่คือความสัมพันธ์ระหว่าง Qubit สองตัวที่อธิบายได้ด้วย entanglement

สร้างและรันโปรแกรมควอนตัมด้วย Qiskit

โอเค กลับมาเขียนโค้ดกัน เราจะสร้าง entangled state เดียวกับที่ทำใน Composer (เรียกว่า Φ+\Phi^+ (phi-plus) Bell state) แต่คราวนี้เราจะเขียนโค้ดด้วยมือ เราต้องฝึกทักษะนี้เพราะเมื่อ Scale ไปสู่ Qubit มากขึ้นและ Circuit ที่ซับซ้อนขึ้น Composer จะช่วยไม่ได้

ในการสร้าง Bell state Circuit เราใช้ Gate HH (Hadamard) เพื่อใส่ Qubit แรกเข้าสู่ superposition ที่เท่ากัน จากนั้นใช้ Gate CXCX (controlled-NOT) ซึ่ง Entangle สองสถานะเข้าด้วยกัน Qubit ทั้งสองตอนนี้มีความสัมพันธ์กันในแบบที่ไม่มีสิ่งเทียบเท่าในโลกคลาสสิก

# --- Build the Bell circuit (phi-plus) ---
bell = QuantumCircuit(2)
bell.h(0)
bell.cx(0, 1)
bell.measure_all() # creates a classical register named "meas"

bell.draw("mpl")

Output of the previous code cell

ฟังก์ชันช่วยสำหรับรัน Circuit

ตอนนี้มากำหนดฟังก์ชันช่วยที่จัดการกระบวนการรัน Circuit ควอนตัมและดึงผลลัพธ์การวัดออกมา ฟังก์ชันนี้ดูแลการ Transpile Circuit ให้ตรงกับ instruction set ของ Backend การรันผ่าน Sampler primitive และการดึง count จากผลลัพธ์

def run_circuit_and_get_counts(circuit, backend, shots=1000):
"""
Runs a quantum circuit on a specified backend and returns the measurement counts.

Args:
circuit (QuantumCircuit): The quantum circuit to run.
backend: The Qiskit backend (real device or simulator).
shots (int): The number of shots to run the circuit.

Returns:
dict: A dictionary of measurement counts.
"""
pm = generate_preset_pass_manager(backend=backend, optimization_level=1)
isa_circuit = pm.run(circuit)

sampler = Sampler(mode=backend)

job = sampler.run([isa_circuit], shots=shots)
result = job.result()

return result[0].data.meas.get_counts()

รันบน QPU และแสดงผลลัพธ์

สุดท้าย เรารัน Circuit บน IBM quantum processing unit (QPU) บน Cloud สำหรับ 1000 shots และพล็อตผลลัพธ์ IBM QPU เป็นระบบทางกายภาพที่สามารถรับ Noise ได้ ดังนั้น Gate จึงไม่สมบูรณ์นิดหน่อย การวัดอาจผิดบ้างบางครั้ง และ Device calibration เปลี่ยนแปลงตามเวลา

การรันบนคอมพิวเตอร์ควอนตัมจริงยังมีข้อควรพิจารณาในทางปฏิบัติ งานอาจต้องรอในคิว เพราะมีคนจำนวนมากที่อาจใช้ Device เดียวกัน นอกจากนี้คุณยังต้องเลือกจำนวน shot ที่สมดุลระหว่างข้อพิจารณาทางสถิติ (shots มากขึ้น = signal-to-noise ratio สูงขึ้น) กับข้อจำกัดด้านเวลา/ค่าใช้จ่าย

ทำตามคำแนะนำใน comment ของโค้ดใน Cell ถัดไป หลังจากรัน Cell คุณควรเห็น histogram ที่มี count ประมาณเท่ากันสำหรับ bitstring 0000 และ 1111 โดยมี 0101 หรือ 1010 เกิดขึ้นบ้างเนื่องจาก Noise Cell ถัดไปใน Notebook นี้รัน Circuit เดียวกันบน Simulator หากต้องการข้ามการรันบน QPU

# Syntax for first saving your token.  Delete these lines after saving your credentials.
QiskitRuntimeService.save_account(
channel="ibm_quantum_platform",
token="YOUR_TOKEN_HERE",
overwrite=True,
set_as_default=True,
)
service = QiskitRuntimeService(channel="ibm_quantum_platform")

# Load saved credentials
service = QiskitRuntimeService()

# Use the least busy backend, or uncomment the loading of a specific backend like "ibm_fez".
backend = service.least_busy(operational=True, simulator=False, min_num_qubits=127)
# backend = service.backend("ibm_fez")
print(backend.name)
ibm_pittsburgh
counts = run_circuit_and_get_counts(bell, backend, shots=1000)
plot_histogram(counts)

Output of the previous code cell

รันบน Simulator และแสดงผลลัพธ์

Simulator คือเวอร์ชัน "โลกสมบูรณ์แบบ" ของการคำนวณควอนตัม ที่นี่เรารัน Circuit บน Simulator สำหรับ 1000 shots และพล็อตผลลัพธ์ คุณควรเห็น count ประมาณเท่ากันสำหรับสถานะ 0000 และ 1111 โดยไม่มี 0101 หรือ 1010 เลย ซึ่งเป็นลายเซ็นของความสัมพันธ์สมบูรณ์ของ Bell state

backend = AerSimulator()
counts = run_circuit_and_get_counts(bell, backend, shots=1000)

plot_histogram(counts)

Output of the previous code cell

ทดสอบความเข้าใจ

Gate สองอันที่สร้าง Bell state ที่นี่คืออะไร?

คำตอบ

Gate H บน Qubit 0 ตามด้วย Gate CX ที่มี Qubit 0 เป็น control และ Qubit 1 เป็น target

บน Simulator ในอุดมคติ bitstring สองอันใดควรครองใน histogram?

คำตอบ

00 และ 11 ควรครอง

ทำไม Simulator ที่สมบูรณ์แบบจึงไม่มี count ของ 00 เท่ากับ count ของ 11 เสมอ?

คำตอบ

แม้ว่า Simulator จะ "สมบูรณ์แบบ" และนำไปสู่ Bell state ที่สมบูรณ์แบบ แต่ก็ยังเป็นการจำลองกระบวนการที่มีความสุ่มโดยธรรมชาติ ดังนั้นความผันผวนทางสถิติยังคงเกิดขึ้น มันเหมือนกับการโยนเหรียญ 1000 ครั้ง: แม้ว่าจะมีโอกาส 50-50 ที่เหรียญจะออกหัวหรือก้อย ก็ไม่ได้หมายความว่าคุณจะได้หัวและก้อยอย่างละ 500 ครั้งพอดีเสมอ

ทำไมคอมพิวเตอร์ควอนตัมจริงถึงอาจแสดงผล 01 หรือ 10 บ้าง ทั้งที่ Simulator ไม่แสดง?

คำตอบ

เพราะ Device จริงมี Noise Gate และการวัดไม่สมบูรณ์แบบ และนั่นอาจทำให้เกิด Error เป็นครั้งคราว

ความแตกต่างในทางปฏิบัติอย่างหนึ่งระหว่าง Simulator กับคอมพิวเตอร์ควอนตัมจริงนอกจาก Noise คืออะไร?

คำตอบ

คอมพิวเตอร์ควอนตัมอาจต้องรอในคิว มีความพร้อมใช้งานจำกัด และมีข้อจำกัดเฉพาะ Device ที่ส่งผลต่อวิธีที่ Circuit ทำงาน

บทสรุป

เราเริ่มต้นด้วยการตั้งค่า Qiskit ใน Colab environment ที่เปิดใหม่ ซึ่งเป็นวิธีที่ workflow Notebook จริงๆ หลายอย่างเริ่มต้น จากนั้นเดินทางสู่การคำนวณควอนตัมโดยใช้ Composer แล้วสร้าง Circuit สอง Qubit ง่ายๆ ที่ผลิต Bell state Φ+\Phi^+ และใช้การสุ่มตัวอย่างซ้ำๆ และแสดง entanglement เป็นความสัมพันธ์ใน histogram การวัด Qubit นอกจากนี้เราได้เห็นว่าคอมพิวเตอร์ควอนตัมจริงนำ Noise และ Error เข้ามา

วัตถุประสงค์การเรียนรู้

หลังจากที่เราได้เรียนรู้วิธีสร้าง Bell state Φ+\Phi^+ แล้ว ลองดูว่าคุณสามารถแก้ไขโค้ดเพื่อสร้างหนึ่งใน Bell state สามอันที่เหลือได้ไหม โดยเฉพาะสถานะ Ψ\Psi^- จะถูกใช้ในบทเรียนที่จะมาถึง ดังนั้นหากคุณคิดออกว่าจะสร้างมันได้อย่างไร คุณก็จะก้าวไปข้างหน้าได้

This translation based on the English version of 7 พ.ค. 2569