エンジニアにも知って欲しいChatGPT基本テクニック

# はじめに

ChatGPTブームがひと段落した感がありますが、周りのエンジニアでChatGPTを活用している姿をあまり見みません。

基本的なテクニックを理解すれば、エンジニアこそChatGPTを活用できると思うので、普段使用しているテクニックをいくつかピックアップして紹介します。

## プロンプトの記載方法

### Markdown記法で指示する

色々なところで紹介されていますが、回答や処理の精度を上げる方法としてChatGPTへの指示にMarkdown記法を使用することがオススメされています。

例えば下記のような文章による指示を行おうとした場合

```:文章による指示
あなたはChatGPTのプロンプトエンジニアです。ChatGPTの基本的なテクニックを教えてください。
また、テクニックはリスト形式で10個提示してください。
```

Markdown記法に書き直すと下記の形になります。

```markdown:Markdown記法による指示
# 指示内容
ChatGPTの基本的なテクニックを教えてください。

# 役割
あなたはChatGPTのプロンプトエンジニアです。

# 出力形式
リスト形式で10項目提示します。
```
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/699056/02849036-05be-a486-f13d-36a14f3b9218.png" width="400">

なお、Markdown記法についてはQiitaでも紹介されているので参考にしてください。

https://qiita.com/tbpgr/items/989c6badefff69377da7

### 変数を使う

ChatGPTへの指示で変数を扱うことができます。変数は変数名を中括弧(`{}`)で囲う事で使用できます。

例えば指示内容や出力方法などにも変数を使用できます。

```markdown
# 指示
- {名前}を使用した会話のサンプルを出力してください。
- ChatGPTの基本的なテクニックについて会話を行ってください。

# 名前
- 山田太郎
- 山田花子

# 出力フォーマット
- `{名前}:{会話}`の形式で出力してください
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/699056/4d43cc2f-5aff-8ed2-24a8-0dbde60eaf99.png" width="400">

また、入力内容を変数に格納させる事もできます。

```markdown
# 指示
- {会話テキスト}を要約してください。
- {会話テキスト}のフォーマットは`{{名前}}:{{会話}}`の形式で記載されています。

# 会話テキスト
"""
山田太郎:まず、一つ目は「具体的な指示を与えること」だよ。例えば、何かを説明してもらいたいときには、具体的に何について説明してほしいかを明確にするんだ。
山田花子:なるほど、それは確かに重要ね。具体的に指示を出すことで、より正確な答えが得られるんだね。
山田太郎:そうそう。そして、二つ目は「段階的な質問をすること」。複雑な問題を解決するときには、一度に全部を聞くのではなく、段階を追って質問することで、より詳細な情報を得ることができるんだ。
山田花子:それはいいアイデアね。例えば、料理のレシピを知りたいときに、最初に材料を聞いて、その次に作り方を聞くって感じかな。
山田太郎:まさにその通り。それから、三つ目は「コンテキストを提供すること」。質問をする前に、少し背景を説明すると、より適切な答えが返ってくることが多いんだ。
"""
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/699056/81cc7cb1-ddbb-8f57-5e9a-388b5f71c3d8.png" width="400">

### パラメータを設定する

独自で作成した変数とは別に、ChatGPT独自が持っているパラメータがあります。
代表的なパラメータはOpenAI APIでも使用しているパラメータになりますが、その中でも有用なパラメータをピックアップして紹介します。

https://platform.openai.com/docs/api-reference/chat

|パラメータ|型|範囲|デフォルト値|説明|
|---|---|---|---|---|
|frequency_penalty|float|0.0～2.0|0|同じ単語やフレーズの繰り返しを避けるためのペナルティ。|
|max_tokens|int|1～4096|4096|生成されるテキストの最大トークン数。|
|n|int|1～20|1|生成される応答の数。|
|presence_penalty|float|0.0～2.0|0|特定のトピックやアイデアの頻出を避けるためのペナルティ。|
|seed|int|任意の整数|なし|再現性を持たせるためのランダムシード値。|
|temperature|float|0.0～2.0|1|出力の創造性やランダム性を制御する。(`top_p`と併用不可)|
|top_p|float|0.0～1.0|1|生成される単語の選択肢の多様性を制御する。(`temperature`と併用不可)|

例えば下記のパラメータを変えて出力結果を比較してみます。

```markdown
# 指示
ChatGPTの良いところを箇条書きで出力してください

# パラメータ
- frequency_penalty:0.0
- max_tokens:10
- n:5
- presence_penalty:0.0
- temperature:0.0
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/699056/abb1a635-12d1-2ac7-0410-9c8228ae67c9.png)

`max_tokens`による出力文字列の変化(10→100)と、`n`による生成されるリスト数の変化(5個→10個)についてはわかりやすく出力結果が変化しています。

:::note info

Azure OpenAIの情報になりますが、[パフォーマンスチューニング](https://learn.microsoft.com/ja-jp/azure/ai-services/openai/how-to/latency)でもパラメータの扱いについて言及しているので、興味がある方は調べてみてください。

:::

### 入出力の上限について

ChatGPTには使用しているプランやモデルによって入出力する画像サイズや文字数に制限があります。
これらはトークンという単位に分割されてカウントされますが、OpenAIのPricingにも記載(`Context window`)があるので参考にしてください。

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/699056/5a97eb5b-da19-fada-1541-95c68490e50d.png)

また、具体的に入力する文字列がいくつのトークンになるのかカウントするサイトをOpenAIでも用意しています。

https://platform.openai.com/tokenizer

:::note info
OpenAIではTokenizerのコードを[Github](https://github.com/openai/tiktoken/blob/main/README.md)で公開しています。
また、[cookbook](https://cookbook.openai.com/examples/how_to_count_tokens_with_tiktoken)や[OpenAI 開発者フォーラム](https://community.openai.com/t/chatgpt-api-maximum-token/83321)でも言及されているので、興味のある方は調べてみてください。
:::

### プロンプトテクニック集

OpenAIから精度の高いプロンプトの書き方としてPrompt Engineering Guideが公開されています。

https://platform.openai.com/docs/guides/prompt-engineering

|項目|概要|
|---|---|
|明確な指示を書く|プロンプトには具体的で明確な指示を含めることが重要です。これにより、モデルがタスクを正確に理解し、期待される応答を生成しやすくなります。|
|参照テキストを提供する|モデルに関連する背景情報や参照テキストを提供することで、より関連性の高い応答を引き出すことができます。これにより、モデルの理解度が向上し、適切な応答が得られます。|
|複雑なタスクをより単純なサブタスクに分割する|複雑なタスクをより単純なサブタスクに分割することで、モデルが各ステップを順序立てて処理しやすくなり、全体の精度が向上します。|
|モデルに「考える」時間を与える|プロンプト内で「考える」時間を与える表現を使用することで、モデルがより詳細で深い応答を生成するための時間を確保します。|
|外部ツールを使用する|必要に応じて外部ツールやデータベースを活用することで、モデルの能力を補完し、より高度な応答を得ることができます。|
|変更を体系的にテストする|プロンプトの効果を評価するために、変更を体系的にテストし、結果を分析して最適化を図ることが重要です。これにより、モデルのパフォーマンスを継続的に改善できます。|


また、Azure OpenAIになりますが、プロンプトエンジニアリング手法が公開されており、現在でも随時更新されています。

https://learn.microsoft.com/ja-jp/azure/ai-services/openai/concepts/advanced-prompt-engineering?pivots=programming-language-chat-completions

|項目|概要|
|---|---|
|システムメッセージ|システムメッセージは、会話のトーンやスタイルを設定し、モデルに全体的な指示を提供するために使用されます。|
|少数ショット学習|少数の例を提供することで、モデルが特定のタスクを学習し、類似の要求に対して正確に応答する能力を向上させます。|
|チャット以外のシナリオ|チャット以外のユースケースでも、プロンプトエンジニアリングを活用してモデルの応答品質を向上させることができます。|
|明確な命令から始める|プロンプトを明確な命令で始めることで、モデルが期待されるタスクを正確に理解し、適切な応答を生成しやすくなります。|
|最後に命令を繰り返す|重要な命令をプロンプトの最後に繰り返すことで、モデルがその指示を見落とすことなく従う可能性が高まります。|
|出力を事前処理する|出力形式を指定することで、モデルが一貫したフォーマットで応答を提供するように導くことができます。|
|明確な構文を追加する|プロンプトに明確な構文を追加することで、モデルの理解を助け、望ましい応答を得やすくします。|
|タスクを中断する|タスクが複雑な場合、モデルにタスクの進捗を確認させることで、誤った方向に進むのを防ぐことができます。|
|アフォーダンスの使用|アフォーダンスを使用して、モデルに特定のアクションや応答を誘導する手法を取り入れます。|
|思考の連鎖プロンプティング|モデルが複雑な問題を解決するために、段階的に考えるプロセスを促すプロンプティング技法です。|
|出力構造の指定|出力の形式や構造を明確に指定することで、モデルが一貫した応答を生成するようにします。|
|`temperature`パラメーターと`Top_p`パラメーター|これらのパラメーターを調整することで、モデルの応答の多様性や創造性を制御できます。|
|根拠付けるコンテキストを提供する|モデルが応答を生成する際に必要な背景情報や根拠を提供することで、より正確で関連性の高い応答を得ることができます。|

https://learn.microsoft.com/ja-jp/azure/ai-services/openai/concepts/gpt-4-v-prompt-engineering

|項目|概要|
|---|---|
|コンテキスト的な特異性|特定の文脈を提示することで、モデルがより関連性の高い応答を生成します。背景情報や具体的な状況を明確に伝えることが重要です。|
|タスク指向のプロンプト|明確な指示を含むプロンプトを使用して、モデルが特定のタスクを実行するように導きます。具体的な行動を指示することが効果的です。|
|拒否の処理|モデルが不適切な応答を生成しないように、拒否するべき内容や行動を明示します。不適切なリクエストを事前に防ぐことが目的です。|
|例の追加|望ましい出力の例をプロンプトに含めることで、モデルが求められる応答の形式や内容を理解しやすくします。|
|プロンプトのチューニングを試す|プロンプトの内容や形式を調整し、モデルの応答を最適化します。異なるアプローチを試し、最適なプロンプトを見つけます。|
|要求を分割する|複雑な要求をシンプルなサブタスクに分割し、段階的に指示を出すことで、モデルがより正確な応答を生成しやすくします。|
|出力形式を定義する|モデルの応答形式を明示することで、出力が一貫したフォーマットで提供されるようにします。例えば、リスト形式や箇条書きなどを指定します。|

具体例も記載されており、比較的使いやすい形にまとまっているので、よければ参考にしてください。

## マルチモーダルの活用

### 質問内容に画像を使用する

意外と使われていない手法ですが、ChatGPTはマルチモーダルに対応しているため、画像を入力として使用できます。

例えばQiitaの通知アイコンについて質問する際も、画面キャプチャを使用してChatGPTに質問することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/699056/2976e0f2-9d0c-7864-6380-69d5f5e13324.png)

:::note infro
ファイルを入力に使用するには、入力エリアの添付ファイルアイコンをクリックしてファイルを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/699056/88554c60-99c9-d1a1-6905-2049ddec971f.png)

また、画面キャプチャなどクリップボードにファイルが格納されている場合は、入力エリアにカーソルを当てた後に貼り付け操作(Command + v / Ctrl + v)を行う事で簡単にファイルを入力に使用する事ができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/699056/61a4f2ff-68ab-5393-4ccc-2da81f95e0b6.png)

:::

### 画像の文字認識(OCR)を使用する

ChatGPTの日本語の文字認識(OCR)の精度は意外と高く、画像に含まれる文字列を認識させる事ができます。

わかりやすい例として、画像に含まれる日本語の文字起こしに使用できます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/699056/4c72df1a-50e2-6053-6188-65e8fc9db18e.png" width="400">

また、まれに日本語を読み取れない時がありますが、そう言った時は`OCRで日本語の文字列を読み取ってください`と明示的にお願いするか、ブレを固定したい場合は日本語のトレーニングデータをアップロードしてAdvanced Data Analysisで強制的に日本語を解析させる事もできます。

下記の記事の`日本語をトレーニングする`で紹介していますので、よければご覧ください。

https://qiita.com/b-mente/items/b15011ab3b6c3830e732#%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%82%92%E3%83%88%E3%83%AC%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E3%81%99%E3%82%8B

### 画像からソースコードを生成する

上述したように画像の文字列を認識させる事ができるため、出来ることの幅が大きく広がります。
例えば説明文を入れた画像から内容を読み取らせ、ソースコードを生成する事もできます。

下記は説明付きWebサイトのスケッチ画像からソースコードを生成する例ですが、これだけザックリした指示でもちゃんとHTMLを出力してくれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/699056/db4dcf6a-7dd2-4f0d-3b0c-fa4ce4926af9.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/699056/faf8be9f-a27d-d7c9-e8fc-191a839ccbb5.png)

また、領域名だけ画像に記載し、プロンプトに各領域に対する説明をMarkdownで記載することで細かな設定や動作を表現する事もできます。

### UML/SysML画像を解析する

開発で使用しているシーケンス図などのUMLやSysMLの画像をChatGPTに入力し、解析やその後の処理や出力に利用する事ができます。

下記はシーケンス画像から内容の解説やMermaid記法に出力をしている例ですが、こちらも応用の幅が非常に広いので、ぜひ活用してみてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/699056/4f759acb-828e-1de9-b263-295eaa075f50.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/699056/6db72f71-22ca-96cb-f2f7-523752241018.png)

- mermaid記法の出力結果
```mermaid
sequenceDiagram
    participant User
    participant WebServer
    participant AppServer
    participant DB
    
    User->>WebServer: HttpRequest
    WebServer->>AppServer: Forwarding Request
    AppServer->>DB: Data Inquiry
    DB-->>AppServer: Inquiry Results
    AppServer-->>WebServer: Processing Result
    WebServer-->>User: HttpResponse
```

また、下記でUML/SysML画像からMermaid記法で出力する方法を紹介していますので、よければご覧ください。

https://qiita.com/b-mente/items/b15011ab3b6c3830e732

## Advanced Data Analysisの活用

ChatGPTにはAdvanced Data Analysis(旧Code Interpreter)というPythonの実行環境が用意されています。
よく使用される例としてPDFやエクセル、CSVなどのデータ解析や、テキストやファイル操作などが挙げられますが、短時間で実行可能なPythonスクリプトであれば大体なんでもできます。

https://help.openai.com/en/articles/8437071-data-analysis-with-chatgpt

### 各種制限

ChatGPT本体やAdvanced Data Analysisには下記の制限がかけられていますので、この制限の中でAdvanced Data Analysisを実行していく必要があります。

- 実行時間制限
    - 一度のコード実行にかかる時間は通常60秒以内
- メモリ使用量制限
    - 1.5GB〜2GB(目安)
- 扱えるファイルの種類
    - テキスト ファイル、スプレッドシート、プレゼンテーション、ドキュメントによく使用されるすべてのファイル拡張子
- アップロードの制限
    - 最大20ファイル
    - 1ファイルあたり最大512MB
        - テキストやドキュメントファイル：200万トークン以内
        - スプレッドシートやCSVファイル：最大50MB
        - 画像：最大20MB

https://help.openai.com/en/articles/8555545-file-uploads-faq

:::note info

扱えるファイルの種類がザックリしていますが、[AssistantsのCode Interpreter](https://platform.openai.com/docs/assistants/tools/code-interpreter)に記載しているファイルは使用できそうです。

```:ファイルの種類
.c, .cs, .cpp, .doc, .docx, .html, .java, .json, .md, .pdf, .php,
.pptx, .py, .py, .rb, .tex, .txt, .css, .js, .sh, .ts, .csv, .jpeg,
.jpg, .gif, .png, .tar, .xlsx, .xml, .zip
```

:::

### 画像を加工する

特に画像加工系などはデフォルトでパッケージやライブラリが用意されているので、文章による指示でも加工を行なってくれます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/699056/4f0487b1-6a6a-13e7-ffb3-fc2466523df3.png" width="400">

- PIL(Pillow)、cv2(OpenCV)
    - リサイズやトリミングなどの基本的な処理を行いたい場合
    - 画像を合成
    - 複数の画像を連結（結合）
    - 透過png画像を作成
    - ネガポジ反転（画素値を逆転）
    - 円形や正方形のサムネイル画像作成
    - 図形描画
    - アニメーションGif作成
    - 顔検出（顔認識）
    - モザイク処理

また、`qrcode`が用意されているので、QRコードの生成なども行えます。

```
qrcodeライブラリを使用して下記URLのQRコードを生成してください。

https://www.google.com/
```
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/699056/3467c262-6783-a1f1-1df3-b45e41a99f14.png" width="400">

:::note warn
svgwriteが用意されているのでSVGも出力できますが、PNGなどの画像をSVGに変換するにはsvgwrite + cv2だけではなく、matplotlibなどの化学計算用の画像ライブラリと組み合わせる必要がありそうです。
:::

### デフォルトで使用できるパッケージ

下記を入力すると、現在使用できるパッケージの一覧を表示してくれます。

~~~
# 指示
CodeInterpreterでPythonコードを実行してください

# Pythonコード
```
import pkg_resources

installed_packages_list = sorted(["%s==%s" % (i.key, i.version) for i in pkg_resources.working_set])
installed_packages_list
```
~~~

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/699056/3c57299b-753c-fe98-e73f-2d5652a2c37e.png" width="400">

<details><summary>パッケージ一覧</summary><div>

```
'absl-py==2.1.0'
'ace-tools==0.0.1'
'aeppl==0.0.31'
'aesara==2.7.3'
'affine==2.4.0'
'aiohttp==3.8.6'
'aiosignal==1.3.1'
'analytics-python==1.4.post1'
'anyio==3.7.1'
'anytree==2.8.0'
'argon2-cffi-bindings==21.2.0'
'argon2-cffi==23.1.0'
'arviz==0.17.1'
'asn1crypto==1.5.1'
'asttokens==2.4.1'
'async-timeout==4.0.3'
'attrs==23.2.0'
'audioread==3.0.1'
'babel==2.14.0'
'backoff==1.10.0'
'basemap-data==1.3.2'
'basemap==1.3.9'
'bcrypt==4.1.2'
'beautifulsoup4==4.12.3'
'bleach==6.1.0'
'blinker==1.7.0'
'blis==0.7.11'
'blosc2==2.0.0'
'bokeh==2.4.0'
'branca==0.7.1'
'brotli==1.1.0'
'cachetools==5.3.3'
'cairocffi==1.6.1'
'cairosvg==2.5.2'
'camelot-py==0.10.1'
'catalogue==2.0.10'
'certifi==2024.2.2'
'cffi==1.16.0'
'chardet==3.0.4'
'charset-normalizer==2.1.1'
'click-plugins==1.1.1'
'click==8.1.7'
'cligj==0.7.2'
'cloudpickle==3.0.0'
'cmake==3.28.3'
'cmudict==1.0.21'
'comm==0.2.2'
'confection==0.1.4'
'cons==0.4.6'
'contourpy==1.2.0'
'countryinfo==0.1.2'
'cryptography==3.4.8'
'cssselect2==0.7.0'
'cycler==0.12.1'
'cymem==2.0.8'
'cython==0.29.36'
'databricks-sql-connector==0.9.1'
'debugpy==1.8.1'
'decorator==4.4.2'
'defusedxml==0.7.1'
'dlib==19.24.2'
'dnspython==2.6.1'
'docx2txt==0.8'
'einops==0.3.2'
'email-validator==2.1.1'
'entrypoints==0.4'
'et-xmlfile==1.1.0'
'etuples==0.3.9'
'exchange-calendars==3.4'
'executing==2.0.1'
'faker==8.13.2'
'fastapi==0.95.2'
'fastjsonschema==2.19.1'
'fastprogress==1.0.3'
'ffmpeg-python==0.2.0'
'ffmpy==0.3.2'
'filelock==3.13.1'
'fiona==1.9.2'
'flask-cachebuster==1.0.0'
'flask-cors==4.0.0'
'flask-login==0.6.3'
'flask==3.0.2'
'folium==0.12.1'
'fonttools==4.49.0'
'fpdf==1.7.2'
'frozenlist==1.4.1'
'future==1.0.0'
'fuzzywuzzy==0.18.0'
'gensim==4.3.1'
'geographiclib==1.52'
'geopandas==0.10.2'
'geopy==2.2.0'
'gradio==2.2.15'
'graphviz==0.17'
'gtts==2.2.3'
'h11==0.14.0'
'h2==4.1.0'
'h5netcdf==1.3.0'
'h5py==3.8.0'
'hpack==4.0.0'
'html5lib==1.1'
'httpcore==1.0.4'
'httptools==0.6.1'
'httpx==0.27.0'
'hypercorn==0.14.3'
'hyperframe==6.0.1'
'idna==3.6'
'imageio-ffmpeg==0.4.9'
'imageio==2.34.0'
'imgkit==1.2.2'
'importlib-metadata==7.0.2'
'importlib-resources==6.3.0'
'iniconfig==2.0.0'
'ipykernel==6.29.3'
'ipython-genutils==0.2.0'
'ipython==8.22.2'
'isodate==0.6.1'
'itsdangerous==2.1.2'
'jax==0.2.28'
'jedi==0.19.1'
'jinja2==3.1.3'
'joblib==1.3.2'
'json5==0.9.22'
'jsonpickle==3.0.3'
'jsonschema-specifications==2023.12.1'
'jsonschema==4.21.1'
'jupyter-client==7.4.9'
'jupyter-core==5.1.3'
'jupyter-server==1.23.5'
'jupyterlab-pygments==0.2.2'
'jupyterlab-server==2.19.0'
'jupyterlab==3.4.8'
'keras==2.6.0'
'kerykeion==2.1.16'
'kiwisolver==1.4.5'
'korean-lunar-calendar==0.3.1'
'langcodes==3.3.0'
'lazy-loader==0.3'
'librosa==0.8.1'
'lit==18.1.1'
'llvmlite==0.42.0'
'logical-unification==0.4.6'
'loguru==0.5.3'
'lxml==5.1.0'
'markdown2==2.4.13'
'markdownify==0.9.3'
'markupsafe==2.1.5'
'matplotlib-inline==0.1.6'
'matplotlib-venn==0.11.6'
'matplotlib==3.6.3'
'minikanren==1.0.3'
'mistune==3.0.2'
'mizani==0.10.0'
'mne==0.23.4'
'monotonic==1.6'
'moviepy==1.0.3'
'mpmath==1.3.0'
'msgpack==1.0.8'
'mtcnn==0.1.1'
'multidict==6.0.5'
'multipledispatch==1.0.0'
'munch==4.0.0'
'murmurhash==1.0.10'
'mutagen==1.45.1'
'nashpy==0.0.35'
'nbclassic==0.4.5'
'nbclient==0.10.0'
'nbconvert==7.16.2'
'nbformat==5.10.2'
'nest-asyncio==1.6.0'
'networkx==2.8.8'
'nltk==3.6.3'
'notebook-shim==0.2.4'
'notebook==6.5.1'
'numba==0.59.0'
'numexpr==2.9.0'
'numpy-financial==1.0.0'
'numpy==1.24.0'
'nvidia-cublas-cu11==11.10.3.66'
'nvidia-cuda-cupti-cu11==11.7.101'
'nvidia-cuda-nvrtc-cu11==11.7.99'
'nvidia-cuda-runtime-cu11==11.7.99'
'nvidia-cudnn-cu11==8.5.0.96'
'nvidia-cufft-cu11==10.9.0.58'
'nvidia-curand-cu11==10.2.10.91'
'nvidia-cusolver-cu11==11.4.0.1'
'nvidia-cusparse-cu11==11.7.4.91'
'nvidia-nccl-cu11==2.14.3'
'nvidia-nvtx-cu11==11.7.91'
'odfpy==1.4.1'
'opencv-python==4.5.5.62'
'openpyxl==3.0.10'
'opt-einsum==3.3.0'
'orjson==3.9.15'
'oscrypto==1.3.0'
'packaging==24.0'
'pandas==1.5.3'
'pandocfilters==1.5.1'
'paramiko==3.4.0'
'parso==0.8.3'
'pathlib-abc==0.1.1'
'pathy==0.11.0'
'patsy==0.5.6'
'pdf2image==1.16.3'
'pdfkit==0.6.1'
'pdfminer.six==20220319'
'pdfplumber==0.6.2'
'pdfrw==0.4'
'pexpect==4.9.0'
'pillow==9.2.0'
'pip==24.0'
'platformdirs==4.2.0'
'plotly==5.3.0'
'plotnine==0.10.1'
'pluggy==1.4.0'
'pooch==1.8.1'
'preshed==3.0.9'
'priority==2.0.0'
'proglog==0.1.10'
'prometheus-client==0.20.0'
'prompt-toolkit==3.0.43'
'pronouncing==0.2.0'
'psutil==5.9.8'
'ptyprocess==0.7.0'
'pure-eval==0.2.2'
'py-cpuinfo==9.0.0'
'py==1.11.0'
'pycountry==20.7.3'
'pycparser==2.21'
'pycryptodome==3.20.0'
'pycryptodomex==3.20.0'
'pydantic==1.10.2'
'pydot==1.4.2'
'pydub==0.25.1'
'pydyf==0.9.0'
'pygments==2.17.2'
'pygraphviz==1.7'
'pyjwt==2.8.0'
'pylog==1.1'
'pyluach==2.2.0'
'pymc==4.0.1'
'pymupdf==1.21.1'
'pynacl==1.5.0'
'pyopenssl==21.0.0'
'pypandoc==1.6.3'
'pyparsing==3.1.2'
'pypdf2==1.28.6'
'pyphen==0.14.0'
'pyproj==3.6.1'
'pyprover==0.5.6'
'pyshp==2.3.1'
'pyswisseph==2.10.3.2'
'pytesseract==0.3.8'
'pytest==6.2.5'
'pyth3==0.7'
'python-dateutil==2.9.0.post0'
'python-docx==0.8.11'
'python-dotenv==1.0.1'
'python-json-logger==2.0.7'
'python-multipart==0.0.9'
'python-pptx==0.6.21'
'pyttsx3==2.90'
'pytz==2024.1'
'pywavelets==1.5.0'
'pyxlsb==1.0.8'
'pyyaml==6.0.1'
'pyzbar==0.1.8'
'pyzmq==25.1.2'
'qrcode==7.3'
'rarfile==4.0'
'rasterio==1.3.3'
'rdflib==6.0.0'
'referencing==0.33.0'
'regex==2023.12.25'
'reportlab==3.6.12'
'requests==2.31.0'
'resampy==0.4.3'
'rpds-py==0.18.0'
'scikit-image==0.20.0'
'scikit-learn==1.1.3'
'scipy==1.9.3'
'seaborn==0.11.2'
'send2trash==1.8.2'
'sentencepiece==0.2.0'
'setuptools==65.5.1'
'shap==0.39.0'
'shapely==1.7.1'
'six==1.16.0'
'slicer==0.0.7'
'smart-open==6.4.0'
'sniffio==1.3.1'
'snowflake-connector-python==2.7.12'
'snuggs==1.4.7'
'soundfile==0.10.2'
'soupsieve==2.5'
'spacy-legacy==3.0.12'
'spacy-loggers==1.0.5'
'spacy==3.4.4'
'srsly==2.4.8'
'stack-data==0.6.3'
'starlette==0.27.0'
'statsmodels==0.13.5'
'svglib==1.1.0'
'svgwrite==1.4.1'
'sympy==1.8'
'tables==3.8.0'
'tabula==1.0.5'
'tabulate==0.8.9'
'tenacity==8.2.3'
'terminado==0.18.1'
'text-unidecode==1.3'
'textblob==0.15.3'
'thinc==8.1.12'
'threadpoolctl==3.3.0'
'thrift==0.16.0'
'tifffile==2024.2.12'
'tinycss2==1.2.1'
'toml==0.10.2'
'tomli==2.0.1'
'toolz==0.12.1'
'torch==2.0.1'
'torchaudio==2.0.2'
'torchtext==0.6.0'
'torchvision==0.15.2'
'tornado==6.4'
'tqdm==4.64.0'
'traitlets==5.14.2'
'trimesh==3.9.29'
'triton==2.0.0'
'typer==0.7.0'
'typing-extensions==4.5.0'
'ujson==5.9.0'
'urllib3==1.26.18'
'uvicorn==0.19.0'
'uvloop==0.19.0'
'wand==0.6.13'
'wasabi==0.10.1'
'watchfiles==0.21.0'
'wcwidth==0.2.13'
'weasyprint==53.3'
'webencodings==0.5.1'
'websocket-client==1.7.0'
'websockets==10.3'
'werkzeug==3.0.1'
'wheel==0.43.0'
'wordcloud==1.9.2'
'wsproto==1.2.0'
'xarray-einstats==0.7.0'
'xarray==2024.2.0'
'xgboost==1.4.2'
'xlsxwriter==3.2.0'
'xml-python==0.4.3'
'yarl==1.9.4'
'zipp==3.18.1'
'zopfli==0.2.3'

```
</div></details>


# おわりに

普段ChatGPTを利用する際に使用している基本的なテクニックをいくつかピックアップして紹介しました。

エンジニアにとってはChatGPTよりGithubCopilotなどの他の生成AIの方が親和性が高いと感じている方も多いと思いますが、ChatGPTは汎用性も高く、幅広く応用できるのでエンジニアの方にもぜひ活用して頂ければと思います。