量子计算这几年从一个只存在于论文里的概念,变成了真实可触碰的软件生态,最直接的催化剂就是一批开源量子计算编程框架的成熟。我最早接触Qiskit是在读研的时候,当时只是跑了一个五比特的随机线路,感觉像是把一个数学公式敲进了Python,没什么特别的。但真正深入之后才发现,框架的意义远不止给量子硬件提供一个调用接口,它把整个量子计算的思考方式重新做了一次抽象:比特变成了量子比特,逻辑门变成了酉矩阵,程序变成了线路,运行变成了采样。这种转变对刚入门的人来说可能是障碍,但对想要认真做研究和工程的人来说,恰恰是最大的杠杆。

这篇文章我打算把这些开源框架掰开揉碎讲清楚:它们为什么会出现、各自解决什么问题、怎么选型、怎么在本地把第一个量子程序跑通,以及我从实际踩坑中总结出来的经验。适合三类人看:一是刚接触量子计算、想找一个靠谱框架入门的学生或开发者;二是已经在用量子计算做科研或算法验证、想横向对比选型的研究者;三是企业里做技术预研、需要评估开源量子框架落地可能性的工程师。无论你是哪一类,读完这篇文章后都应该能独立完成环境搭建,并理解量子程序的核心编写范式。

1. 为什么量子计算需要“编程框架”而不是“直接写硬件指令”

1.1 从量子硬件到量子程序:中间这一层有多关键

量子计算机的硬件层和传统计算机有本质区别。传统CPU有x86指令集、ARM指令集,编译器替你把高级语言翻译成机器码,操作系统再帮你管理内存和调度任务,这一整套抽象已经被打磨了几十年。而量子计算机的硬件状态是一堆超导量子比特上的微波脉冲序列,或者离子阱里激光脉冲的时序控制,直接面对这些物理控制参数来写程序,几乎不可想象,你不仅要懂量子物理,还要懂微波工程、低温电子学、脉冲校准。

这时候编程框架就充当了传统计算里“编译器+操作系统+标准库”的综合角色。它定义了一套人类可读的量子操作指令,比如H门、CNOT门、测量操作,然后由框架负责把这些高级操作编译成目标量子设备能执行的底层指令。更细节的是,不同硬件厂商的量子芯片拓扑结构不一样,有的芯片相邻比特之间才能做双比特门,框架里的编译调度器负责做比特映射和路由插入,这些工作对用户是透明的。

这也是为什么开源在量子领域特别重要。量子计算的硬件和算法还在快速变化,闭源软件很难跟上研究前沿;而开源框架允许全球的研究者直接修改编译器调度策略、实现新的量子门分解算法、接入自己的噪声模型。换句话说,开源让量子计算软件生态变成了一个可以共同演进的活系统,而不是被某一家公司锁死的黑盒。

1.2 开源框架带来的本质改变:门槛、复现与生态

在没有成熟开源框架的年代,量子算法的验证基本靠手推矩阵和写Matlab脚本,一个十比特的线路就能让脚本运行到怀疑人生。普通研究者的计算资源根本跑不起大规模量子模拟,更不用提在真实量子芯片上验证算法。开源框架出现后,最大的改变是门槛的指数级下降。

现在你只需要一个Python环境, pip install qiskit 就能拥有一个功能完整的量子计算开发栈,本地能跑模拟器,云端能连真实硬件,社区里还有大量开箱即用的算法库和教程代码。这种便利性带来的效应是复现能力的质变。以前论文里说“我们用10比特量子电路实现了某个协议”,别人想复现,得自己去猜所有细节;现在论文通常直接附带GitHub仓库地址,里面是完整的Qiskit或Cirq代码,任何人拉到本地都能跑出相同结果。这些开源框架实际上变成了学术成果的一部分,也是学术交流的通用语言。

我还想强调生态两个字。开源框架不是孤立存在的,它们周围长出了无数子项目:量子机器学习库、量子优化库、噪声模拟工具、可视化插件、教育平台。以Qiskit为例,它的生态里包含Terra(核心库)、Aer(高性能模拟器)、Runtime(云端执行服务)、Optimization(量子优化模块)、Machine Learning(量子机器学习模块)、Nature(量子化学模块)等,这种覆盖面使得一个框架就能支撑从基础研究到应用开发的全链路工作。后文中我会逐个拆解主流框架,帮助你建立更清晰的选型图谱。

2. 主流开源量子计算编程框架横向拆解与选型思考

2.1 Qiskit:整个量子软件生态的“瑞士军刀”

如果你只能选一个框架入门,我会毫不犹豫推荐Qiskit。它是IBM主导的开源项目,也是当前社区活跃度最高、文档最全、生态最庞大的量子编程框架。Qiskit的架构设计很有层次感,核心量子电路构建用 QuantumCircuit 类来组织,你只需要把量子门像搭积木一样往线路上加,然后选择后端(Backend)执行即可。

from qiskit import QuantumCircuit
from qiskit_aer import AerSimulator

qc = QuantumCircuit(2, 2)
qc.h(0)
qc.cx(0, 1)
qc.measure([0, 1], [0, 1])

simulator = AerSimulator()
result = simulator.run(qc, shots=1024).result()
counts = result.get_counts(qc)
print(counts)

这段代码大家都很熟悉,它构建了一个两比特Bell态线路,并用量子模拟器执行1024次采样。初看非常简单,但Qiskit在背后做的事情远远不止这些,它会自动完成比特映射、门分解、优化等编译步骤。

Qiskit的可视化功能也是一大亮点。 qc.draw() 能直接输出ASCII版电路图, plot_histogram() 能把测量结果的概率分布画成柱状图。我见过很多新手第一次跑通Qiskit时,最兴奋的就是看到那些量子叠加态下塌缩出来的随机分布图。这种即时反馈对学习动机的激励作用非常明显,比单纯看理论公式直观得多。

不过也要提一点Qiskit的坑。随着版本迭代到1.0之后,API结构发生了一些变化,网上很多旧教程里的写法已经跑不通了,比如 qiskit.execute 这类函数被调整到独立模块, qiskit.providers.aer 的导入路径也变了。如果你网上搜索到一段很老的Qiskit代码,大概率要手动改两三个导入语句才能跑起来。这一点在后面的排障章节我会详谈。

2.2 Cirq:为NISQ算法精细控制而生

Google主导的Cirq走的是一条和Qiskit不太一样的路线。Cirq更强调对量子电路的精细化控制,这跟Google的量子计算研究风格密切相关,他们的团队经常需要在NISQ(含噪声中等规模量子)设备上跑各种对噪声非常敏感的算法实验,因此框架的设计哲学是尽量暴露底层细节,给研究者最大的控制自由度。

Cirq里面一个非常核心的概念是 Moment (时刻),同一个时刻内可以并行执行的量子操作被放在同一个 Moment 里。这种设计让线路的时间深度一目了然,而且可以直接手动优化并行度。对于追求线路深度最小化的研究者来说,这是Cirq最大的价值。

import cirq

qubits = cirq.LineQubit.range(2)
circuit = cirq.Circuit(
    cirq.H(qubits[0]),
    cirq.CNOT(qubits[0], qubits[1]),
    cirq.measure(*qubits)
)
print(circuit)

Cirq的线路可视化是字符图,能清楚看到每一个Moment里有哪些门在并行执行。如果你是做量子纠错或者噪声分析方向的,Cirq对这些底层操作的控制粒度会让研究工作顺手很多。代价就是上手门槛稍高,很多概念需要你真正理解量子电路的时序模型。

Cirq和Google的量子硬件集成度高,如果你计划用Google的量子处理器做实验,Cirq是绕不开的。不过在国内网络环境下,接入Google云服务有时不太方便,这让Cirq的很多优势在实际使用中打了折扣,多数时候只能用它的模拟器做算法验证。我的建议是:如果你以快速上手和生态完整为首要目标,先学Qiskit;如果你关注的是算法深度和底层控制,Cirq值得花时间钻研。

2.3 Pennylane:把量子电路当成可微分层来训练

Pennylane是加拿大Xanadu公司发起的开源框架,它的定位非常精准:量子机器学习。Pennylane最大的创新点是把量子电路嵌入到了自动微分框架中,使得你可以像训练传统神经网络一样,通过梯度下降来优化量子线路里的参数。

我第一次用Pennylane的时候有种强烈的熟悉感,因为它跟PyTorch的写法太像了。你定义一个量子节点(QNode),里面是量子门操作,返回某个可观测量的期望值,然后把它当作一个PyTorch模型里的子层,直接调用反向传播。

import pennylane as qml
import torch

dev = qml.device("default.qubit", wires=2)

@qml.qnode(dev, interface="torch")
def circuit(x, theta):
    qml.RY(x, wires=0)
    qml.RY(theta, wires=1)
    qml.CNOT(wires=[0, 1])
    return qml.expval(qml.PauliZ(1))

x = torch.tensor(0.5, requires_grad=False)
theta = torch.tensor(0.2, requires_grad=True)

loss = circuit(x, theta)
loss.backward()
print(theta.grad)

这种设计解决了量子机器学习落地时的一个关键问题:变分量子线路的参数更新需要计算量子梯度,传统数值差分会引入大量采样噪声,而Pennylane通过 parameter-shift rule (参数平移规则)来实现解析梯度计算,效率和精度都远高于数值差分。

Pennylane的多后端支持也是它的一大卖点,它既可以跑在自己的 default.qubit 模拟器上,也能作为Qiskit和Cirq的上层框架,调用这些框架的模拟器或真实硬件后端。这种“框架套框架”的做法减小了学习迁移成本,但也会偶尔出现接口层面的小坑,尤其是版本更新时,接口的兼容性问题偶有发生。如果你主要做量子机器学习方向,Pennylane应该是第一选择。

2.4 ProjectQ和其他框架:按需选型

除了三巨头,还有一些值得关注的框架。ProjectQ来自瑞士苏黎世联邦理工学院,主打编译优化和高效的模拟器实现。它的设计哲学是尽量让量子程序的编写符合经典程序直觉,同时提供高层次的编译优化能力。用ProjectQ写程序时,门的应用是通过运算符重载完成的,比如 H | qubit 表示把H门作用到量子比特上,写法很简洁。

from projectq import MainEngine
from projectq.ops import H, CNOT, Measure

eng = MainEngine()
qubit1 = eng.allocate_qubit()
qubit2 = eng.allocate_qubit()
H | qubit1
CNOT | (qubit1, qubit2)
Measure | qubit1
Measure | qubit2
eng.flush()

QuTiP(Quantum Toolbox in Python)更偏物理科研场景,用于量子光学、量子动力学模拟和量子态层析计算,并不算严格意义上的量子电路编程框架,但如果你做量子物理底层计算,它有不可替代的价值。微软阵营的Q#语言则走的是另一条路,它更像一种专注于量子算法的领域特定语言,和C#的集成紧密,适合在Azure Quantum生态里做算法层面的验证。对于绝大多数场景,我建议优先掌握Qiskit,再根据具体方向横向扩展,没有必要每个框架都深入,人的精力是有限的。

3. 从零跑通第一个量子程序:环境搭建与Bell态实验

3.1 Python环境准备与框架安装

我推荐用Conda或venv创建独立的Python环境来开发量子程序。量子计算框架依赖的Python包比较多,和机器学习框架一起使用时容易出现依赖冲突,独立环境能避免很多麻烦。

conda create -n quantum python=3.11
conda activate quantum
pip install qiskit qiskit-aer qiskit-ibm-runtime

如果是在离线环境,或者网络下载速度不理想,可以配置国内pip镜像源再安装,速度会快很多。安装完成后,建议验证一下核心包能否正常导入:

import qiskit
from qiskit_aer import AerSimulator
print(qiskit.__version__)

我遇到的第一个坑就是版本不匹配。很多教程基于旧版Qiskit,但是新版API已经变化,比如 AerSimulator qiskit_aer 导入,而不是从 qiskit.providers.aer 导入。强烈建议运行时先检查版本,把版本定在一个稳定组合上,比如Qiskit 1.0+ 搭配 qiskit-aer 0.14+。我自己的经验是,直接装最新稳定版,代码就按最新API来写,不要回头去看远古教程。

3.2 第一段代码:制备Bell态并验证纠缠

Bell态是最经典的量子纠缠态之一,状态向量可以写为(|00⟩ + |11⟩)/√2。制备方法很简单:先把第一个量子比特用H门变成叠加态,再用这个叠加态作为控制位去控制第二个比特执行CNOT门,就能得到纠缠态。

from qiskit import QuantumCircuit
from qiskit_aer import AerSimulator
from qiskit.visualization import plot_histogram

qc = QuantumCircuit(2, 2)
qc.h(0)
qc.cx(0, 1)
qc.measure(0, 0)
qc.measure(1, 1)

simulator = AerSimulator()
result = simulator.run(qc, shots=4096).result()
counts = result.get_counts(qc)
print(counts)

运行结果应该是 00 11 各占大约2048次,理论上 01 10 出现的概率接近为零。这个结果直接证明了两个比特之间存在纠缠:测量第一个比特得到0,第二个比特一定是0;得到1,第二个比特一定是1。这个实验看起来简单,但它是量子通信、量子密码、量子纠错等所有上层应用的物理基础。

我建议新手在跑通代码后,花点时间观察测量结果,多换几种线路结构试试。比如把H门去掉直接测量,你就会看到 00 以接近100%的概率出现;再把CNOT门放在H门之前,结果又会完全不一样。这种“动手改造线路,观察结果变化”的玩法,比死记硬背量子门定义要有效得多。

3.3 本地模拟器和真实量子芯片的差异

刚入门的时候可以只用模拟器,因为本地模拟器基于密度矩阵或态矢量计算,结果非常“理想化”,没有噪声和退相干。真实量子芯片则会受到测量误差、门误差和相干时间衰退等因素影响,导致同样的线路跑出的结果往往会有一些“杂质”,比如Bell态实验里偶尔会出现 01 10

IBM的云平台允许你免费接入真实的量子芯片,但需要注册账号并拿到API Token。接入方式如下:

from qiskit_ibm_runtime import QiskitRuntimeService, Sampler

service = QiskitRuntimeService(channel="ibm_quantum", token="your_token")
backend = service.least_busy(operational=True, simulator=False)
sampler = Sampler(backend=backend)
job = sampler.run(qc, shots=1024)
print(job.result())

用真实芯片跑程序才能真切感受到量子噪声的存在。我经常跟朋友说,模拟器像是理想的数学世界,真实芯片才把物理世界的复杂性还给了你。第一次在真实芯片上拿到一个带噪声的直方图时,你反而会更深刻地理解量子纠错为什么这么重要。

4. 量子编程的核心概念与代码范式拆解

4.1 量子比特和叠加态:从经典比特到量子比特

经典比特只有0和1两种确定状态。量子比特除了可以处于0和1,还能处于两者的任意叠加态,即状态向量可以写成α|0⟩ + β|1⟩,其中α和β是复数振幅,且|α|² + |β|² = 1。测量后你会以|α|²的概率得到0,以|β|²的概率得到1。

这个概念对刚接触的人冲击力很大,我第一次学时也很难直观理解“一个比特同时是0和1”是什么意思。一个勉强能用的生活化类比是转动的硬币:硬币在空中时不确定是正面还是反面,它是两种状态的叠加;但落地后(测量后),它就坍缩为正或反。这个类比不太精确,但对建立直觉够用。

在编程层面,你不需要手动处理振幅的复数计算,框架已经封装好了。你只需要明确两点:初始状态通常是|0⟩,通过门操作来改变量子比特的状态。当你要做算法设计时,心里必须清楚你的量子线路中每个量子比特的振幅在如何变化,否则写出来的线路可能只是随机门序列。

4.2 量子门操作与电路模型

量子门本质上是对量子态进行酉变换(unitary transformation)。所有量子门都可以用矩阵表示,并且是可逆的。这一点和传统逻辑门完全不同,传统逻辑门比如与门或非门会丢失信息,量子门不会。一个量子门作用在量子比特上,相当于在状态空间里做了一个旋转,这决定了它能保持信息的完整性。

常用的量子门不多,掌握下面这些就足够了:

  • H门(Hadamard门):把|0⟩变成(|0⟩+|1⟩)/√2,把|1⟩变成(|0⟩-|1⟩)/√2,用于创建叠加态。
  • X门:量子版的“非”门,把|0⟩变成|1⟩,把|1⟩变成|0⟩。
  • CNOT门:两比特门,当控制比特是|1⟩时,翻转目标比特,可用于产生纠缠。
  • RY门:绕Y轴旋转任意角度,是变分量子算法里最常用的参数化门。
  • Z门:改变相位,不改变概率幅。

在Qiskit中应用门非常简单,就是往 QuantumCircuit 上加:

qc = QuantumCircuit(1)
qc.h(0)
qc.x(0)
qc.rz(1.5708, 0)

但是堆门不等于写算法。一个合格的量子程序设计者要能理解门的组合效果,比如H门后接X门再测,和先X门再H门再测,结果会不同。我建议你把常用门的矩阵形式写在笔记本上,做线路设计时随时对照。等你用多了,自然会形成强烈直觉。

4.3 测量和波函数坍缩:读到的不是全貌

测量是量子编程中最容易让人困惑的部分。原因是测量会破坏量子态的叠加结构,导致波函数坍缩。在量子程序中,同一个量子态的多次运行结果不一定是同一个值,它是一系列采样分布。

说得直白点,如果你的量子态是(|0⟩+|1⟩)/√2,那么测量1000次,大约500次得到0,500次得到1。但你无法从这1000个测量结果中恢复出原始的量子态信息,因为叠加相位信息已经在测量时丢失了。这给算法设计带来了深层约束:你的算法必须在测量结果中编码答案,使得答案的采样概率足够高。

代码层面,测量必须在线路最后进行。Qiskit中的 measure 操作会把量子比特的值写入经典寄存器,然后模拟器或真实硬件按指定的采样次数运行,最后返回计数分布。我在实际中经常发现新手会忘记设置 shots 参数,导致只采样一次,得到的结果充满随机性,误以为程序写错了。记住,量子程序的运行结果本质上是分布,你需要通过足够多的采样来估计这个分布。

4.4 参数化量子电路:变分算法的地基

参数化量子电路是当前NISQ时代最重要的一类量子线路。它的关键特征是线路中包含带参数的旋转门,比如 RY(theta) ,这些参数可以通过经典优化器来调整。这样一来,量子线路就变成了一个可训练的函数逼近器,可以嵌入多种优化算法中。

变分量子特征求解器(VQE)和量子近似优化算法(QAOA)都是基于参数化量子电路的典型应用。它们的核心逻辑可以统一描述为:构造一个参数化线路,定义与问题相关的损失函数,然后在经典计算机上用梯度下降等优化算法调整线路参数,直到损失函数收敛。

在Qiskit中,参数化电路可以这样声明:

from qiskit.circuit import Parameter
import numpy as np

theta = Parameter('θ')
qc = QuantumCircuit(1)
qc.ry(theta, 0)
qc.measure_all()

params = np.array([0.5])
bound_circuit = qc.bind_parameters({theta: 0.3})

参数化电路让量子程序摆脱了“一次性实验”的局限,变成了可以迭代优化的过程。这也是量子计算与机器学习结合最紧密的接口点。很多刚入门量子机器学习的朋友,其实不需要自己去实现复杂的梯度推导,直接借助PennyLane这类框架,把量子电路当作一个可微分层来用,就能快速搭建自己的混合量子经典模型。

5. 三个能直接上手的实战案例

5.1 案例一:用量子线路实现真随机数生成器

传统计算机没办法生成真正的随机数,用的都是伪随机算法,只要知道种子就能预测后续序列。量子随机数生成器利用量子测量的不确定性,从原理上保证随机性无法被预测。

实现一个8比特量子随机数生成器非常容易:

from qiskit import QuantumCircuit
from qiskit_aer import AerSimulator

qc = QuantumCircuit(8, 8)
for i in range(8):
    qc.h(i)
qc.measure(range(8), range(8))

sim = AerSimulator()
result = sim.run(qc, shots=1).result()
counts = result.get_counts(qc)
random_bits = list(counts.keys())[0]
print(random_bits)

每次运行得到8位随机二进制字符串,转换为十进制就能得到0到255之间的随机数。如果你使用真实量子芯片来做,得到的随机性来源于物理过程,是真随机数。很多领域对随机数的质量要求极高,比如彩票、密码学、蒙特卡洛模拟,量子随机数源是一个很有想象力的应用方向。

当然,从工程角度看,真实量子芯片的噪声和相关性问题还很多,真正商用量子随机数发生器使用的是专用光子或芯片方案,而不是通用量子计算机。但作为学习量子计算的第一个“能摸到具体用途”的例子,这个实验价值很高。

5.2 案例二:量子态层析与保真度校验

当你构建了一个量子线路,你需要验证它是否真的实现了你想要的状态。量子态层析(quantum state tomography)是一种通过一系列不同测量方向的统计结果,反推出量子态密度矩阵的技术。在实验中经常用保真度(fidelity)来量化期望态和实际态的重叠程度。

Qiskit里可以用 Statevector 获取理想态向量,与模拟器或真实设备返回的密度矩阵做对比。

from qiskit.quantum_info import Statevector, state_fidelity, DensityMatrix

qc = QuantumCircuit(2)
qc.h(0)
qc.cx(0, 1)

ideal = Statevector(qc)
print(ideal)

# 模拟含噪声的密度矩阵
noisy_backend = AerSimulator(noise_model=noise_model)
# ... 执行层析实验
# fidelity = state_fidelity(ideal, measured_state)

用模拟器时可以轻松算出完美结果,但真实设备上测量噪声会极大影响层析精度。我第一次在真实芯片上做层析时,跑了几千次线路,最后得到的状态保真度大概只有85%左右,这个结果让我真实感受到NISQ设备的噪声有多大。量子态层析是一个很好的中间训练科目,它能迫使你同时理解量子力学基础、统计采样和误差分析,而不是仅仅停留在拖拽门的层面。

5.3 案例三:Pennylane实现量子机器学习分类器

量子机器学习(QML)最经典的教学案例就是把量子线路当作一个分类器,来处理经典的二分类问题。下面我用Pennylane搭建一个简单的量子分类器,思路是将特征编码成量子门的旋转角度,然后用可训练的参数门调整量子态,最后测量某个可观测量的期望值作为分类结果。

import pennylane as qml
import numpy as np

n_qubits = 2
dev = qml.device("default.qubit", wires=n_qubits)

@qml.qnode(dev)
def quantum_classifier(features, weights):
    for i in range(n_qubits):
        qml.RY(features[i], wires=i)
    qml.CNOT(wires=[0, 1])
    for i in range(n_qubits):
        qml.RY(weights[i], wires=i)
    qml.CNOT(wires=[0, 1])
    return qml.expval(qml.PauliZ(0))

features = np.array([0.3, 0.5])
weights = np.array([0.1, -0.2])
print(quantum_classifier(features, weights))

这个量子分类器的可训练参数就是两个RY门的旋转角度。把它接入一个经典优化循环,就能在训练数据上不断更新权重,使分类准确率逐步提升。PennyLane会自动计算量子节点对参数的梯度,因此反向传播的流程和普通PyTorch模型没有差别。

这个案例让我对量子机器学习的感受变得非常具体。量子线路确实能作为经典神经网络的替代组件参与训练,但在当前噪声环境下,它能否在实际数据上超越经典基准,依然是个开放问题。我的态度是,现在学QML更多是占位和积累,等硬件成熟后再细化应用。

6. 常见问题与排障经验实录

6.1 环境安装与依赖管理

量子编程项目最常见的坑就是版本不兼容。具体来说有三个高频场景:Qiskit版本过旧导致API报错、Pennylane与PyTorch版本不兼容、qiskit-aer与qiskit-terra不匹配。

我建议你把这些包放进一个 requirements.txt 里锁定版本,例如:

qiskit==1.1.0
qiskit-aer==0.15.1
qiskit-ibm-runtime==0.26.0
pennylane==0.36.0
torch==2.3.0

遇到导入报错时,先分清是哪个包的问题,再考虑是重装还是升级。一个实用的技巧是创建独立conda环境时直接指定Python版本为3.11,因为很多量子计算依赖包对Python小版本的兼容性存在滞后。

6.2 线路运行与模拟器精度问题

模拟器运行结果和理论值不一致的情况,大多是采样次数不足导致的统计涨落。比如Bell态实验只跑100次,得到的比例可能在40:60左右,这并不说明线路错误,只是统计噪声太大。把shots提高到4096以上,结果就会明显逼近理论值。

另一个容易踩的坑是使用了没有优化的线路结构。Qiskit虽然自动做编译优化,但一些明显的线路冗余还是需要人工判断。比如连续两个H门是可以抵消的,Qiskit不一定每次都能识别出来。运行速度慢时,可以考虑用 optimization_level=2 optimization_level=3 来提升编译器优化强度。

6.3 接入云端硬件时的注意事项

接入IBM云量子设备,需要提前在IBM Quantum账户中获取API Token,并把Token配置为环境变量而不是硬编码到代码里。连接后要注意队列等待时间。热门硬件的排队时间可能长达几十分钟,建议优先选择 least_busy() 方法自动挑选负载最低的设备。

真实芯片的采样结果受噪声影响较大,第一次跑出“看起来很奇怪”的结果不要慌。把线路简化成1比特或2比特,分别跑模拟器和真实设备,对比两者的直方图差异,往往就能判断噪声严重程度。在真实设备上,建议开启偏差消除(error mitigation)选项,比如使用 SamplerV2 中的 resilience_level 参数,能有效改善最终结果。

写在最后的个人体会

我用了挺久的时间才意识到,学习开源量子计算编程框架,真正值钱的地方不在于记住某个框架的API,而在于建立“量子程序是一种概率分布的试探性程序”的思维模式。传统程序员习惯了一口一口地调试查看每一个变量的确定值,量子程序则要求你在统计分布和状态空间中思考问题。当你对这种思维模式觉得顺手了,框架选哪个反而成了次要问题。

如果非要给后来者一个建议,我的建议是专注于一个主框架,不要贪多。Qiskit是最不容易出错的选择,深入学完后再根据方向迁移。把模拟器玩熟了,再尝试接入真实量子芯片,不要跳步。开源框架这么多,每个都浅尝辄止不如把其中一个吃透。最后一个小技巧:每次跑实验前,把量子线路画出来看一眼,往往能发现很多逻辑错误。这个习惯让我省下过无数个debug的下午,建议你也养成。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐