ChatGPTでQiskit Developer試験の練習問題が作れないか試してみました

### １．はじめに
QiskitではIBM量子開発者認定資格（以下、Qiskit Developer試験と略記します）があり、オンラインやテストセンターで受験できます。
試験の概要や学習や試験対策の「虎の巻」および関連の教材については、[2022年12月のQiita Advent Calendarの拙稿](https://qiita.com/w371dy/items/bc188f70ffdc2e7b9c7a)でもご紹介しました。

先日、Qiskit AdvocateのAbby Mithcellさんが[「Can ChatGPT Pass the Qiskit Developer Certification ?」](https://youtu.be/HPc6zHzcZjk)というタイトルで、Qiskit Developer試験のために公開されているSample TestをChatGPTに解かせてみる動画をQiskit YouTube channelで公開しています。

Sample Test では量子回路（図）を示して、その回路が作成される正しいコードを選ばせる問題も含まれます。現在のChatGPTでは問題文のほかに付随する量子回路や図を読み取り、それについて回答させる使い方はできないため、Qiskitの動画ではSample Testの問題の形式を少し変えて、質問文として与えどのような回答をするのかを見ているようです。

Developer試験では過去問は非公開、また受験者にも守秘義務があるため、試験の出題内容について明らかにすることができません。このため、出題例としてSample Testが[試験の公式ホームページ](https://www.ibm.com/training/certification/C0010300)で公開されています（が、出題形式を知るという趣旨で公開されているため、出題範囲を全てカバーしているわけではありません）。

私は勤務先でQiskitの勉強会を行っています。Qiskit Developer試験は量子プログラミングの基礎的なスキルを身につけるのに大変よい内容と考えており、勉強会の参加者に受験を勧めているのですが、身近に練習問題があればよいのではと感じていました。ChatGPTを使ってSample Testの一部から、試しに練習問題を作ってみたケースを以下に紹介します。

### ２．ChatGPTについて
ChatGPTは生成型AIと呼ばれるサービスの一つですが、質問や指示のしかたによって、得られる回答の精度が変わるという特徴があります。
この指示や質問はプロンプトと呼ばれており、望みの回答を引き出すためにより適切な
指示や質問をする技術はプロンプトエンジニアリングと呼ばれています。

ChatGPTの出力は誤った説明や回答となることもあります。このため、ChatGPTからの出力を使う際には、人が正しいかどうか判断・確認をして使う必要があります。

### ３．Sample Test からの練習問題作成
ここではChatGPTの無料版を利用して、Sample Testから２問ほど選び、類題を作成してもらうことを試してみます。入力の仕方に制約があるため、文章を使った形の問題を選んでいます。

#### ３－１　Sample Test 第2問の類題作成

ここでは、Sample Test 第2問の類題の作成を依頼してみます。

[Sample Test 第2問]
```
Given this code fragment, what is the probability that 
a measurement would result in |0> ?

qc = QuantumCircuit(1)
qc.ry(3 * math.pi/4, 0)

A. 0.8536
B. 0.5
C. 0.1464
D. 1.0
```

１量子ビットの量子回路で、|0>にY軸周りの回転（3/4pi）のゲートを作用させた後、|0>を測定する確率を求める問題です。
状態ベクトルが|0>からRy（3/4pi）ゲートによってどのように変化するかを求め、|0>の係数の絶対値の２乗を計算すれば、この状態ベクトルを測定したときに|0>となる確率が求められます。正解は、C. 0.1464です。
Ryゲートの行列表現から計算することもできますが、|0>の状態からRyゲートによってy軸のまわりに3/4pi回転した後の状態ベクトルは、ブロッホ球において|1>に近い側に位置しています。このことから、|1>を測定する確率は2分の1より大きいことが考えられますが|1>ではないため、選択肢より、A. 0.8536となると考えられます。したがって、|0>を測定する確率は1から|1>を測定する確率を引いた 1 - 0.8536 = 0.1464となります。

#### ３－１ー１　プロンプト
ここでは、ChatGPTに以下のようなプロンプトで類題を10問作ってもらうよう、依頼しました。プロンプトでは、役割、目的、例題、問題作成の制約、出力の形式を与えています。

##### 役割
あなたは量子コンピューティングのSDKであるQiskitの専門家です。Qiskit Developer Certificate の資格をもっており、出題範囲とその内容をよく知っています。また、初心者への丁寧なアドバイスをするスキルを持っています。

##### 目的
Qiskit Developer Certificate の試験の受験する人のために練習問題をつくってください。以下に示す例題をもとに回転ゲートの種類や回転の角度、0あるいは1を測定する確率などのパラメータを変えることで10問の類題を作ることとします。

##### 例題
以下の例題を参考にして同じような形式の問題を作ってください：

 Given this code fragment, what is the probability that a measurement would result in |0> ?  

　qc = QuantumCircuit(1) 
　qc.ry(3 * math.pi/4,0) 

　A.  0.8536
　B.  0.5
　C.  0.1464
　D.  1.0 

##### 問題作成の制約
・問題は、4個から5個の選択肢を示し、正解を選ぶ形式で出題してください。
・0または1を測定する確率について回答させる問題としてください。
・1量子ビットの回路でRx,Ry,Rzの回転ゲートいずれか１つを使うものとします。
・回転の角度はπ/4ラジアン、2π/4ラジアン、3π/4ラジアン、πラジアンのいずれかに限定します。
・正解となぜその正解となるのかの説明もつけてください。説明はステップバイステップで考えた結果を示してください。

##### 出力
　問題文
　回答の選択肢
　正解
　正解の導出についての説明

#### ３－１ー２　出力例
出力例は以下のとおりです。問題と正解の解説となっています：

問題1:
以下のコードフラグメントが与えられたとき、測定結果が|0>になる確率はどれでしょうか？

```python
qc = QuantumCircuit(1) 
qc.rx(math.pi/4, 0)

A.  0.8536
B.  0.5
C.  0.1464
D.  1.0
```

正解: A. 0.8536

説明: 与えられた回路では、1量子ビットの量子回路を作成し、X軸周りにπ/4ラジアンだけ回転させています。測定結果が|0>になる確率を求めるためには、回転後の量子状態ベクトルの振幅を計算する必要があります。

初期状態は|0>なので、状態ベクトルは[1, 0]となります。Rxゲートの作用によって、状態ベクトルは以下のように変化します：

[cos(θ/2), -i * sin(θ/2)]

ここで、θは回転角度です。与えられた回路では、θ = π/4なので、状態ベクトルは以下のようになります：

[cos(π/8), -i * sin(π/8)]

測定結果が|0>になる確率は、状態ベクトルの振幅の絶対値の2乗として計算できます。したがって、|cos(π/8)|^2を計算します：

|cos(π/8)|^2 = cos^2(π/8) = 0.8536

よって、測定結果が|0>になる確率は0.8536となります。

#### ３－１ー３ 作成した練習問題10問の結果
全部で10問の出力を確認したところ、以下の結果となりました（個々の問題の出力は長くなるため、省きます）。

|問題No |ゲート| 回転角 |回答　|
|---|----|--------|------|
| 1 |Rx  |$\pi/4$ |正解  |
| 2 |Ry  |$2\pi/4$|正解  |
| 3 |Rz  |$\pi/4$ |不正解|
| 4 |Rx  |$4\pi/4$|不正解|
| 5 |Rx  |$2\pi/4$|不正解|
| 6 |Ry  |$2\pi/4$|不正解|
| 7 |Ry  |$3\pi/4$|不正解|
| 8 |Rz  |$2\pi/4$|正解  |
| 9 |Rz  |$3\pi/4$|不正解|
|10 |Rx  |$3\pi/4$|不正解|

この結果からみて、ChatGPTでは計算をさせるのは少し難しそうな印象です。
練習問題としては、回転角が$\pi/4$単位にする等、既知の知識で筆算などで計算ができる値にする必要があります。こうしたことから、正解となる選択肢もある程度絞られるため、そうした計算のパターンをChatGPTに知らせておくようにするとよいのかもしれません。

### ３－２　Sample Test 第5問の類題作成

次に、Sample Test 第5問の類題の作成を依頼してみます。
[Sample Test 第5問]
```
Which code fragment will produce a maximally entangled, or Bell state?

A. 
bell = QuantumCircuit(2)
bell.h(0)
bell.x(1)
bell.cx(0, 1)

B. 
bell = QuantumCircuit(2)
bell.cx(0, 1)
bell.h(0)
bell.x(1)

C. 
bell = QuantumCircuit(2)
bell.h(0)
bell.x(1)
bell.cz(0, 1)

D. 
bell = QuantumCircuit(2)
bell.h(0)
bell.h(0)
```
２量子のエンタングルメント状態をつくる量子回路を選ばせる問題ですが、正解は、選択肢Aです。
２量子ビットのエンタングル状態は以下の４つがあります：
```math
\begin{align}
 \Phi^{+} &= \frac{1}{\sqrt{2}}(|00\rangle+|11\rangle) \\
 \Phi^{-} &= \frac{1}{\sqrt{2}}(|00\rangle-|11\rangle) \\
 \Psi^{+} &= \frac{1}{\sqrt{2}}(|01\rangle+|10\rangle) \\
 \Psi^{-} &= \frac{1}{\sqrt{2}}(|01\rangle-|10\rangle) \\
\end{align}
```
したがって、これらのうち１つを正解として選択肢に含む問題を作ってくれることを期待し、以下のようなプロンプトを投入しました。プロンプトでは５問つくってもらうよう依頼しています。正解は４通りしかないので、５問のうちのいずれかは他の問題と正解が同じとなることを期待しました。

#### ３－２－１　プロンプト
##### 役割
あなたは量子コンピューティングのSDKであるQiskitの専門家です。Qiskit Developer Certificate の資格をもっており、出題範囲とその内容をよく知っています。また、初心者への丁寧なアドバイスをするスキルを持っています。
##### 目的
Qiskit Developer Certificate の試験の受験する人のために練習問題をつくってください。以下に示す例題をもとに、２量子ビットのベル状態を構成する回路を表わすコードを選択させる５問の問題を作ってください。
##### 例題
Which code fragment will produce a maximally entangled, or Bell state?

A. 
bell = QuantumCircuit(2)
bell.h(0)
bell.x(1)
bell.cx(0, 1)

B. 
bell = QuantumCircuit(2)
bell.cx(0, 1)
bell.h(0)
bell.x(1)

C. 
bell = QuantumCircuit(2)
bell.h(0)
bell.x(1)
bell.cz(0, 1)

D. 
bell = QuantumCircuit(2)
bell.h(0)
bell.h(0)

##### 問題作成の制約
・問題は、4個から5個の選択肢を示し、正解を選ぶ形式で出題してください。
・２量子ビットのベル状態は4種類あります。
・選択肢のなかに含まれる正解は１個までとします。
・正解となぜその正解となるのかという説明もつけてください。正解ではない選択肢についても説明してください。説明は説明はステップバイステップで考えた結果を示してください。
##### 出力
　問題文
　回答の選択肢
　正解
　正解の導出についての説明

#### ３－２－２　出力例
出力例は以下のとおりです：

問題1:
以下のうち、どのコード断片が最大限にエンタングルしたベル状態を生成しますか？
A. 
bell = QuantumCircuit(2)
bell.h(0)
bell.x(1)
bell.cx(0, 1)

B. 
bell = QuantumCircuit(2)
bell.cx(0, 1)
bell.h(0)
bell.x(1)

C. 
bell = QuantumCircuit(2)
bell.h(0)
bell.x(1)
bell.cz(0, 1)

D. 
bell = QuantumCircuit(2)
bell.h(0)
bell.h(0)

選択肢:
A. bell.h(0); bell.x(1); bell.cx(0, 1)
B. bell.cx(0, 1); bell.h(0); bell.x(1)
C. bell.h(0); bell.x(1); bell.cz(0, 1)
D. bell.h(0); bell.h(0)`

正解: B. bell.cx(0, 1); bell.h(0); bell.x(1)

正解の導出についての説明:
ベル状態は、量子ビット間で最大限のエンタングルメントを持つ状態です。与えられた選択肢のうち、正しいベル状態を生成するコード断片はBです。

選択肢Aでは、最初にHadamardゲートを適用して量子ビット0を重ね合わせ状態にしますが、量子ビット1には操作がありません。その後、CNOTゲートを使用して量子ビット0から量子ビット1に情報を伝達しますが、ビット1は初期化されていないため、最大限のエンタングルメントは得られません。

選択肢Cでは、量子ビット0にHadamardゲートを適用し、量子ビット1にXゲートを適用しています。しかし、その後の操作で量子ビット0と量子ビット1をエンタングルするためのゲートがありません。したがって、最大限のエンタングルメントは得られません。
選択肢Dでは、量子ビット0に2回Hadamardゲートを適用していますが、量子ビット1には操作がありません。そのため、エンタングルメントは生成されません。

選択肢Bでは、CNOTゲートを使用して量子ビット0から量子ビット1に情報を伝達する前に、Hadamardゲートを量子ビット0に適用しています。その後、Xゲートを量子ビット1に適用します。これにより、最大限のエンタングルメントを持つベル状態が生成されます。

#### ３－２－３　作成した練習問題５問の結果
各問とも、選択肢は４つ生成されていました。
実際の問題５問（No.1～No.5）の出力結果とそれぞれの問題の選択肢（A～D）の正解、不正解をまとめると以下の表のとおりです。問題の解答の説明も出力させるようにしていますが、ここでの正解、不正解は解答の説明の正誤によらず、上記の４つのエンタングル状態のどれかを作る回路のコードを出力していれば正解とし、それでなければ不正解としています。

| 問題 | No.1 | No.2 | No.3 | No.4 | No.5 |
|:-:|:-:|:-:|:-:|:-:|:-:|
|選択肢A| 〇 | 〇 | 〇 | ✕ | ✕ |
|選択肢B| ✕ | ✕ | 〇 | 〇 | ✕ |
|選択肢C| ✕ | 〇 | ✕ | 〇 | 〇 |
|選択肢D| ✕ | 〇 | ✕ | 〇 | ✕ |

問題No.1、No.5がうまくできているようです。No.2～4は正解となる選択肢を含んでいますが、２つ以上の正解を含んでおり、出題の指示とは異なります。また、選択肢に含まれる正解は４種類のうちの２種類で、
```math
\begin{align}
 \Phi^{+} &= \frac{1}{\sqrt{2}}(|00\rangle+|11\rangle) \\
 \Psi^{+} &= \frac{1}{\sqrt{2}}(|01\rangle+|10\rangle) \\
\end{align}
```
を表わすコードとなっており、
```math
\begin{align}
 \Phi^{-} &= \frac{1}{\sqrt{2}}(|00\rangle-|11\rangle) \\
 \Psi^{-} &= \frac{1}{\sqrt{2}}(|01\rangle-|10\rangle) \\
\end{align}
```
の２種類は一度も現れませんでした。
エンタングル状態は４つあることはプロンプトで提示していましたが、これらを明示させてから使うようにしていなかったことが原因ではないかと考えています。

### ４．まとめ
２つのケースについて、ChatGPTを使って練習問題を作ってみた結果を紹介しました。例示したものをまねて問題を作ることはできていると感じました。ただ、回答については正解ではないものもありました。実際にChatGPTによる出力が正しいかどうか自分で確認したうえで使う必要があることを理解しました。
ChatGPTとのやりとりをすることで練習問題のアイデアをトライアルアンドエラーで試すことができそうで、自分のアイデアを試しにChatGPTに入力し、その出力を確認する「壁打ち」の相手として活用できるのではないかという感想です。
複数の条件を与えてランダムに量子回路のパターンを発生させる等が文章で指示できるようになると、活用できる範囲が広がるのではないかと思われます。
量子コンピューティングの分野でもChatGPTのような生成型AIは活用できる可能性が何かあるのではないかと感じており、ほかのテーマでも試してみたいと考えています。