SW/인공지능

Apache Sea Tunnel, Milvus, OpenAI : 도서 제목 유사도 검색의 정확성 및 효율성 향상 방법, 예제, 예시, 코드

얇은생각 2024. 1. 29. 07:30
반응형

Apache Sea Tunnel, Milvus, OpenAI를 사용하면 큰 언어 모델을 통해 보다 정확한 책 제목 유사도 검색을 달성할 수 있습니다. 현재 기존의 도서 검색 솔루션(공공 도서관 등)은 책 제목의 실제 내용에 대한 의미론적 이해보다는 키워드 매칭에 크게 의존하고 있습니다. 결과적으로 검색 결과는 요구를 잘 충족하지 못하거나 예상과 크게 다를 수 있습니다. 키워드 매칭에만 의존하는 것은 의미론적 이해를 달성할 수 없고, 따라서 검색자의 진의를 이해할 수 없기 때문에 충분하지 않기 때문입니다.

그렇다면 책 검색을 더 정확하고 효율적으로 수행할 수 있는 더 나은 방법은 없을까요? 정답은 그렇다 입니다! 유사도 검색을 위해 아파치 시 터널, 밀버스 및 OpenAI를 결합하여 전체 책 제목의 의미적 이해를 달성하고 검색 결과를 더 정확하게 만드는 방법을 소개하겠습니다.

시맨틱 검색은 입력 데이터를 표현하기 위해 훈련된 모델을 사용하는 것으로, 이 접근 방식은 이상 탐지 및 문서 검색을 포함한 텍스트 기반의 다양한 사용 사례로 확장될 수 있습니다. 따라서 이 글에서 소개하는 기술은 도서 검색 분야에 중요한 혁신과 영향을 가져올 수 있습니다.

다음으로 이 글을 좀 더 잘 이해하기 위해 이 글과 관련된 몇 가지 개념과 도구/플랫폼을 간단히 소개하겠습니다.

 

 

Apache Sea Tunnel, Milvus, OpenAI : 도서 제목 유사도 검색의 정확성 및 효율성 향상 방법, 예제, 예시, 코드

 

 

아파치 Sea Tunnel

Apache SeaTunnel은 오픈 소스의 고성능 분산 데이터 관리 및 컴퓨팅 플랫폼입니다. Apache Foundation이 지원하는 최상위 프로젝트로, 방대한 데이터를 처리하고 실시간 데이터 쿼리 및 컴퓨팅을 제공하며 여러 데이터 소스 및 형식을 지원할 수 있습니다. SeaTunnel의 목표는 다양한 대규모 데이터 처리 요구사항을 충족할 수 있도록 확장 가능한 엔터프라이즈 수준의 데이터 관리 및 통합 플랫폼을 제공하는 것입니다.

 

 

밀버스

Milvus는 오픈 소스 벡터 유사도 검색 엔진으로 대용량 벡터의 저장, 검색, 유사도 검색을 지원합니다. 대규모 벡터 데이터를 위한 고성능 저비용 솔루션입니다. Milvus는 추천 시스템, 이미지 검색, 음악 추천 등 다양한 시나리오에 사용될 수 있습니다.

 

 

OpenAI

ChatGPT OpenAI가 개발한 GPT(Generative Pre-trained Transformer) 모델에 기반한 대화형 AI 시스템입니다. 이 시스템은 주로 인간의 대화와 유사한 자연어 텍스트를 생성하기 위해 자연어 처리 및 딥러닝 기술을 사용합니다. ChatGPT는 지능형 고객 서비스, 챗봇, 지능형 비서 및 언어 모델 연구 개발을 포함한 광범위한 응용 분야를 가지고 있습니다. 최근 몇 년 동안 ChatGPT은 자연어 처리 분야의 연구 핫스팟 중 하나가 되었습니다.

 

 

LLM

LLM(Large Language Model)은 주어진 텍스트를 분석 및 이해하고 이와 관련된 텍스트 콘텐츠를 생성할 수 있는 딥러닝 기술 기반의 자연어 처리 모델입니다. 대규모 언어 모델은 일반적으로 딥 신경망을 사용하여 자연어의 문법 및 의미 규칙을 학습하고 텍스트 데이터를 연속 벡터 공간에서 벡터 표현으로 변환합니다. 훈련 중 대규모 언어 모델은 언어 패턴 및 통계 규칙을 학습하기 위해 많은 양의 텍스트 데이터를 사용하며, 이를 통해 기사, 뉴스, 대화와 같은 고품질 텍스트 콘텐츠를 생성할 수 있습니다. 대규모 언어 모델은 기계 번역, 텍스트 생성, 질의 응답 시스템, 음성 인식 등 다양한 응용 분야가 있습니다. 현재 많은 오픈 소스 딥러닝 프레임워크가 텐서플로우, 파이토치 등과 같은 대규모 언어 모델의 구현을 제공합니다.

 

 

자습서

, 시작합니다! OpenAI의 임베딩 API Apache SeaTunnel을 벡터 데이터베이스와 결합하여 책 제목 전체에 대한 의미 검색을 수행하는 방법을 보여드리겠습니다.

 

 

준비

실험 전에 그들의 공식 웹사이트에서 OpenAI 토큰을 얻은 다음 밀버스 실험 환경을 구축해야 합니다. 이 예제에 사용할 데이터도 준비해야 합니다. 여기에서 데이터를 다운로드할 수 있습니다.

SeaTunnel을 통해 Milvus로 데이터를 가져오는 중입니다.

먼저 book.csv /tmp/milvus_test/book 아래에 두고 작업 구성을 milvus.conf로 설정한 후 구성 아래에 배치합니다. 빠른 시작 가이드를 참고하시기 바랍니다.

env {
  # You can set engine configuration here
  execution.parallelism = 1
  job.mode = "BATCH"
  checkpoint.interval = 5000
  #execution.checkpoint.data-uri = "hdfs://localhost:9000/checkpoint"
}

 

source {
  # This is a example source plugin **only for test and demonstrate the feature source plugin**
  LocalFile {
    schema {
      fields {
        bookID = string
        title_1 = string
        title_2 = string
      }
    }
    path = "/tmp/milvus_test/book"
    file_format_type = "csv"
  }
}transform {
}sink {
  Milvus {
    milvus_host = localhost
    milvus_port = 19530
    username = root
    password = Milvus
    collection_name = title_db
    openai_engine = text-embedding-ada-002
    openai_api_key = sk-xxxx
    embeddings_fields = title_2
  }
}

 

 

다음 명령을 실행합니다:

./bin/SeaTunnel.sh --config ./config/milvus.conf -e local

 

 

데이터베이스에 있는 데이터를 보면 데이터가 작성되었음을 알 수 있습니다.

그런 다음 다음 다음 코드를 사용하여 책 제목에 대한 의미 검색을 수행합니다:

import json
import random
import openai
import time
from pymilvus import connections, FieldSchema, CollectionSchema, DataType, Collection, utility

 

COLLECTION_NAME = 'title_db'  # Collection name
DIMENSION = 1536  # Embeddings size
COUNT = 100  # How many titles to embed and insert.
MILVUS_HOST = 'localhost'  # Milvus server URI
MILVUS_PORT = '19530'
OPENAI_ENGINE = 'text-embedding-ada-002'  # Which engine to use
openai.api_key = 'sk-******'  # Use your own Open AI API Key hereconnections.connect(host=MILVUS_HOST, port=MILVUS_PORT)collection = Collection(name=COLLECTION_NAME)collection.load()
def embed(text):
    return openai.Embedding.create(
        input=text, 
        engine=OPENAI_ENGINE)["data"][0]["embedding"]
def search(text):
    # Search parameters for the index
    search_params={
        "metric_type": "L2"
    }    results=collection.search(
        data=[embed(text)],  # Embeded search value
        anns_field="title_2",  # Search across embeddings
        param=search_params,
        limit=5,  # Limit to five results per search
        output_fields=['title_1']  # Include title field in result
    )    ret=[]
    for hit in results[0]:
        row=[]
        row.extend([hit.id, hit.score, hit.entity.get('title_1')])  # Get the id, distance, and title for the results
        ret.append(row)
    return retsearch_terms=['self-improvement', 'landscape']for x in search_terms:
    print('Search term:', x)
    for result in search(x):
        print(result)
    print()

 

 

 

결과는 다음과 같습니다:

Search term: self-improvement
[96, 0.4079835116863251, "The Dance of Intimacy: A Woman's Guide to Courageous Acts of Change in Key Relationships"]
[56, 0.41880303621292114, 'Nicomachean Ethics']
[76, 0.4309804439544678, 'Possession']
[19, 0.43588975071907043, 'Vanity Fair']
[7, 0.4423919916152954, 'Knowledge Is Power (The Amazing Days of Abby Hayes: #15)']

 

Search term: landscape
[9, 0.3023473024368286, 'The Lay of the Land']
[1, 0.3906732499599457, 'The Angry Hills']
[78, 0.392495334148407, 'Cloud Atlas']
[95, 0.39346450567245483, 'Alien']
[94, 0.399422287940979, 'The Known World']

 

 

예전의 키워드 검색 방법을 사용하면 책 제목에 '자기계발', '향상' 등의 키워드가 포함되어 있어야 합니다. 하지만 의미 이해를 위해 큰 언어 모델을 사용함으로써 우리의 필요에 더 부합하는 책 제목을 검색할 수 있습니다. 예를 들어 위 예제에서 '자기계발'이라는 키워드를 검색했을 때 표시된 '친밀의 춤: 핵심관계의 용기 있는 행동에 대한 여성의 지침서', '니코마체 윤리' 등의 책 제목에 관련 키워드가 포함되어 있지는 않았지만 분명히 우리의 필요에 더 부합했습니다.

따라서 Apache SeaTunnel, Milvus, OpenAI를 사용하여 큰 언어 모델을 통해 보다 정확한 책 제목 유사도 검색을 달성할 수 있으며, 책 검색 분야에 중요한 기술적 돌파구를 제공하고 의미 이해를 위한 귀중한 참고 자료를 제공할 수 있습니다. 이것이 모든 사람들에게 영감을 줄 수 있기를 바랍니다.

반응형