{
  "title": "Pinecone과 LLM을 활용한 이커머스 하이브리드 검색",
  "excerpt": "전통적인 정보 검색 방법과 LLM(Language Model) 및 관리형 벡터 데이터베이스인 Pinecone을 결합하여 이커머스 애플리케이션을 위한 강력한 하이브리드 검색 시스템을 구축하는 방법을 알아보세요. 검색 관련성 향상, 개인화, 롱테일 쿼리 처리, 더 간단한 인프라 관리를 포함한 이커머스 하이브리드 검색의 이점을 살펴보세요.",
  "content_html": "<p>관련 제품을 검색하고 찾는 것은 이커머스 웹사이트의 핵심 요소입니다. 빠르고 정확한 검색 결과를 제공하는 것은 높은 사용자 만족도와 사용자 불만 사이의 차이를 결정짓습니다. 최근 자연어 이해 및 벡터 검색 기술의 발전으로 인해 향상된 검색 시스템이 더욱 접근하기 쉽고 효율적으로 변모하면서 더 나은 사용자 경험과 개선된 전환율을 이끌어내고 있습니다.</p>\n<p>이 블로그 포스트에서는 고성능 벡터 검색 엔진인 Pinecone과 파인튜닝된 도메인 특화 언어 모델을 활용하여 이커머스를 위한 하이브리드 검색 시스템을 구현하는 방법을 살펴보겠습니다. 이 포스트를 마치면 하이브리드 검색에 대한 깊은 이해는 물론, 실제로 구현할 수 있는 단계별 실습 가이드도 함께 얻게 될 것입니다.</p>\n<h2>하이브리드 검색이란?</h2>\n<img src=\"/assets/images/pinecone_hybrid_index.jpg\" alt=\"Pinecone 하이브리드 인덱스\" class=\"post-img\" width=\"2360\" height=\"921\" />\n<span class=\"post-img-caption\">간단한 Pinecone 하이브리드 인덱스의 상위 수준 개념도</span>\n<p>구현에 앞서 하이브리드 검색이 무엇인지 간략히 살펴보겠습니다. 하이브리드 검색은 전통적인 검색(희소 벡터 검색)과 벡터 검색(밀집 벡터 검색)의 장점을 결합하여 다양한 도메인에서 더 나은 검색 성능을 달성하는 접근 방식입니다.</p>\n<p>밀집 벡터 검색은 텍스트 데이터에서 고품질의 벡터 임베딩을 추출하고 유사도 검색을 수행하여 관련 문서를 찾습니다. 하지만 도메인 특화 데이터셋으로 파인튜닝되지 않은 경우, 도메인 밖 데이터를 다룰 때 어려움을 겪는 경우가 많습니다.</p>\n<p>반면 전통적인 검색은 TF-IDF(Term Frequency-Inverse Document Frequency)나 BM25와 같은 희소 벡터 표현을 사용하며, 별도의 도메인 특화 파인튜닝이 필요 없습니다. 새로운 도메인도 처리할 수 있지만, 단어 간 의미적 관계를 이해하지 못하고 밀집 검색이 갖는 지능이 부족하기 때문에 성능에 한계가 있습니다.</p>\n<p>하이브리드 검색은 두 접근 방식의 약점을 단일 시스템 내에서 결합하여 완화하고자 합니다. 이를 통해 밀집 벡터 검색의 성능 잠재력과 전통적 검색의 제로샷 적응력을 동시에 활용할 수 있습니다.</p>\n<p>하이브리드 검색에 대한 기본적인 이해를 마쳤으니, 이제 구현으로 들어가 보겠습니다.</p>\n<h2>하이브리드 검색 시스템 구축하기</h2>\n<p>하이브리드 검색 시스템을 구현하기 위한 다음 단계들을 다루겠습니다:</p>\n<ol>\n<li>도메인 특화 언어 모델 활용</li>\n<li>희소 및 밀집 벡터 생성</li>\n<li>Pinecone 설정</li>\n<li>하이브리드 검색 파이프라인 구현</li>\n<li>쿼리 실행 및 파라미터 튜닝</li>\n</ol>\n<h3>1. 도메인 특화 언어 모델 활용</h3>\n<p>최근 몇 년간 OpenAI의 GPT나 Cohere와 같은 대규모 사전 학습 언어 모델이 자연어 이해 및 생성을 포함한 다양한 작업에서 점점 더 인기를 얻고 있습니다. 이러한 모델은 도메인 특화 데이터로 파인튜닝하여 성능을 개선하고 이커머스 제품 검색과 같은 특정 작업에 맞게 적응시킬 수 있습니다.</p>\n<p>이 예제에서는 파인튜닝된 도메인 특화 언어 모델을 사용하여 제품과 쿼리에 대한 밀집 벡터 임베딩을 생성하겠습니다. 하지만 다른 모델을 선택하거나 특정 도메인에 맞는 사용자 정의 임베딩을 직접 만들 수도 있습니다.</p>\n<pre><code class=\"language-python\">import torch\nfrom transformers import AutoTokenizer, AutoModel\n\n# Load a pre-trained domain-specific language model\nmodel_name = \"your-domain-specific-model\"\ntokenizer = AutoTokenizer.from_pretrained(model_name)\nmodel = AutoModel.from_pretrained(model_name)\n\n# Generate dense vector embeddings for a product description\ntext = \"Nike Air Max sports shoes for men\"\ninputs = tokenizer(text, return_tensors=\"pt\")\nwith torch.no_grad():\n    outputs = model(**inputs)\n    dense_embedding = outputs.last_hidden_state.mean(dim=1).numpy()</code></pre>\n<h3>2. 희소 및 밀집 벡터 생성</h3>\n<p>하이브리드 검색을 위해서는 이커머스 데이터에 대한 희소 및 밀집 벡터 표현이 모두 필요합니다. 이제 이러한 벡터를 생성하는 방법을 설명하겠습니다.</p>\n<h4>희소 벡터</h4>\n<p>TF-IDF나 BM25와 같은 희소 벡터 표현은 토큰화, 불용어 제거, 스테밍과 같은 표준 텍스트 처리 기법을 사용하여 생성할 수 있습니다. 희소 벡터를 생성하는 예시는 어휘 행렬을 사용하여 구현할 수 있습니다.</p>\n<pre><code class=\"language-python\"># This function generates sparse vector representations of a list of product descriptions\ndef generate_sparse_vectors(text):\n    '''Generates sparse vector representations for a list of product descriptions\n\n    Args:\n        text (list): A list of product descriptions\n\n    Returns:\n        sparse_vector (dict): A dictionary of indices and values\n    '''\n    sparse_vector = bm25.encode_queries(text)\n    return sparse_vector\n\nfrom pinecone_text.sparse import BM25Encoder\n\n# Create the BM25 encoder and fit the data\nbm25 = BM25Encoder()\nbm25.fit(new_df.full_data)\n\n# Create the sparse vectors\nsparse_vectors = []\nfor product_description in product_descriptions:\n    sparse_vectors.append(generate_sparse_vectors(text=product_description))</code></pre>\n<h4>밀집 벡터</h4>\n<p>밀집 벡터 표현은 사전 학습된 모델이나 사용자 정의 도메인 특화 언어 모델을 사용하여 생성할 수 있습니다. 앞선 예제에서는 도메인 특화 언어 모델을 사용하여 제품 설명에 대한 밀집 벡터 임베딩을 생성했습니다.</p>\n<pre><code class=\"language-python\">def generate_dense_vector(text):\n    '''Generates dense vector embeddings for a list of product descriptions\n\n    Args:\n        text (list): A list of product descriptions\n\n    Returns:\n        dense_embedding (np.array): A numpy array of dense vector embeddings\n    '''\n    # Tokenize the text and convert to PyTorch tensors\n    inputs = tokenizer(text, return_tensors=\"pt\")\n    # Generate the embeddings with the pre-trained model\n    with torch.no_grad():\n        outputs = model(**inputs)\n        dense_vector = outputs.last_hidden_state.mean(dim=1).numpy()\n    return dense_vector\n\n# Generate dense vector embeddings for a list of product descriptions\ndense_vectors = []\nfor product_description in product_descriptions:\n    dense_vectors.append(generate_dense_vector(text=product_description))</code></pre>\n<h3>3. Pinecone 설정</h3>\n<p>Pinecone은 하이브리드 검색을 지원하는 고성능 벡터 검색 엔진입니다. 희소 벡터와 밀집 벡터 모두를 위한 단일 인덱스를 생성할 수 있으며, 다양한 데이터 모달리티에 걸친 검색 쿼리를 원활하게 처리합니다.</p>\n<p>Pinecone을 사용하려면 계정에 가입하고 Pinecone 클라이언트를 설치한 후 API 키와 환경을 설정해야 합니다.</p>\n<pre><code class=\"language-python\"># Create a Pinecone hybrid search index\nimport pinecone\n\npinecone.init(\n    api_key=\"YOUR_API_KEY\",  # app.pinecone.io\n    environment=\"YOUR_ENV\"  # find next to api key in console\n)\n\n# Create a Pinecone hybrid search index\nindex_name = \"ecommerce-hybrid-search\"\npinecone.create_index(\n    index_name = index_name,\n    dimension = MODEL_DIMENSION,  # dimensionality of dense model\n    metric = \"dotproduct\"\n)\n# connect to the index\nindex = pinecone.Index(index_name=index_name)\n# view index stats\nindex.describe_index_stats()</code></pre>\n<h3>4. 하이브리드 검색 파이프라인 구현</h3>\n<p>희소 및 밀집 벡터를 생성하고 Pinecone 설정을 마쳤으니, 이제 하이브리드 검색 파이프라인을 구축할 수 있습니다. 이 파이프라인은 다음 단계를 포함합니다:</p>\n<ol>\n<li>Pinecone 인덱스에 제품 데이터 추가</li>\n<li>희소 및 밀집 벡터를 모두 사용하여 결과 검색</li>\n</ol>\n<pre><code class=\"language-python\">def add_product_data_to_index(product_ids, sparse_vectors, dense_vectors, metadata=None):\n    \"\"\"Upserts product data to the Pinecone index.\n\n    Args:\n        product_ids (`list` of `str`): Product IDs.\n        sparse_vectors (`list` of `list` of `float`): Sparse vectors.\n        dense_vectors (`list` of `list` of `float`): Dense vectors.\n        metadata (`list` of `list` of `str`): Optional metadata.\n\n    Returns:\n        None\n    \"\"\"\n    batch_size = 32\n\n    # Loop through the product IDs in batches.\n    for i in range(0, len(product_ids), batch_size):\n        i_end = min(i + batch_size, len(product_ids))\n        ids = product_ids[i:i_end]\n        sparse_batch = sparse_vectors[i:i_end]\n        dense_batch = dense_vectors[i:i_end]\n        meta_batch = metadata[i:i_end] if metadata else []\n\n        vectors = []\n        for _id, sparse, dense, meta in zip(ids, sparse_batch, dense_batch, meta_batch):\n            vectors.append({\n                'id': _id,\n                'sparse_values': sparse,\n                'values': dense,\n                'metadata': meta\n            })\n\n        # Upsert the vectors into the Pinecone index.\n        index.upsert(vectors=vectors)\n\nadd_product_data_to_index(product_ids, sparse_vectors, dense_vectors)</code></pre>\n<p>이제 데이터가 인덱싱되었으니 하이브리드 검색 쿼리를 실행할 수 있습니다.</p>\n<h3>5. 쿼리 실행 및 파라미터 튜닝</h3>\n<img src=\"/assets/images/pinecone_hybrid_query.jpg\" alt=\"Pinecone 하이브리드 쿼리\" class=\"post-img\" width=\"2360\" height=\"892\" />\n<span class=\"post-img-caption\">간단한 Pinecone 하이브리드 쿼리의 상위 수준 개념도</span>\n<p>하이브리드 검색 쿼리를 실행하기 위해 쿼리와 상위 결과 개수, 그리고 밀집 및 희소 벡터 검색 점수 간의 가중치를 조절하는 알파 파라미터를 입력받는 함수를 만들겠습니다.</p>\n<pre><code class=\"language-python\">def hybrid_scale(dense, sparse, alpha: float):\n    \"\"\"Hybrid vector scaling using a convex combination\n\n    alpha * dense + (1 - alpha) * sparse\n\n    Args:\n        dense: Array of floats representing\n        sparse: a dict of `indices` and `values`\n        alpha: float between 0 and 1 where 0 == sparse only\n               and 1 == dense only\n    \"\"\"\n    if alpha < 0 or alpha > 1:\n        raise ValueError(\"Alpha must be between 0 and 1\")\n    # scale sparse and dense vectors to create hybrid search vecs\n    hsparse = {\n        'indices': sparse['indices'],\n        'values':  [v * (1 - alpha) for v in sparse['values']]\n    }\n    hdense = [v * alpha for v in dense]\n    return hdense, hsparse\n\ndef search_products(query, top_k=10, alpha=0.5):\n    # Generate sparse query vector\n    sparse_query_vector = generate_sparse_vector(query)\n\n    # Generate dense query vector\n    dense_query_vector = generate_dense_vector(query)\n\n    # Calculate hybrid query vector\n    dense_query_vector, sparse_query_vector = hybrid_scale(dense_query_vector, sparse_query_vector, alpha)\n\n    # Search products using Pinecone\n    results = index.query(\n        vector=dense_query_vector,\n        sparse_vector=sparse_query_vector,\n        top_k=top_k\n    )\n\n    return results</code></pre>\n<p>그런 다음 이 함수를 사용하여 이커머스 데이터셋에서 관련 제품을 검색할 수 있습니다.</p>\n<pre><code class=\"language-python\">query = \"running shoes for women\"\nresults = search_products(query, top_k=5)\n\nfor result in results:\n    print(result['id'], result['metadata']['product_name'], result['score'])</code></pre>\n<p>알파 파라미터의 다양한 값을 실험해보면 특정 도메인에 맞는 희소 및 밀집 벡터 검색 간의 최적의 균형을 찾는 데 도움이 될 것입니다.</p>\n<h2>마무리</h2>\n<p>이 블로그 포스트에서는 Pinecone과 도메인 특화 언어 모델을 활용하여 이커머스를 위한 하이브리드 검색 시스템을 구축하는 방법을 살펴보았습니다. 하이브리드 검색은 전통적 검색과 벡터 검색의 장점을 결합하여 다양한 도메인에서 검색 성능과 적응력을 향상시킬 수 있게 해줍니다.</p>\n<p>이 포스트에서 제공하는 단계와 코드 스니펫을 따라가면 자신의 이커머스 웹사이트 요구사항에 맞춘 하이브리드 검색 시스템을 직접 구현할 수 있습니다. 지금 바로 Pinecone을 탐색하고 이커머스 검색 경험을 개선해 보세요!</p>\n<h2>참고 자료</h2>\n<ul>\n<li><a href=\"https://colab.research.google.com/github/pinecone-io/examples/blob/master/search/hybrid-search/ecommerce-search/ecommerce-search.ipynb\">Pinecone 하이브리드 검색 기법을 활용한 이커머스 검색 (Google Colab 노트북)</a>: Pinecone의 하이브리드 검색 기법을 사용하여 이커머스 검색을 구현하는 실습 가이드입니다.</li>\n<li><a href=\"https://docs.pinecone.io/docs/ecommerce-search\">Pinecone 이커머스 검색 문서</a>: 이커머스 검색 시스템 구축을 위한 Pinecone 공식 문서입니다.</li>\n<li><a href=\"https://colab.research.google.com/github/pinecone-io/examples/blob/master/pinecone/sparse/bm25/bm25-vector-generation.ipynb\">Pinecone을 활용한 BM25 벡터 생성 (Google Colab 노트북)</a>: Pinecone을 사용하여 BM25 희소 벡터를 생성하는 가이드입니다.</li>\n<li><a href=\"https://github.com/pinecone-io/pinecone-text\">GitHub의 Pinecone Text 저장소</a>: Pinecone을 활용한 텍스트 처리 및 벡터 생성 리소스 모음입니다.</li>\n<li><a href=\"https://www.pinecone.io/learn/hybrid-search-intro/\">Pinecone 웹사이트의 하이브리드 검색 소개</a>: Pinecone의 기능을 바탕으로 한 하이브리드 검색의 개요, 이점 및 사용 사례를 다룹니다.</li>\n</ul>",
  "source_hash": "sha256:e66aaa4db1667d84e791217c8e94d2c0fb0ed99f7181b65b37a84e72ae3181ef",
  "model": "moonshotai/kimi-k2.6",
  "generated_at": "2026-08-07T05:25:58.777581+00:00"
}