# generate a jsonl where each line is a sample import json import os import string REGISTRY_PATH = os.path.join(os.path.dirname(__file__), "../evals/registry") def format(template: str, **kwargs: dict[str, str]) -> str: """Format a template string with kwargs.""" keys = [k[1] for k in string.Formatter().parse(template) if k[1]] assert all(k in kwargs for k in keys), f"Required: {keys}, got: {sorted(kwargs)}" cur_keys = {k: kwargs[k] for k in keys} return template.format(**cur_keys) YAML = """ mg-{prompt_name}-{subject}: id: mg-{prompt_name}-{subject}.dev.v0 metrics: [accuracy] mg-{prompt_name}-{subject}.dev.v0: class: evals.elsuite.modelgraded.classify:ModelBasedClassify args: samples_jsonl: test_modelgraded/{prompt_name}_{subject}.jsonl eval_type: {eval_type} modelgraded_spec: {modelgraded_spec} """.strip() unlabeled_prompts = dict( humor=dict( modelgraded_spec="humor_jp", prompt="{subject}で数行の大喜利を書いて。敬語じゃなく関西弁で吉本のM1チャンピョンみたいに書いて。", eval_type="cot_classify_jp", ), ) subjects = dict( animals=["cat", "bird", "hamster"], fruits=["apple", "banana", "orange"], people=["Elon Musk", "Bill Gates", "Jeff Bezos"], people_jp=[ "イーロン・マスク", "ビル・ゲイツ", "ジェフ・ベゾス", "アルベルト・アインシュタイン", "ニコラ・テスラ", "レオナルド・ダ・ヴィンチ", "マハトマ・ガンジー", "ウィリアム・シェイクスピア", "スティーブ・ジョブズ", "ビル・ゲイツ", "マイケル・ジャクソン", "マダム・キュリー", "ジョン・F・ケネディ", "マーティン・ルーサー・キング・ジュニア", "ネルソン・マンデラ", "プラトン", "アリストテレス", "フィリップ・コッタウェイ", "ニール・アームストロング", "レオ・トルストイ", "マルコ・ポーロ", "ウィリアム・テル", "モーツァルト", "ベートーベン", "ショパン", "ダンテ・アリギエーリ", "フランツ・カフカ", "ガリレオ・ガリレイ", "アイザック・ニュートン", "チャールズ・ダーウィン", "フリードリヒ・ニーチェ", "シェイクスピア", "オスカー・ワイルド", "アーサー・コナン・ドイル", "アガサ・クリスティ", "J・K・ローリング", "トルーマン・カポーティ", "アルフレッド・ヒッチコック", "ウォルト・ディズニー", "アンディ・ウォーホル", "ピカソ", "ミケランジェロ", "レオナルド・フィボナッチ", "アルキメデス", "マルコム・X", "ジョージ・ワシントン", "エイブラハム・リンカーン", "フランクリン・D・ルーズベルト", "ワシントン・アーヴィング", "マーク・トウェイン", "フィリップ・K・ディック", "ジョージ・オーウェル", "トーマス・モア", "ハンス・クリスチャン・アンデルセン", "グリム兄弟", "アレクサンドル・デュマ", "ビクトル・ユーゴー", "エミール・ゾラ", "フランツ・シューベルト", "ゲオルク・フリードリヒ・ヘンデル", "ヨハン・セバスチャン・バッハ", "ルートヴィヒ・ヴァン・ベートーヴェン", "ヨハネス・ブラームス", "ロベルト・シューマン", "ヨハン・シュトラウス2世", "イーロン・マスク", "スティーブン・ホーキング", "リチャード・ファインマン", "アラン・チューリング", "ニール・デグラス・タイソン", "マイケル・ファラデー", "スティーブン・スピルバーグ", "クリストファー・ノーラン", "スタン・リー", "ジョージ・ルーカス", "ウィリアム・ゴールディング", "ジョージ・オーウェル", "エルンスト・ヘッケル", "ルイ・パスツール", "カール・セーガン", "アンリ・ベルクソン", "ミハイル・バクーニン", "ハンス・モルゲンソー", "アンドレ・マルロー", "シモーヌ・ド・ボーヴォワール", "ベルトルト・ブレヒト", "ジャン=ポール・サルトル", "フリードリヒ・ヘーゲル", "マックス・ウェーバー", "マルクス・アウレリウス", "レフ・トルストイ", "アントン・チェーホフ", "フョードル・ドストエフスキー", "トルストイ", "ウィリアム・フォークナー", "エルネスト・ヘミングウェイ", "アーサー・ミラー", "テネシー・ウィリアムズ", "サミュエル・ベケット", "ハロルド・ピンター", "フランツ・カフカ", "ジョージ・バーナード・ショー", "ウィリアム・ゴールディング", "ジャック・ケルアック", "エドガー・アラン・ポー", "ハーマン・メルヴィル", "ジョセフ・コンラッド", "アーサー・コナン・ドイル", "ジョン・スタインベック", "ジェームズ・ジョイス", "バージニア・ウルフ", "トマス・マン", "フランツ・カフカ", "ヘルマン・ヘッセ", "ゲオルク・ヴィルヘルム・フリードリヒ・ヘーゲル", "エマニュエル・カント", "ジャン=ジャック・ルソー", "ジョン・ロック", "トマス・ホッブズ", "ジョン・デューイ", "ジョン・スチュアート・ミル", "ニコロ・マキャヴェッリ", "モンテスキュー", "ルソー", "プラトン", "アリストテレス", "サー・アイザック・ニュートン", ], ) # remove duplicates subjects = {k: list(set(v)) for k, v in subjects.items()} unlabeled_target_sets = [ ("humor", "people_jp"), ] data_dir = f"{REGISTRY_PATH}/data/test_modelgraded" yaml_str = f"# This file is generated by {os.path.basename(__file__)}\n\n" evals = [] for prompt_name, subject in unlabeled_target_sets: prompt = unlabeled_prompts[prompt_name]["prompt"] samples = [{"input": format(prompt, subject=s)} for s in subjects[subject]] file_name = f"{data_dir}/{prompt_name}_{subject}.jsonl" # save samples jsonl with open(file_name, "wb") as f: for sample in samples: # f.write(json.dumps(sample) + "\n") json_data = json.dumps(sample, ensure_ascii=False) f.write(json_data.encode("utf-8")) f.write(b"\n") print(f"wrote {len(samples)} samples to {file_name}") yaml_str += ( YAML.format( prompt_name=prompt_name, subject=subject, modelgraded_spec=unlabeled_prompts[prompt_name]["modelgraded_spec"], eval_type=unlabeled_prompts[prompt_name]["eval_type"], ) + "\n\n" ) evals += [f"mg-{prompt_name}-{subject}: {file_name}"] yaml_file = f"{REGISTRY_PATH}/evals/test-modelgraded-generated.yaml" with open(yaml_file, "w") as f: f.write(yaml_str) print(f"wrote {yaml_file}") for e in evals: print(e)