Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Zennへのスパム投稿が急増したのでLLMでなんとかした話

dyoshikawa
September 19, 2024
380

 Zennへのスパム投稿が急増したのでLLMでなんとかした話

dyoshikawa

September 19, 2024
Tweet

Transcript

  1. 自己紹介 フロントエンド: Next.js, React, Vue2など バックエンド: Ruby on Rails, Node.js+Express,

    PHP+Laravelなど インフラ: Google Cloud, AWS 資格: 応用情報技術者、AWS Specialty Securityなど
  2. リージョン Claude Sonnet: us-central1 (Iowa), asia-southeast1 (Singapore) Haiku: us-central1 (Iowa),

    europe-west4 (Netherlands) Geminiは東京リージョン(asia-northeast1)が使える
  3. JSON出力(Gemini) Gemini API を使用して JSON 出力を生成する | Google AI for

    Developers generation_config に {"response_mime_type": "application/json"} を指定することでJSON形式の出力になる
  4. JSON出力(Gemini) 構造はプロンプトで下記のように指示する PythonのType Hints風の記法 List 5 popQular cookie recipes. Using

    this JSON schema: Recipe = {"recipe_name": str} Return a `list[Recipe]` 実際、手元の検証ではJSON Schemaで指示するよりJSONパース エラーが少なかったので上記がベスプラっぽい response_schema にJSON Schemaを渡す方法もある こちらの方が精度良さそう
  5. JSON出力(Claude) 出力フォーマットの制御 (JSONモード) - Anthropic LLM(assistant)の出力の一文字目に { を指定する messages: [

    { role: "user", content: [ { type: "text", text: "猫についての俳句を書いてください。“first_line”、“second_line”、“third_line”をキーとするJSON形式を使用してください。" }, ], role: "assistant", content: [ { type: "text", text: "{" # JSONの一文字目を入力しておく }, ], } ],
  6. 回答精度 判定結果よりスコア付けすると、おおむね次の結果になった Gemini 1.5 Flash < Claude 3 Haiku =

    Claude 3 Sonnet = Claude 3.5 Sonnet < Gemini 1.5 Pro Gemini 1.5 Proでベースのプロンプトを作成したので、必ずしもフェ アではないかも LLMの定量的な評価は難しい 🤔 でも取れた結果を材料にするしかない
  7. Gemini独自の機能(補足) Claudeもキャッシュによる最適化機能を発表 Prompt caching with Claude \ Anthropic is now

    available on the Anthropic API. 上記のため、AWSのBedrockやGoogle Cloud Vertex AIではまだ使え ないと思われる 参考: https://github.com/boto/boto3/issues/4262
  8. Gemini vs Claudeのまとめ ※あくまでVertex AI上で動かす場合の比較 項目 結果 価格 ほぼ同等。Context CachingやBatch

    Predictionの存在を考えるとコストはGemini優位か リージョン Geminiは東京リージョンが使える JSON出力 両方できる。Gemini 1.5 Proはパラメータから厳密な指定が可能 SDK Gemini: Python, Node.js, Go, Dart, Android(Java, Kotlin), Swift Claude: Python, Node.js 回答精度 Gemini 1.5 Flash < Claudeの各モデル < Gemini 1.5 Pro(あくまで今回の検証において)
  9. RubyからGeminiを利用する Geminiを呼び出すコード credentials = Google::Auth.get_application_default access_token = credentials.fetch_access_token!["access_token"] uri =

    URI(API_URL) http = Net::HTTP.new(uri.host, uri.port) http.use_ssl = true request = Net::HTTP::Post.new(uri.request_uri) request["Authorization"] = "Bearer #{access_token}" request["Content-Type"] = "application/json" request.body = { contents: { role: "user", parts: [ { text: "こんにちは" } ], }, generation_config: { temperature: TEMPERATURE, max_output_tokens: MAX_TOKENS
  10. RubyからGeminiを利用する ちなみにClaudeだとこんなコード request["Authorization"] = "Bearer #{access_token}" request["Content-Type"] = "application/json" request.body

    = { anthropic_version: "vertex-2023-10-16", messages: [ { role: "user", content: [ { type: "text", text: "こんにちは" } ], } ], temperature: TEMPERATURE, max_tokens: MAX_TOKENS, stream: false }.to_json