ChatGPT Plus で使える Code Interpreter でのグラフ描画と PowerPoint のスライド化（ダウンロードできるファイルの生成）

## はじめに
先ほど、ChatGPT の Code Interpreter を軽く試した流れ（＋関連情報）を記事にしたのですが、その後に試したことも記事にしてみます。

●ChatGPT Plusユーザー向けの Code Interpreter で QRコード生成を試す！（Pythonの qrcode パッケージを使用した処理） - Qiita
　https://qiita.com/youtoy/items/89a944fc9125ee6b8426

この記事で紹介するのは、グラフ描画と、ダウンロードが可能な PowerPoint のファイルの生成です。

## Code Interpreter についてなど
Code Interpreter は、ChatGPT で「Python での処理を行えて、アップロード・ダウンロードも扱える」というものです。Code Interpreter に関する公式情報や、Code Interpreter を使うための手順を、[上で掲載した記事](https://qiita.com/youtoy/items/89a944fc9125ee6b8426)に書いていますので、そちらもご参照ください。

この記事では、Code Interpreter の有効化やモデル選択ができた状態からの話を書いていきます。

## Code Interpreter で行った内容
### 概要
今回の記事で紹介する、試してみた内容は以下のとおりです。

1. グラフの描画
2. 描画した画像を PowerPoint のファイルにする

その流れについて、書いていきます。

### 1）グラフの描画
グラフ描画の事例は、[OpenAI公式の記事（3月に公開されていた ChatGPT plugins の記事）の最後の部分](https://openai.com/blog/chatgpt-plugins#code-interpreter)、そこに掲載されたデモ動画の中で登場していました。

公式動画でのプロンプトは「plot function 1/sin(x)」で、自分の場合は「1/sin(x)のグラフを描画して」という内容にしました。　そして、以下のグラフ画像を得ることができました。
![グラフ描画](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/b1fd6d76-fec6-b9e7-40f0-621777d2dce6.png)
上にのせている画像中の「Show work」という部分をクリックすると、以下のように Python のコードを表示させることもできます。
![グラフ描画（ソースコードの表示）](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/69f35857-fe76-b997-6697-d1bbb0bbaa83.png)

そして、公式のデモ動画では、このグラフ表示の後にグラフの一部のみを拡大表示させる、という続きもあったので、それも試してみました。
公式デモのプロンプトは「zoom in to range of x value between 0 and 1」で、自分は「0から1の範囲をズームして描画して」という内容にしています。
![グラフのズーム](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/4dca6d7d-01a9-c73e-96fd-6b941b22f69c.png)
公式デモで見られたグラフと、同じものが得られました。

### 2）PowerPoint のファイルの生成
ここまでの手順で、ChatGPT がグラフ描画を行った状態になっています。

そこに追加で、「先ほどのグラフの画像をPowerPointのファイルにしてください」というプロンプトを入力してみました。そうすると、以下のように Python のコードと、ダウンロード用のリンクが表示されました。
![PowerPointのファイルの生成](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/327863fa-6335-cfdd-351d-9805e6641d84.png)
　先ほどと同様、「Show work」という部分をクリックすると、以下のように Python のコードが表示されます。
![PowerPointのファイルの生成（コード付）](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/700cd59d-6e70-1f0e-8637-ab7badb5e3e3.png)

生成されたダウンロード用のリンクから、ファイルをダウンロードして PowerPoint で開いてみたのですが、以下のようにグラフ画像が貼り付けられたスライドが得られました（画像のサイズが、少しおかしな感じではあるのですが...）。
![PowerPointのファイルを開いたときの様子](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/260a68fc-c771-c2d3-5835-a922a803123c.png)
グラフの画像だけでなく、「Graph of 1/sin(x)」というテキストが入力されたテキストボックスも、スライド上に作成されているのが確認できました。

### 3）PowerPoint のファイルの生成 〜その2〜
先ほどの PowerPoint のファイルで、「画像がもう少し小さくても良いかな」とか「テキストは日本語にならないかな」とか思いました。

そして、「プロンプトで明示的に指示すれば良いのでは？」とも思ったので、追加で試してみました。具体的なプロンプトは以下のとおりです。

> **先ほどのグラフの画像をPowerPointのファイルにしてください。
その際に、グラフ画像の大きさは、スライドの半分くらいのサイズにしてください。また、その画像の上に「1/sin(x)のグラフ」と書いたテキストボックスを置いてください。**

そして得られた PowerPoint のファイルはこちらです。
テキストボックスと画像が重なってしまっているところはおしいですが、プロンプトで明示していた「画像のリサイズ」と「テキストボックスの内容を日本語にする」というのはできていました。
![PowerPointのファイル生成（2回目）](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/b34d28ca-af1d-6496-dc0d-4fd576fc566a.png)
レイアウトやスライドに記載する内容を指示できているところは、どこまでのことができるかは気になるものの、活用できそうな感じがします。

#### 処理のやり直しなどが発生した話
少し余談みたいな内容になるかもしれないですが、上記の 2回目の PowerPointファイルの生成を試した時に起こったことを、メモとして残してみます。

何が起こったかというと、1つはタブを切り替えたためか「コード実行の中断と再実行」が発生しました。
そして、その後の再実行では「セッションがリセットされたことによるライブラリの不足・生成済みだった画像の消失」が発生していました。
その後、処理のやり直しやライブラリのインポートが行われて、グラフ画像の再生成と PowerPointファイルの生成が行われました。
![処理のやり直し](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/d35f9f48-9469-50f8-31fc-d16cfb37b629.png)

それと、最後のステップで用いられた Python のコードなどを掲載してみます。

```Python
import numpy as np
import matplotlib.pyplot as plt

# Define the function
def f(x):
    return 1/np.sin(x)

# Generate x values in the range [0, 1]
x = np.linspace(0, 1, 1000)

# Compute y values
y = f(x)

# Save the graph to a file
plt.figure(figsize=(10,6))
plt.plot(x, y, label=r'$\frac{1}{\sin(x)}$')
plt.ylim(-10, 10) # Limit the y-axis to make graph more readable
plt.title(r'Graph of $\frac{1}{\sin(x)}$')
plt.xlabel('x')
plt.ylabel('y')
plt.grid(True)
plt.legend()
plt.savefig('/mnt/data/graph.png')

# Create a new PowerPoint presentation
prs = Presentation()

# Add a slide with a blank layout
slide_layout = prs.slide_layouts[6]
slide = prs.slides.add_slide(slide_layout)

# Add a text box above the place where the image will be
left = Inches(2)
top = Inches(1)
width = height = Inches(5)
txBox = slide.shapes.add_textbox(left, top, width, height)
tf = txBox.text_frame
p = tf.add_paragraph()
p.text = "1/sin(x)のグラフ"

# Add the graph to the slide
img_path = '/mnt/data/graph.png'
left = Inches(2)
top = Inches(1.5)
height = prs.slide_height / 2
slide.shapes.add_picture(img_path, left, top, height=height)

# Save the PowerPoint presentation
prs.save('/mnt/data/presentation.pptx')
```

Python のコードの後には「STDOUT/STDERR」が出ていたりもしたようでした。
![出力の最後の部分](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/fb5cf333-1d7f-ecc6-7099-fd77f4362e66.png)

## おわりに
今回、グラフの描画を依頼し、そこで作成されたグラフを PowerPoint のファイルにするような依頼を試してみました。

今回、単純に PowerPointファイル生成のみを依頼してみた後に、PowerPointファイルのスライドに関する依頼を加えたものも試してみました。追加で試したほうについて、どこまで複雑な依頼ができるかは検証できておらず気になるところですが、面白そうなことができそうだと感じました。