Slide 1

Slide 1 text

The Go gopher was designed by Renée French. The gopher stickers was made by Takuya Ueda. Licensed under the Creative Commons 3.0 Attributions license. (続)生成 AIによる 静的解析ツールの自動生成 2024/10/24 tenntenn.go #7 - 静的解析ナイト

Slide 2

Slide 2 text

UEDA Takuya / tenntenn 上田拓 也 newmo株式会社 / ソフトウェアエンジニア 一般社団法人 Gophers Japan 代表理事 Google Developers Expert (GDE) / Go Category tenntenn Conference 主催・登壇者 2013年よりGo Conferenceの運営を行う。 
 2016年、メルカリグループに入社、Goコミュニティへの貢献や採用・社内教育などに従事。 
 2021年、一般社団法人Gophers Japan設立、代表理事に就任。Google Developers Expert (GDE)に選出。 
 2022年、株式会社ナレッジワーク入社。ソフトウェアエンジニアおよびGoエンジニアのイネーブルメントに従事。 
 2024年、newmo株式会社入社。ソフトウェアエンジニアとしてプロダクト開発に従事。 
 略歴

Slide 3

Slide 3 text

生成AIと静的解析ツール GPT-4にて生成 https://chat.openai.com/share/243a6106-d7c4-427e-a0e5-1300131bd134

Slide 4

Slide 4 text

生成AIを使ったコード生成の難点 正しい/最適なコードを生成するとは限らない コンパイラを通るけど 生成されたコードのコントロールが難しい 書式が想定されたものにならない

Slide 5

Slide 5 text

プロンプトエンジニアリング プロンプトエンジニアリング 生成AIとやり取りをするプロンプトを工夫するテクニックなど 工夫次第で生成されるコンテンツの質が大きく変わってくる Few-shot プロンプティング どんな回答を期待しているのか例示してモデルに伝える いくつかコードを例示すると期待したコードを生成しやすくなる https://chat.openai.com/share/7d66e624-ca24-44d8-adf2-d85b688ddce6

Slide 6

Slide 6 text

GoからOpenAIのAPIを呼び出す サードパーティ製のライブラリを利用 github.com/sashabaranov/go-openai APIキーを渡すことで簡単にAPIを呼び出せる client := openai.NewClient("API Key") resp, err := client.CreateChatCompletion(ctx, openai.ChatCompletionRequest{ Model: openai.GPT3Dot5Turbo, Messages: []openai.ChatCompletionMessage{{ Role: openai.ChatMessageRoleUser, Content: "Hello!", }}, }, ) if err != nil { /* 略 */ } fmt.Println(resp.Choices[0].Message.Content)

Slide 7

Slide 7 text

skeletonのしくみ txtar形式を使ったテンプレートを活用 fs.FS型としてテンプレートを埋め込む txtar形式にしてそこにデータを流し込む テンプレートを txtar形式に変更 テンプレートに データを埋め込み ディレクトリに 展開 x/tools/txtar: implement fs.FS #44158 Proposal Accepted 🎉

Slide 8

Slide 8 text

skeletonへの導入 未完成な状態でファイルを生成して生成 AIに埋めてもらう 結果に不満がある場合に修正もできるようにしたい テストを書いてもらったりしたい テンプレートを txtar形式に変更 テンプレートに データを埋め込み ディレクトリに 展開 ここ

Slide 9

Slide 9 text

ここから続き

Slide 10

Slide 10 text

テストデータを与えて生成する ■ analysistestでテストする前提のデータを渡す ● テストが通るようなコードを生成してもらう ● エッジケースも指定する package a import "log" // The tool can find function callings of log.Fatal. func f() { log.Fatal("error") // want "NG" fatal := log.Fatal fatal("error") // want "NG" println() // OK }

Slide 11

Slide 11 text

デモ

Slide 12

Slide 12 text

今後の展望 ■ GeminiとかGemmaを使ってみる ● GDEなので ● 無料で試してもらえるように ■ GenKit for Goを使ってみる ● 何者かもわかってないので調べるところから ■ 本格的にskeletonに取り込む ● 提供方法を考える