استفاده از textembedding-gecko@003 برای جاسازی های برداری

۱. مقدمه

آخرین به‌روزرسانی: 2024-04-08

جاسازی متن

جاسازی متن به فرآیند تبدیل داده‌های متنی به نمایش‌های عددی اشاره دارد. این نمایش‌های عددی، که اغلب بردار هستند، معنای معنایی و روابط بین کلمات در یک متن را ثبت می‌کنند. آن را اینگونه تصور کنید:

متن مانند یک زبان پیچیده، پر از ظرافت‌ها و ابهامات است.

جاسازی متن، آن زبان را به قالبی ساده‌تر و ریاضی تبدیل می‌کند که کامپیوترها بتوانند آن را بفهمند و دستکاری کنند.

مزایای جاسازی متن

  • پردازش کارآمد را ممکن می‌سازد: نمایش‌های عددی در مقایسه با متن خام برای رایانه‌ها بسیار سریع‌تر پردازش می‌شوند. این امر برای کارهایی مانند موتورهای جستجو، سیستم‌های توصیه‌گر و ترجمه ماشینی بسیار مهم است.
  • معنای معنایی را در بر می‌گیرد: جاسازی‌ها فراتر از معنای تحت‌اللفظی کلمات هستند. آن‌ها زمینه و روابط بین کلمات را در بر می‌گیرند و امکان تجزیه و تحلیل دقیق‌تر را فراهم می‌کنند.
  • بهبود عملکرد یادگیری ماشین: جاسازی‌های متن می‌توانند به عنوان ویژگی‌هایی در مدل‌های یادگیری ماشین مورد استفاده قرار گیرند و منجر به عملکرد بهتر در کارهایی مانند تحلیل احساسات، طبقه‌بندی متن و مدل‌سازی موضوعی شوند.

موارد استفاده از جاسازی متن

جاسازی متن، با تبدیل متن به نمایش‌های عددی، کاربردهای متنوعی را در پردازش زبان طبیعی (NLP) ایجاد می‌کند. در اینجا به برخی از موارد استفاده کلیدی اشاره می‌کنیم:

۱. موتورهای جستجو و بازیابی اطلاعات:

جاسازی متن به موتورهای جستجو اجازه می‌دهد تا معنای پشت جستجوها را درک کرده و آنها را با اسناد مرتبط مطابقت دهند، حتی اگر کلمات کلیدی دقیق وجود نداشته باشند.

با مقایسه جاسازی‌های یک عبارت جستجو با جاسازی‌های سند، موتورهای جستجو می‌توانند اسنادی را که موضوعات یا مفاهیم مشابهی را پوشش می‌دهند، شناسایی کنند.

۲. سیستم‌های پیشنهاددهنده:

سیستم‌های توصیه‌گر از جاسازی متن برای تحلیل رفتار و ترجیحات کاربر که از طریق نظرات، رتبه‌بندی‌ها یا سابقه مرور بیان می‌شوند، استفاده می‌کنند.

سپس سیستم می‌تواند با مقایسه‌ی جاسازی‌های محصولات، مقالات یا سایر محتوایی که کاربر با آنها تعامل داشته است، موارد مشابه را توصیه کند.

۳. تشخیص سرقت ادبی:

مقایسه‌ی جاسازی‌های دو متن می‌تواند با یافتن شباهت‌های معنادار در ساختار معنایی آنها، به شناسایی سرقت ادبی بالقوه کمک کند.

اینها فقط چند نمونه هستند و با تکامل تکنیک‌های جاسازی متن، امکانات همچنان در حال افزایش هستند. همچنان که کامپیوترها از طریق جاسازی، درک بهتری از زبان به دست می‌آورند، می‌توانیم انتظار کاربردهای نوآورانه‌تری را در آینده داشته باشیم.

textembedding-gecko@003

Textembedding-gecko@003 نسخه خاصی از یک مدل جاسازی متن از پیش آموزش‌دیده است که توسط Google Cloud Platform (GCP) از طریق Vertex AI و مجموعه ابزارها و خدمات هوش مصنوعی آنها ارائه می‌شود.

آنچه خواهید ساخت

در این آزمایشگاه کد، شما یک اسکریپت پایتون خواهید ساخت. این اسکریپت:

  • از API ورتکس برای فراخوانی textembedding-gecko@003 و تبدیل متن به جاسازی‌های متنی (بردارها) استفاده کنید.
  • ایجاد یک پایگاه داده شبیه‌سازی شده از متن و بردارهای آنها
  • با مقایسه بردارها، یک پرس و جو در پایگاه داده برداری شبیه‌سازی شده ما انجام دهید و محتمل‌ترین پاسخ را دریافت کنید.

آنچه یاد خواهید گرفت

  • نحوه استفاده از جاسازی متن در GCP
  • نحوه تماس با textembedding-gecko@003
  • نحوه اجرای این برنامه در Workbench
  • نحوه استفاده از Vertex AI - Workbench برای اجرای اسکریپت‌ها

آنچه نیاز دارید

  • نسخه جدید کروم
  • دانش پایتون
  • یک پروژه ابری گوگل
  • دسترسی به Vertex AI - میز کار

۲. راه‌اندازی

یک نمونه میز کار Vertex AI ایجاد کنید

  1. در کنسول گوگل کلود، در صفحه انتخاب پروژه، یک پروژه گوگل کلود را انتخاب یا ایجاد کنید.
  1. به انتخابگر پروژه بروید
  2. مطمئن شوید که پرداخت برای پروژه Google Cloud شما فعال است.
  3. فعال کردن API نوت‌بوک‌ها

شما می‌توانید با استفاده از کنسول Google Cloud، رابط خط فرمان gcloud یا Terraform یک نمونه از Vertex AI Workbench ایجاد کنید. در این آموزش، ما آن را با استفاده از کنسول Google Cloud ایجاد خواهیم کرد. اطلاعات بیشتر در مورد سایر روش‌ها را می‌توانید اینجا بیابید.

  1. در کنسول گوگل کلود، به صفحه Instances بروید که از طریق منوی Vertex AI، بخش Notebooks قابل دسترسی است و روی Workbench کلیک کنید. 56c087d619c464dd.png
  2. به موارد بروید.
  3. روی ایجاد جدید کلیک کنید. 381ff9b895e77641.png
  4. در پنجره‌ی «ایجاد نمونه»، در بخش «جزئیات»، اطلاعات زیر را برای نمونه‌ی جدید خود وارد کنید:

نام : برای نمونه جدید خود یک نام وارد کنید. نام باید با یک حرف شروع شود و به دنبال آن حداکثر ۶۲ حرف کوچک، عدد یا خط فاصله (-) وجود داشته باشد و نمی‌تواند با خط فاصله پایان یابد.

منطقه و ناحیه : یک منطقه و ناحیه برای نمونه جدید انتخاب کنید. برای بهترین عملکرد شبکه، منطقه‌ای را انتخاب کنید که از نظر جغرافیایی به شما نزدیک‌تر باشد.

نیازی به نصب پردازنده گرافیکی نیست

در بخش شبکه، موارد زیر را وارد کنید:

شبکه‌سازی : گزینه‌های شبکه را برای استفاده از یک شبکه در پروژه فعلی خود یا یک شبکه Shared VPC از یک پروژه میزبان، در صورت پیکربندی، تنظیم کنید. اگر از Shared VPC در پروژه میزبان استفاده می‌کنید، باید نقش Compute Network User (roles/compute.networkUser) را نیز به Notebooks Service Agent از پروژه سرویس اعطا کنید.

در قسمت شبکه : شبکه مورد نظر خود را انتخاب کنید. می‌توانید یک شبکه VPC انتخاب کنید، البته تا زمانی که دسترسی خصوصی به گوگل در شبکه فعال باشد یا بتوانید به اینترنت دسترسی داشته باشید.

در فیلد Subnetwork: زیرشبکه مورد نظر خود را انتخاب کنید. می‌توانید پیش‌فرض را انتخاب کنید.

در ویژگی‌های نمونه (Instance) می‌توانید پیش‌فرض را که e2-standard-4 است، رها کنید.

d47bdc2d7f516c46.png

  1. روی ایجاد کلیک کنید.

Vertex AI Workbench یک نمونه ایجاد می‌کند و به طور خودکار آن را اجرا می‌کند. وقتی نمونه آماده استفاده شد، Vertex AI Workbench یک لینک Open JupyterLab را فعال می‌کند. روی آن کلیک کنید.

یک دفترچه یادداشت پایتون ۳ ایجاد کنید

  1. در داخل Jupyterlab، از Launcher، در بخش Notebook، روی آیکونی با لوگوی پایتون که روی آن نوشته شده Python3 کلیک کنید. e16bb118cd28256f.png
  2. یک دفترچه یادداشت ژوپیتر با نام Untitled و پسوند ipynb ایجاد می‌شود. da9bd34cf307156c.png
  3. می‌توانید با استفاده از بخش مرورگر فایل در سمت چپ، نام آن را تغییر دهید یا می‌توانید آن را همانطور که هست رها کنید.

حالا می‌توانیم کد خود را در دفترچه یادداشت قرار دهیم.

۳. وارد کردن کتابخانه‌های مورد نیاز

پس از ایجاد نمونه و باز شدن Jupyterlab، باید تمام کتابخانه‌های مورد نیاز برای codelab خود را نصب کنیم.

ما نیاز داریم به:

  1. نامپی
  2. پانداها
  3. ورودی TextEmbedding، مدل TextEmbedding از vertexai.language_models

کد زیر را کپی کرده و در یک سلول قرار دهید:

from vertexai.language_models import TextEmbeddingInput, TextEmbeddingModel

import numpy as np
import pandas as pd

چیزی شبیه به این خواهد بود:

6852d323eedcac93.png

۴. ایجاد یک پایگاه داده برداری شبیه‌سازی شده

برای آزمایش کد خود، یک پایگاه داده از متن و بردارهای مربوطه که با استفاده از مدل جاسازی متن gecko@003 ترجمه شده‌اند، ایجاد خواهیم کرد.

هدف این است که کاربران یک متن را جستجو کنند، آن را به یک بردار تبدیل کنند، آن را در پایگاه داده ما جستجو کنند و تقریبی‌ترین نتیجه را برگردانند.

پایگاه داده وکتور ما ۳ رکورد را در خود جای خواهد داد، به این ترتیب آن را ایجاد خواهیم کرد:

کد زیر را کپی کرده و در یک سلول جدید جایگذاری کنید.

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

این شکلی خواهد بود:

26baa3b876c0605d.png

بیایید کد را تحلیل کنیم

در متغیرهای DOCUMENT1، DOCUMENT2 و DOCUMENT3 ما یک دیکشنری ذخیره می‌کنیم که اسناد را با عناوین و محتویاتشان شبیه‌سازی می‌کند. این «اسناد» به یک دفترچه راهنمای شبیه‌سازی شده از یک ماشین ساخت گوگل ارجاع می‌دهند.

در خط بعدی، لیستی از آن ۳ سند (دیکشنری) ایجاد می‌کنیم.

documents = [DOCUMENT1, DOCUMENT2, DOCUMENT3]

در نهایت، با استفاده از پانداس، یک دیتافریم از آن لیست ایجاد می‌کنیم که df_initial_db نام خواهد داشت.

df_initial_db = pd.DataFrame(documents)
df_initial_db.columns = ['Title', 'Text']
df_initial_db

۵. ایجاد جاسازی متن

اکنون با استفاده از مدل 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      

این شکلی خواهد بود:

4c4af091c7a82861.png

بیایید کد را تحلیل کنیم

ما تابعی به نام embed_fn تعریف کردیم که به عنوان ورودی، یک دیتافریم pandas را دریافت می‌کند که شامل متن برای انجام جاسازی است. سپس این تابع، متن کدگذاری شده به صورت یک بردار را برمی‌گرداند.

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، متن کدگذاری شده هر سطر را ذخیره و اضافه خواهیم کرد.

با استفاده از متد iterrows از pandas، می‌توانیم هر سطر را در دیتافریم تکرار کنیم و مقادیر را از ستون Text (که شامل اطلاعات دستی از پایگاه داده شبیه‌سازی شده ما است) دریافت کنیم.

برای ارسال متن معمولی و بازگرداندن بردار آن با استفاده از مدل gecko@003، متغیر model را مقداردهی اولیه می‌کنیم که در آن با فراخوانی تابع TextEmbeddingModel.from_pretrained، مدل را برای استفاده تنظیم می‌کنیم.

model = TextEmbeddingModel.from_pretrained("textembedding-gecko@003")
embeddings = model.get_embeddings([(row['Text'])])                     

سپس، در متغیر تعبیه‌شده، بردار متنی را که از طریق تابع model.get_embeddings ارسال می‌کنیم، ثبت می‌کنیم.

در پایان تابع، یک ستون جدید در دیتافریم به نام 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      

۶. پرسیدن سوال از پایگاه داده برداری

اکنون که پایگاه داده ما شامل متن و بردارهای آنها است، می‌توانیم یک سؤال بپرسیم و برای یافتن پاسخ، از پایگاه داده خود پرس‌وجو کنیم.

برای این کار، کد زیر را کپی کرده و در یک سلول جدید قرار دهید:

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)

نتیجه چیزی شبیه به این خواهد بود:

6b7cf9b08e3b4573.png

بیایید کد را تحلیل کنیم

مشابه تابع مرحله قبل، ابتدا متغیر question را با آنچه که قصد داریم از پایگاه داده خود بپرسیم، مقداردهی اولیه می‌کنیم.

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)

۷. مقایسه بردارها

اکنون لیستی از بردارها در پایگاه داده شبیه‌سازی شده خود و یک سوال تبدیل شده به یک بردار داریم. به این ترتیب، اکنون می‌توانیم بردار سوال را با تمام بردارهای موجود در پایگاه داده خود مقایسه کنیم تا دریابیم کدام یک به پاسخ دقیق‌تر سوال ما نزدیک‌تر است.

برای انجام این کار، فاصله بین بردار سوال و هر بردار از پایگاه داده را اندازه‌گیری خواهیم کرد. تکنیک‌های متعددی برای اندازه‌گیری فاصله بین بردارها وجود دارد، برای این کدلب خاص، از فاصله اقلیدسی یا نرم L2 استفاده خواهیم کرد.

73ea8635c4570bea.png

در پایتون، می‌توانیم از تابع 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}')

نتیجه باید به این شکل باشد:

b70563b50ea86668.png

بیایید کد را تحلیل کنیم

ما با تبدیل ستونی که متن جاسازی‌شده یا بردارهای پایگاه داده ما را در خود نگه می‌دارد به یک لیست و ذخیره آن در list_embedded_text_from_db شروع می‌کنیم.

ما همچنین متغیر shorten_distance را با مقدار ۱ مقداردهی اولیه کردیم تا آن را تا زمانی که کوتاه‌ترین فاصله واقعی را پیدا کنیم، به‌روزرسانی کنیم.

list_embedded_text_from_db = df_embedded_values_db['Embedded text']
shortest_distance=1

سپس با استفاده از یک حلقه for، تکرار می‌کنیم و فاصله بین بردار مربوط به سوال و هر بردار موجود در پایگاه داده را بدست می‌آوریم.

با استفاده از تابع linalg.norm در numpy، فاصله آنها را محاسبه می‌کنیم.

اگر فاصله محاسبه شده کمتر از فاصله موجود در متغیر shorten_distance باشد، فاصله محاسبه شده روی این متغیر تنظیم خواهد شد.

سپس کوتاه‌ترین فاصله و همچنین موقعیتی در لیست که در آن پیدا شده است را در متغیرهای shorten_distance و shorten_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

۸. نتایج

با دانستن موقعیت برداری که کوتاه‌ترین فاصله بین سوال و پایگاه داده را دارد، می‌توانیم نتایج را چاپ کنیم.

کد زیر را کپی کرده و در یک سلول جدید جایگذاری کنید:

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'])

بعد از اجرا، چیزی شبیه به این خواهید داشت:

7a0e429171a19afe.png

۹. تبریک

تبریک می‌گویم، شما با موفقیت اولین برنامه خود را با استفاده از مدل textembedding-gecko@003 در یک مورد استفاده واقعی ساختید!

شما اصول جاسازی متن و نحوه استفاده از مدل gecko003 در GCP Workbench را آموختید.

اکنون مراحل کلیدی مورد نیاز برای به کارگیری دانش خود در موارد استفاده بیشتر را می‌دانید.

بعدش چی؟

به برخی از این آزمایشگاه‌های کد نگاهی بیندازید...

اسناد مرجع