ChatGPTの新機能GPTsで自分自身のコピーを作って遊んでみる

:::note
この記事は元々**2024年1月7日**に個人ブログで公開された内容をQiitaに移行したものです。
:::

2023年11月にChatGPTの新機能「GPTs」がリリースされたので早速遊んでみたいと思います。

[GPTs](https://openai.com/blog/introducing-gpts)とは、前提知識や指示を事前に与えることで、自由にカスタマイズしたChatGPTを作成できるサービスのことです。ChatGPTが広い目的に使える万能型の言語モデルだとしたら、GPTsはもっと特定の目的に特化したモデルみたいなイメージですね。

ちゃんとカスタマイズすればかなり便利そうなのですが、今回はお試しとして、私の知識を持った私自身のコピーを作って遊んでみたいと思います。

私が情報を発信しているのは基本的にブログとX(Twitter)なので、その２つから情報を抽出してGPTsに与えてみます。

## ブログ（Wordpress）から記事データを抽出

私がディズニー関連の記事をよく書いている[ブログ](https://dbstory.jp)から各記事のデータを抽出します。

私のブログはWordpressで動いているので、データベース（mySQL）からさくっと抽出していきましょう。

**1. まずは各々の方法でWordpressのサーバーからmySQLに接続します。**

**2. 以下SQLコマンドで、記事データを外部ファイル（CSV形式）に出力します。**

```sql
SELECT post_title,post_content FROM wp_posts WHERE post_status = 'publish' AND post_type IN ('post') INTO OUTFILE "/tmp/posts.csv" FIELDS TERMINATED BY "," ENCLOSED BY '"' LINES TERMINATED BY '\r\n';
```

ポイントは以下の通り。

- Wordpressでは記事データは`wp_posts`というテーブルに格納されているので、それを対象にSELECT文。
- `post_status = 'publish'`で公開記事のみに限定（下書きが入らないように）。
- このままだと「固定記事」も入ってしまうので、`post_type in ('post')`で「投稿」のみに限定。固定記事も入れたかったらこれは不要です。
- 出力ファイルは`/tmp/posts.csv`にしてます。SQLで出力するとパーミッションの問題がしばしば発生しますが、`/tmp`ディレクトリならパーミッションが`777`なので、難しいことを考えたくないなら`/tmp`ディレクトリにしておくのが良いでしょう。
- `FIELDS`以降の解説です。CSV形式で出力したいので、`TERMINATED BY ","`で列の区切りを「,」に指定、`ENCLOSED BY '"'`でフィールドを「"」で囲み、`LINES TERMINATED BY '\r\n'`で行の区切り（改行文字）を「`\r\n`」に指定しています。

**3. GPTsに読み込ませるためにjsonファイルへ変換する**

今のままのCSVファイルだと複数の改行コード「\n」と「\r\n」が混在してGPTsがうまく読めない可能性があるので、読みやすいjsonに変換しましょう。
Pythonで以下のように変換します。

```python
import csv
import json

# ファイル読み込み
with open('posts.csv') as f:
  input_csv = csv.reader(f, escapechar='\\')

# {"title": "xxx", "content": "xxx"}のリストへ変換
output = []
for row in input_csv:
  dict = {"title":  row[0], "content": row[1]}
  output.append(dict)

# ファイルへ出力
with open('blogPosts.json', 'w') as f:
  json.dump(output, f, indent=2, ensure_ascii=False)
```

これでブログの記事データの抽出は完了です。
最終的な出力ファイルは以下のような感じになります。

```json
[
  {
    "title": "記事タイトル１",
    "content": "記事の内容。\n記事の内容。\n記事の内容。"
  },
  {
    "title": "記事タイトル２",
    "content": "記事の内容。\n記事の内容。\n記事の内容。"
  },
  {
    "title": "記事タイトル３",
    "content": "記事の内容。\n記事の内容。\n記事の内容。"
  }
]
```

## X(Twitter)からツイートデータを抽出
Twitter APIを使わずに全ツイートを取得する方法について別記事で解説しているのでそっちを参照。

[link]

最終的な出力ファイルは以下のような感じになります。

```json
[
  "ガンボスープめちゃくちゃ美味かった",
  "Leafletバグ多すぎてつらい",
  "リメンバーミーのエンディングは神"
]
```

## GPTsに２つのファイルをアップロード

以上により、GPTsに与えるための「`blogPosts.json`」と「`tweetFullTexts.json`」の２つのファイルが用意できました。

この２つのファイルをGPTsに与えます。

ChatGPTを開き、GPTsのメニューを探して、「Create a GPT」を選択します。

![gpts-configure-1024x914.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3981597/0bf610ea-f542-43e5-a8df-702cb2f5a4e5.png)

作成するGPTsの設定画面が開かれるので、以下のように設定します。

-「Knowledge」には先ほど用意した２つのファイルをアップロードしましょう。
-「Instructions」にはGPTsへの指示文を入力します。ここではアップロードした２つのファイルについて説明した後、私を模倣して振る舞うように指示しています。
（Instructionsには何も入力しなくても、Knowledgeさえあればそれなりに質問に答えてくれるGPTができるらしいです。）

## 動作テスト
さっそく完成した私の分身「アクセルGPT」に質問を投げてみましょう。

まずは好きなディズニーのアトラクションを聞いてみましょう。私なら「センターオブジアース」か「海底２万マイル」と答えるはずです。

![axel-gpt-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3981597/8a4c9d96-ae7b-4fe1-901f-d46449c55dc3.png)

いい感じですね。私が「このアトラクションが好き」と具体的に書いたことはないですが、ブログで「海底２万マイル」について言及することが多いことから、それが好きだと予測され回答されています。

次はマニアックなことを訊いてみましょう。

アトラクション「センターオブジアース」に登場する、「ネモニウム」という架空の物質について質問しています。

![axel-gpt-2-1-1024x459.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3981597/4a5a16ad-f239-41e4-b61a-f951bcec5c2e.jpeg)

このように通常のChatGPTからは曖昧な答えが返ってくるのに対し、「アクセルGPT」からは詳細な回答が返ってきています。
私のブログの内容をそのまま出力するのではなく、しっかりと内容を噛み砕いた上で、項目ごとに分けてわかりやすく返答してくれているのは、さすがChatGPTだなと思います。

## おわりに
ということで、今回はChatGPTの新機能「GPTs」を使って、自分自身のコピーを作ってみました。

ChatGPT Plusに登録している人であれば、下記のリンクから実際に「アクセルGPT」をお試しいただけます。

https://chat.openai.com/g/g-SG99CqJ3N-akuserugpt

私はたまに自分でブログに書いた内容を忘れるんですが、そのときは自分で自分のブログを徘徊して知識の再確認をしてるんですよね。今回作ったGPTは、そんなときに自分の知識を再確認するために役立ちそうです。

とはいえこんな使い方よりも、実際はもっと実用的な使い方ができると思います。
例えば気になる書籍の内容を読み込ませれば、その書籍の知識を持ったGPTの出来上がりです。何か本に関連した質問を投げれば、本の知識に基づいて回答してくれそうですよね。

「Actions」を駆使すればAPIなどを呼び出すこともできるそうなので、たとえば質問を投げると何かしらAPIを自動で呼び、そのリアルタイムな内容に基づいて返事を返してくれるアプリもノーコードで作ることができますよね。

想像力次第で色々できそうです。

ちなみに数日後には、GPTsで作成したオリジナルのGPTをオンラインで配布できる「GPT Store」というサービスもリリース予定らしいです。
実際に利用するかは分かりませんが、ちょっと楽しみ。