golang.tokyo #41
- Goコミュニティの技術談義
- 今回はGMOベパポ主催
- イベントURL
LT1 Go Embedでwasm埋め込み
竹田さん
株式会社ラクス
- 今回のテーマは仕事関係ない話
go embed
- いろんなファイルを埋め込み可能にするパッケージ
- テキストファイル、バイナリファイルなど
- いろんなファイルを埋め込み可能にするパッケージ
ファイルにコメント
ファイルの埋め込みはコンパイル時に実行
wasmはどう埋め込むか?
- 他の同様にファイルの中にコメント
- []byteの変数として読み込む
goで作ったわけではないwasmでも呼び出せる
- goroutineで呼び出しもできる
wasm埋め込みのメリット
- Goバイナリで完結
- wasmランタイムも埋め込める
- ビルド時に埋め込めるので安全
- ライブラリとして意識せずに使える g* oの機能も使える
Q&A
- Q. ユースケースはどんなものがあるか? wasmにコンパイルできれば、goで任意のコードが呼び出せるか?
- A. cgoでなくwasmでインポートできるとか、任意のコードは呼び出せると思う
LT2 Goクイズ
jumpaku
クイズ5問
選択肢式
Q1 実行時エラーマップのキーがないとこ?
- A コンパイルエラー。mapに対する添字アクセスはアドレッサブルでない
Q2 実行時エラーnil pointer?
- A Xを出力。メソッド内tを参照しないためnil pointerは発生しない
Q3 実行時エラーnil pointer
- A 実行時エラー。値のデリファレンス時にエラー
Q4 X出力。
- A Xを出力tはアドレッサブル
Q5 X出力
- A コンパイルエラー。コンポジットリテラルはアドレッサブルでない
振る舞いに注意
- ポインタ、レシーバ
- アドレッサブルな値
- コンポジットリテラルは例外
LT3 自作LLM Native GORM Pluginで実現するAI Agentバックテスト基盤構築
LayerX pon
AI申請レビュー
- AI機能をめっちゃつくっている
AIAgentのバックテスト
- バックテスト:金融取引戦略やシステムが過去のデータを元にどの程度パフォーマンスを出すか評価するテスト
- 評価捗る
- 提案に使える
- 機能の効果をチェックできる
過去データsnowflakeに保存している
- snowflake:クラウドデータウェアハウス。TreasureDataとかと一緒
- プロシージャで取り出し
- 複数の手続きクエリをまとめたもの
課題:AI申請レビューはAPIに依存
- APIは最新データに依存
- snowflakeでの機能差し替えは難しい
- APIの参照先をsnowflakeに差し替え→クエリビルダーから影響してしまう
APIの実装を変更しないでやる→gorm pluginを使う
- 任意の処理を差し込める
- プラグインを作った
- LLMでSQLを書き換え
- パフォーマンスが必要でないからLLMを利用可能なケース
- バッチ処理
APIでgorm v1/v2が混在
- 移行用のパッケージ
- ゴールデンテストを作成
- →バックテストできた
gorm pluginが手段の選択肢にあると便利
LT4 KessokuのDIにおけるgoroutineスケジューリング
マズリーンさん
- SRE Dena
DIツールkessokuの話
GoのDI
- DIとは依存を外部から注入する設計パターン
- ツール・ライブラリで自動化可能
- google/wire
- 実行時オーバーヘッドがない
- コンパイルエラーでミスがわかる
- リポジトリアーカイブされてしまった
- google/wire
課題
- 開発体験が悪い
- 補完が効かない
- goroutineが使えない
- 開発体験が悪い
→ライブラリ作成 kessoku
wireとほぼ同じ/Buildタグ不要
asyncの設定→goroutineで非同期に
- →コールドスタートが高速化
goroutineのスケジューリング(本題)
- 最小限のgoroutineで非同期にしたい←大変
- DI→依存関係をグラフ化→トポロジカルソートで一列に並べる(wire)
- 要件
- 依存関係のないasyncは別goroutine
- 最小限のgoroutine
- 必須ではない
- asyncなしはwireと同じ
やったこと
- goroutineの数を導出
- 最大非同期数
- asyncは考慮しないゆるい制約
- グラフ理論最小パス
- 最大マッチング問題
- 最大非同期数
- 実行goroutineを決定
- asyncとasyncそれぞれ優先度で設定
- goroutineの数を導出
LT5 Goで時間を“操る”テスト, synctest
26新卒
LayerXでインターン
go1.25で追加されたtesting/synctestについて使ってみた
メリット
- goの並行処理は直感的にかける
デメリット
- 非決定的、time.sleepでCIが遅くなる
synctest
- バブルをつくって実行
- Test() 隔離環境で実行
- Wait() 現在のバブルのすべてのgoroutineがdurably blockedになるまで待機
- バブルをつくって実行
ユースケース
- IOの疑似検証
- Context timeout
- TTLキャッシュ
- 並行パイプライン
Goにおける生成AIによるコード生成のベンチマーク評価入門
どすこい
FY24卒
武田
- バックエンド開発のWebエンジニア GMOペパボ
AIコーディングの精度について
- Goはシンプルだから精度高い?→調べると低いらしい
- コードの生成の評価って何をしているのか?
- 精度評価は業務と同じといえるのか?
- (定性評価・試行錯誤も大事)
定量評価のデータセット
- HumanEval
- 人間が書いたコード
- Githubそのままではいけないケースを用意
- Python
- HumanEval-XL
- 複数言語の比較
- LLMで翻訳
- HumanEval
評価方法
- pass@k
- k=1 一発勝負
- k=100 100回施行、理論的助言
- k=5~10 施行した使い心地
- pass@k
データセットの入力
- json
- プロンプトなど
- 簡単な問題から、高難易度まで
- json
テストケースの例
- 残高管理問題
- 入力を入れていくときにマイナスになるか
- 範囲偶数問題
- 範囲の偶数を返す
- 残高管理問題
他の言語に比べGoが低い理由
- 正解の為のコードが長くなりやすい→失敗が多い?
- テストの性質
- テストケースは小規模アルゴリズムパズルで、APIなどGoが得意な分野がテストされてない
感想
- 自前でpluginやライブラリを作る選択肢を持ちたい
- 期限が差し迫ったタスクだと、見込みが立ちやすい選択肢取りがち
- AIのコード生成でGoの精度が高くないの以外だった