日々の業務でのChatGPT活用場面

# はじめに

こんにちは。
新卒3年目エンジニアの @af_ty です。

ChatGPTが公開されて一年以上が経ち、プロンプト事例や活用術の紹介サイト・書籍なども出回ってきています。業務に活用しているエンジニアの方も多いのではないでしょうか。
私もまだまだ試行錯誤中ではあるものの、少しずつアシスタントとして活用できるようになってきています。

この記事では、そうした試行錯誤の事例と、使ってみた感想を共有させていただきます。


# 事例

## コーディング系


### Elasticsearch (Javaライブラリ)

私のチームではElasticsearchを使った開発が多いです。

下記はそのうち `インデックスに付与されたエイリアスを取得する部分` のたたき台を書かせた際のやり取りです。

![es_getalias.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2299296/05e62800-d5e0-a1dc-7a72-fd19b1111bd7.png)


> Elasticsearch のインデックスについて考えてみましょう。インデックスのエイリアスの名前を取得するJavaコードを書いてください。

> もちろんです、Java APIを使用してElasticsearchのインデックスのエイリアスの名前を取得するには、以下のコード・スニペットを使用できます：

```java
import org.elasticsearch.action.admin.indices.alias.get.GetAliasesRequest;
import org.elasticsearch.action.admin.indices.alias.get.GetAliasesResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.GetAliasesRequest;
import org.elasticsearch.client.indices.GetAliasesResponse;

public class ElasticsearchAlias {

    public static String getAliasName(String indexName, RestHighLevelClient client) throws IOException {
        GetAliasesRequest request = new GetAliasesRequest(indexName);
        GetAliasesResponse response = client.indices().getAlias(request, RequestOptions.DEFAULT);
        String[] aliases = response.getAliases().keys().toArray(String[]::new);

        if (aliases.length > 0) {
            return aliases[0]; // Assuming one alias per index, change this if multiple aliases are expected.
        }

        return null; // No alias found for the given index.
    }
}
```


> プロジェクトの依存関係に Elasticsearch Java High-Level REST Client が追加されていることを確認してください。上記のコードは、指定されたインデックスに関連付けられた最初のエイリアスを取得します。インデックスに複数のエイリアスがある場合は、その状況に対応するようにロジックを調整するとよいでしょう。

複雑な内容ではないですが、一瞬で出してくれるのが結構ありがたいです。

ちなみに英語でチャットしていますが、これは英語の方が高精度という話を読んだことがあったためです。
ただ、体感的に日本語でも十分な回答が得られることが多いため、最近はもっぱら日本語でチャットしています。


### Google App Script

スプレッドシートでちょっとしたデータ分析をする機会があり、数十枚のシートに渡って特定のセルを塗りつぶしたいことがありました。
手作業はかなり面倒です。かといってGASは未経験なので、自分で関数やサンプルコードを探すとなると時間がかかりそうです。
そこでChatGPTに聞いてみます。

ひとまず１枚のシートを作業対象としたコードを書かせて、上手く動いたらforループで複数シートに展開することにしました。下記はその際のやり取りです。

![gas_paint_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2299296/f778b4d4-6c09-cad3-8edb-463f01cc2980.png)

上記で動かしたところ、 `hoge`と完全一致するセルだけしか塗りつぶされなかったので、手元で　`values[i][0] === "hoge"`　を　`values[i][0].indexOf("hoge") != -1`　に修正して利用しました。(上記スニペットの下から5行目)

また、緑は見づらかったので、他の色を試してみることにしました。

![gas_paint_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2299296/02a2c8d7-aaec-9bb8-8142-89c342fe42cd.png)

引数オプション等もその場で聞けるので便利です。

### Linuxコマンド

コマンドの使い方を忘れてしまい、マニュアルを探すのが面倒な時、ChatGPTに聞くことがあります。
下記は一例です。

![shell_date.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2299296/3b9f17c9-2d96-d62c-1cf5-562620767e53.png)

※コード部分
```shell
date '+%Y-%m' --date="$(date +%Y-%m-01) -3 month" | tr '\n' ' ' | sed 's/ $//'
```
↓　実行結果
```shell
2022-12
```

1ヶ月しか出力されませんでしたが、たたき台としては十分です。手元で編集して、下記のコードを使いました。

```shell
year_months=''; for n in {2..0}; do year_months="$year_months "`date +%Y-%m -d "$(date +%Y-%m-01) -$n month"`; done; echo $year_months
```

ちなみに後日試したら、デバッグもChatGPTに任せられそうでした。

![shell_date_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2299296/d9fc4e0b-9e8c-b6a8-f4e6-453cd1f24c33.png)

※最終的なコード
```shell
for i in {0..2}; do date -d "$(date +%Y-%m-01) -$i month" '+%Y-%m'; done | tac | tr '\n' ' '
```
↓　実行結果
```shell
2022-12 2023-01 2023-02
```

(何故か英語で回答されましたが) 欲しい出力は無事に得られました。



## 単純作業系

### 表データ → HTML表

とあるドキュメントにHTML形式の表を埋め込む必要があり、面倒だったため、ChatGPTに書いてもらいました。

![html_table.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2299296/db34af7e-07db-895b-0676-30bc9de6a6f3.png)


### 列データ → Excel表

Excelで数百行1列に張り付けたデータを、複数列に分割する必要があり、これも面倒なのでChatGPTに良いやり方を聞いてみました。

![excel_table_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2299296/d9cf5c00-59d4-a6c8-b006-4ad5a53ded36.png)

なるべく簡単な方法で実現したいので、提案された方法ではなく、貼り付け先の各セルにINDIRECT関数を記載することにしました。

![excel_table_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2299296/c2e40a08-90a8-1b47-9c29-9b92cb31642d.png)

上記の式を`B1`に張り付けたところ、1行ズレて表示されることが分かったため、`COLUMN()`の部分を`COLUMN()-1`に修正して利用しました。


## その他
### DevOps関連用語の整理

DevOps関連の知識があまりないので、整理のため聞いてみました。

![devops.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2299296/adfc6a0c-b9ff-3af8-57db-4656926fffee.png)

Wikipedia等で確認したところ、合っていそうでした。
簡潔にまとめてくれるので、新しいことを覚える際の入り口としても活用できると思います。

# 所感
使ってみて感じたことを書いてみます。

## 人間と比べたメリット
- 知識量が多い
- 処理が速い
- 適当に指示して振り回しても怒られない

## 人間と比べたデメリット
- 堂々と間違った回答をしたりする (Hallucination)、意思疎通の齟齬が目立つ
    - 間違えてもいい領域で使う
    - 人間のレビューを挟む

## 試したこと
- GPT-3.5・GPT-4
    - GPT-3.5で十分な精度が得られることが多く、かつ速いので、多くの場合GPT-3.5を使っています。
    - 余談ですが、GPT-4の方が感情表現が豊かな印象はあります。例えば英会話練習をしたい場合などは、GPT-4が良いかもしれません。
- 日本語か英語か
    - 日本語でも十分な精度が得られることが多いと感じています。

# 今後試したいこと
- これまではプログラムの部品を実装してもらい、デバッグ等を自分でやっていましたが、デバッグ等もチャットで指示したほうが効率が良さそうです。
- 上記の例よりも複雑な要件の場合でも、要件の整理から手伝ってもらうのを試してみたいです。
- 12/6に公開されたばかりのGeminiとの比較もしてみたいです。

- 面倒な作業をAIに任せて、人間がやりたいこと・人間しかできないことに注力していけるといいですよね。