GPTsを1から解説！「大っ嫌いスポーツ！だって意味ないもーん！」に便乗しよう

# 元ネタを知らない方はこちら
アレン様の名言ですね。最近楽しませていただいてます。私の周りにはあまり知っている人がいなかったので...誰かわからない方はこちらのリンクをチェックしてください！

https://www.instagram.com/allen_japan_official/

**スポーツを嫌いな理由が「意味がないから」というのが面白かったので、何もかもが嫌いなアレン様をつくりました。**

こちらから試してみてください！！

https://chatgpt.com/g/g-NZOB2cnlj-arenyang-bot

# GPTsをつくる
つくり方は簡単です。

:::note 
1. GPTsの新規作成
1. プロンプト作成
1. プレビューで確認
1. 完成
:::

GPTsはユーザーがカスタマイズしたChatGPTです。例えば「歴史の先生チャットボット」など特定の役割を与えることができます。

https://www.skillupai.com/blog/ai-knowledge/about-gpts/

自分用に使うことや他の人にも公開して収益化することもできるようです。

:::note alert
GPTsの作成は有料プランです
:::

https://openai.com/chatgpt/pricing/

# 1. GPTsの新規作成

ChatGPTを開いて「GPTを探す」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/986141/7a28a043-e93b-405e-35f3-7ac3fa24e7de.png)

「作成する」を選びます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/986141/20e5d0a9-e35d-e243-f77e-10973df3eba6.png)

最初の画面はこのようになっています。対話ながら作成することができますが、今回は「作成する」ではなく「構成」から設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/986141/09a8df5e-ddb5-8268-18c9-17f201d94417.png)

# 2. プロンプト作成

構成に必要な項目を入れていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/986141/40706a2d-a666-c281-0875-0dad6cf19206.png)

今回はこのように入れました。
```
名前:️✨🌹アレン様Bot🌹✨⚜️
説明:大っ嫌いスポーツ！！だって意味ないもーん！を応用していろんなものを嫌うボットです
指示:
------------------------------------------------------------
## 役割
- あなたはアレン様です。日本のオネエで「大っ嫌いスポーツ！！だって意味ないもーん！」などのセリフが有名です。
- 一人称は「ァタクシ」です。
- ハルシネーションは禁止です。

## 出力
- 対話者が入力した言葉から対象となる{(テーマ)}を取得し、「{(テーマ)}大っ嫌い！！だって{(理由)}もーん！」と返答をしてください。
- アレン様の口調はナレッジファイルとこちらのURL(https://www.instagram.com/allen_japan_official/)を参考にしてください。
------------------------------------------------------------
```

こちら↑にはナレッジファイルとありますが、「知識」の項目にファイルをアップロードすることでその内容を学習します。
アレン様を口調などを学習させるためにアレン様構文が解説されたブログをPDFファイルにしてアップロードしました。PDFファイルにするにはブラウザの印刷機能などから行います。[ハルシネーション](https://atmarkit.itmedia.co.jp/ait/articles/2303/30/news027.html)対策になります。

https://goodnightkuchinashi.hatenablog.com/entry/2022/10/20/004852

「機能」の「ウェブ検索」と「DALL-E画像生成」のチェックを外します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/986141/17d27b24-4072-85dc-cf87-58e1c7c1df8d.png)

# 3. プレビューで確認する
この状態で回答を確認します。画面右側の「プレビュー」を使って実際に会話してみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/986141/04b3fd5b-5ff6-9116-87e6-b62178c3b261.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/986141/d6725c7f-b932-e2d8-7d81-31f6298e0ee0.png)
嫌う理由の着眼点がAIと相性が良いかもしれません。
今度は文章だとどうなるでしょうか？ちょっと意地悪してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/986141/dbea9992-c98c-3964-b25b-99fe0970bf07.png)
良いですね。

「アレン様」だとどうなるでしょうか？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/986141/25af8a19-af6d-5fee-bec9-2a589f2b0191.png)
なんと肯定的な回答になりました！ナレッジファイルが効いているのでしょうか？予想外です。
ですが、念のため指示内容を更新しておきます。
```
## 役割
- あなたはアレン様です。日本のオネエで「大っ嫌いスポーツ！！だって意味ないもーん！」などのセリフが有名です。
- 一人称は「ァタクシ」です。
- ハルシネーションは禁止です。

## 出力
- 対話者が入力した言葉から対象となる{(テーマ)}を取得し、「{(テーマ)}大っ嫌い！！だって{(理由)}もーん！」と返答をしてください。
- {(テーマ)}が自分(アレン様)だった場合は、全力で肯定してください。 ←追加
- アレン様の口調はナレッジファイルとこちらのURL(https://www.instagram.com/allen_japan_official/)を参考にしてください。
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/986141/d85428c1-528e-6199-1223-c33f028627e2.png)

「アレン」では嫌うこともあるようです。概ね上手くいっているのでこれで良しとします。

# 4. 完成
完成したモデルを公開します。「作成する」を選ぶと公開範囲を選択できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/986141/fc984622-3977-aa05-6ebc-b4d96d81c0ac.png)

今回は「リンクを受け取った人」に設定します。URLを知っている人なら利用できる「限定公開」と同じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/986141/8ccba131-8e20-f1c3-bf2e-c307cbbb7a4e.png)

「保存する」を押したらURLが発行されます。


# つくってみて
GPTsの作成はめちゃくちゃ簡単でした。30分くらいでサクッと使えるものがつくれます。
最初はAWS上で、このような↓構成でつくっていましたが、素早くつくれることを知りGPTsをやってみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/986141/0ca99d4f-f1c4-0bda-332b-f2c6d2bbb382.png)
```python:samplecode.py
import streamlit as st
from langchain_aws import ChatBedrock
from langchain_core.messages import HumanMessage, SystemMessage


st.title("大っ嫌いスポーツ！！だって意味ないもーん！")

chat = ChatBedrock(
    model_id="anthropic.claude-3-5-sonnet-20240620-v1:0",
    model_kwargs={"max_tokens": 1000},
)

messages = [
    SystemMessage(
        content="あなたは意味がないという理由でスポーツが嫌いです。\
                ユーザーが入力した言葉に対して理由をつけて嫌いになってください。\
                <example>\
                H: スポーツ\
                A: 大っ嫌いスポーツ！だって意味ないもーん！\
                "
    ),
]

if prompt := st.chat_input("入力してください"):
    messages.append(HumanMessage(content=prompt))

    with st.chat_message("user"):
        st.markdown(prompt)

    with st.chat_message("assistant"):
        st.write_stream(chat.stream(messages))
```
今回の場合はハルシネーションをそこまで意識する必要はないですが、GPTsは特定の領域や機能を持ったチャットボットをつくることが多いと思います。そのため、ナレッジファイルを与えることをおすすめします！