1. 소개
최종 업데이트: 2024년 4월 8일
텍스트 임베딩
텍스트 임베딩은 텍스트 데이터를 숫자 표현으로 변환하는 프로세스를 의미합니다. 이러한 수치 표현(흔히 벡터)은 텍스트의 단어 간의 의미론적 의미와 관계를 캡처합니다. 다음과 같이 생각해 보세요.
텍스트는 뉘앙스와 모호성이 가득한 복잡한 언어와 같습니다.
텍스트 삽입은 이 언어를 컴퓨터가 이해하고 조작할 수 있는 더 간단한 수학적 형식으로 변환합니다.
텍스트 임베딩의 이점
- 효율적인 처리 가능: 컴퓨터는 숫자 표현을 원시 텍스트보다 훨씬 빠르게 처리할 수 있습니다. 이는 검색엔진, 추천 시스템, 기계 번역과 같은 작업에 매우 중요합니다.
- 시맨틱 의미를 포착합니다. 임베딩은 단어의 문자 그대로의 의미를 넘어섭니다. 단어 간의 맥락과 관계를 포착하여 더 미묘한 분석을 가능하게 합니다.
- 머신러닝 성능 개선: 텍스트 임베딩은 머신러닝 모델에서 특성으로 사용될 수 있으므로 감정 분석, 텍스트 분류, 주제 모델링과 같은 작업의 성능이 개선됩니다.
텍스트 임베딩의 사용 사례
텍스트 임베딩은 텍스트를 수치적 표현으로 변환하여 자연어 처리 (NLP)의 다양한 애플리케이션을 활용할 수 있도록 합니다. 다음은 몇 가지 주요 사용 사례입니다.
1. 검색엔진 및 정보 검색:
텍스트 임베딩을 사용하면 검색엔진이 정확한 키워드가 포함되어 있지 않더라도 쿼리의 시맨틱 의미를 파악하고 관련 문서와 일치시킬 수 있습니다.
검색 쿼리의 임베딩을 문서 임베딩과 비교하면 검색엔진은 유사한 주제나 개념을 다루는 문서를 식별할 수 있습니다.
2. 추천 시스템:
추천 시스템은 텍스트 임베딩을 사용하여 리뷰, 평점 또는 탐색 기록을 통해 표현된 사용자 행동 및 선호도를 분석합니다.
그러면 시스템은 사용자가 상호작용한 제품, 기사 또는 기타 콘텐츠의 임베딩을 비교하여 유사한 항목을 추천할 수 있습니다.
3. 표절 감지:
두 텍스트의 임베딩을 비교하면 시맨틱 구조에서 유의미한 유사성을 찾아 잠재적인 표절을 식별하는 데 도움이 될 수 있습니다.
이는 몇 가지 예일 뿐이며 텍스트 삽입 기술이 발전함에 따라 가능성은 계속해서 커질 것입니다. 컴퓨터가 임베딩을 통해 언어를 더 잘 이해하게 되면 앞으로 훨씬 더 혁신적인 애플리케이션이 등장할 것으로 기대됩니다.
textembedding-gecko@003
Textembedding-gecko@003은 Vertex AI 및 AI 도구 및 서비스 모음을 통해 Google Cloud Platform (GCP)에서 제공하는 선행 학습된 텍스트 임베딩 모델의 특정 버전입니다.
빌드할 항목
이 Codelab에서는 Python 스크립트를 빌드합니다. 이 스크립트는 다음을 수행합니다.
- Vertex API를 사용하여 textembedding-gecko@003을 호출하고 텍스트를 텍스트 임베딩 (벡터)으로 변환합니다.
- 텍스트와 벡터로 구성된 시뮬레이션된 데이터베이스 만들기
- 벡터를 비교하여 시뮬레이션된 벡터 데이터베이스에 쿼리를 실행하고 가장 가능성이 높은 응답을 가져옵니다.
학습할 내용
- GCP에서 텍스트 임베딩을 사용하는 방법
- textembedding-gecko@003 호출 방법
- Workbench에서 실행하는 방법
- Vertex AI - Workbench를 사용하여 스크립트를 실행하는 방법
필요한 항목
- 최신 버전의 Chrome
- Python에 관한 지식
- Google Cloud 프로젝트
- Vertex AI - Workbench 액세스
2. 설정
Vertex AI Workbench 인스턴스 만들기
- Google Cloud 콘솔의 프로젝트 선택기 페이지에서 Google Cloud 프로젝트를 선택하거나 만듭니다.
- 프로젝트 선택기로 이동
- Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.
- Notebooks API를 사용 설정합니다.
Google Cloud 콘솔, gcloud CLI 또는 Terraform을 사용하여 Vertex AI Workbench 인스턴스를 만들 수 있습니다. 이 튜토리얼에서는 Google Cloud 콘솔을 사용하여 프로젝트를 만듭니다. 다른 방법에 대한 자세한 내용은 여기를 참고하세요.
- Google Cloud 콘솔에서 Vertex AI 메뉴의 노트북 섹션에서 액세스할 수 있는 인스턴스 페이지로 이동하여 Workbench를 클릭합니다.
- 인스턴스로 이동합니다.
- '새로 만들기'를 클릭합니다.
- 인스턴스 만들기 대화상자의 세부정보 섹션에서 새 인스턴스에 대해 다음 정보를 제공합니다.
이름: 새 인스턴스 이름을 입력합니다. 이름은 문자로 시작해야 합니다. 이어서 최대 62자(영문 기준)의 소문자, 숫자 또는 하이픈(-)이 와야 하며 하이픈으로 끝나서는 안 됩니다.
리전 및 영역: 새 인스턴스의 리전 및 영역을 선택합니다. 최상의 네트워크 성능을 위해 지리적으로 가장 가까운 리전을 선택합니다.
GPU를 설치할 필요가 없음
네트워킹 섹션에서 다음을 제공합니다.
네트워킹: 현재 프로젝트의 네트워크 또는 호스트 프로젝트의 공유 VPC 네트워크(구성된 경우)를 사용하도록 네트워크 옵션을 조정합니다. 호스트 프로젝트에서 공유 VPC를 사용하는 경우 서비스 프로젝트의 Notebooks 서비스 에이전트에도 Compute 네트워크 사용자 역할 (roles/compute.networkUser)을 부여해야 합니다.
네트워크 필드: 원하는 네트워크를 선택합니다. 네트워크에 비공개 Google 액세스가 사용 설정되어 있거나 네트워크가 인터넷에 액세스할 수 있는 경우 VPC 네트워크를 선택할 수 있습니다.
서브네트워크 필드: 원하는 서브네트워크를 선택합니다. 기본 템플릿을 선택할 수 있습니다.
인스턴스 속성에서는 기본값인 e2-standard-4를 그대로 두어도 됩니다.
- 만들기를 클릭합니다.
Vertex AI Workbench에서 인스턴스를 만들고 자동으로 시작합니다. 인스턴스를 사용할 준비가 되면 Vertex AI Workbench에서 JupyterLab 열기 링크를 활성화합니다. 해당 메뉴 아이콘을 클릭합니다.
Python 3 노트북 만들기
- Jupyterlab 내의 런처에서 노트북 섹션에 있는 Python 로고가 있는 아이콘(Python3)을 클릭합니다.
- 제목이 Untitled이고 확장자가 ipynb인 Jupyter 노트북이 생성됩니다.
- 왼쪽의 파일 브라우저 섹션을 사용하여 이름을 바꾸거나 그대로 둘 수 있습니다.
이제 노트북에 코드를 배치할 수 있습니다.
3. 필수 라이브러리 가져오기
인스턴스가 생성되고 JupyterLab이 열리면 Codelab에 필요한 모든 라이브러리를 설치해야 합니다.
다음이 필요합니다.
- numpy
- pandas
- vertexai.language_models의 TextEmbeddingInput, TextEmbeddingModel
아래 코드를 복사하여 셀에 붙여넣습니다.
from vertexai.language_models import TextEmbeddingInput, TextEmbeddingModel
import numpy as np
import pandas as pd
그러면 다음과 같이 표시됩니다.
4. 시뮬레이션된 벡터 데이터베이스 만들기
코드를 테스트하기 위해 gecko@003 텍스트 임베딩 모델을 사용하여 변환된 텍스트와 각 벡터로 구성된 데이터베이스를 만듭니다.
목표는 사용자가 텍스트를 검색하고 벡터로 변환한 후 데이터베이스에서 검색하여 가장 근사한 결과를 반환하는 것입니다.
벡터 데이터베이스는 레코드 3개를 보유합니다. 다음과 같이 만듭니다.
아래 코드를 복사하여 새 셀에 붙여넣습니다.
DOCUMENT1 = {
"title": "Operating the Climate Control System",
"content": "Your Googlecar has a climate control system that allows you to adjust the temperature and airflow in the car. To operate the climate control system, use the buttons and knobs located on the center console. Temperature: The temperature knob controls the temperature inside the car. Turn the knob clockwise to increase the temperature or counterclockwise to decrease the temperature. Airflow: The airflow knob controls the amount of airflow inside the car. Turn the knob clockwise to increase the airflow or counterclockwise to decrease the airflow. Fan speed: The fan speed knob controls the speed of the fan. Turn the knob clockwise to increase the fan speed or counterclockwise to decrease the fan speed. Mode: The mode button allows you to select the desired mode. The available modes are: Auto: The car will automatically adjust the temperature and airflow to maintain a comfortable level. Cool: The car will blow cool air into the car. Heat: The car will blow warm air into the car. Defrost: The car will blow warm air onto the windshield to defrost it."}
DOCUMENT2 = {
"title": "Touchscreen",
"content": "Your Googlecar has a large touchscreen display that provides access to a variety of features, including navigation, entertainment, and climate control. To use the touchscreen display, simply touch the desired icon. For example, you can touch the \"Navigation\" icon to get directions to your destination or touch the \"Music\" icon to play your favorite songs."}
DOCUMENT3 = {
"title": "Shifting Gears",
"content": "Your Googlecar has an automatic transmission. To shift gears, simply move the shift lever to the desired position. Park: This position is used when you are parked. The wheels are locked and the car cannot move. Reverse: This position is used to back up. Neutral: This position is used when you are stopped at a light or in traffic. The car is not in gear and will not move unless you press the gas pedal. Drive: This position is used to drive forward. Low: This position is used for driving in snow or other slippery conditions."}
documents = [DOCUMENT1, DOCUMENT2, DOCUMENT3]
df_initial_db = pd.DataFrame(documents)
df_initial_db.columns = ['Title', 'Text']
df_initial_db
다음과 같이 표시됩니다.
코드 분석하기
DOCUMENT1, DOCUMENT2, DOCUMENT3 변수에는 제목과 내용이 있는 문서를 에뮬레이션하는 사전이 저장됩니다. 이러한 '문서'는 Google에서 만든 자동차의 시뮬레이션된 설명서를 참조합니다.
다음 줄에서는 이러한 3개의 문서 (사전)로 목록을 만듭니다.
documents = [DOCUMENT1, DOCUMENT2, DOCUMENT3]
마지막으로 pandas를 활용하여 이 목록에서 df_initial_db라는 dataframe을 만듭니다.
df_initial_db = pd.DataFrame(documents)
df_initial_db.columns = ['Title', 'Text']
df_initial_db
5. 텍스트 임베딩 만들기
이제 시뮬레이션된 문서 데이터베이스의 각 레코드에 gecko@003 모델을 사용하여 텍스트 임베딩을 가져옵니다.
다음 코드를 복사하여 새 셀에 붙여넣습니다.
def embed_fn(df_input):
list_embedded_values = []
for index, row in df_input.iterrows():
model = TextEmbeddingModel.from_pretrained("textembedding-gecko@003")
embeddings = model.get_embeddings([(row['Text'])])
list_embedded_values.append(embeddings[0].values)
df_input['Embedded text'] = list_embedded_values
return df_input
df_embedded_values_db = embed_fn(df_initial_db)
df_embedded_values_db
다음과 같이 표시됩니다.
코드 분석하기
임베딩을 실행할 텍스트가 포함된 pandas dataframe을 입력으로 받는 embed_fn이라는 함수를 정의했습니다. 그런 다음 함수는 벡터로 인코딩된 텍스트를 반환합니다.
def embed_fn(df_input):
list_embedded_values = []
for index, row in df_input.iterrows():
model = TextEmbeddingModel.from_pretrained("textembedding-gecko@003")
embeddings = model.get_embeddings([(row['Text'])])
list_embedded_values.append(embeddings[0].values)
df_input['Embedded text'] = list_embedded_values
return df_input
list_embedded_values라는 목록에 모든 행의 인코딩된 텍스트를 저장하고 추가합니다.
pandas의 iterrows 메서드를 사용하면 데이터 프레임의 모든 행을 반복하여 시뮬레이션된 데이터베이스의 수동 정보가 포함된 Text 열의 값을 가져올 수 있습니다.
gecko@003 모델을 사용하여 일반 텍스트를 전송하고 벡터를 반환하려면 TextEmbeddingModel.from_pretrained 함수를 호출하여 사용할 모델을 설정하는 변수 model을 초기화합니다.
model = TextEmbeddingModel.from_pretrained("textembedding-gecko@003")
embeddings = model.get_embeddings([(row['Text'])])
그런 다음 변수 임베딩에서 model.get_embeddings 함수를 통해 전송하는 텍스트의 벡터를 캡처합니다.
함수 끝에서 dataframe에 Embedded text라는 새 열을 만듭니다. 이 열에는 gecko@003 모델을 기반으로 생성된 벡터 목록이 포함됩니다.
df_input['Embedded text'] = list_embedded_values
return df_input
마지막으로 df_embedded_values_db 변수에서 시뮬레이션된 데이터베이스의 원본 데이터와 각 행의 벡터 목록이 포함된 새 열을 포함하는 데이터 프레임을 캡처합니다.
df_embedded_values_db = embed_fn(df_initial_db)
df_embedded_values_db
6. 벡터 데이터베이스에 질문하기
이제 데이터베이스에 텍스트와 벡터가 포함되었으므로 질문을 하고 데이터베이스에 쿼리하여 답변을 찾을 수 있습니다.
이렇게 하려면 아래 코드를 복사하여 새 셀에 붙여넣습니다.
question='How do you shift gears in the Google car?'
model = TextEmbeddingModel.from_pretrained("textembedding-gecko@003")
embeddings = model.get_embeddings([(question)])
text_to_search=embeddings[0].values
len(text_to_search)
결과는 다음과 같습니다.
코드 분석하기
이전 단계의 함수와 마찬가지로 먼저 데이터베이스에 묻고자 하는 내용으로 질문 변수를 초기화합니다.
question='How do you shift gears in the Google car?'
그런 다음 모델 변수에서 TextEmbeddingModel.from_pretrained 함수를 통해 사용하려는 모델을 설정합니다. 이 경우 gecko@003 모델입니다.
model = TextEmbeddingModel.from_pretrained("textembedding-gecko@003")
embeddings 변수에서 model.get_embeddings 함수를 호출하고 벡터로 변환할 텍스트를 전달합니다. 이 경우 질문을 전달합니다.
embeddings = model.get_embeddings([(question)])
마지막으로 text_to_search 변수는 질문에서 변환된 벡터 목록을 보유합니다.
참조로 벡터의 길이를 출력합니다.
text_to_search=embeddings[0].values
len(text_to_search)
7. 벡터 비교
이제 시뮬레이션된 데이터베이스에 벡터 목록이 있고 질문이 벡터로 변환되었습니다. 즉, 이제 질문의 벡터를 데이터베이스의 모든 벡터와 비교하여 질문에 더 정확하게 답변하는 데 가장 근접한 벡터를 찾을 수 있습니다.
이를 위해 질문 벡터와 데이터베이스의 각 벡터 간의 거리를 측정합니다. 벡터 간의 거리를 측정하는 여러 기법이 있습니다. 이 Codelab에서는 유클리드 거리 또는 L2 노름을 사용합니다.
Python에서는 numpy 함수를 활용하여 이를 수행할 수 있습니다.
다음 코드를 복사하여 새 셀에 붙여넣습니다.
list_embedded_text_from_db = df_embedded_values_db['Embedded text']
shortest_distance=1
for position, embedded_value in enumerate(list_embedded_text_from_db):
distance=np.linalg.norm((np.array(embedded_value) - np.array(text_to_search)), ord = 2)
print(distance)
if distance<shortest_distance:
shortest_distance=distance
shortest_position=position
print(f'The shortest distance is {shortest_distance} and the position of that value is {shortest_position}')
다음과 같은 결과가 표시됩니다.
코드 분석하기
먼저 삽입된 텍스트 또는 데이터베이스의 벡터를 포함하는 열을 목록으로 변환하고 list_embedded_text_from_db에 저장합니다.
또한 실제 최단 거리를 찾을 때까지 계속 업데이트할 수 있도록 shortest_distance 변수를 1로 초기화했습니다.
list_embedded_text_from_db = df_embedded_values_db['Embedded text']
shortest_distance=1
그런 다음 for 루프를 사용하여 질문의 벡터와 데이터베이스의 각 벡터 간의 거리를 반복하여 가져옵니다.
numpy linalg.norm 함수를 사용하여 거리를 계산합니다.
계산된 거리가 shortest_distance 변수의 거리보다 작으면 계산된 거리가 이 변수로 설정됩니다.
그런 다음 가장 짧은 거리와 목록에서 발견된 위치를 캡처합니다. shortest_distance 및 shortest_position 변수에서
for position, embedded_value in enumerate(list_embedded_text_from_db):
distance=np.linalg.norm((np.array(embedded_value) - np.array(text_to_search)), ord = 2)
print(distance)
if distance<shortest_distance:
shortest_distance=distance
shortest_position=position
8. 결과
질문과 데이터베이스 간의 최단 거리를 보유한 벡터 목록의 위치를 알면 결과를 출력할 수 있습니다.
아래 코드를 복사하여 새 셀에 붙여넣습니다.
print("Your question was:\n "+question+ " \nAnd our answer is:\n "+
df_embedded_values_db.at[shortest_position, 'Title']+": "+
df_embedded_values_db.at[shortest_position, 'Text'])
실행하면 다음과 같이 표시됩니다.
9. 축하합니다
축하합니다. 실제 사용 사례에서 textembedding-gecko@003 모델을 사용하여 첫 번째 애플리케이션을 빌드했습니다.
텍스트 임베딩의 기본사항과 GCP Workbench에서 gecko003 모델을 사용하는 방법을 알아봤습니다.
이제 더 많은 사용 사례에 지식을 적용하는 데 필요한 주요 단계를 알게 되었습니다.
다음 단계
다음 Codelab을 확인하세요.