自己紹介
- 寺尾 拓 (@autotaker1984)
- 大学院での専攻はプログラム検証
- 2019年からWorks Human Intelligence(の前身)に新卒入社。
- 開発環境の改善やCICD、リリースサイクルの改善に取り組む
- Qiita執筆
会社紹介
大手法人向け統合人事システム COMPANY
- 人事管理
- 給与計算
- 勤怠管理
- タレントマネジメント
- etc
今日のトークテーマ
大規模言語モデルでプログラミングがどう変わるのか
2021年6月: GitHub Copilotのプレビュー開始
- OpenAIのCodexモデルを使用
- 自然言語からのプログラム生成が可能に
2022年12月: ChatGPTのリリース
- OpenAI GPT-3.5モデルを使用
- コードと自然言語の両方を理解するAI
- 「対話」によって繰り返し内容修正することが可能に
2022年3月: GPT-4のリリース
- 言語理解の精度が大幅に向上
- 各種ペーパーテストで人類と同等の成績を達成
- 人間の補助付きで競技プログラミングも可能に
大規模言語モデルによってできるようになったこと
- プログラミング言語間での「翻訳」
- 自然言語↔︎プログラミング言語の「翻訳」
- 自然言語によるプログラムの「修正」
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. 自然言語によるプログラムの「修正」
対話的にプログラムを実装できる。
Q. CSVデータを生成して
(まだ)大規模言語モデルではできないこと
- コンテキストの制限
- 一度に処理できるのはGPT-4でも32Kトークン (~1500行程度)まで。
- ソースコード全部を食わせるのは不可能
- うまいこと必要なコードを検索してコンテキストを作成する必要
- デバッグ
- 大規模言語モデルは論理を正確に追うのが苦手で、特に矛盾した状況に弱い
- 生成したコードにはある程度バグ(≒矛盾)が含まれる
- なぜバグが起こったのかは説明できるが、うまく修正できない
まとめ
- 大規模言語モデルによって「対話的プログラミング」が実用可能に
- AIとエンジニアがコラボレーションして開発するプログラミングパラダイム
- AIの役割
- エンジニアの指示に従ってコードの実装、修正
- 書いたコードが何をしているかエンジニアに説明
- エンジニアの役割
- AIが書ける程度に問題をブレイクダウン
- AIの書いたコードをレビュー
- AIと一緒にデバッグし修正方法を考える