21
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Qiita LT: 対話的プログラミング

Last updated at Posted at 2023-04-21
1 / 17

自己紹介


会社紹介

Works Human Intelligence

大手法人向け統合人事システム COMPANY

  • 人事管理
  • 給与計算
  • 勤怠管理
  • タレントマネジメント
  • etc

今日のトークテーマ

大規模言語モデルでプログラミングがどう変わるのか


2021年6月: GitHub Copilotのプレビュー開始

  • OpenAIのCodexモデルを使用
  • 自然言語からのプログラム生成が可能に

2022年12月: ChatGPTのリリース


2022年3月: GPT-4のリリース


大規模言語モデルによってできるようになったこと

  1. プログラミング言語間での「翻訳」
  2. 自然言語↔︎プログラミング言語の「翻訳」
  3. 自然言語によるプログラムの「修正」

1. プログラミング言語間の翻訳: Java

public class ReadCSVFile {

    public static void main(String[] args) {

        String csvFile = "/path/to/csv/file.csv";

        try (CSVReader reader = new CSVReader(new FileReader(csvFile))) {
            String[] line;
            while ((line = reader.readNext()) != null) {
                // CSVファイルから読み込んだ1行の処理
                // line[0]は1列目、line[1]は2列目...
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

1. プログラミング言語間の翻訳: Python

import csv

csv_file = "/path/to/csv/file.csv"

with open(csv_file, 'r') as file:
    reader = csv.reader(file)
    for line in reader:
        # CSVファイルから読み込んだ1行の処理
        # line[0]は1列目、line[1]は2列目...

1. プログラミング言語間の翻訳: TypeScript

import * as csv from 'csv-parser';
import * as fs from 'fs';

const csvFile = "/path/to/csv/file.csv";

fs.createReadStream(csvFile)
  .pipe(csv())
  .on('data', (line: string[]) => {
    // CSVファイルから読み込んだ1行の処理
    // line[0]は1列目、line[1]は2列目...
  })
  .on('error', (error: Error) => {
    console.error(error);
  });

逐次的な翻訳ではなく、「意味」を理解して翻訳している!


2. 自然言語↔︎プログラミング言語の「翻訳」

Q. このコードの挙動を簡潔に説明して

refreshQuotaImpl :: UserId -> UTCTime -> Key -> Redis Bool
refreshQuotaImpl userId timestamp quotaKey = do
    param <- restoreQuotaParamImpl (Just (quotaKey, Just userId))
    let limitTime = addUTCTime (param ^. paramDuration . to negate) timestamp
        key = "quota." <> userId <> "." <> quotaKey
    let popOld = handleReply $ lindex key 0 >>= \case
            Nothing -> pure ()
            Just val -> do
                let (timestamp1, _) = parseQuota val
                when (timestamp1 < limitTime) $ do
                    handleReply $ lpop key
                    popOld
    popOld
    l <- handleReply $ lrange key 0 (-1)
    pure $ length l < param ^. paramCallLimit
        && (l & map (snd . parseQuota)
              & sum
              & (< (param ^. paramAmountLimit)))

2. 自然言語↔︎プログラミング言語の「翻訳」

ChatGPTの回答

このコードは、Redisを使用してAPI利用制限を管理する関数であり、与えられたユーザーID、APIエンドポイントキー、およびAPIリクエストのタイムスタンプを元に、Redisリストから古いエントリーを削除し、API利用制限を超えていない場合はTrueを、超えている場合はFalseを返します。


2. 自然言語↔︎プログラミング言語の「翻訳」

Q. どのようなアルゴリズムでAPI利用が制限されますか?

ChatGPTの回答

このコードでは、API利用制限はRedisのリストによって管理されます。リストの各エントリーは、APIリクエストが発生した時間とリクエストによって消費されたリソースの量を示します。refreshQuotaImpl関数は、Redisリストから過去のエントリーを削除し、制限の有効期限内のエントリーだけを残します。その後、リスト内のエントリーの値を合計し、API利用制限を超えていないかどうかを確認します。API利用制限を超えている場合はFalseを、超えていない場合はTrueを返します。このアルゴリズムにより、API利用のトラッキングが実現され、APIの利用制限を管理できます。


3. 自然言語によるプログラムの「修正」

対話的にプログラムを実装できる。

Demo

Q. CSVデータを生成して

Q. CSVのデータを格納するTicketクラスを生成して

Q. CSVのデータをTicketクラスのリストに格納して


(まだ)大規模言語モデルではできないこと

  • コンテキストの制限
    • 一度に処理できるのはGPT-4でも32Kトークン (~1500行程度)まで。
    • ソースコード全部を食わせるのは不可能
    • うまいこと必要なコードを検索してコンテキストを作成する必要
  • デバッグ
    • 大規模言語モデルは論理を正確に追うのが苦手で、特に矛盾した状況に弱い
    • 生成したコードにはある程度バグ(≒矛盾)が含まれる
    • なぜバグが起こったのかは説明できるが、うまく修正できない

まとめ

  • 大規模言語モデルによって「対話的プログラミング」が実用可能に
    • AIとエンジニアがコラボレーションして開発するプログラミングパラダイム
  • AIの役割
    • エンジニアの指示に従ってコードの実装、修正
    • 書いたコードが何をしているかエンジニアに説明
  • エンジニアの役割
    • AIが書ける程度に問題をブレイクダウン
    • AIの書いたコードをレビュー
    • AIと一緒にデバッグし修正方法を考える
21
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?