gpt-oss:20bでpromptfooのテストケースを試してみる

    この投稿をXにポストするこの投稿をFacebookにシェアするこのエントリーをはてなブックマークに追加

書き手・読み手のモチベーション

  • gpt-ossをちょっと使ってみたい
    • apache2.0なので、もしかしたら組み込みや自社利用もあるかも
  • もし使うとなった場合
    • APIに比べて、アラインメントはどんな感じでされているのか
    • せっかくなんで、CI的なテストも回していきたい、promptfooとか使ってみて

promptfoo

promptfooは、生成AIやLLMを評価・テストするためのオープンソースツール
ユーザーが用意したプロンプトや期待する出力をもとに、複数のモデルに対して同じ条件でテストを実施し、精度や一貫性を比較が可能
特に便利なのは、評価指標(例:正答率、類似度スコア)を設定できる点と、YAMLやJSONで簡単にテストケースを管理できる点。また、テスト結果をダッシュボードで可視化できるため、モデルの強み・弱みを一目で把握できる
開発者や企業が「どのモデルが業務要件に適しているか」を判断する際に役立ち、プロンプト設計やガードレール検証の効率化を支援するツールという位置づけの理解
ちなみに、gpt-oss:120bには下記のようなレポートも出されており、シンプルにこういうレポートが自社用の観点で出されたらわかりやすいなと感じる
https://promptfoo.dev/models/reports/gpt-oss-120b


gpt-oss

説明は不要かと思いますが、一応下記を参考

ポイントは - MoEを使用していること、実際に利用するVRAMを抑えられるかも - apache2.0で気軽に使える - (事前の有識者記事を見る限り、かつマシン次第だが)推論が結構早い様子

gpt-ossを動かす

PCはこちらを利用
https://rounda.co.jp/blog/homemade_pc_llm/
最初はvLLMで動かそうと思い、下記のHowToに従っていたのですが、確保するメモリの指定や設定にて妙にうまく行かない点があり、断念...

手っ取り早いollamaに切り替えて動かしました。

前情報通り、非常にスムーズに回答が出力されるなという印象です。


rounda@rounda-server1:~$ ollama run gpt-oss:20b
>>> こんにちは
Thinking...
User says "こんにちは" meaning "Hello" in Japanese. We should respond politely in Japanese, maybe ask how can we help, or something. It's a greeting. We can respond "こんにちは!どのようにお手伝いできますか?" That's a typical friendly greeting. Also mention that we can help with anything. We'll respond in Japanese.
...done thinking.
こんにちは!今日はどんなお手伝いが必要ですか?お気軽にどうぞ。
>>> あなたの知識はいつ時点まで最新化された情報をもとに構成されていますか?
Thinking...
The user asks in Japanese: "あなたの知識はいつ時点まで最新化された情報をもとに構成されていますか?" Means: "Up to what point is your knowledge updated?" They likely want to know the cutoff date of training. According to system: "knowledge cutoff: 2024-06". So answer in Japanese: 20246月まで。 Could elaborate that training 
includes up to that.
...done thinking.
私の知識は20246月時点までの情報をベースにしています。つまり、20246月以降に発表された出来事や最新研究、法律・規制の変更などは、私のデータベースには含まれていません。もしそれ以降の情報が必要な場合は、最新のニュースや公式発表を直接確認いただくと確実です。
>>> Send a message (/? for help)

promptfoo上で動かす

promptfooはDockerで動かしました
https://www.promptfoo.dev/docs/usage/self-hosting/
コマンドは少しだけ変えています。私の環境ではollamaをローカルで動かしていて、promptfooはDockerのコンテナ上からアクセスすることになるので --network=host --user rootを加えています。

docker run -d \
 --network=host --user root \
 --name promptfoo_container  \
 -p 3000:3000  \
 -v /home/rounda/project/promptfoo:/home/promptfoo/.promptfoo \
 ghcr.io/promptfoo/promptfoo:latest

あと事前準備としては1点。promptfooでモデルを呼び出しテストケースを回す際には、デフォルトで**様々な呼び出し方式(APIやコマンド、HTTPなど)**があります。
今回で行くと、ollamaへの直接呼び出しと、OpenAIのSDKベースがあり、今回は後者を選択しています(前者は試してないですが、現時点では対応されているかも含め不明確だったので)
具体的にはPython Providerなるものを呼び出して使いました。

https://www.promptfoo.dev/docs/providers/python/#example-1-openai-compatible-provider


※注意

パっと調べた感じ promptfooのDocker環境に`pip install`する方法がよくわらからず
(お決まりのPEP668で怒られ、それっぽいvenv環境でinstallしても解消せず)
`PIP_BREAK_SYSTEM_PACKAGES=1 pip install openai`のコマンドで無理やりinstallしています

localhost:3000でアクセス、Red Teamにアクセスし、デフォルトのテストケースで処理を回していきます。

設定した画面のスクショなどは割愛しますが、作成したYAMLやテストに利用するSampleのコードは載せておきます

※YAMLの記載例はこちらのzenn記事には記載をしています
https://zenn.dev/rounda_blog/articles/a03ee2f656c6cc


# yamlに記載下通り/home/promptfoo/custom_provider.pyに配置
import os
import json
from openai import OpenAI
def call_api(prompt, options, context):
    """Provider that calls OpenAI API."""
    # Initialize client
    client = OpenAI(
        base_url="http://localhost:11434/v1",  # Local Ollama API
        api_key="ollama"                       # Dummy key
    )
    # Parse messages if needed
    try:
        messages = json.loads(prompt)
    except:
        messages = [{"role": "user", "content": prompt}]
    # Make API call
    try:
        response = client.chat.completions.create(
            model="gpt-oss:20b",
            messages=messages
        )
        return {
            "output": response.choices[0].message.content,
            "tokenUsage": {
                "total": response.usage.total_tokens,
                "prompt": response.usage.prompt_tokens,
                "completion": response.usage.completion_tokens
            }
        }
    except Exception as e:
        return {
            "output": "",
            "error": str(e)
        }

promptfooでのテスト結果

上記載のyamlだとレコメンドとなっている、かつ一番ライトなコースで390ケースのテスト実施という形。体感時間にして30分くらいで終了
95.64% passing (373/390 cases)となっているが、テストケースが緩いのかなという印象。


あと、passしたケースでもI’m sorry, but I can’t help with that.という回答が多く、APIで提供されているモデルよりも、スパッと回答を閉じるようにチューニングされているのかなという印象を受けた。とはいえ、他に提供されているOSSのモデルと比べても、それなりに利用しやすいアラインメントがされているいんだろうなと感じる。
エラーケースも詳細に出ているケースもあれば、テストケース自体がそもそも少し的外れ的なものも含まれている印象。このあたりは自社用にチューニングをかけていくべき。
※以下は、ページに自動翻訳をかけたものです。実際のinputは英語です。


OSS版でもレポートが出て、それは便利


まとめ

gpt-ossに対してpromptdfooを試して触ってみました。印象としては20bでも扱えるケースはありそうで、なおかつユースケースに合わせたテストケースを作成し、運用していくことは今後増えるかもな〜という印象を受けました。しっかり扱えば精度が出るモデルが増えていく分、品質もしっかり担保していく仕組みづくりなども提供していければと思います。


宣伝

弊社ではデータ基盤策定からLLMまで、お客様にあったプロセスでの提案とご支援が可能です、お気軽にお問合せください。

また、中途採用やインターンの問い合わせもお待ちしています!

お問い合わせ・資料請求

プロジェクトに関するご質問や詳細な情報が必要な場合は、お気軽にお問い合わせください。

サービス紹介資料

当社のサービスや実績について詳しく解説した資料をご覧いただけます。

資料をダウンロード

無料相談・お問い合わせ

お持ちの課題について、広くお問い合わせを受け付けています。

問い合わせをする
    この投稿をXにポストするこの投稿をFacebookにシェアするこのエントリーをはてなブックマークに追加

関連記事

MCP活用ガイド︕Notion上の文字起こしをナレッジ/タスク要素に自動振り分けし、Backlogへ一気通貫で出力
MCP活用ガイド︕Notion上の文字起こしをナレッジ/タスク要素に自動振り分けし、Backlogへ一気通貫で出力
記事を読む
n8nを使って、モデル比較からHITLまで考える
n8nを使って、モデル比較からHITLまで考える
記事を読む
「生成AI ≠ これまでのAI」 としてプロジェクトを進めるためのマインド
「生成AI ≠ これまでのAI」 としてプロジェクトを進めるためのマインド
記事を読む