2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ChatGPTAdvent Calendar 2024

Day 13

OpenAIのEmbdddingは実際どのように解釈されているのか検証する

Last updated at Posted at 2024-12-12

ChatGPTのアドベントカレンダーの13日目の投稿です。
虎の穴ラボ所属のH.Hです。
今回はChatGPTを出しているOpenAIが提供しているEmbeddingのAPIについてまとめていきたいと思います。

※今回の内容は2024/12/1時点のtext-embedding-3-smallのモデルを使用した検証結果となります。
別のモデルになった場合には結果が変わる可能性もある点はご容赦ください。

そもそもEmbeddingってなに?

今回取り扱うEmbeddingについてOpenAIの公式のページから引用します。

OpenAI’s text embeddings measure the relatedness of text strings. Embeddings are commonly used for:

 Search (where results are ranked by relevance to a query string)
 Clustering (where text strings are grouped by similarity)
 Recommendations (where items with related text strings are recommended)
 Anomaly detection (where outliers with little relatedness are identified)
 Diversity measurement (where similarity distributions are analyzed)
 Classification (where text strings are classified by their most similar label)
An embedding is a vector (list) of floating point numbers. The distance between two vectors measures their relatedness. Small distances suggest high relatedness and large distances suggest low relatedness.

[日本語訳]

OpenAIのtext embeddingsは、テキスト文字列の関連性を測定します。Embeddingは一般的に以下の用途で使用されます:

 検索(結果がクエリ文字列への関連性でランク付けされる)
 クラスタリング(テキスト文字列が類似性でグループ化される)
 レコメンデーション(関連するテキスト文字列を持つ項目が推奨される)
 異常検出(関連性の低い外れ値が特定される)
 多様性の測定(類似性の分布が分析される)
 分類(テキスト文字列が最も類似したラベルで分類される)

Embeddingは浮動小数点数のベクトル(リスト)です。2つのベクトル間の距離は、それらの関連性を測定します。小さな距離は高い関連性を示し、大きな距離は低い関連性を示します。

引用元
https://platform.openai.com/docs/guides/embeddings

まとめると文章の特徴を数値化した値の集合(ベクトル)にしたもので、同じような文章は同じような値になり、異なる文章は値が変わるのでそれぞれの数値の集合の距離が離れるものであるとなっています。
特徴が似ているからこそテキストの文字列の関係性を読み解くことができ、同じ内容を特定する検索や分類ができるとなっています。

テキストの文字列の関係性ってどう扱われる?

今回の検証のテーマはこの文字列の関係性が実際どのように扱われているのかを確かめたいと思います。
先ほども書いた通りEmbeddingは処理されると数値の集合(ベクトル)なので、数値のまとまりを見ても人間には理解できないものではありません。
しかも数値の集合であるベクトルなので、一つの文章だけではどのような数値化されているかわからないので複数の文章の比較が必要になります。

関係性は単純にどう扱われているかはわからないので今回検証してみました。

検証方法

今回は複数の似たような文章を複数準備し解析を行い、それぞれのベクトルのコサイン類似度を比較していきます。
コサイン類似度については以下のページを参照してみてください。

検証パターン

今回色の好みを説明する文章を準備して検証します。
他のAPIは英語の方がOpenAIのAPIは回答性能が良いとのことで、今回一部を除いて文章は英語で準備します。

パターン1 好みの色の種類を変化させた場合の比較

以下の文章を準備し検証します。
一つずつ好きな色を減らしていた場合の差分を確認します。

(1) I like blue,red,yellow,black and white.
(2) I like blue,red,yellow and black.
(3) I like blue,red and yellow.
(4) I like blue and red.
(5) I like blue.

パターン2 好きな色を減らして、減らした色を嫌いな色とした場合の比較

以下の文章を準備し検証します。
パターン1と違い、減らした色は好みではないとしています。

(1) I like blue,red,yellow,black and white.
(2) I like blue,red,yellow and black.I don't like white
(3) I like blue,red and yellow.I don't like black and white
(4) I like blue and red.I don't like yellow,black and white
(5) I like blue.I don't like red,yellow,black and white
(6) I don't like blue,red,yellow,black and white

パターン3 言語が異なる場合の比較

英語と日本語で同じ意味の文章を準備して検証します。

(1) I like blue,red,yellow,black and white.
(2) I like 青,赤,黄色,黒 and 白.
(3) 私は青と赤と黄色と黒と白が好きです

パターン4 似た色に変えた場合の比較

blueをmediumblueやdodgerblueに変更した場合などを検証します。
青(blue)・赤(red)・黄色(yellow)のカラーコードを少しずらした色に変えた場合を比較します。

(1) I like blue,red and yellow.
(2) I like mediumblue,red and yellow.
(3) I like dodgerblue,red and yellow.
(4) I like blue,crimson and yellow.
(5) I like mediumblue,crimson and yellow.
(6) I like dodgerblue,crimson and yellow.
(7) I like blue,orangered and yellow.
(8) I like mediumblue,orangered and yellow.
(9) I like dodgerblue,orangered and yellow.
(10) I like blue,red and gold.
(11) I like mediumblue,red and gold.
(12) I like dodgerblue,red and gold.
(13) I like blue,crimson and gold.
(14) I like mediumblue,crimson and gold.
(15) I like dodgerblue,crimson and gold.
(16) I like blue,orangered and gold.
(17) I like mediumblue,orangered and gold.
(18) I like dodgerblue,orangered and gold.
(19) I like blue,red and khaki.
(20) I like mediumblue,red and khaki.
(21) I like dodgerblue,red and khaki.
(22) I like blue,crimson and khaki.
(23) I like mediumblue,crimson and khaki.
(24) I like dodgerblue,crimson and khaki.
(25) I like blue,orangered and khaki.
(26) I like mediumblue,orangered and khaki.
(27) I like dodgerblue,orangered and khaki.

パターン5 順序を結果に反映されるのかの検証

これまでは好みの色の順序は決めていなかったが、文章の中に好きな色の順序を示す語句を入れた結果を検証する。

(1) I like blue,red and yellow in that order.
(2) I like blue,yellow and red in that order.
(3) I like red,blue and yellow in that order.
(4) I like red,yellow and blue in that order.
(5) I like yellow,blue and red in that order.
(6) I like yellow,red and blue in that order.

検証コード

OpenAIのAPI呼び出しにはSpringAIを使用し検証します。
Javaのライブラリで様々なAIのAPIへの連携Javaのコードから簡単に呼び出せるようにするものとなります。
SpringAIについては以下の公式ページを参照してください。

過去にChatモデルを利用する方法をまとめているので、ライブラリの読み込み方法については下記のページを参照してください。

testListに検証する文字列のリストになっています。

----------------------------抜粋----------------------------
OpenAiApi openAiApi = new OpenAiApi(APIキー);
        EmbeddingModel embeddingModel = new OpenAiEmbeddingModel(openAiApi);
        EmbeddingResponse embeddingResponse = embeddingModel.call(
                new EmbeddingRequest(Arrays.stream(testList).toList(),
                        OpenAiEmbeddingOptions.builder()
                                .withModel("text-embedding-3-small")//モデルの指定
                                .build()));
        for(int i=0;i<testList.length;i++) {
            System.out.println(testList[i]);//文字列の出力
        }
        for(int i=0;i<embeddingResponse.getResults().size();i++) {
            for(int j=0;j<embeddingResponse.getResults().size();j++) {
                if(i!=j) {
                    List<BigDecimal> aList = new ArrayList<>();
                    List<BigDecimal> bList = new ArrayList<>();
                    for(int k=0;k<embeddingResponse.getResults().get(i).getOutput().length;k++){
                        aList.add(BigDecimal.valueOf(embeddingResponse.getResults().get(i).getOutput()[k]));
                    }
                    for(int k=0;k<embeddingResponse.getResults().get(j).getOutput().length;k++){
                        bList.add(BigDecimal.valueOf(embeddingResponse.getResults().get(j).getOutput()[k]));
                    }
                    System.out.println(i+","+j+","+cosineSimilarity(aList,bList));//コサイン類似度を計算
                }
            }
        }
----------------------------抜粋----------------------------
    //コサイン類似度の計算用のメソッド
    private BigDecimal cosineSimilarity(List<BigDecimal> a,List<BigDecimal> b){
        BigDecimal answer=new BigDecimal(0);
        BigDecimal avalue=new BigDecimal(0),bvalue=new BigDecimal(0),abvalue=new BigDecimal(0);
        for(BigDecimal value:a){
            avalue=avalue.add(value.multiply(value));
        }
        for(BigDecimal value:b){
            bvalue=bvalue.add(value.multiply(value));
        }
        for(int i=0;i<a.size();i++){
            abvalue=abvalue.add(a.get(i).multiply(b.get(i)));
        }
        answer=abvalue.divide(
                BigDecimal.valueOf(
                        Math.sqrt(
                                abvalue.doubleValue()
                        )).multiply(
                                BigDecimal.valueOf(
                                        Math.sqrt(bvalue.doubleValue())
                        )
                ),20,BigDecimal.ROUND_HALF_UP);
        return answer;
    }

結果

0.95以上をかなり相関がある、0.9以上を相関があると今回判断しました。

パターン1

結果

比較元 比較先 コサイン類似度
1 2 0.978979839451631
1 3 0.948125694731735
1 4 0.887691006052696
1 5 0.826107630559425
2 3 0.951856645248675
2 4 0.904140719681315
2 5 0.837290899484275
3 4 0.92333839037122
3 5 0.855166276513974
4 5 0.906273542019577

かなり相関がある組み合わせ

(1) I like blue,red,yellow,black and white.
(2) I like blue,red,yellow and black.

(2) I like blue,red,yellow and black.
(3) I like blue,red and yellow.

相関がある

(1) I like blue,red,yellow,black and white.
(3) I like blue,red and yellow.

(2) I like blue,red,yellow and black.
(4) I like blue and red.

(3) I like blue,red and yellow.
(4) I like blue and red.

(4) I like blue and red.
(5) I like blue.

要素が4個以上あれば要素が1個要素を減らしても相関がかなり強く、要素を2個減らしても相関はあると判断はできる。要素が4個より少なくなると徐々に相関の度合いが小さくなる。

パターン2

結果

比較元 比較先 コサイン類似度
1 2 0.93248650539291
1 3 0.93825526463869
1 4 0.921300174907635
1 5 0.91793691586534
1 6 0.890003171112561
2 3 0.976477723985217
2 4 0.963119932531142
2 5 0.956903972501076
2 6 0.937696942167902
3 4 0.985890356228887
3 5 0.966481404485423
3 6 0.943799135329929
4 5 0.971994224385257
4 6 0.943535001877281
5 6 0.942163520974473

かなり相関がある組み合わせ

(2) I like blue,red,yellow and black.I don't like white
(3) I like blue,red and yellow.I don't like black and white

(2) I like blue,red,yellow and black.I don't like white
(4) I like blue and red.I don't like yellow,black and white

(2) I like blue,red,yellow and black.I don't like white
(5) I like blue.I don't like red,yellow,black and white

(3) I like blue,red and yellow.I don't like black and white
(4) I like blue and red.I don't like yellow,black and white

(3) I like blue,red and yellow.I don't like black and white
(5) I like blue.I don't like red,yellow,black and white

(4) I like blue and red.I don't like yellow,black and white
(5) I like blue.I don't like red,yellow,black and white

相関がある

ほぼ残りの組み合わせはコサイン類似度が0.9以上でした。
(1)(6)の組み合わせだけが0.9を下回りました。
結果を見る限り、反対の意味の単語があったとしても中の単語が類似していると意味が違っていても相関があると判断になると思います。

パターン3

結果

比較元 比較先 コサイン類似度
1 2 0.881132999607579
1 3 0.826387724046584
2 3 0.844673182841843

全ての組み合わせで0.9を下回る結果となりました。

パターン4

結果

比較元 比較先 コサイン類似度 比較元 比較先 コサイン類似度
1 2 0.939219354541853 1 3 0.891026539173884
1 4 0.933068536251334 1 5 0.901823909906668
1 6 0.86328534847454 1 7 0.933744455464122
1 8 0.897950238515677 1 9 0.839219312829321
1 10 0.929311812468498 1 11 0.883769165063646
1 12 0.825824502794964 1 13 0.871712708248538
1 14 0.845334092298531 1 15 0.798165499509393
1 16 0.887935616105655 1 17 0.85138245378816
1 18 0.783264028287473 1 19 0.880658471676029
1 20 0.857714916707866 1 21 0.80733470541887
1 22 0.840067190566285 1 23 0.82160852588774
1 24 0.783996626390762 1 25 0.86332594069167
1 26 0.841989734761978 1 27 0.782779687631992
2 3 0.870162678205395 2 4 0.888272196059175
2 5 0.955817160940033 2 6 0.848803120486147
2 7 0.904399661162206 2 8 0.963038002219937
2 9 0.844056791984793 2 10 0.861415854955188
2 11 0.940825761545671 2 12 0.796307161322209
2 13 0.815500633430941 2 14 0.898088587997917
2 15 0.779197939336188 2 16 0.853150398296136
2 17 0.920160828626093 2 18 0.789086785920943
2 19 0.831579686948793 2 20 0.912811536958008
2 21 0.79379740700513 2 22 0.801297402528842
2 23 0.877486937055076 2 24 0.781523685597513
2 25 0.834237807140985 2 26 0.907791211496909
2 27 0.791950280619059 3 4 0.849513724572126
3 5 0.850164302794657 3 6 0.97917642706121
3 7 0.866328091852949 3 8 0.857182421468681
3 9 0.957128440195503 3 10 0.836368586697289
3 11 0.819415643197632 3 12 0.957425252156275
3 13 0.795989429272626 3 14 0.798348342050748
3 15 0.933525559996781 3 16 0.826024251463845
3 17 0.817351534335109 3 18 0.922478335738063
3 19 0.795813897669136 3 20 0.803881737076212
3 21 0.920126825322321 3 22 0.769813278171519
3 23 0.779157620420475 3 24 0.905651812350137
3 25 0.805972170581638 3 26 0.808182684547585
3 27 0.915452161004719 4 5 0.954247336067063
4 6 0.887810828743445 4 7 0.887742437413305
4 8 0.858555614067526 4 9 0.810487978220287
4 10 0.877052401008207 4 11 0.840913994733511
4 12 0.79260393970791 4 13 0.940228567590783
4 14 0.901762079573722 4 15 0.833730333957799
4 16 0.844340688327965 4 17 0.815160730370596
4 18 0.755537283593641 4 19 0.833462412440697
4 20 0.818708946400976 4 21 0.776241182124786
4 22 0.9084364561637 4 23 0.879345573570094
4 24 0.822783039360731 4 25 0.826035787818593
4 26 0.810494877831321 4 27 0.759783045839888
5 6 0.885245704499662 5 7 0.874295254020115
5 8 0.927825988124807 5 9 0.827875419614375
5 10 0.838864165291627 5 11 0.906401691377352
5 12 0.786782186815412 5 13 0.889082285578716
5 14 0.947141173730417 5 15 0.827683928067092
5 16 0.827687685976614 5 17 0.887911973437888
5 18 0.774569462751008 5 19 0.806885960696822
5 20 0.880625545692384 5 21 0.780690181732005
5 22 0.870394327196608 5 23 0.925589655161309
5 24 0.827007770655839 5 25 0.811991412321358
5 26 0.879842026054786 5 27 0.780760815280821
6 7 0.851651852244173 6 8 0.847108346549291
6 9 0.949795989121543 6 10 0.812606416354891
6 11 0.799307343148895 6 12 0.93965706353163
6 13 0.833540694332727 6 14 0.833006643792862
6 15 0.95828407637816 6 16 0.810271212791737
6 17 0.805983338981772 6 18 0.913811399617136
6 19 0.773958403268366 6 20 0.787978130894609
6 21 0.903310793186395 6 22 0.808774979304578
6 23 0.816543582546302 6 24 0.931245750314598
6 25 0.792120649501968 6 26 0.800139260590935
6 27 0.909445658459466 7 8 0.954739168215271
7 9 0.907391891684244 7 10 0.878477247558699
7 11 0.859318351875347 7 12 0.814025218922579
7 13 0.833573080046243 7 14 0.827834507417791
7 15 0.798785150355801 7 16 0.961100597838149
7 17 0.919458858361692 7 18 0.86739148255934
7 19 0.836470028294212 7 20 0.836708767045224
7 21 0.790353161082986 7 22 0.808889503845822
7 23 0.805608012792843 7 24 0.782119655230676
7 25 0.928681148117898 7 26 0.901330132679985
7 27 0.855281976796408 8 9 0.899912166211357
8 10 0.831655278429532 8 11 0.912546125816204
8 12 0.795114811023792 8 13 0.793552946815817
8 14 0.878580418150836 8 15 0.788187886150909
8 16 0.910317398642678 8 17 0.963637426551769
8 18 0.855528444242114 8 19 0.804434865793443
8 20 0.88926634176527 8 21 0.785228080108624
8 22 0.782765272354536 8 23 0.859318651173313
8 24 0.783869012665636 8 25 0.884962676441611
8 26 0.945675135812012 8 27 0.849802220678112
9 10 0.783084021473821 9 11 0.793629780018295
9 12 0.918048311671179 9 13 0.75174443831014
9 14 0.777123038065433 9 15 0.908388127830817
9 16 0.865943963444558 9 17 0.862879806860717
9 18 0.969417031838132 9 19 0.751581301849983
9 20 0.781405521235848 9 21 0.880508429450523
9 22 0.733827860980201 9 23 0.76065014629884
9 24 0.881090617811904 9 25 0.839084062043121
9 26 0.847675983315267 9 27 0.954611807895515
10 11 0.93234692797262 10 12 0.880119173542077
10 13 0.943542853361175 10 14 0.902893838850251
10 15 0.855264981847871 10 16 0.932753992076065
10 17 0.882282180041849 10 18 0.814947155854707
10 19 0.857957614616067 10 20 0.826505997526745
10 21 0.794883456317915 10 22 0.828820483642666
10 23 0.801894335374555 10 24 0.773642351453491
10 25 0.846475683406914 10 26 0.813268000098877
10 27 0.765392150347858 11 12 0.851305058878527
11 13 0.8900273829242 11 14 0.961472335977047
11 15 0.836045458199196 11 16 0.906825996974565
11 17 0.960458127311109 11 18 0.825926719095439
11 19 0.813902836452884 11 20 0.890659188365852
11 21 0.781249048112821 11 22 0.793098269347082
11 23 0.864316149464685 11 24 0.770118387710096
11 25 0.822268238144741 11 26 0.888496329260283
11 27 0.776750930940157 12 13 0.84202242582297
12 14 0.835446419097595 12 15 0.976207237255188
12 16 0.857038885607306 12 17 0.837870968299803
12 18 0.950162155494565 12 19 0.768471049832445
12 20 0.768597199541727 12 21 0.909430344668642
12 22 0.750200630570622 12 23 0.751894228540045
12 24 0.897046394836986 12 25 0.785534186432905
12 26 0.777782381883629 12 27 0.905341151099466
13 14 0.947951392703648 13 15 0.879320222460299
13 16 0.889822215054967 13 17 0.845792828476349
13 18 0.78482666407553 13 19 0.824172096071124
13 20 0.800578626811161 13 21 0.770919684258391
13 22 0.900975222382227 13 23 0.865378922907095
13 24 0.815601251035204 13 25 0.817915601534569
13 26 0.790958697091489 13 27 0.746966475885876
14 15 0.874040572019935 14 16 0.877916717191655
14 17 0.927875967220779 14 18 0.80978801733983
14 19 0.792746761531498 14 20 0.863635665385192
14 21 0.770426976727055 14 22 0.861143756964476
14 23 0.913271186411782 14 24 0.815842721784264
14 25 0.803098185354097 14 26 0.86598423602756
14 27 0.769081775067253 15 16 0.842884777642275
15 17 0.831806236820682 15 18 0.942121629239407
15 19 0.749848359584716 15 20 0.75986169895421
15 21 0.891828422679117 15 22 0.795362280831174
15 23 0.79889088856731 15 24 0.925423959876259
15 25 0.773710498595132 15 26 0.776041211331342
15 27 0.901225174128099 16 17 0.950988175746023
16 18 0.894263451263384 16 19 0.819741213528766
16 20 0.815078424493299 16 21 0.778710562874375
16 22 0.797792106577597 16 23 0.78985897785486
16 24 0.77081808925339 16 25 0.915561132283413
16 26 0.882091997577097 16 27 0.840666295867562
17 18 0.887821185465665 17 19 0.783612106309276
17 20 0.870497713766213 17 21 0.772182806170854
17 22 0.76822992245176 17 23 0.845677815248565
17 24 0.771692564581358 17 25 0.872368589455892
17 26 0.93155768304384 17 27 0.838212645463532
18 19 0.726530085624392 18 20 0.75671343420853
18 21 0.871624289650451 18 22 0.713398959961107
18 23 0.740460993415416 18 24 0.87412259891714
18 25 0.823656229470765 18 26 0.828594242025936
18 27 0.950258231612203 19 20 0.955855173778078
19 21 0.908155078306568 19 22 0.948084464246463
19 23 0.916073395636242 19 24 0.877305335549328
19 25 0.950119366178441 19 26 0.911983344124648
19 27 0.84177189462911 20 21 0.899099589637603
20 22 0.915861171283932 20 23 0.96242678799258
20 24 0.879870011156851 20 25 0.926906977838563
20 26 0.969114223386081 20 27 0.856305951248133
21 22 0.872767735029174 21 23 0.870553318960148
21 24 0.974369888630562 21 25 0.885016098221048
21 26 0.874204330975315 21 27 0.948705704328491
22 23 0.962119094763811 22 24 0.904666369936643
22 25 0.912568850463006 22 26 0.88177154787197
22 27 0.816680935660578 23 24 0.906125021596158
23 25 0.893099178421269 23 26 0.937623843222202
23 27 0.833495187835417 24 25 0.867478020056096
24 26 0.866124923336045 24 27 0.94677960143756
25 26 0.95747089013735 25 27 0.899801628526624
26 27 0.899740863587443

全体として一つぐらい名称をずらすとある程度相関があると判断できるが、色の名称によってかなりズレが出ると判断できる。逆に0.95以上の値があまり出ない結果となった。

パターン5

結果

比較元 比較先 コサイン類似度
1 2 0.985652333918244
1 3 0.991034467639437
1 4 0.984366137234821
1 5 0.985988138124172
1 6 0.987968583781377
2 3 0.980775136639645
2 4 0.990039090702445
2 5 0.979752338937624
2 6 0.97886518413078
3 4 0.987219846090609
3 5 0.987403343680172
3 6 0.986558190508577
4 5 0.97777000008095
4 6 0.981062030807067
5 6 0.993692919208658

パターン5は全て相関がかなり強い結果となりましたが、逆に順序の意味合いが結果には現れなかったという結果になりました。

まとめ

今回はEmbdddingの値の検証を行いました。
結果は以下のとおりです。

1.文章の意味というより単語の影響がかなり大きい
また単語も意味ではなく文字列を判断材料にしているような結果のため、似た意味の文章の判断を行うためには工夫が必要になることもわかりました
2.一つの文章に複数の意味を持たせても正しく判断されない
肯定と否定を混ぜても正しく判断されないので、文章を分けて解析する必要があると考えられます
3.順序などの要素を入れたとしてもベクトルに影響はかなり小さい

上記の通り文章としての理解というより、文字を数値化している傾向が強いです。
そのため大きな文章を渡して類似性を検証することは難しいので、ベクトル化するとしても事前の前処理として整理を行う必要があるとわかりました。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?