kuratarimuロゴkuratarimu

#3

Embeddings APIで短文の「同じ答え」は判定できるのか

#技術#AI#調査

投稿者: かし

投稿日: 2026/03/14


こんにちは!かしです。

先日配信を開始した『超!答えを当てろ!心読みゲームAI』は、お題に対してみんなが回答し、その意味が近ければ高得点というゲームです。 そこで回答の意味の近さをAIが判定してくれるという仕組みが必要になり、いろいろ方法を模索しているなかで、Embeddings APIを試してみたので、その結果を記事にまとめます!

結論から書くと、今回の小規模検証では、Embeddings APIは「関連している回答」を拾うのはかなり得意でしたが、今回のゲームで必要だった「ターゲットの答えと同じ方向の意味か」を判定する用途では、安定しませんでした。

特に、話題は同じでも意味の向きが逆の回答や、同じカテゴリに属するけれどゲーム上は外したい回答を、うまく分けきれない場面がありました。 そのため、最終的な判定にはgpt-5-nanoを採用しました。

ただ、Embeddings APIを試したことで、取得できる「関連度としての近さ」と今作のゲームで欲しかった「同じ方向の意味か」はかなり違う、ということがはっきり分かったので、その過程を残しておこうと思います。

なお、今回比べているのは「モデルそのものの純粋な優劣」というより、今回のゲームで欲しい採点基準をどれだけ素直に実装できたかです。

Embeddings(埋め込み)モデルとは

Embeddings(埋め込み)モデルとは、テキストを数値ベクトルに変換するモデルで、文章や単語を、その意味を反映した数列として表現します。 生成AIのように文章を作るためのモデルではなく、テキストの意味を計算可能な形に変換します。

今回使用したモデルは、OpenAIの「text-embedding-3-small」と「text-embedding-3-large」です。

text-embedding-3-smallは軽量な埋め込みモデルで、デフォルトのベクトル次元数は1536、執筆時点の価格は1M tokensあたり$0.02です。

text-embedding-3-largeはより高次元のベクトルを生成するモデルで、デフォルトのベクトル次元数は3072、執筆時点の価格は1M tokensあたり$0.13となっています。

  • text-embedding-3-smallの出力例の一部
{
  "input": "こんにちは",
  "embedding": [
    0.019256591796875,
    -0.009674072265625,
    0.003337860107421875,
    0.032073974609375,
    ...
    -0.017059326171875,
    -0.0196685791015625
  ]
}

実際に使ってみる

ターゲットの回答と他プレイヤーの回答をそのまま埋め込みに変換し、コサイン類似度で近さを出す方法を試しました。

  • 使用したコード
const cosineSimilarity = (a: number[], b: number[]): number => {
  if (a.length !== b.length) {
    throw new Error("Embedding dimension mismatch")
  }

  let dot = 0
  let normA = 0
  let normB = 0

  for (let i = 0; i < a.length; i++) {
    const va = a[i]
    const vb = b[i]
    dot += va * vb
    normA += va * va
    normB += vb * vb
  }

  const denom = Math.sqrt(normA) * Math.sqrt(normB)
  if (denom === 0) return 0

  return dot / denom // -1〜1
}

やっていることは単純で、回答文をベクトルにして、その角度の近さを見ているだけです。 意味が近い文ほどスコアが高くなるはずなので、判定に使えそうに見えます。

検証方法

今回の検証では、10個のターゲットの回答に対して、それぞれ「正解」「惜しい」「不正解」と考える他プレイヤーの回答を1つずつ用意しました。

厳密なベンチマークではなく、ゲームで実際に困りそうなパターンを自分で集めた小規模な検証ですが、 今回知りたかったのは、感覚的に意味が近い順近い並びになるかだったので、これで試しています。

理想は「正解 > 惜しい > 不正解」の順に並ぶことです。

検証に使った10ケース

  1. ターゲットの回答:歯磨き / 正解:歯を磨く / 惜しい:口をゆすぐ / 不正解:靴磨き
  2. ターゲットの回答:洗濯 / 正解:洗濯をする / 惜しい:服を洗う / 不正解:お皿を洗う
  3. ターゲットの回答:カレーライス / 正解:カレーを食べる / 惜しい:スープカレーを食べる / 不正解:ハヤシライスを食べる
  4. ターゲットの回答:温泉に入る / 正解:温泉に浸かる / 惜しい:大浴場でお風呂に入る / 不正解:プールで泳ぐ
  5. ターゲットの回答:朝は白米を食べたい / 正解:朝ごはんはいつもご飯にしている / 惜しい:パンよりご飯の方が好き / 不正解:朝はパンしか食べない
  6. ターゲットの回答:犬を飼いたい / 正解:わんちゃんを飼いたい / 惜しい:ペットが欲しい / 不正解:観葉植物を増やしたい
  7. ターゲットの回答:ホラー映画が苦手 / 正解:怖い映画はあまり見たくない / 惜しい:グロい映画だけは無理 / 不正解:ホラー映画が大好き
  8. ターゲットの回答:海より山が好き / 正解:夏は海より山に行きたい / 惜しい:自然の中ならどこでも好き / 不正解:海で泳ぐのが一番好き
  9. ターゲットの回答:早起きは得意じゃない / 正解:朝起きるのが苦手 / 惜しい:いつも夜更かししている / 不正解:毎朝5時にスッキリ目が覚める
  10. ターゲットの回答:辛いものが好き / 正解:激辛ラーメンが好き / 惜しい:辛いのは少しなら食べられる / 不正解:辛いものはほとんど食べられない

試してみた結果

以下の例は、まず素の短文をtext-embedding-3-largeにそのまま入れて比較したときの結果です。 「targetAnswer」がターゲットの回答、「playerAnswer」が他プレイヤーの回答です。 「score」はその2つのコサイン類似度で、値が高いほど意味が近いと判定されたことを表しています。

例1:「歯磨き」

{
  "targetAnswer": "歯磨き",
  "results": [
    {
      "playerAnswer": "歯を磨く",
      "score": 0.7858019757028247
    },
    {
      "playerAnswer": "口をゆすぐ",
      "score": 0.49742195545244766
    },
    {
      "playerAnswer": "靴磨き",
      "score": 0.5205107130146102
    }
  ]
}

「歯磨き」と「歯を磨く」が高いのは期待通りです。 でも「口をゆすぐ」より「靴磨き」のほうが高く出ています。

人間の感覚だと、「歯磨き」に近いのは「口をゆすぐ」のほうだと思います。 ただ、埋め込みでは「磨き」という表現の近さに引っ張られたのか、「靴磨き」が高くなっています。

例2:「ホラー映画が苦手」

{
  "targetAnswer": "ホラー映画が苦手",
  "results": [
    {
      "playerAnswer": "怖い映画はあまり見たくない",
      "score": 0.7279540154719416
    },
    {
      "playerAnswer": "グロい映画だけは無理",
      "score": 0.6458544714495487
    },
    {
      "playerAnswer": "ホラー映画が大好き",
      "score": 0.7183203316369989
    }
  ]
}

これもかなり厳しいです。

「ホラー映画が苦手」と「怖い映画はあまり見たくない」はかなり近い答えです。 しかし「ホラー映画が大好き」も、ほぼ同じくらい高く出ています。

「同じ話題について話している」ことは拾えている一方で、 「好き」と「苦手」のような意味の向きまでは十分に分けられていません。

例3:「朝は白米を食べたい」

{
  "targetAnswer": "朝は白米を食べたい",
  "results": [
    {
      "playerAnswer": "朝ごはんはいつもご飯にしている",
      "score": 0.5939088137828767
    },
    {
      "playerAnswer": "パンよりご飯の方が好き",
      "score": 0.5325391683677608
    },
    {
      "playerAnswer": "朝はパンしか食べない",
      "score": 0.6271628703116867
    }
  ]
}

ここでは「朝は白米を食べたい」とは違う意味の「朝はパンしか食べない」が最も高くなってしまいました。

ここでも高く出ているのは「同じ朝食の話題に属している回答」であって、 「ターゲットと同じ方向の答え」ではありません。

今回ほしかったのは関連度ではなく、あくまで「どれくらい同じ答えと言ってよいか」だったので、 このズレはゲームの判定としてはかなり大きいです。

いろいろ試す

文章を長くしてみる

短い単語や短文だと情報が少なすぎるのかなと思いました。 そこで、文章を長くして意味をはっきり書けば、もう少しうまくいくのではないかと思い試してみたところ

{
  "targetAnswer": "私は白米が大好きです。ですが朝に白米を食べるのは好きではありません。だから朝はパンを食べます。",
  "results": [
    {
      "playerAnswer": "白い米が好きな私ですが、朝食はパンです。朝に白い米を食べるのは苦手なので。",
      "score": 0.9034094710444319
    },
    {
      "playerAnswer": "私はパンが大好きです。ですが朝にパンを食べるのは好きではありません。だから朝は白米を食べます。",
      "score": 0.9480389978339393
    },
    {
      "playerAnswer": "白米かパンだったら、パンが好きです。なので朝食もパンを食べます。",
      "score": 0.8360780292533864
    }
  ]
}

全て高くなりました。 (なお、ここでは元の10ケースとは別に、長文化したときにどう振る舞うかを見るための参考例を1つ試しています。)

長く書いて情報量を増やしたことで改善するというより、 「白米」「パン」「朝食」「好き」「食べる」といった共通の話題が増えて、全体的に近い文章として見られやすくなったのかもしれません。

やはり、埋め込みとコサイン類似度の組み合わせが得意なのは「同じ話題かどうか」「関連しているかどうか」を見ることであって、 「結論の向きまで一致しているか」を安定して見ることではないようです。

テンプレを固定して長文化してみる

次に試したのが、入力のフォーマットを統一する方法です。

短文のままだと、名詞だったり、動詞句だったり、好みの文だったりで表現の形がバラバラです。 それが比較に悪影響を出している可能性もあると思い、次のような共通テンプレをつけました。

これは人の考え・好み・行動・状態を表す短い表現です。内容:〇〇

たとえば「歯磨き」なら

{
  "targetAnswer": "これは人の考え・好み・行動・状態を表す短い表現です。内容: 歯磨き",
  "results": [
    {
      "playerAnswer": "これは人の考え・好み・行動・状態を表す短い表現です。内容: 歯を磨く",
      "score": 0.9048533799989358
    },
    {
      "playerAnswer": "これは人の考え・好み・行動・状態を表す短い表現です。内容: 口をゆすぐ",
      "score": 0.8347862185580316
    },
    {
      "playerAnswer": "これは人の考え・好み・行動・状態を表す短い表現です。内容: 靴磨き",
      "score": 0.8161878310824603
    }
  ]
}

素の短文よりはだいぶよく見えます。 少なくとも「口をゆすぐ」が「靴磨き」より上に来るようになりました。

ただ、長文にしたときと同じように、全体のスコアが高くなりました。 共通のテンプレが入ることで、どのテキストも全体として似た形になるので当たり前かもしれませんが。

期待通りにいかない例もそのままです

{
  "targetAnswer": "これは人の考え・好み・行動・状態を表す短い表現です。内容: ホラー映画が苦手",
  "results": [
    {
      "playerAnswer": "これは人の考え・好み・行動・状態を表す短い表現です。内容: 怖い映画はあまり見たくない",
      "score": 0.8905152532244994
    },
    {
      "playerAnswer": "これは人の考え・好み・行動・状態を表す短い表現です。内容: グロい映画だけは無理",
      "score": 0.8385668311832427
    },
    {
      "playerAnswer": "これは人の考え・好み・行動・状態を表す短い表現です。内容: ホラー映画が大好き",
      "score": 0.8627474221069046
    }
  ]
}

「ホラー映画が大好き」が依然として高いです。 比較条件をそろえることで多少見やすくはなったものの、根本の問題はまだ残っていました。

お題も一緒に入れてみる

どんなお題に対する答えなのかという文脈なしに、回答単体だけを比べるのがよくないのではと思い、回答だけでなく問題文も一緒に埋め込みに入れてみました。

{
  "targetAnswer": "出題文: 毎日やる身だしなみは?\n回答: 歯磨き",
  "results": [
    {
      "playerAnswer": "出題文: 毎日やる身だしなみは?\n回答: 歯を磨く",
      "score": 0.981703298854754
    },
    {
      "playerAnswer": "出題文: 毎日やる身だしなみは?\n回答: 口をゆすぐ",
      "score": 0.9075322244184577
    },
    {
      "playerAnswer": "出題文: 毎日やる身だしなみは?\n回答: 靴磨き",
      "score": 0.8316197645523895
    }
  ]
}

かなり良いです。少なくとも3候補のうち正解を選ぶという点ではかなり改善しました。

実際、手元で用意した10ケースでは、最もスコアが高い回答はすべて「正解」になりました。 ただし、それでも意味の向きが逆の回答を十分に低くできるわけではありませんでした。 「正解」を拾う性能は上がっても、「惜しい」と「不正解」の境界はまだ不安定です。

問題の「ホラー映画が苦手」

{
  "targetAnswer": "出題文: 映画館で避けたいジャンルは?\n回答: ホラー映画が苦手",
  "results": [
    {
      "playerAnswer": "出題文: 映画館で避けたいジャンルは?\n回答: 怖い映画はあまり見たくない",
      "score": 0.9139684470083951
    },
    {
      "playerAnswer": "出題文: 映画館で避けたいジャンルは?\n回答: グロい映画だけは無理",
      "score": 0.8760314061796762
    },
    {
      "playerAnswer": "出題文: 映画館で避けたいジャンルは?\n回答: ホラー映画が大好き",
      "score": 0.9062903355359324
    }
  ]
}

やはり「ホラー映画が大好き」がかなり高い。

問題文を入れることでだいぶ良くなりましたが、ターゲットの答えと本当に同じ方向の意味かを分けるところまでは、まだ安定しません。

Embeddings APIは候補検索や近い回答を集める用途にはかなり向いていそうだけど、少なくとも、今回のように短文や「問題文+回答」をそのまま埋め込み、コサイン類似度だけで最終判定まで行う方法は、今作の用途では厳しそうでした。

ここまで試して分かったこと

ここまで試して分かったのは、今回のように短文や「問題文+回答」をそのまま埋め込み、コサイン類似度で比べる方法は、「同じ話題にどれだけ近いか」を見るのにはかなり強い、ということでした。

まず、表現が似ているものにはかなり引っ張られます。 「歯磨き」と「靴磨き」のように、人間から見れば違う行動でも、単語の形や表現が近いと高く出やすいです。

次に、同じ話題に属している回答も高くなりやすいです。 「ホラー映画が苦手」と「ホラー映画が大好き」のように、意味の向きが逆でも、話題が同じだと近く見えてしまいます。

そして、問題文まで含めると、今度は「同じお題に関係している回答」が全体的に高くなります。 トップ候補を拾うには強いのですが、惜しいと不正解の分離はまだ甘い、という感じでした。

一方で、今作のゲームで必要だったのは、

  • 関連しているか
  • ターゲットの答えと同じ方向の意味か
  • どのくらい同じ答えと言ってよいか

を分けることでした。

この差が、今回のユースケースではかなり大きかったです。

Embeddings APIが悪いわけではない

ここは誤解しないように書いておきたいところです。

今回の結果は、Embeddings APIがダメだったという話ではありません。 むしろ、近い回答を探したり、回答をまとめたりする用途にはかなり使えそうだと感じました。

たとえば、

  • 似た回答をクラスタリングする
  • 近い候補を数件拾う
  • 明らかに遠い回答を落とす

といった前処理には十分使えそうです。

ただ、今作のゲームでやりたかったのは、「この回答はターゲットの答えとどのくらい同じ意味か」を人間の感覚に近い形で評価することでした。 その用途には、埋め込みの類似度だけでは少し足りませんでした。

最終的にgpt-5-nanoを採用した

そこで最終的には、gpt-5-nanoに0〜4の段階で評価させる方式を採用しました。

ざっくり言うと、

  • 4: ほぼ同じ意味
  • 3: かなり近い
  • 2: 同じ方向ではあるが外れ
  • 1: 少しだけ関係がある
  • 0: ほぼ関係ない

というルールをsystem promptに書き、問題文、ターゲットの回答、他プレイヤーの回答をまとめて渡しています。

たとえば、さきほどの「歯磨き」はこうなります。

{
  "targetAnswer": "歯磨き",
  "results": [
    {
      "playerAnswer": "歯を磨く",
      "level": 4
    },
    {
      "playerAnswer": "口をゆすぐ",
      "level": 2
    },
    {
      "playerAnswer": "靴磨き",
      "level": 0
    }
  ]
}

かなり人間の感覚に近いです。

問題の「ホラー映画が苦手」もこうなりました。

{
  "targetAnswer": "ホラー映画が苦手",
  "results": [
    {
      "playerAnswer": "怖い映画はあまり見たくない",
      "level": 4
    },
    {
      "playerAnswer": "グロい映画だけは無理",
      "level": 3
    },
    {
      "playerAnswer": "ホラー映画が大好き",
      "level": 1
    }
  ]
}

こちらも、少なくとも今回欲しかったゲームの判定にはかなり近いです。

ここで大きかったのは、単にテキストの近さを測るのではなく、 「この問題に対して、ターゲットの答えとどのくらい同じ意味と言えるか」というルールを与えたうえで判定させたことだと思っています。

もちろん、gpt-5-nanoにすればすべて自動で完璧になるわけではありません。 0〜4のどこに線を引くかはゲーム設計にも依存するので、実際にはsystem promptの書き方や評価基準の調整はかなり重要でした。

Embeddings APIでは「関連度の近さ」は取れても、 LLM判定では「ゲームとして気持ちいい採点基準」を作る必要がある、という別の難しさがあります。 それでも今回は、最終判定としてはこちらのほうが人間の感覚に近かったです。

速度やコスト面ではEmbeddings APIのほうが有利

もちろん、gpt-5-nanoにすると良いことばかりではありません。 速度とコストでは、今回試した範囲ではEmbeddings APIのほうがかなり有利でした。

手元の記録では、同系統の処理をそれぞれ試したときのレスポンス時間はだいたい次のような感じでした。 いずれも今回の検証コードを手元で動かしたときの参考値で、入力長やネットワーク状況によって変動します。

Embeddings API:

  • 約348ms〜1045ms
  • 平均すると約591ms

gpt-5-nano:

  • 約4676ms〜15710ms
  • 平均すると約9932ms

ざっくり17倍くらい差があります。 この差はかなり大きいです。

コスト面についても、執筆時点ではtext-embedding-3-smallは1M tokensあたり$0.02、text-embedding-3-largeは$0.13です。 一方でgpt-5-nanoはinputが1M tokensあたり$0.05、outputが$0.40なので、今回のようにsystem promptと出力を伴う最終判定では、LLM側のほうがコストは重くなります。

なので、用途によっては

  • まずEmbeddings APIで近い候補を絞る
  • 最終判定だけgpt-5-nanoに任せる

という二段構えも十分ありだと思います。

今回は実装をシンプルにしたかったことと、ゲーム体験として判定の気持ちよさを優先したかったことから、最終的にはgpt-5-nanoのみを採用しました。

まとめ

今回の検証では、Embeddings APIに短文や問題文をそのまま入れてコサイン類似度で比べる方法は、

  • 表現が近いもの
  • 同じ話題に属するもの
  • 同じ問題に対する関連回答

を拾うのはかなり得意でした。

特に、問題文まで含めるとトップ1候補を拾う精度は大きく改善し、 「近い候補を集める」「明らかに遠い回答を落とす」といった用途には十分使えそうでした。

一方で、

  • 意味の向きが逆の回答
  • 同じカテゴリに属するがゲーム上は外したい回答
  • 惜しいと不正解の細かい分離

までは、この方法だけでは安定しませんでした。

今回の検証で分かったのは、 Embeddings APIが弱いというより、 今回の方法で取れる「関連度としての近さ」と、 このゲームで必要だった「同じ答えと言ってよいか」は、 かなり別物だったということです。

そのため、今作のゲームでは最終的にgpt-5-nanoによる評価を採用しました。 ただ、Embeddings APIを試したことで、 「候補検索には強いが、最終判定には別の仕組みが必要かもしれない」 という判断ができたのは大きな収穫でした。

今回検証した全データ

text-embedding-3-small
{
  "targetAnswer": "歯磨き",
  "results": [
    {
      "playerAnswer": "歯を磨く",
      "score": 0.8744282087375574
    },
    {
      "playerAnswer": "口をゆすぐ",
      "score": 0.27269482446835447
    },
    {
      "playerAnswer": "靴磨き",
      "score": 0.692357340077765
    }
  ]
}

{
  "targetAnswer": "洗濯",
  "results": [
    {
      "playerAnswer": "洗濯をする",
      "score": 0.8787886780503076
    },
    {
      "playerAnswer": "服を洗う",
      "score": 0.6242099236189093
    },
    {
      "playerAnswer": "お皿を洗う",
      "score": 0.5342068693951665
    }
  ]
}

{
  "targetAnswer": "カレーライス",
  "results": [
    {
      "playerAnswer": "カレーを食べる",
      "score": 0.5741616383487594
    },
    {
      "playerAnswer": "スープカレーを食べる",
      "score": 0.5383024620551943
    },
    {
      "playerAnswer": "ハヤシライスを食べる",
      "score": 0.43511237049722484
    }
  ]
}

{
  "targetAnswer": "温泉に入る",
  "results": [
    {
      "playerAnswer": "温泉に浸かる",
      "score": 0.891538578448749
    },
    {
      "playerAnswer": "大浴場でお風呂に入る",
      "score": 0.642548281748832
    },
    {
      "playerAnswer": "プールで泳ぐ",
      "score": 0.5014175475119111
    }
  ]
}

{
  "targetAnswer": "朝は白米を食べたい",
  "results": [
    {
      "playerAnswer": "朝ごはんはいつもご飯にしている",
      "score": 0.49275049741390026
    },
    {
      "playerAnswer": "パンよりご飯の方が好き",
      "score": 0.48545780234686
    },
    {
      "playerAnswer": "朝はパンしか食べない",
      "score": 0.6309836806772371
    }
  ]
}

{
  "targetAnswer": "犬を飼いたい",
  "results": [
    {
      "playerAnswer": "わんちゃんを飼いたい",
      "score": 0.676326809069244
    },
    {
      "playerAnswer": "ペットが欲しい",
      "score": 0.6713568603886082
    },
    {
      "playerAnswer": "観葉植物を増やしたい",
      "score": 0.35814859520482745
    }
  ]
}

{
  "targetAnswer": "ホラー映画が苦手",
  "results": [
    {
      "playerAnswer": "怖い映画はあまり見たくない",
      "score": 0.6658283201680274
    },
    {
      "playerAnswer": "グロい映画だけは無理",
      "score": 0.5737192530900216
    },
    {
      "playerAnswer": "ホラー映画が大好き",
      "score": 0.7753292435505422
    }
  ]
}

{
  "targetAnswer": "海より山が好き",
  "results": [
    {
      "playerAnswer": "夏は海より山に行きたい",
      "score": 0.6892929951507957
    },
    {
      "playerAnswer": "自然の中ならどこでも好き",
      "score": 0.4676891492938407
    },
    {
      "playerAnswer": "海で泳ぐのが一番好き",
      "score": 0.6225576360535596
    }
  ]
}

{
  "targetAnswer": "早起きは得意じゃない",
  "results": [
    {
      "playerAnswer": "朝起きるのが苦手",
      "score": 0.6416431924613103
    },
    {
      "playerAnswer": "いつも夜更かししている",
      "score": 0.3023021206437179
    },
    {
      "playerAnswer": "毎朝5時にスッキリ目が覚める",
      "score": 0.3636874036567177
    }
  ]
}

{
  "targetAnswer": "辛いものが好き",
  "results": [
    {
      "playerAnswer": "激辛ラーメンが好き",
      "score": 0.6385528975707788
    },
    {
      "playerAnswer": "辛いのは少しなら食べられる",
      "score": 0.6164311757995364
    },
    {
      "playerAnswer": "辛いものはほとんど食べられない",
      "score": 0.6365837345774211
    }
  ]
}
text-embedding-3-large
{
  "targetAnswer": "歯磨き",
  "results": [
    {
      "playerAnswer": "歯を磨く",
      "score": 0.7858019757028247
    },
    {
      "playerAnswer": "口をゆすぐ",
      "score": 0.49742195545244766
    },
    {
      "playerAnswer": "靴磨き",
      "score": 0.5205107130146102
    }
  ]
}

{
  "targetAnswer": "洗濯",
  "results": [
    {
      "playerAnswer": "洗濯をする",
      "score": 0.8196348704978467
    },
    {
      "playerAnswer": "服を洗う",
      "score": 0.7007991625023957
    },
    {
      "playerAnswer": "お皿を洗う",
      "score": 0.5575125906897939
    }
  ]
}

{
  "targetAnswer": "カレーライス",
  "results": [
    {
      "playerAnswer": "カレーを食べる",
      "score": 0.6343729790900556
    },
    {
      "playerAnswer": "スープカレーを食べる",
      "score": 0.5215610749562717
    },
    {
      "playerAnswer": "ハヤシライスを食べる",
      "score": 0.5124442489103223
    }
  ]
}

{
  "targetAnswer": "温泉に入る",
  "results": [
    {
      "playerAnswer": "温泉に浸かる",
      "score": 0.8803266294204958
    },
    {
      "playerAnswer": "大浴場でお風呂に入る",
      "score": 0.7328133466443659
    },
    {
      "playerAnswer": "プールで泳ぐ",
      "score": 0.5109087300087263
    }
  ]
}

{
  "targetAnswer": "朝は白米を食べたい",
  "results": [
    {
      "playerAnswer": "朝ごはんはいつもご飯にしている",
      "score": 0.5939088137828767
    },
    {
      "playerAnswer": "パンよりご飯の方が好き",
      "score": 0.5325391683677608
    },
    {
      "playerAnswer": "朝はパンしか食べない",
      "score": 0.6271628703116867
    }
  ]
}

{
  "targetAnswer": "犬を飼いたい",
  "results": [
    {
      "playerAnswer": "わんちゃんを飼いたい",
      "score": 0.8505383114214666
    },
    {
      "playerAnswer": "ペットが欲しい",
      "score": 0.7757609984889507
    },
    {
      "playerAnswer": "観葉植物を増やしたい",
      "score": 0.4167989044503456
    }
  ]
}

{
  "targetAnswer": "ホラー映画が苦手",
  "results": [
    {
      "playerAnswer": "怖い映画はあまり見たくない",
      "score": 0.7279540154719416
    },
    {
      "playerAnswer": "グロい映画だけは無理",
      "score": 0.6458544714495487
    },
    {
      "playerAnswer": "ホラー映画が大好き",
      "score": 0.7183203316369989
    }
  ]
}

{
  "targetAnswer": "海より山が好き",
  "results": [
    {
      "playerAnswer": "夏は海より山に行きたい",
      "score": 0.7234679163717804
    },
    {
      "playerAnswer": "自然の中ならどこでも好き",
      "score": 0.5505083014623681
    },
    {
      "playerAnswer": "海で泳ぐのが一番好き",
      "score": 0.6201954823979338
    }
  ]
}

{
  "targetAnswer": "早起きは得意じゃない",
  "results": [
    {
      "playerAnswer": "朝起きるのが苦手",
      "score": 0.7414678591899143
    },
    {
      "playerAnswer": "いつも夜更かししている",
      "score": 0.5096379091320417
    },
    {
      "playerAnswer": "毎朝5時にスッキリ目が覚める",
      "score": 0.5092075552699026
    }
  ]
}

{
  "targetAnswer": "辛いものが好き",
  "results": [
    {
      "playerAnswer": "激辛ラーメンが好き",
      "score": 0.5892135759360032
    },
    {
      "playerAnswer": "辛いのは少しなら食べられる",
      "score": 0.6395005256064619
    },
    {
      "playerAnswer": "辛いものはほとんど食べられない",
      "score": 0.6542874272067919
    }
  ]
}

{
  "targetAnswer": "私は白米が大好きです。ですが朝に白米を食べるのは好きではありません。だから朝はパンを食べます。",
  "results": [
    {
      "playerAnswer": "白い米が好きな私ですが、朝食はパンです。朝に白い米を食べるのは苦手なので。",
      "score": 0.9034094710444319
    },
    {
      "playerAnswer": "私はパンが大好きです。ですが朝にパンを食べるのは好きではありません。だから朝は白米を食べます。",
      "score": 0.9480389978339393
    },
    {
      "playerAnswer": "白米かパンだったら、パンが好きです。なので朝食もパンを食べます。",
      "score": 0.8360780292533864
    }
  ]
}

{
  "targetAnswer": "これは人の考え・好み・行動・状態を表す短い表現です。内容: 歯磨き",
  "results": [
    {
      "playerAnswer": "これは人の考え・好み・行動・状態を表す短い表現です。内容: 歯を磨く",
      "score": 0.9048533799989358
    },
    {
      "playerAnswer": "これは人の考え・好み・行動・状態を表す短い表現です。内容: 口をゆすぐ",
      "score": 0.8347862185580316
    },
    {
      "playerAnswer": "これは人の考え・好み・行動・状態を表す短い表現です。内容: 靴磨き",
      "score": 0.8161878310824603
    }
  ]
}

{
  "targetAnswer": "これは人の考え・好み・行動・状態を表す短い表現です。内容: 洗濯",
  "results": [
    {
      "playerAnswer": "これは人の考え・好み・行動・状態を表す短い表現です。内容: 洗濯をする",
      "score": 0.9323529647813656
    },
    {
      "playerAnswer": "これは人の考え・好み・行動・状態を表す短い表現です。内容: 服を洗う",
      "score": 0.9431129370206771
    },
    {
      "playerAnswer": "これは人の考え・好み・行動・状態を表す短い表現です。内容: お皿を洗う",
      "score": 0.8523429752037505
    }
  ]
}

{
  "targetAnswer": "これは人の考え・好み・行動・状態を表す短い表現です。内容: カレーライス",
  "results": [
    {
      "playerAnswer": "これは人の考え・好み・行動・状態を表す短い表現です。内容: カレーを食べる",
      "score": 0.8564150149979789
    },
    {
      "playerAnswer": "これは人の考え・好み・行動・状態を表す短い表現です。内容: スープカレーを食べる",
      "score": 0.8311569772864047
    },
    {
      "playerAnswer": "これは人の考え・好み・行動・状態を表す短い表現です。内容: ハヤシライスを食べる",
      "score": 0.8082001812666307
    }
  ]
}

{
  "targetAnswer": "これは人の考え・好み・行動・状態を表す短い表現です。内容: 温泉に入る",
  "results": [
    {
      "playerAnswer": "これは人の考え・好み・行動・状態を表す短い表現です。内容: 温泉に浸かる",
      "score": 0.9719392992256416
    },
    {
      "playerAnswer": "これは人の考え・好み・行動・状態を表す短い表現です。内容: 大浴場でお風呂に入る",
      "score": 0.9188110588972433
    },
    {
      "playerAnswer": "これは人の考え・好み・行動・状態を表す短い表現です。内容: プールで泳ぐ",
      "score": 0.8047966603852698
    }
  ]
}

{
  "targetAnswer": "これは人の考え・好み・行動・状態を表す短い表現です。内容: 朝は白米を食べたい",
  "results": [
    {
      "playerAnswer": "これは人の考え・好み・行動・状態を表す短い表現です。内容: 朝ごはんはいつもご飯にしている",
      "score": 0.8513976462635766
    },
    {
      "playerAnswer": "これは人の考え・好み・行動・状態を表す短い表現です。内容: パンよりご飯の方が好き",
      "score": 0.7689990888024837
    },
    {
      "playerAnswer": "これは人の考え・好み・行動・状態を表す短い表現です。内容: 朝はパンしか食べない",
      "score": 0.837677732350338
    }
  ]
}

{
  "targetAnswer": "これは人の考え・好み・行動・状態を表す短い表現です。内容: 犬を飼いたい",
  "results": [
    {
      "playerAnswer": "これは人の考え・好み・行動・状態を表す短い表現です。内容: わんちゃんを飼いたい",
      "score": 0.9613315341569678
    },
    {
      "playerAnswer": "これは人の考え・好み・行動・状態を表す短い表現です。内容: ペットが欲しい",
      "score": 0.9169887331893528
    },
    {
      "playerAnswer": "これは人の考え・好み・行動・状態を表す短い表現です。内容: 観葉植物を増やしたい",
      "score": 0.7123040648000649
    }
  ]
}

{
  "targetAnswer": "これは人の考え・好み・行動・状態を表す短い表現です。内容: ホラー映画が苦手",
  "results": [
    {
      "playerAnswer": "これは人の考え・好み・行動・状態を表す短い表現です。内容: 怖い映画はあまり見たくない",
      "score": 0.8905152532244994
    },
    {
      "playerAnswer": "これは人の考え・好み・行動・状態を表す短い表現です。内容: グロい映画だけは無理",
      "score": 0.8385668311832427
    },
    {
      "playerAnswer": "これは人の考え・好み・行動・状態を表す短い表現です。内容: ホラー映画が大好き",
      "score": 0.8627474221069046
    }
  ]
}

{
  "targetAnswer": "これは人の考え・好み・行動・状態を表す短い表現です。内容: 海より山が好き",
  "results": [
    {
      "playerAnswer": "これは人の考え・好み・行動・状態を表す短い表現です。内容: 夏は海より山に行きたい",
      "score": 0.8232030239917015
    },
    {
      "playerAnswer": "これは人の考え・好み・行動・状態を表す短い表現です。内容: 自然の中ならどこでも好き",
      "score": 0.7419592179870176
    },
    {
      "playerAnswer": "これは人の考え・好み・行動・状態を表す短い表現です。内容: 海で泳ぐのが一番好き",
      "score": 0.7777197805515886
    }
  ]
}

{
  "targetAnswer": "これは人の考え・好み・行動・状態を表す短い表現です。内容: 早起きは得意じゃない",
  "results": [
    {
      "playerAnswer": "これは人の考え・好み・行動・状態を表す短い表現です。内容: 朝起きるのが苦手",
      "score": 0.8886322620265178
    },
    {
      "playerAnswer": "これは人の考え・好み・行動・状態を表す短い表現です。内容: いつも夜更かししている",
      "score": 0.7869079866460585
    },
    {
      "playerAnswer": "これは人の考え・好み・行動・状態を表す短い表現です。内容: 毎朝5時にスッキリ目が覚める",
      "score": 0.7261436319080592
    }
  ]
}

{
  "targetAnswer": "これは人の考え・好み・行動・状態を表す短い表現です。内容: 辛いものが好き",
  "results": [
    {
      "playerAnswer": "これは人の考え・好み・行動・状態を表す短い表現です。内容: 激辛ラーメンが好き",
      "score": 0.884336919179131
    },
    {
      "playerAnswer": "これは人の考え・好み・行動・状態を表す短い表現です。内容: 辛いのは少しなら食べられる",
      "score": 0.8439575615738872
    },
    {
      "playerAnswer": "これは人の考え・好み・行動・状態を表す短い表現です。内容: 辛いものはほとんど食べられない",
      "score": 0.8170673561663078
    }
  ]
}

{
  "targetAnswer": "出題文: 毎日やる身だしなみは?\n回答: 歯磨き",
  "results": [
    {
      "playerAnswer": "出題文: 毎日やる身だしなみは?\n回答: 歯を磨く",
      "score": 0.981703298854754
    },
    {
      "playerAnswer": "出題文: 毎日やる身だしなみは?\n回答: 口をゆすぐ",
      "score": 0.9075322244184577
    },
    {
      "playerAnswer": "出題文: 毎日やる身だしなみは?\n回答: 靴磨き",
      "score": 0.8316197645523895
    }
  ]
}

{
  "targetAnswer": "出題文: 家事の中でよくやることは?\n回答: 洗濯",
  "results": [
    {
      "playerAnswer": "出題文: 家事の中でよくやることは?\n回答: 洗濯をする",
      "score": 0.9852364051616238
    },
    {
      "playerAnswer": "出題文: 家事の中でよくやることは?\n回答: 服を洗う",
      "score": 0.9715993928105566
    },
    {
      "playerAnswer": "出題文: 家事の中でよくやることは?\n回答: お皿を洗う",
      "score": 0.8909952268659705
    }
  ]
}

{
  "targetAnswer": "出題文: 疲れた日に食べたいものは?\n回答: カレーライス",
  "results": [
    {
      "playerAnswer": "出題文: 疲れた日に食べたいものは?\n回答: カレーを食べる",
      "score": 0.9450244508882659
    },
    {
      "playerAnswer": "出題文: 疲れた日に食べたいものは?\n回答: スープカレーを食べる",
      "score": 0.9101873057342676
    },
    {
      "playerAnswer": "出題文: 疲れた日に食べたいものは?\n回答: ハヤシライスを食べる",
      "score": 0.8764334502991629
    }
  ]
}

{
  "targetAnswer": "出題文: 旅行先でやりたいことは?\n回答: 温泉に入る",
  "results": [
    {
      "playerAnswer": "出題文: 旅行先でやりたいことは?\n回答: 温泉に浸かる",
      "score": 0.9876624406040568
    },
    {
      "playerAnswer": "出題文: 旅行先でやりたいことは?\n回答: 大浴場でお風呂に入る",
      "score": 0.9543620855820929
    },
    {
      "playerAnswer": "出題文: 旅行先でやりたいことは?\n回答: プールで泳ぐ",
      "score": 0.8629789926967388
    }
  ]
}

{
  "targetAnswer": "出題文: 朝ごはんは何を食べたい?\n回答: 朝は白米を食べたい",
  "results": [
    {
      "playerAnswer": "出題文: 朝ごはんは何を食べたい?\n回答: 朝ごはんはいつもご飯にしている",
      "score": 0.8914826856081596
    },
    {
      "playerAnswer": "出題文: 朝ごはんは何を食べたい?\n回答: パンよりご飯の方が好き",
      "score": 0.8556479885902473
    },
    {
      "playerAnswer": "出題文: 朝ごはんは何を食べたい?\n回答: 朝はパンしか食べない",
      "score": 0.8602626113574825
    }
  ]
}

{
  "targetAnswer": "出題文: 今いちばん欲しいものは?\n回答: 犬を飼いたい",
  "results": [
    {
      "playerAnswer": "出題文: 今いちばん欲しいものは?\n回答: わんちゃんを飼いたい",
      "score": 0.9754859965937572
    },
    {
      "playerAnswer": "出題文: 今いちばん欲しいものは?\n回答: ペットが欲しい",
      "score": 0.9458655280503104
    },
    {
      "playerAnswer": "出題文: 今いちばん欲しいものは?\n回答: 観葉植物を増やしたい",
      "score": 0.6991285255192712
    }
  ]
}

{
  "targetAnswer": "出題文: 映画館で避けたいジャンルは?\n回答: ホラー映画が苦手",
  "results": [
    {
      "playerAnswer": "出題文: 映画館で避けたいジャンルは?\n回答: 怖い映画はあまり見たくない",
      "score": 0.9139684470083951
    },
    {
      "playerAnswer": "出題文: 映画館で避けたいジャンルは?\n回答: グロい映画だけは無理",
      "score": 0.8760314061796762
    },
    {
      "playerAnswer": "出題文: 映画館で避けたいジャンルは?\n回答: ホラー映画が大好き",
      "score": 0.9062903355359324
    }
  ]
}

{
  "targetAnswer": "出題文: 自然のレジャーならどっち派?\n回答: 海より山が好き",
  "results": [
    {
      "playerAnswer": "出題文: 自然のレジャーならどっち派?\n回答: 夏は海より山に行きたい",
      "score": 0.9194795223394829
    },
    {
      "playerAnswer": "出題文: 自然のレジャーならどっち派?\n回答: 自然の中ならどこでも好き",
      "score": 0.8520990873276055
    },
    {
      "playerAnswer": "出題文: 自然のレジャーならどっち派?\n回答: 海で泳ぐのが一番好き",
      "score": 0.8719003244595585
    }
  ]
}

{
  "targetAnswer": "出題文: 自分の苦手なことは?\n回答: 早起きは得意じゃない",
  "results": [
    {
      "playerAnswer": "出題文: 自分の苦手なことは?\n回答: 朝起きるのが苦手",
      "score": 0.9132687653261166
    },
    {
      "playerAnswer": "出題文: 自分の苦手なことは?\n回答: いつも夜更かししている",
      "score": 0.8133773093950624
    },
    {
      "playerAnswer": "出題文: 自分の苦手なことは?\n回答: 毎朝5時にスッキリ目が覚める",
      "score": 0.8453465493843169
    }
  ]
}

{
  "targetAnswer": "出題文: 外食でつい選びがちな味は?\n回答: 辛いものが好き",
  "results": [
    {
      "playerAnswer": "出題文: 外食でつい選びがちな味は?\n回答: 激辛ラーメンが好き",
      "score": 0.9389636689298924
    },
    {
      "playerAnswer": "出題文: 外食でつい選びがちな味は?\n回答: 辛いのは少しなら食べられる",
      "score": 0.938895633200754
    },
    {
      "playerAnswer": "出題文: 外食でつい選びがちな味は?\n回答: 辛いものはほとんど食べられない",
      "score": 0.8640950991065965
    }
  ]
}
gpt-5-nano
{
  "targetAnswer": "歯磨き",
  "results": [
    {
      "playerAnswer": "歯を磨く",
      "level": 4
    },
    {
      "playerAnswer": "口をゆすぐ",
      "level": 2
    },
    {
      "playerAnswer": "靴磨き",
      "level": 0
    }
  ]
}

{
  "targetAnswer": "洗濯",
  "results": [
    {
      "playerAnswer": "洗濯をする",
      "level": 4
    },
    {
      "playerAnswer": "服を洗う",
      "level": 4
    },
    {
      "playerAnswer": "お皿を洗う",
      "level": 2
    }
  ]
}

{
  "targetAnswer": "カレーライス",
  "results": [
    {
      "playerAnswer": "カレーを食べる",
      "level": 4
    },
    {
      "playerAnswer": "スープカレーを食べる",
      "level": 3
    },
    {
      "playerAnswer": "ハヤシライスを食べる",
      "level": 2
    }
  ]
}

{
  "targetAnswer": "温泉に入る",
  "results": [
    {
      "playerAnswer": "温泉に浸かる",
      "level": 4
    },
    {
      "playerAnswer": "大浴場でお風呂に入る",
      "level": 3
    },
    {
      "playerAnswer": "プールで泳ぐ",
      "level": 1
    }
  ]
}

{
  "targetAnswer": "朝は白米を食べたい",
  "results": [
    {
      "playerAnswer": "朝ごはんはいつもご飯にしている",
      "level": 3
    },
    {
      "playerAnswer": "パンよりご飯の方が好き",
      "level": 3
    },
    {
      "playerAnswer": "朝はパンしか食べない",
      "level": 1
    }
  ]
}

{
  "targetAnswer": "犬を飼いたい",
  "results": [
    {
      "playerAnswer": "わんちゃんを飼いたい",
      "level": 4
    },
    {
      "playerAnswer": "ペットが欲しい",
      "level": 3
    },
    {
      "playerAnswer": "観葉植物を増やしたい",
      "level": 1
    }
  ]
}

{
  "targetAnswer": "ホラー映画が苦手",
  "results": [
    {
      "playerAnswer": "怖い映画はあまり見たくない",
      "level": 4
    },
    {
      "playerAnswer": "グロい映画だけは無理",
      "level": 3
    },
    {
      "playerAnswer": "ホラー映画が大好き",
      "level": 1
    }
  ]
}

{
  "targetAnswer": "海より山が好き",
  "results": [
    {
      "playerAnswer": "夏は海より山に行きたい",
      "level": 4
    },
    {
      "playerAnswer": "自然の中ならどこでも好き",
      "level": 2
    },
    {
      "playerAnswer": "海で泳ぐのが一番好き",
      "level": 1
    }
  ]
}

{
  "targetAnswer": "早起きは得意じゃない",
  "results": [
    {
      "playerAnswer": "朝起きるのが苦手",
      "level": 4
    },
    {
      "playerAnswer": "いつも夜更かししている",
      "level": 2
    },
    {
      "playerAnswer": "毎朝5時にスッキリ目が覚める",
      "level": 1
    }
  ]
}

{
  "targetAnswer": "辛いものが好き",
  "results": [
    {
      "playerAnswer": "激辛ラーメンが好き",
      "level": 4
    },
    {
      "playerAnswer": "辛いのは少しなら食べられる",
      "level": 3
    },
    {
      "playerAnswer": "辛いものはほとんど食べられない",
      "level": 1
    }
  ]
}