티스토리 뷰

OpenAI Embedding

주어진 텍스트에 대한 연관성을 측정하기 위한 임베딩 모델로, 문장의 임베딩 유사도를 계산하여 문맥적 검색을 할 수 있습니다.
예를 들어, 찾는 문장을 임베딩하여 벡터 데이터베이스로 만들고 질의를 받아 임베딩한 벡터 데이터를 가지고 저장한 데이터들과 유사도를 측정할 수 있습니다.

생성

주의: openai embedding 을 사용하기 전에 key 를 미리 발급받아야 한다.

api docs 에는 예제에

embeddings.create

로 설명되어 있지만, 필자는 아래와 같이 하도록 하겠다.

모델은 text-embedding-ada-002 을 권장한다.

import { Configuration, OpenAIApi } from 'openai';

const configuration = new Configuration({
  apiKey: OPENAI_API_KEY,
});

const openai = new OpenAIApi(configuration);

const main = async () => {
  const embedding = await openai.createEmbedding({
    model: "text-embedding-ada-002",
    input: "회사의 소개자료를 찾아줘",
  });

  console.log(embedding.data);
}

await main();

다음과 같이 input 을 넣으면, input 의 데이터를 임베딩하여 데이터를 벡터화 하게 된다.
데이터 규격은 아래와 같다.

{
  "object": "list",
  "data": [
    {
      object: 'embedding',
      index: 0,
      embedding: [
          -0.011943147,   -0.011845413,   0.005118026,  -0.027860826,
         -0.0060725654,    0.034897704,  -0.011330677,   0.010040583,
          -0.014946851,    0.014555913,  -0.016849415,   0.013813132,
          -0.011532662,   -0.013747976, -0.0013731687, -0.0033522907,
           0.017279446,   -0.020459073,  -0.002941806,  -0.010802912,
          0.0051245415,   -0.023534449,  -0.010236052,   0.012405756,
          -0.006551464,  -0.0026078802,    0.01409982,  -0.004994229,
         0.00009198234,    0.008932927,    0.02976339, -0.0033066813,
         -0.0053558466,   -0.007102035,  0.0037269394,  0.0072128004,
          0.0061637843,    0.002523177,   0.027235325,  -0.014777445,
           0.001806458,    0.004241674,  0.0035803379,  -0.017996166,
           0.019012604,     0.01576782,  -0.023378074,  -0.007681926,
           0.015780851,    0.026140701,  -0.009662677,   0.023065325,
        -0.00048663598,   -0.004358955,   0.017670384,  -0.006225683,
          0.0018341494,    0.021801293,  0.0028847945,   -0.02332595,
           0.009454177,   0.0031307593,  -0.034089766, -0.0050430964,
          -0.029815516,    0.005333042,  -0.008515926,  0.0041309083,
         -0.0119301155,    0.010379395,    0.01761826,   0.042117022,
         -0.0046228385,   -0.007219316,   0.020159354,  -0.022452855,
          -0.014047694,  -0.0066003315,  -0.019885698,  -0.008893833,
           0.008437739,   -0.027495952,  0.0077992072,  -0.001770622,
           0.019677198,    0.030128265,  -0.017813727,   0.011734647,
          -0.030884078,   -0.009063239,   0.020680605,   0.013774038,
          -0.023065325, -0.00035408366,  -0.008568051,  0.0013177858,
         -0.0017608486,    0.031040452,  -0.003117728,  -0.042846773,
        ... 1436 more items
      ]
    }
  ],
  "model": "text-embedding-ada-002",
  "usage": {
    "prompt_tokens": 14,
    "total_tokens": 14
  }
}

cosine similarity

이제 벡터 데이터가 생성되었으면, 이를 가지고 벡터 서치(코사인 유사도)를 통해 제일 연관성이 높은 것을 찾으면 된다.
코사인 유사도의 경우, elastic search 를 이용하는 경우도 있지만, 필자는 compute-cosine-similarity npm 모듈을 사용했다.

yarn add compute-cosine-similarity
import similarity from 'compute-cosine-similarity';

// 내가 찾고자 하는 input 을 임베딩하여 파라미터로 넘겨, 벡터 데이터 베이스에 가지고 있는 벡터 데이터들과 유사도를 비교
const bestVectorSearch = async (searchEmbedding) => {
  let bestData = null;
  let bestSimilarity = -1;

  for (const data of datas) {
    const currentSimilarity = similarity(
      searchEmbedding,
      data,
    );

    // 가장 유사도가 높은 데이터를 가져온다.
    if (currentSimilarity > bestSimilarity) {
      bestSimilarity = currentSimilarity;
      bestData = data
    }
  }

  return bestData;
};
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함