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

# 自己紹介

* 寺尾　拓 ([@autotaker1984](https://twitter.com/autotaker1984))
* 大学院での専攻はプログラム検証
* 2019年からWorks Human Intelligence（の前身）に新卒入社。
* 開発環境の改善やCICD、リリースサイクルの改善に取り組む
* Qiita執筆
  * [新卒１年目が荒れ果てた開発環境に１年間でCIを導入し単体テストを布教した話](https://qiita.com/autotaker1984/items/894bf0df0009c621da11)
  * [マニュアルレボリューション〜楽しく書ける製品マニュアルを目指して〜](https://qiita.com/autotaker1984/items/cfde031f6ae80830499c)

---

# 会社紹介

<style>
img[alt~="center"] {
  display: block;
  margin: 0 auto;
}
</style>

[Works Human Intelligence](https://www.works-hi.co.jp)

大手法人向け統合人事システム COMPANY
  - 人事管理
  - 給与計算
  - 勤怠管理
  - タレントマネジメント
  - etc 


---
# 今日のトークテーマ

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

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

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

---
# 2022年12月: ChatGPTのリリース

- OpenAI GPT-3.5モデルを使用
- コードと自然言語の両方を理解するAI
- 「対話」によって繰り返し内容修正することが可能に
  - [ChatGPTによるプログラム生成の可能性と限界](https://qiita.com/autotaker1984/items/5b5ac8c01d11fbbbc4a7)

---

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

- 言語理解の精度が大幅に向上
- 各種ペーパーテストで人類と同等の成績を達成
- 人間の補助付きで競技プログラミングも可能に
  - [GPT-4は青色コーダーの夢を見るか](https://qiita.com/autotaker1984/items/2929937cd1fea6137d1f)

--- 

# 大規模言語モデルによってできるようになったこと
1. プログラミング言語間での「翻訳」
2. 自然言語↔︎プログラミング言語の「翻訳」
3. 自然言語によるプログラムの「修正」

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

```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

```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

```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. このコードの挙動を簡潔に説明して
```haskell
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](https://snippet-gpt-piacbsg5ja-an.a.run.app)

Q. [CSVデータを生成して](https://snippet-gpt-piacbsg5ja-an.a.run.app/?rev=68c39ce67cb66c9d8b84a6358ea5f34fcbc8b7213905f311053acfc9e557ec35)

Q. [CSVのデータを格納するTicketクラスを生成して](https://snippet-gpt-piacbsg5ja-an.a.run.app/?rev=8beb143a189379055af5dd25dfba619995e74c30c69adfc31c85624472329484)

Q. [CSVのデータをTicketクラスのリストに格納して](https://snippet-gpt-piacbsg5ja-an.a.run.app/?rev=c5c5bed9ab0d3e4773b6c74a6416f07faf1f64c8179e30a5058307bdfad05036)

---
# （まだ）大規模言語モデルではできないこと

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

---

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