何时使用
当任务需要构建量子电路、在模拟器或 IBM Quantum 真机上执行,并分析比特串/期望值结果时使用本条。典型场景:搭建贝尔态/纠缠电路、为硬件做转译优化、用 Sampler 取测量分布、用 Estimator 算可观测量期望、实现 VQE/QAOA/Grover 等变分或搜索算法、量子化学基态求解。
不该用的边界(务必先确认目标硬件/框架,避免选错栈):
- 目标是 Google 量子硬件 → 改用 Cirq。
- 需要基于梯度的量子机器学习(自动微分)→ 改用 PennyLane。
- 做开放量子系统/含噪主方程演化模拟 → 改用 QuTiP。
- 纯经典数值或一般编程任务,无量子比特概念 → 本条不适用。
步骤
- 安装环境:用 uv 装 Qiskit,含可视化依赖。
- 构建电路:用
QuantumCircuit加单比特门(H、X、Y、Z、旋转/相位门)、多比特门(CX、SWAP、Toffoli),按需measure_all()。 - 本地验证:先用
StatevectorSampler(取比特串)或StatevectorEstimator(取期望值)在模拟器跑通,再上硬件。 - 转译优化:上真机前必须
transpile(qc, backend=backend, optimization_level=3),让电路适配后端门集与拓扑。 - 选 primitive 与执行模式:Sampler 取测量分布(优化类算法);Estimator 算可观测量期望(化学/物理)。模式:Session(VQE/QAOA 等迭代算法)、Batch(独立并行作业)、单作业(一次性实验)。
- 真机执行:通过
QiskitRuntimeService选后端(可用least_busy()),提交前查后端状态,保存 job id,按需设resilience_level做误差缓解。 - 后处理与可视化:
get_counts()取结果,qc.draw('mpl')画电路,plot_histogram(counts)画直方图。
指令
安装:
uv pip install qiskit
uv pip install "qiskit[visualization]" matplotlib
Qiskit Patterns 四步工作流:Map(问题映射成电路)→ Optimize(转译适配硬件)→ Execute(用 primitive 运行)→ Post-process(提取分析结果)。
关键约束:
- production 用
optimization_level=3。 - 尽量减少双比特门(主要误差来源)。
- 上真机前先用带噪模拟器测试。
- 保存并复用已转译电路;变分算法监控收敛。
- shots 先少后多,定稿时再加大。
示例
贝尔态(本地 Sampler):
from qiskit import QuantumCircuit
from qiskit.primitives import StatevectorSampler
qc = QuantumCircuit(2)
qc.h(0) # 对 qubit 0 施加 Hadamard
qc.cx(0, 1) # qubit 0 控制 qubit 1 的 CNOT
qc.measure_all()
sampler = StatevectorSampler()
result = sampler.run([qc], shots=1024).result()
counts = result[0].data.meas.get_counts()
print(counts) # 约 {'00': 512, '11': 512}
真机执行(带转译):
from qiskit_ibm_runtime import QiskitRuntimeService, SamplerV2 as Sampler
from qiskit import transpile
service = QiskitRuntimeService()
backend = service.backend("ibm_brisbane")
qc_optimized = transpile(qc, backend=backend, optimization_level=3)
sampler = Sampler(backend)
job = sampler.run([qc_optimized], shots=1024)
result = job.result()
变分算法 VQE(Session + Estimator + SciPy):
from qiskit_ibm_runtime import Session, EstimatorV2 as Estimator
from scipy.optimize import minimize
with Session(backend=backend) as session:
estimator = Estimator(session=session)
def cost_function(params):
bound_qc = ansatz.assign_parameters(params)
qc_isa = transpile(bound_qc, backend=backend)
result = estimator.run([(qc_isa, hamiltonian)]).result()
return result[0].data.evs
result = minimize(cost_function, initial_params, method='COBYLA')
注意事项
- V2 primitive 接口:
run入参是电路列表[qc],结果按result[0].data.<reg>.get_counts()取,测量寄存器默认名meas(来自measure_all())。 - Estimator 入参是
(circuit, observable)元组;期望值在result[0].data.evs。 - 真机需配置 IBM Quantum 账号与 API token(
QiskitRuntimeService持久化);提交前查后端队列与状态。 - 转译会改变比特映射与门序列,结果解读需对应转译后的测量寄存器。
- 参数化电路用
assign_parameters绑定,适配变分算法。
互见
- first-principles-thinking:拆解量子算法/问题映射的底层原理。
- 官方文档:https://quantum.ibm.com/docs ;API:https://docs.quantum.ibm.com/api/qiskit ;Patterns:https://quantum.cloud.ibm.com/docs/en/guides/intro-to-patterns
本条采编自 K-Dense-AI/scientific-agent-skills(MIT)。