임베딩이 모냐

임베딩은 여러 개념이 있는데 우선은 word_embedding 을 기준으로 설명하려고 한다.
사람은 king - queen 이라는 두 단어를 봤을 때 유사한 단어라고 인지를 한다.
하지만 컴퓨터는 이걸 못한다.
그래서 AI 가 이 단어가 어떤 단어에 근접한지 판단을 해서 점수를 적어, 좌표에 놓는다.
예를 들면 이런식이다.
성별에 관한 용어임? | 남자임? | 여자임? | 멋있음? | |
킹 | 0.9 | 1 | -1 | 1 |
퀸 | 0.9 | -1 | 1 | 1 |
ㅋㅋ
이걸로 하나하나 정해서 좌표에 던져 놓는다.
저 질문 하나하나를 차원이라고 한다.
Ollama 의 임베딩 모델은 1024
text-embedding-3-small 은 1536 개 였나 그렇다. (large 하면 더 많아짐)
어쨌든 이렇게 차원이 있는데 이 차원이 많아질 수록 당연히 임베딩하는데 돈이 더 많이 든다.
그리고 시간도 오래걸린다.
차원이 적을 수록 시간이 적게 걸리는데 이러면 응답이 안좋아질 수도 있다, 그래서 임베딩 압축기술이라는 것을 임베딩 모델에서 쓴다고 한다.
임베딩 어떻게 쓸까
이게 진짜 진짜 고민이다.
우선 벡터DB 에 데이터를 저장할 때 어떻게 하냐면
- id(Key 라고 하는 사람도 있고 Id 라고 하는 사람도 있고 Index 라고 하는 사람도 있음)
- PK 라고 생각하면 된다.
- id 로 검색하면 메타데이터랑 임베딩 된 거 들고 온다.
- metadata (중요)
- nosql에 저장하는 거 처럼 key - value 형식으로 이루어진 메타데이터
- embedding (중요)
- 임베딩 된 거
자 그러면 벡터 DB 에서 어떤 걸 지원하냐면
- top-k
- 임베딩 적으로 유사한 거 들고온다.
- filter
- 메타데이터 필터링 해준다.
- 조금 더 정확한 정보를 얻을 수 있음
우리는 이런 것들을 가지고 임베딩을 어떤 값으로 할지 정해야한다.
이게 제일 중요한 포인트다
- 어떤 기준으로 텍스트를 벡터화 할지
- 어떤 정보를 넣고 어떤 걸 metadata 로 돌지
- 나중에 어떻게 검색하고 싶은지를 먼저 생각해야한다.
예를 들면 사용자 무신사(온라인 옷 쇼핑몰)의 옷 추천 형식이 있다.
사용자가 많이 본 거나 좋아요 한 옷들의 임베딩 평균값을 벡터화 한다.
{
"id": "user_892",
"metadata": {
"favorite_styles": {
"귀염뽀짝": 12,
"시크": 5,
"멋진": 3,
"웃긴": 0,
"남친룩": 2
},
"season_preference": ["spring", "fall"],
"color_preference": ["pink", "black", "white"],
"style_keywords": ["러블리", "모던", "베이직"],
"last_updated": "2025-04-07"
},
"embedding": [0.512, 0.201, ..., 0.789] // 유저 취향 벡터 (평균 또는 가중합)
}
그리고
옷들은 이런 형식으로 저장한다.
{
"id": "item_21933",
"metadata": {
"style": "귀염뽀짝", // 감성 스타일
"color": ["pink", "white"], // 주요 색상
"season": ["spring", "summer"], // 계절성
"gender": "female", // 성별 타겟 (옵션)
"type": "dress", // 옷 종류 (예: hoodie, jeans, jacket)
"style_keywords": ["러블리", "프릴", "하객룩"], // 추출된 키워드
"upload_date": "2025-04-07",
"brand": "lovelyme", // 브랜드명 (필요 시)
"price": 49000 // 가격 (옵션)
},
"embedding": [0.231, 0.821, ..., 0.556] // 이미지 임베딩 (예: 1024차원)
}
이거 블로그 글 빨리 쓰고 싶어서 GPT 로 뽑은 거라 막 그렇게 좋지 않은 설계 일수도 있다.
다음은 쿼리 예시다.
vectorDB.query({
embedding: user_embedding,
topK: 10,
filter: {
"metadata.style": "귀염뽀짝",
"metadata.season": "spring",
"metadata.color": { $in: ["pink", "white"] }
}
})
이렇게 하면 추천 서비스를 만들 수 있다.
근데 진짜 하나하나 고민해야할게 많아서 어렵다.
걍 전부 넣고 filter 를 적극적으로 사용하는 것도 방법이 될 수 있다.