見出し画像

チームエンジニアに新メンバー、ChatGPT:AIがもたらすパワーアップの秘訣

ごきげんよう。あっきー(@kuronekopunk)です🙋‍♀️
社内でやっている『10分勉強会』で共有した内容をそのままブログにしました。発表者や回によってテーマはバラバラですが興味あれば勉強会に遊びに来てください🙌

チームエンジニアに新メンバー、ChatGPT:AIがもたらすパワーアップの秘訣

ChatGPTとは?

ChatGPT(Chat Generative Pre-trained Transformer)は、OpenAIが開発した大規模な言語モデルです。自然言語処理(NLP)の技術を活用し、人間と同じような文章を生成することができます。ChatGPTは、インターネット上の大量のテキストデータから学習し、質問に答えたり、文章を作成したりする能力を持っています。

エンジニアリングにおけるChatGPTの活用

エンジニアリング業界では、ChatGPTがさまざまな方法で活用されています。以下はそのいくつかの例です。

  • コード補完: ChatGPTは、プログラミング言語を理解し、コードの補完や修正を行うことができます。これにより、エンジニアは効率的にコーディングを行うことができます。

  • ドキュメント生成: ChatGPTは、プロジェクトのドキュメントを自動生成することができます。これにより、エンジニアはドキュメント作成にかかる時間を削減できます。

  • バグ検出: ChatGPTは、コード内のバグを検出し、修正提案を行うことができます。これにより、エンジニアは品質の高いコードを保つことができます。

ChatGPTとエンジニアの役割分担

ChatGPTがエンジニアリングの分野で役立つ一方で、エンジニアは以下のような役割を担います。

  • 設計と戦略: ChatGPTは具体的な実装方法を提案できますが、システム全体の設計や戦略はエンジニアが行います。

  • モデルのカスタマイズ: ChatGPTは多くの場合汎用的ですが、特定の業界やニーズに合わせたカスタマイズが必要な場合、エンジニアが行います。

  • 評価とフィードバック: ChatGPTが生成したコードやドキュメントの評価やフィードバックを行い、改善を進めます。

ChatGPTの課題と注意点

ChatGPTを活用する際には、以下の課題や注意点に留意する必要があります。

  • データセキュリティ: ChatGPTは多くの情報を学習しているため、セキュリティ上の懸念があります。企業秘密や個人情報を含むデータを取り扱う際は、適切なセキュリティ対策が必要です。

  • 倫理的な問題: ChatGPTは偏見を持った情報も学習することがあります。そのため、生成されたコンテンツに偏見が含まれる可能性があります。エンジニアは倫理的な問題に留意し、適切な対応を行う必要があります。

  • 依存の危険性: ChatGPTの利便性が高いため、エンジニアが過度に依存してしまう可能性があります。技術的なスキルや知識を維持するために、適度なバランスが重要です。

まとめ

ChatGPTはエンジニアリングの分野で多くの可能性を持っており、効率的なコーディングやドキュメント作成、バグ検出に役立ちます。しかし、データセキュリティや倫理的な問題、過度な依存の危険性には注意が必要です。エンジニアとChatGPTが互いの役割を理解し、協力して働くことで、より良いエンジニアリングを実現できます。




本題ここから

ここまではGPT4に以下のプロンプトを与え書いてもらいました。

# 命令書:
あなたはプロの編集者です。
以下の条件を満たすように最高のブログ記事を書いてください

# 制約条件:
・タイトルは『ChatGPTと共存するエンジニアリング』
・対象読者はエンジニアです
・次に書く見出しを参考に数セクションに分けて記事を書いてください。次に提示する見出しは絶対ではなく、他に良い見出しや構成があれば提案をしてください

# 見出し:
1. ChatGPTとは?
2. エンジニアリングにおけるChatGPTの活用
3. ChatGPTとエンジニアの役割分担
4. ChatGPTの課題と注意点
5. まとめ

タイトルは仮で与えたのでその後でタイトル案を提示してもらい書き換えました。

先程のブログタイトルを興味深く読まれやすいものにするために5個ほど案を提示してください

『チームエンジニアに新メンバー、ChatGPT』このタイトルめちゃくちゃ気に入ってます。

活用してみて、それっぽい文章を爆速で書いてくれるのでたたき台を作るのにはとても良さそうです。
実際にプログラミングを手伝ってもらうとどうなるか試してみましょう。

※ここからchatGPTにコードを書いてもらうサンプルなので『ChatGPTと共存するためにエンジニアに必要なスキル』までスキップ可能です。


コードを解説してもらう

私🙋‍♀️
以下のコードを解説してください

class User < ApplicationRecord
  scope :active, lambda { |user_id = nil|
    this = references(:posts).left_outer_joins(:posts)
    if user_id.present?
      this.where.not(posts: { user_id: nil }).or(this.where(id: select_id)).distinct
    else
      this.where.not(posts: { user_id: nil }).distinct
    end
  }
end

Bot🤖
このコードは、Ruby on Railsで記述されたUserクラスです。ActiveRecordを継承しており、データベースとのやりとりをサポートしています。
疑似コード:

  1. Userクラスを定義する

  2. activeスコープを定義する

    1. 引数としてuser_idを受け取る (デフォルトはnil)

    2. postsテーブルを参照し、left_outer_joinsで結合する

    3. user_idが存在する場合

      1. postsテーブルのuser_idがnilでないレコード、または指定されたuser_idのレコードを抽出し、重複を排除する

    4. user_idが存在しない場合

      1. postsテーブルのuser_idがnilでないレコードを抽出し、重複を排除する

このコードは、Userクラスにactiveスコープを追加しています。このスコープは、ユーザーがアクティブ(投稿を持っている)かどうかを判断するために使われます。user_idが指定されている場合、そのユーザーを含めてアクティブなユーザーを取得します。user_idが指定されていない場合、すべてのアクティブなユーザーを取得します。


コード改善を依頼する

私🙋‍♀️
先程のコードをリファクタリングしてください

Bot🤖
リファクタリングの目的は、コードの可読性や保守性を向上させることです。以下のリファクタリングされたコードは、active スコープをより読みやすく、理解しやすくすることを目指しています。

class User < ApplicationRecord
  scope :active, lambda { |user_id = nil|
    base_query = references(:posts).left_outer_joins(:posts).where.not(posts: { user_id: nil })

    if user_id.present?
      base_query.or(where(id: user_id)).distinct
    else
      base_query.distinct
    end
  }
end

このリファクタリングでは、共通のクエリ部分をbase_query変数にまとめ、コードの重複を削減しました。この変更により、コードの構造が明確になり、読みやすくなります。


Rspecを書いてもらう

私🙋‍♀️
先程のコードのRspecをかいてください

Bot🤖
RSpecを使って先程のリファクタリングされたUserクラスのactiveスコープをテストするコードを提供します。
まず、テスト対象のUserクラスを使用しているRailsアプリケーションで必要なテストデータを準備します。この例では、FactoryBotを使ってテストデータを定義します。

# spec/factories/users.rb
FactoryBot.define do
  factory :user do
    # 必要な属性を設定してください。
  end
end

そして、Userクラスのactiveスコープに対するRSpecテストを作成します。

# spec/models/user_spec.rb
require 'rails_helper'

RSpec.describe User, type: :model do
  describe '.active' do
    let!(:active_user) { create(:user) }
    let!(:inactive_user) { create(:user) }
    let!(:user_with_post) { create(:user) }

    before do
      create(:post, user: user_with_post)
    end

    context 'when user_id is not provided' do
      it 'returns active users (users with posts)' do
        result = User.active
        expect(result).to include(user_with_post)
        expect(result).not_to include(active_user, inactive_user)
      end
    end

    context 'when user_id is provided' do
      it 'returns active users and the specified user' do
        result = User.active(active_user.id)
        expect(result).to include(user_with_post, active_user)
        expect(result).not_to include(inactive_user)
      end
    end
  end
end

このRSpecテストでは、User.activeスコープの振る舞いを2つのシナリオでテストしています。

  1. user_idが指定されていない場合: 投稿を持つユーザーのみが含まれることを確認しています。

  2. user_idが指定されている場合: 投稿を持つユーザーと、指定されたuser_idのユーザーが含まれることを確認しています。

テストデータの作成には、FactoryBotを使用していますが、必要に応じて適切な属性を設定してください。また、Postモデルのファクトリも適切に設定してください。

バリデーションを書いてもらう


私🙋‍♀️
※この前にRailsで複数人でチャットできるモデル設計を依頼しています
「先程のチャットに同一ユーザー同士のチャットができないようバリデーションを追加してください」

Bot🤖
チャットに同一ユーザー同士のチャットができないようにバリデーションを追加するには、ChatUserモデルに独自のバリデーションを追加する必要があります。以下はその例です。
同一ユーザー同士のチャットができないようにするために、ChatRoomUserモデルにカスタムバリデーションを追加します。
まず、ChatRoomUserモデルにvalidateメソッドを使って、カスタムバリデーションメソッドunique_users_in_chat_roomを呼び出すよう設定します。

# app/models/chat_room_user.rb
class ChatRoomUser < ApplicationRecord
  belongs_to :user
  belongs_to :chat_room

  validate :unique_users_in_chat_room

  private

  def unique_users_in_chat_room
    # 同一のユーザーが同じチャットルームに複数回参加していないことを確認する
    if ChatRoomUser.where(user_id: user_id, chat_room_id: chat_room_id).exists?
      errors.add(:user, "はすでにこのチャットルームに参加しています。")
    end
  end
end

上記のコードでは、unique_users_in_chat_roomメソッドを使って、同一ユーザーが同じチャットルームに複数回参加していないことを確認しています。もし同一ユーザーが同じチャットルームに参加しようとした場合、エラーが追加され、バリデーションが失敗します。
これにより、同一ユーザー同士のチャットができないように制限されます。ただし、実際のアプリケーションに応じて、エラーメッセージやバリデーションの条件を適切に変更してください。



ChatGPTと共存するためにエンジニアに必要なスキル

たたき台的なコードを少ないコストで書いてもらうことはできました。
ChatGPTを活用していく上でエンジニアに必要なスキルは大まかに2つあります。

  1. 要件を適切に伝える文章力

  2. ChatGPTの出力結果の正しさを検証する技術力

1. 要件を適切に伝える文章力

インプットが悪いとアウトプットの質も悪くなります。プロンプトエンジニアリングのように期待するアウトプットが得られるように要件定義とそれを伝える文章力が重要になります。
これは通常の開発でも必須ですが、駆け出しエンジニアのスキルアップのロードマップとしてこの後説明する『2. ChatGPTの出力結果の正しさを検証する技術力』のための最低限のプログラミングができれば設計の知識を付けていくほうが近道のように感じます。

今回はOpenAI公式YouTubeの中で出てきたプロンプトに、深津式汎用プロンプトで紹介されている「追加情報必要なら質問して」を追加した以下のプロンプトで実行しました。

あなたはAIプログラミングアシスタントです。
- ユーザーの要求に注意深く、厳密に従ってください。
- 最初に段階的に考えます。何を構築するかの計画を疑似コードで詳細に記述します。
- 次に、コードを 1 つのコードブロックに出力します。
- 他の散文は最小限に抑えます
- このタスクで最高の結果を出すため追加の情報が必要な場合は質問をしてください


2. ChatGPTの出力結果の正しさを検証する技術力

ChatGPTの出力したコードでエラーが出るならまだいい方で、動きはするけど意図したものでない可能性があります。そのため純粋な技術力はまだ必要になります。
『こちらの方がパフォーマンスが良い』と提案されてそれっぽいことを言われるがユースケース次第では違う可能性もあります。そのため、ChatGPTにはサポートしてもらうがコードのオーナーシップは自分が持てるよう注意が必要です。

さいごに

用法用量を守ってツールを適切に活用し、生産性を上げていきましょう🙋‍♀️



読んでくれてありがとうございます!少しでもいいなと思ったら「スキ❤️」してもらえると飛んで喜びます!シェアしてもらったらもっと嬉しいです!