κ²μ λ‘μ§(opensearch)
Tip
π‘ μ΄ κΈ°μ μ ν΅μ¬μ ν μ€νΈλ‘ μ΄λ―Έμ§λ₯Ό κ²μν μ μλ€λ κ²
μ ν΅μ μΈ μ΄λ―Έμ§ κ²μμ λ©νλ°μ΄ν°λ νμΌ μ΄λ¦μ κΈ°λ°μΌλ‘ νμ§λ§,
μλ§¨ν± κ²μμ μ΄λ―Έμ§ μ체μ λ΄μ©μ μ΄ν΄νκ³ μ΄λ₯Ό λ°νμΌλ‘ μ μ¬ν μ΄λ―Έμ§λ₯Ό κ²μν μ μλ κΈ°λ₯μ λ§ν©λλ€.
μΌλ°μ μΌλ‘ μ΄λ κ² κ²μν΄μ κ²°κ³Όλ₯Ό λ°μΌλ €λ©΄, λ¨μ μνλͺ λΏλ§ μλλΌ μνμ λν μΆκ° μ 보λ₯Ό μ λ ₯ν΄μ£Όμ΄μΌ ν κ²μ΄λ€.
겨μΈ, κ²μ μ, λ°μ΄νΈλ£© λ±λ±
νμ§λ§ μ΄ κΈ°λ₯μ ν΅μ¬μ μ΄λ ν μΆκ° μ 보λ₯Ό μ λ ₯νμ§ μκ³ λ λ± μ΄λ―Έμ§ νλλ§μ κ°μ§κ³ ν μ€νΈλ₯Ό κ²μν μ μλ€λ κ²μ λλ€.
μ΄λ―Έμ§μ λν μ 보(μΊ‘μ )μ μΆμΆν μ μλ λͺ¨λΈμ μ¬μ©νμ¬ λ°μ΄ν°λ₯Ό ν보ν©λλ€.
μμ μλ§¨ν± κ²μμ΄
- λ°μ λΉ¨κ°μ λ―Έλ μνΌμ€
- μ΄λμ΄ νλμ λ‘± μνΌμ€
- μλ§€κ° μλ λ Έλμ μνΌμ€
- ν°μ λ‘μ°ν μ΄λν
- κ°μ νμ΄ν μ΄λν
-
μ¬λ¦μ μ κΈ° μ’μ ν΅κΈ°μ± μ’μ ν°μ ν°μ μΈ
-
격μ μλ νμ μ¬λμ€ λ°μ§
- λ° νΈν μ¬μ±μ© μ΄λν
- λ°©μ κΈ°λ₯μ΄ μλ κ²¨μΈ λΆμΈ
- 골λ 컬λ¬μ λ―Έλλ©ν λμμΈ κ·κ±Έμ΄
- λ°μΌλ¦¬ 룩μ μ΄μΈλ¦¬λ μ€λ² νμ°
0. κΈ°μ κ°μΒΆ
- μΊ‘μ μΆμΆ
- μΊ‘μ μλ² λ© & κ²μμ΄ μλ² λ©
- κ΄λ ¨ μν μ 곡
1. κ°μ μΆμΆΒΆ
λ¨Όμ , μνμ λ±λ‘ν λ λ£λ μν μ΄λ―Έμ§λ‘λΆν° μλμΌλ‘ κ°μ μ μμ±
μ΄λ μνμ μ£Όμ λ΄μ©μ μμ°μ΄λ‘ ννν κ²
μλ₯Ό λ€μ΄, μ λ°μ¬μ§μμ βλΉ¨κ° μ€λ¬΄λ¬κ° μλ λ°λν ν μΌ€λ β μ κ°μ μΊ‘μ μ μμ±
μμ΄ μΊ‘μ
The image shows a young man standing in front of a building with a sign that reads "Royles". He is wearing a beige button-down shirt and black trousers. He is holding a black jacket in his left hand and has a pair of glasses on his right wrist. He has short black hair and is looking off to the side with a serious expression on his face. The building behind him has a wooden facade and large windows.
νκ΅μ΄ μΊ‘μ
κ·Έ μ΄λ―Έμ§λ "Royles"λΌκ³ μ°μ¬μ§ νμ§νμ΄ μλ 건물 μμ μ μλ μ μ λ¨μλ₯Ό 보μ¬μ€λλ€. κ·Έλ λ² μ΄μ§μ λ²νΌλ€μ΄ μ μΈ μ κ²μμ λ°μ§λ₯Ό μ κ³ μμ΅λλ€. κ·Έλ μΌμμ κ²μμ μ¬ν·μ λ€κ³ μκ³ μ€λ₯Έμͺ½ μλͺ©μ μκ²½μ μ°κ³ μμ΅λλ€. κ·Έλ μ§§μ κ²μ 머리λ₯Ό κ°μ§κ³ μκ³ μ¬κ°ν νμ μΌλ‘ μμ λ΄λ €λ€λ³΄κ³ μμ΅λλ€. κ·Έμ λ€μ μλ 건물μ λλ¬΄λ‘ λ μ λ©΄κ³Ό ν° μ°½λ¬Έμ κ°μ§κ³ μμ΅λλ€.
2. νμν μ λ³΄λ§ μΆμΆΒΆ
μμμ 보μ μΊ‘μ λ°μ΄ν°λ₯Ό λͺ¨λ μΌνλͺ° λ°μ΄ν°λ‘ νμ©λ κ²½μ°, λΆνμν λ°μ΄ν°κ° ν¬ν¨λμ΄ κ²μ μ±λ₯μ μ νμν¬ μ μμ΅λλ€. μ΄λ₯Ό λ°©μ§νκΈ° μν΄, λλ©μΈμ λ§μΆ ν΅μ¬ ν€μλλ§μ μΆμΆνκ³ μ€μλ μμΌλ‘ λ°μ΄ν°λ₯Ό μ μ₯νλ λ°©μμ μ±ννμμ΅λλ€.
μ΄λ¬ν λ°©μμ κ²μ μ νλλ₯Ό λμ΄κ³ μμ€ν μ±λ₯μ μ΅μ ννλ λ° λμμ΄ λ©λλ€.
μ΄λ―Έμ§ μ§μ λͺ¨λΈμ ν΅ν΄ νμν μ 보λ§μ μΆμΆνλ λ°©λ²μ μ¬μ©ν©λλ€.
- μΉ΄ν κ³ λ¦¬: μνμ μ’ λ₯ (μ: μνΌμ€, μ΄λν, μ¬λμ€ λ±)
- μμ: μνμ μ£Όμ μμ (μ: λΉ¨κ°μ, νλμ, λ Έλμ λ±)
- μ±λ³: μνμ λμ μ±λ³ (μ: μ¬μ±μ©, λ¨μ±μ©)
- κ³μ : μνμ΄ μ ν©ν κ³μ (μ: μ¬λ¦μ·, 겨μΈμ· λ±)
μ΄λ¬ν μ 보λ₯Ό μλμΌλ‘ μΆμΆν μ μλλ‘ AI λͺ¨λΈμ μ€μ νλ©΄, λͺ¨λΈμ μ΄λ―Έμ§ μμ μν μ 보λ₯Ό μ ννκ² λ°νν μ μμ΅λλ€.
μΆμΆλ μ 보λ₯Ό μ μ₯νκΈ° μν΄ κ²μμμ§ νλλ₯Ό ꡬμ±νκ³ , μλ² λ© λ²‘ν°λ₯Ό μμ±νμ¬ μ μ₯ν©λλ€. μ΄λ¬ν λ°©μμΌλ‘, κ²μ 쿼리μ λν μλ΅ μ μλ² λ© λ²‘ν°λ₯Ό νμ©νμ¬ λμ μ νλμ μλ§¨ν± κ²μ κ²°κ³Όλ₯Ό μ 곡ν©λλ€.
3. κ²μμμ§ λνΉ λͺ¨λΈ ꡬνΒΆ
OpenSearchλ₯Ό νμ©ν κ²μμμ§ λνΉ λͺ¨λΈ ꡬν
μ΄λ―Έμ§μμ μΆμΆν μ 보λ₯Ό ν¨κ³Όμ μΌλ‘ κ²μνκΈ° μν΄ OpenSearchλ₯Ό νμ©ν μλ§¨ν± κ²μ κΈ°λ₯μ ꡬνν©λλ€. μλ§¨ν± κ²μμ λ¨μν ν€μλ λ§€μΉμ λμ΄, κ²μμ΄μ λ¬Έμ κ°μ μλ―Έμ μ μ¬μ±μ κΈ°λ°μΌλ‘ κ²°κ³Όλ₯Ό μ 곡νλ λ°©μμ λλ€. μ΄λ₯Ό μν΄ λνΉ λͺ¨λΈμ μ¬μ©νμ¬ κ²μ κ²°κ³Όμ μ νμ±μ λμ λλ€.
3.1 OpenSearch μ€μ ΒΆ
λ¨Όμ , OpenSearch ν΄λ¬μ€ν°λ₯Ό ꡬμ±ν©λλ€.
- OpenSearch ν΄λ¬μ€ν° ꡬμ±: ν΄λ¬μ€ν°λ₯Ό μ€μ νκ³ νμν μΈλ±μ€λ₯Ό μμ±ν©λλ€.
- μΈλ±μ€ λ§€ν μ€μ : μΆμΆλ μΊ‘μ μ 보λ₯Ό μ μ₯ν μΈλ±μ€μ λ§€νμ μ€μ ν©λλ€. μλ₯Ό λ€μ΄, 'category', 'color', 'gender', 'season' λ±μ νλλ₯Ό ν¬ν¨ν©λλ€.
PUT /fashion_items
{
"mappings": {
"properties": {
"goodsNm": { "type": "text" },
"category": { "type": "dense_vector", "dims": 768 },
"color": { "type": "dense_vector", "dims": 768 },
"gender": { "type": "dense_vector", "dims": 768 },
"season": { "type": "dense_vector", "dims": 768 },
"embedding": { "type": "dense_vector", "dims": 768 }
}
}
}
3.2 μλ² λ© λ²‘ν° μμ± λ° μ μ₯ΒΆ
μ΄λ―Έμ§ μΊ‘μ μ ν΅ν΄ μΆμΆλ μ 보λ₯Ό μλ² λ© λ²‘ν°λ‘ λ³νν©λλ€. μ΄λ₯Ό μν΄ μ¬μ νλ ¨λ λͺ¨λΈ(BERT, CLIP λ±)μ μ¬μ©νμ¬ μΊ‘μ μ 벑ν°λ‘ λ³νν©λλ€. μλ₯Ό λ€μ΄, CLIP λͺ¨λΈμ μ¬μ©νμ¬ μ΄λ―Έμ§μ ν μ€νΈ λͺ¨λμμ μλ² λ©μ μμ±ν μ μμ΅λλ€.
3.3 λνΉ λͺ¨λΈ μ μ©ΒΆ
κ²μ μμ²μ μ²λ¦¬νκΈ° μν΄ μ¬μ©μμ 쿼리λ₯Ό μλ² λ© λ²‘ν°λ‘ λ³νν ν, OpenSearchμ k-NN κ²μ κΈ°λ₯μ μ¬μ©νμ¬ μ μ¬ν νλͺ©μ μ°Ύμ΅λλ€. λνΉ λͺ¨λΈμ ν΅ν΄ κ²μ κ²°κ³Όμ μμλ₯Ό μ νμ¬, κ°μ₯ κ΄λ ¨μ±μ΄ λμ κ²°κ³Όλ₯Ό μμμ λ ΈμΆμν΅λλ€.
- μ¬μ©μ 쿼리 μλ² λ©: μ¬μ©μμ ν μ€νΈ 쿼리λ₯Ό μλ² λ© λ²‘ν°λ‘ λ³νν©λλ€.
- k-NN κ²μ μν: OpenSearchμ k-NN κ²μμ ν΅ν΄ μ μ¬ν νλͺ©μ κ²μν©λλ€.
- λνΉ λͺ¨λΈ μ μ©: κ²μ κ²°κ³Όμ λνΉ λͺ¨λΈμ μ μ©νμ¬ μμλ₯Ό λ§€κΉλλ€.
query = "λ°μ λΉ¨κ°μ λ―Έλ μνΌμ€"
query_embedding = model.get_text_features(query).squeeze().tolist()
search_query = {
"query": {
"bool": {
"should": [
{
"knn": {
"category": {
"vector": query_embedding,
"k": 10
}
}
},
{
"knn": {
"color": {
"vector": query_embedding,
"k": 10
}
}
},
{
"knn": {
"gender": {
"vector": query_embedding,
"k": 10
}
}
},
{
"knn": {
"season": {
"vector": query_embedding,
"k": 10
}
}
},
{
"knn": {
"embedding": {
"vector": query_embedding,
"k": 10
}
}
}
]
}
},
"rescore": {
"window_size": 50,
"query_weight": 0.7,
"rescore_query_weight": 1.2,
"rescore_query": {
"rank_feature": {
"field": "popularity",
"factor": 1.2
}
}
}
}
response = opensearch.search(index="fashion_items", body=search_query)
3.4 κ²μ κ²°κ³Ό μ 곡¢
κ²μ κ²°κ³Όλ μ¬μ©μμκ² κ°μ₯ κ΄λ ¨μ±μ΄ λμ νλͺ©λΆν° μμλλ‘ μ 곡λ©λλ€. OpenSearchμ λνΉ λͺ¨λΈμ ν΅ν΄ μ μ¬μ±μ κΈ°μ€μΌλ‘ κ²°κ³Όλ₯Ό μ λ ¬νμ¬ μ 곡ν©λλ€.
μ΄μ κ°μ λ°©μμΌλ‘ OpenSearchμ μλ² λ© λ²‘ν°λ₯Ό νμ©ν μλ§¨ν± κ²μμ ꡬννλ©΄, μ¬μ©μμκ² λμ± μ ννκ³ μ μλ―Έν κ²μ κ²°κ³Όλ₯Ό μ 곡ν μ μμ΅λλ€. μ΄λ₯Ό ν΅ν΄ μ¬μ©μ κ²½νμ ν¬κ² ν₯μμν¬ μ μμΌλ©°, μΌνλͺ°μμ μνλ μνμ λΉ λ₯΄κ³ μ ννκ² μ°Ύμ μ μκ² λ©λλ€.ΒΆ
κ΄λ ¨ κΈ
- μμ΄μ€ν¬λ¦Όλͺ° AI Search κ΅¬μΆ μ¬λ‘
Portfolioκ²μμμ§ - μλ§¨ν± κ²μμ΄λ
Portfolioκ²μμμ§ - κ°μ νΌν
μ΄λ
AIPortfolio - μ΄λ―Έμ§ κ²μμ΄λ?
AIPortfolio - κ²μ κ²°κ³Ό λνΉ μ€μ½μ΄λ§ μμ€ν
μ€κ³
HandlebarsNestJSOpenSearch