티스토리 뷰
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;
};
'개발.. > Node' 카테고리의 다른 글
레거시 프론트엔드 프로젝트 버전 업데이트 진행 (0) | 2024.08.26 |
---|---|
Nodejs, sharp 이미지 리사이즈시 이미지가 돌아가는 현상 (0) | 2023.09.20 |
Nodejs, Sharp 를 이용한 이미지 최적화 (Webp 변환) (0) | 2023.08.16 |
npkill (0) | 2023.03.31 |
cross-env (0) | 2022.09.26 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- AWS
- docker
- nodejs
- vscode
- 타입스크립트
- 깃허브
- openAI
- 오블완
- Embedding
- vue composition api
- nextjs13
- nuxt2
- 티스토리챌린지
- Github Actions
- Vite
- NUXT
- seo
- dockerfile
- nextjs14
- cors
- React
- 서버 to 서버
- NextJS
- svelte
- 네이버 서치 어드바이저
- webpack
- Git
- Storybook
- 스벨트
- vue router
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함