💬

ビジネスパートナーにChatGPTはいかが?

2023/12/03に公開

はじめに

こんにちはー。

私は学生時代、SVM(サポートベクターマシン)やNaive Bayse(ナイーブベイズ)、Random Forest(ランダムフォレスト)、そしてDeep Neural Network(ディープニューラルネットワーク)といった機械学習モデルを用いて音声に含まれる感情を識別したり、感情のこもった音声を合成する研究を行っていたのもあって、機械学習、特にディープニューラルネットワークを用いた様々な技術に興味があります。

学生時代のですが、発表資料もあるので貼っておきます。
単語の埋め込み表現を用いたEvernoteの自動タグ付けの検討
音声合成の研究

それもあってか最近話題のAI関連技術を用いたサービスである、ChatGPTにもだいぶお世話になっています。

当初はChatGPTがLinux Terminalのように振る舞ってくれるを試してみたり、プライベートで自分で書いたコードの一部を解説させたり、英文を和訳させてみたりと、新しく出てきた技術を試してみるといった使い方をしていました。

ChatGPTをLinuxターミナルにする実験

https://qiita.com/Meria0816/items/53d4e80e97df548194cf#動かしてみよう
linux-terminal
Linuxターミナルとして振る舞わせてpythonをaptでinstallする

mkdir
ディレクトリを作る

python
Pythonをインタラクティブモードで動かしてみる

あるとき業務時間中にも使い始めたら、これはなかなか便利だなとなって、今では悩んだらまっさきに相談する相手になりつつあります。
ということで、この記事ではChatGPTをこんなことに使ってみたよ!をひたすら列挙し、これからChatGPTを使う人や既に使っている人にこんな使い方できるんだ!を伝えていこうと思います。

こんな使い方しました!

壁打ち相手や添削者として。

目標設定や技術カンファレンスや社内勉強会の発表ネタを考えるときなどに、相談相手としてChatGPTを使ってました。実際のやりとりの一部を載せておきます。

私: 「自社開発企業のWebエンジニア目標設定のコツについて教えてください。」

以下ChatGPTのレスポンス

自社開発企業のWebエンジニアとして、お客様が喜んでくれるような目標を設定することは素晴らしい考えです。以下に、目標設定のコツをいくつかご紹介します。

ユーザーエクスペリエンス(UX)の向上: ユーザーがウェブサイトやアプリケーションを使いやすく、直感的に操作できることは重要です。ユーザビリティを高めるために、ナビゲーションの改善、情報の整理、応答性の向上などに取り組むことが目標となります。
パフォーマンスの最適化: ユーザーは高速かつスムーズなウェブ体験を求めています。ウェブページの読み込み時間の短縮やレスポンスの向上、リソースの最適化などに取り組み、パフォーマンスを向上させることが目標です。
レスポンシブデザインの実装: 現代のウェブは様々なデバイスでアクセスされるため、レスポンシブデザインが求められます。異なる画面サイズや解像度に対応し、ユーザーが快適に利用できるようにすることが目標です。
セキュリティの強化: ウェブサイトやアプリケーションのセキュリティは重要な要素です。ユーザーデータの保護、悪意のある攻撃からの防御、脆弱性の対策などに取り組むことが目標です。
新しい技術やトレンドの習得: 技術は日々進歩しており、最新のトレンドやフレームワークに対応することは重要です。新しい技術やツールの習得に取り組み、それらを実際のプロジェクトに適用することが目標となります。
チームとの協力: Web開発は多くの場合、チームで行われます。円滑なコミュニケーションや協力関係の構築、他のメンバーのサポートなどに取り組み、チーム全体の成果に貢献することが目標です。

目標を達成するための手段の例も例示してくれます。

これらの目標を達成するためには、以下の手段が役立つでしょう。

勉強会やカンファレンスへの参加: 技術の最新動向やベストプラクティスを学ぶために、関連する勉強会やカンファレンスに積極的に参加しましょう。
プロジェクトでの挑戦的な役割の引き受け: 新しい技術や機能の開発に関わるプロジェクトに積極的に参加し、自身を成長させる機会をつかみましょう。
コードのレビューやフィードバックの受け入れ: チームメンバーや上司からのフィードバックを積極的に受け入れ、自身のスキル向上に活かしましょう。
オープンソースプロジェクトへの貢献: オープンソースプロジェクトに参加することで、他の開発者との交流や経験の共有ができます。また、自身のスキルを高めるためのプラットフォームとしても活用できます。
自己学習と情報収集: ウェブ開発の分野は広範であり、常に新しい情報が出てきます。自己学習を継続し、ブログや技術記事、書籍などの情報源を活用して、常に最新の知識を取得しましょう。

といった感じで、まぁ結構当たり前っちゃ当たり前のことを言われてはいるんですが、目標設定の切り口がいくつももらえるのはなかなかありがたかったです。その切り口から、「顧客視点を持ったエンジニアになるにはどうしたらいいか」といった感じで、さらに深掘りしてもらったりしました。

カンファレンスのプロポーザルや記事などに対して改善点をアドバイスしてもらったりもしてます。
この記事に関しても以下のようにフィードバックをいただいたので可能な限り取り入れています。
feedback
fixed
フィードバックとそれを踏まえて修正してさらにフィードバック

自己分析を手伝ってもらう。

好きなアニメ作品やドラマ、小説などを列挙し、「好きな作品から私の好きな作品の傾向を説明してみてください」のように尋ねたり、自分の言動の傾向や性格診断結果、ストレングスファインダーの結果などを踏まえて人物像を更新してもらいました。その上で、オススメの作品を教えて欲しいと尋ねた結果が以下の通りです。
https://x.com/myblackcat7112/status/1713583550300348720?s=20

その他にもどんな職業があってるのか尋ねてみたり(エンジニアがちゃんと含まれてて安心した)、どういうアクションをすると特性を活かせるのかを尋ねたりしました。

あなたの興味と特性に基づいて、以下の職業が適しているかもしれません。これらの職業は、あなたの好奇心、学習欲、技術的なスキル、コミュニケーション能力、協力意欲などを活かす機会を提供し、充実感を感じることができる可能性が高いです。

有料課金してChatGPT plusを利用しているユーザーは、ChatGPTを利用用途ごとにカスタムすることができる機能を利用することができます。
その機能を使って自己分析を手伝ってくれるやつを作ったのでこの機会にシェアしておきます。(ChatGPT plusユーザーなら使えるはず)
https://chat.openai.com/g/g-rVwRjdXMl-the-mirror

テストデータの生成をお願いする。

テストコードを書いていたり、手動での検証をするときにダミーのデータが欲しいときってありますよね。できるだけ本物っぽいダミーデータを用意したいときにも使えるみたいです。

私: 「振込先口座情報のような文字列を10個程度生成してください。実在しないものでお願いします。」

もちろんです。以下に、実在しない振込先口座情報のような10個の文字列を生成します:
口座番号: 1234567890, 支店コード: 987, 銀行名: 虚構銀行
口座番号: 2468101357, 支店コード: 654, 銀行名: フィクションバンク
口座番号: 1357924680, 支店コード: 321, 銀行名: ダミーファイナンス
口座番号: 9876543210, 支店コード: 123, 銀行名: イマジナリーバンク
口座番号: 1122334455, 支店コード: 678, 銀行名: フェイクバンキング
口座番号: 9876543210, 支店コード: 456, 銀行名: ノンエクスタントバンク
口座番号: 5555666677, 支店コード: 789, 銀行名: シャドウバンク
口座番号: 9998887776, 支店コード: 234, 銀行名: イリュージョナリーバンク
口座番号: 4444333322, 支店コード: 567, 銀行名: フェイクファイナンス
口座番号: 1212121212, 支店コード: 890, 銀行名: アブストラクトバンク
これらは全て架空の情報であり、実在する銀行口座情報ではありませんのでご安心ください。

検証中に、商品画像のデータが欲しくなったので、DALL・E3 という画像生成できるモデルを使って作ってもらったものもあります。(これもChatGPT plusで使えます)

私: 「丸形、薄型の最先端のスマートウォッチの画像を生成してください」
私: 「この画像をベースに販促商品画像を20枚つくってください。できるだけ利用シーンが伝わるようなものだと尚良しです!」
DALL・Eによるスマートウォッチ画像
DALL・Eによるスマートウォッチ画像生成の流れ

ただし、後述しますが、ここで作られた画像などを商用利用するのは少し慎重になったほうがいいかもしれません。個人での利用や検証くらいなら問題ないです。

実装時に悩んだときの相談相手として。

Railsのmigration

通常の業務ではあまり使わない言語やフレームワークを時として触らなきゃいけないことがあります。
そんなときにもChatGPTは使えます。

私: 「alter table add column number VARCHAR nullable をrailsのmigrationで書いてください」

RailsのMigrationでテーブルに新しいカラムを追加する場合、add_columnメソッドを使用します。また、カラムをnullableにするためにはnull: trueオプションを指定します。以下は、指定された要件に基づいたMigrationクラスの例です。

class AddNumberToTableName < ActiveRecord::Migration[6.0]
  def change
    add_column :table_name, :number, :string, null: true
  end
end

もちろん、このあと公式ドキュメントでこの書き方で問題が無いかは確認してますが、あまり土地勘がない技術を使う場合に大まかに方向性を確認するのには有効そうです。

エラーメッセージの解説

また、エラーメッセージが出たときにエラーメッセージを読んでも理解できないときにググるように、ChatGPTに聞いてみるって使い方もなかなか良さそうです。

たとえば、以下はコードをAWSのCloudFormationを通じてdeployするときに出ていたエラーメッセージを解説してもらったものです。

このエラーメッセージは、AWS CloudFormationスタックの更新または作成に失敗したことを示しています。具体的には、スタックが"UPDATE_ROLLBACK_COMPLETE"の状態になっており、プロセスが終了コード1で完了しています。この状態は、スタックの更新が何らかの理由で失敗し、CloudFormationが自動的にロールバック(元の状態に戻す処理)を行ったことを意味します。

このメッセージとその直前に出ていたエラーメッセージから、どうやらdeployするためのAWS lambdaを実行する権限がないため、スタックが更新できなかったことが分かり、この件は解決しました。

より良いコードの模索

以下のようなPHPの配列を変換するコードをもっと簡潔に書けないか、array_mapなどで書き直せないんだっけ?を尋ねてみました。

$results = [
	['type' => 'aaa', 'value' => 'AAA'],
	['type' => 'bbb', 'value' => 'BBB'],
];

$converted = [];
foreach ($results as $result) {
	$converted[$result['type']][] = $result['value'];
}

/**
 * [
	'aaa' => [0 => 'AAA'],
	'bbb' => [0 => 'BBB'],
    ]
 * 
 **/ 

以下のようにarray_reduceを使う例を出してくれました。あんまり行数変わらないじゃんってことで今回は元のコードのままにしましたが、こんな書き方もできるんだ、と知識を更新するきっかけになりました。

$results = [
	['type' => 'aaa', 'value' => 'AAA'],
	['type' => 'bbb', 'value' => 'BBB'],
];
$converted = array_reduce($results, function($carry, $result) {
    $carry[$result['type']][] = $result['value'];
    return $carry;
}, []);

メソッド名を考えてもらう。

私: 「一定時間経ったキューのレコードをERRORに更新するメソッド名を考えています」

特定の時間が経過したらキューのレコードを「ERROR」に更新するメソッド名を考える際、以下のようなオプションが考えられます。選択肢には、プロジェクトやコーディングスタイルに合わせて最適なものを選ぶことができます。

updateExpiredQueueRecordsToError: 期限切れのキューのレコードを「ERROR」に更新するメソッドです。メソッド名が明確で、何を行うかがわかりやすいです。
markExpiredQueueRecordsAsError: 期限切れのキューのレコードを「ERROR」としてマークするメソッドです。動詞の「mark」は変更操作を示しており、意味が明確です。
processExpiredQueueRecords: 期限切れのキューのレコードを処理し、エラーとしてマークするメソッドです。メソッド名が処理の内容を示しています。
setErrorForExpiredQueueRecords: 期限切れのキューのレコードに対してエラーを設定するメソッドです。操作が「設定」を強調しています。

どのメソッド名を選択するかは、コードベースやチーム内での一貫性、可読性、意図の明確さに依存します。プロジェクト内の命名規則やコーディングスタイルに従って、適切なメソッド名を選びましょう。

メソッド名のようなもっと適した言い換え方はないか、を探る場合に、理由もセットで候補を挙げてもらえるのがなかなかありがたかったです。もちろん、そのまま採用するのではなく、あくまでもそういう言い換えもできるね、とこの結果を参考に最終的にメソッド名を考えています。

技術用語やドキュメントの解説をしてもらう

マニュアルやドキュメントを読んでても、その分野の周辺知識が足りてないと意味を理解できないことがあります。そんなときにその本文をChatGPTに投げることで、背景知識を補った上での解説をもらうことができます。

たとえばこんな感じで、Next.jsのチュートリアル[1]をやりながら意味が分からなかった部分をそのまま、ChatGPTに投げてみると、
私: 「ページファイルに特別な名前をつけることで、Next.jsではUIコンポーネント、テストファイル、その他の関連コードをルーティングと一緒に配置できます。ページファイル内のコンテンツだけが一般公開されます。たとえば、/uiフォルダと/libフォルダは、ルートとともに/appフォルダ内に配置されます。」

Next.jsでは、ファイルシステムベースのルーティングを採用しており、ディレクトリとファイルの構造がそのままアプリケーションのルート(URLパス)に対応します。あなたが説明したように、Next.jsのプロジェクトでは、ページコンポーネントとそれに関連するファイル(UIコンポーネント、テスト、ユーティリティ等)を整理しやすくするために、特定のフォルダ構造を採用することができます。ここでのポイントは、実際にルーティングに影響を与えるのは「pages」フォルダ内のファイルだけであることです。

例えば、以下のようなフォルダ構造を考えることができます:

/pages:このフォルダ内のファイルは直接URLルートに対応します。例えば、/pages/about.jsは/aboutのURLにマッピングされます。
/app/ui:UIコンポーネントを保持するフォルダ。これらのファイルは直接ルーティングには影響しませんが、ページコンポーネントで利用されます。
/app/lib:ユーティリティ関数やカスタムフックなど、再利用可能なロジックを含むフォルダ。

このように理解するのに必要な知識を具体的な例とセットで解説してもらえたりします。

私: 「オニオンアーキテクチャのControllerの実装例をPHPで教えて」

細かい解説は省いてますが以下のようなサンプルコードを提示してもらえました。このように新しい知識を理解するときの足がかりとして使うにも向いているのかな、と思いました。

src/Application/Services/YourService.php

namespace Application\Services;

use Domain\Repositories\YourRepositoryInterface;
use Domain\Services\YourBusinessLogicService;

class YourService
{
    private $repository;
    private $businessLogicService;

    public function __construct(YourRepositoryInterface $repository, YourBusinessLogicService $businessLogicService)
    {
        $this->repository = $repository;
        $this->businessLogicService = $businessLogicService;
    }

    public function someControllerAction($requestData)
    {
        // ビジネスロジックの呼び出し
        $result = $this->businessLogicService->performSomeAction($requestData);

        // 結果をリポジトリに保存
        $this->repository->save($result);

        // 必要に応じてレスポンスを返す
        return $result;
    }
}

注意点

ここまでChatGPTの使用用途を色々紹介してみましたが、ページの下に書いてあるとおり、ChatGPTは間違ったことを言う事があるので、鵜呑みにしてはいけません。

ChatGPT can make mistakes. Consider checking important information.

また、当然ですが業務で知り得た個人情報などは、ChatGPTに入力しないようにしましょう。社内で生成AIの業務利用に関してガイドラインがあればそれに従ってください。

画像生成に関しては、文化庁のセミナー資料 AIと著作権の「生成・利用段階での著作物の利用」によると以下の通り、既にあるものに似ているか否かで著作権侵害になるかが決まるようなので、商用利用する場合は慎重になったほうが良いと思います。(この記事で紹介しているように個人利用だったり、検証データを生成する分には問題ないです)

AIを利用して画像等を生成した場合でも、著作権侵害と
なるか否かは、人がAIを利用せず絵を描いた場合などの、
通常の場合と同様に判断されます。

まとめ

話題のAI技術である、ChatGPTの活用方法を具体的なエピソードとともに紹介しました。また、生成AI自体は間違ってしまうことがあるということを理解した上で、人間の思考のきっかけや調査の際の突破口として利用するのが良さそうだということを説明しました。

個人的にはChatGPTなどのAI関連技術と正しく付き合っていけば、最強のビジネスパートナーになりうるのではないかと思っています。コードを書くときや新しい技術を学ぶ際のサポート、アイディア出し、デバッグ作業、プロポーザルや記事の添削など様々なことに利用できるのでぜひ参考にしてみてください。

脚注
  1. チュートリアル自体は英語ですが、DeepLのChrome拡張で和訳しながら読み進めました。 ↩︎

NE株式会社の開発ブログ

Discussion