Open1

LLMが生成するGoコードの質的評価 - HTTPサーバーの実装から

yebis0942yebis0942

大規模言語モデルによるコード生成の評価

単体コード生成の定番セット

  • 代表的な評価データセット
  • 代表的な評価指標
    • pass@1

この発表でやりたいこと

  • プログラミング言語に依存したタスク設定と評価指標
    • Goの典型的なタスクを用意する
    • Gopherから見て妥当・自然な実装になっているか検証する

やってみた

対象モデル

  • Google
    • Gemini 2.5 Flash
    • Gemini 2.5 Pro
  • Anthropic
    • Claude 4 Sonnet
    • Claude 4 Opus
  • OpenAI
    • GPT-5
  • Alibaba(中国勢 / オープンウェイト)
    • Qwen2.5 Coder 32B Instruct
  • Moonshot AI(中国勢 / オープンウェイト)
    • Kimi K2

プロンプト

Write a function in Go that returns an http.Handler. This http.Handler should have two endpoints: / should return "Hello, world!", and /health should return a JSON object {"status": "ok"}. The server should listen on port 8080. Include proper error handling when starting the server and logging indicating the port it's listening on in the code.

参考訳(Plamo翻訳による)

Go言語でhttp.Handlerを返す関数を作成してください。このhttp.Handlerには以下の2つのエンドポイントが必要です:
/ にアクセスすると "Hello, world!" という文字列を返す
/health にアクセスすると JSONオブジェクト {"status": "ok"} を返す
サーバーはポート8080で待機するようにしてください。サーバー起動時の適切なエラー処理と、コード内で待機中のポートをログに記録する機能を含めてください。

結果

https://github.com/yebis0942/kyotogo-2025-08-31-lt

--- PASS: TestServer/Human (0.00s)
    --- PASS: TestServer/Human/GET_/notfound (0.00s)
    --- PASS: TestServer/Human/GET_/ (0.00s)
    --- PASS: TestServer/Human/GET_/health (0.00s)
--- FAIL: TestServer/Gemini_2.5_Flash (0.00s)
    --- FAIL: TestServer/Gemini_2.5_Flash/GET_/notfound (0.00s)
    --- PASS: TestServer/Gemini_2.5_Flash/GET_/ (0.00s)
    --- PASS: TestServer/Gemini_2.5_Flash/GET_/health (0.00s)
--- PASS: TestServer/Gemini_2.5_Pro (0.00s)
    --- PASS: TestServer/Gemini_2.5_Pro/GET_/notfound (0.00s)
    --- PASS: TestServer/Gemini_2.5_Pro/GET_/ (0.00s)
    --- PASS: TestServer/Gemini_2.5_Pro/GET_/health (0.00s)
--- FAIL: TestServer/Claude_4_Sonnet (0.00s)
    --- FAIL: TestServer/Claude_4_Sonnet/GET_/notfound (0.00s)
    --- PASS: TestServer/Claude_4_Sonnet/GET_/ (0.00s)
    --- PASS: TestServer/Claude_4_Sonnet/GET_/health (0.00s)
--- PASS: TestServer/Claude_4_Opus (0.00s)
    --- PASS: TestServer/Claude_4_Opus/GET_/notfound (0.00s)
    --- PASS: TestServer/Claude_4_Opus/GET_/ (0.00s)
    --- PASS: TestServer/Claude_4_Opus/GET_/health (0.00s)
--- FAIL: TestServer/GPT-5 (0.00s)
    --- FAIL: TestServer/GPT-5/GET_/notfound (0.00s)
    --- FAIL: TestServer/GPT-5/GET_/ (0.00s)
    --- PASS: TestServer/GPT-5/GET_/health (0.00s)
--- PASS: TestServer/Qwen2.5_Coder_32B_Instruct (0.00s)
    --- PASS: TestServer/Qwen2.5_Coder_32B_Instruct/GET_/notfound (0.00s)
    --- PASS: TestServer/Qwen2.5_Coder_32B_Instruct/GET_/ (0.00s)
    --- PASS: TestServer/Qwen2.5_Coder_32B_Instruct/GET_/health (0.00s)
--- PASS: TestServer/Kimi-K2 (0.00s)
    --- PASS: TestServer/Kimi-K2/GET_/notfound (0.00s)
    --- PASS: TestServer/Kimi-K2/GET_/ (0.00s)
    --- PASS: TestServer/Kimi-K2/GET_/health (0.00s)

所感

  • だいたい動いているが…
    • //notfoundにマッチするという仕様の把握が抜けがち
    • HTTPメソッドを限定する仕様が落ちがち
  • 新しい仕様は把握できてない
  • 不要な処理が散見される
    • 片方のエンドポイントだけにw.WriteHeader(http.StatusOK)を差し込んでいるなど
  • 微妙に効率の悪い実装方針を取りがち
    • fmt.Fprintf()よりもio.WriteString()のほうが効率よい