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

1. مقدمه

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

جاسازی متن

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

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

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

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

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

از موارد تعبیه متن استفاده کنید

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

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

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

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

2. سیستم های توصیه:

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

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

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

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

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

textembedding-gecko@003

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

چیزی که خواهی ساخت

در این کد لبه، شما قصد دارید یک اسکریپت پایتون بسازید. این اسکریپت:

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

چیزی که یاد خواهید گرفت

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

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

  • نسخه اخیر کروم
  • آشنایی با پایتون
  • یک پروژه Google Cloud
  • دسترسی به Vertex AI - Workbench

2. راه اندازی

یک نمونه Vertex AI Workbench ایجاد کنید

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

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

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

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

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

نیازی به نصب GPU نیست

در بخش Networking موارد زیر را ارائه دهید:

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

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

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

در ویژگی‌های Instance می‌توانید حالت پیش‌فرض را بگذارید، این e2-standard-4 است.

d47bdc2d7f516c46.png

  1. روی Create کلیک کنید.

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

یک نوت بوک پایتون 3 بسازید

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

اکنون می توانیم شروع به قرار دادن کد خود در دفترچه یادداشت کنیم.

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

هنگامی که نمونه ایجاد شد و Jupyterlab باز شد، باید تمام کتابخانه های مورد نیاز را برای Codelab خود نصب کنیم.

ما نیاز خواهیم داشت:

  1. ناتوان
  2. پانداها
  3. TextEmbeddingInput، TextEmbeddingModel از vertexai.language_models

کد زیر را در یک سلول کپی و پیست کنید:

from vertexai.language_models import TextEmbeddingInput, TextEmbeddingModel

import numpy as np
import pandas as pd

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

6852d323eedcac93.png

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

به این صورت خواهد بود:

26baa3b876c0605d.png

بیایید کد را تجزیه و تحلیل کنیم

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

در خط بعدی، لیستی از آن 3 سند (فرهنگ لغت) ایجاد می کنیم.

documents = [DOCUMENT1, DOCUMENT2, DOCUMENT3]

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

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      

به این صورت خواهد بود:

4c4af091c7a82861.png

بیایید کد را تجزیه و تحلیل کنیم

ما تابعی به نام embed_fn تعریف کردیم که به عنوان ورودی یک dataframe 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 از پانداها، می‌توانیم هر سطر در چارچوب داده را تکرار کنیم و مقادیر را از ستون Text (که حاوی اطلاعات دستی از پایگاه داده شبیه‌سازی شده ما است) دریافت کنیم.

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

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

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

در پایان تابع، یک ستون جدید در چارچوب داده به نام متن جاسازی شده ایجاد می کنیم که حاوی لیست بردارهایی است که بر اساس مدل 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)

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

6b7cf9b08e3b4573.png

بیایید کد را تجزیه و تحلیل کنیم

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

question='How do you shift gears in the Google car?'

سپس، در متغیر model، مدلی را که می‌خواهیم استفاده کنیم، از طریق تابع 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. مقایسه بردارها

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

برای انجام این کار، فاصله بین بردار سوال و هر بردار پایگاه داده را اندازه گیری می کنیم. تکنیک‌های متعددی برای اندازه‌گیری فاصله بین بردارها وجود دارد، برای این آزمایشگاه کد خاص، از فاصله اقلیدسی یا هنجار 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 شروع می کنیم.

ما همچنین متغیر 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'])

پس از اجرای آن، چیزی شبیه به زیر دریافت خواهید کرد:

7a0e429171a19afe.png

9. تبریک می گویم

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

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

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

بعدش چی؟

برخی از این کدها را بررسی کنید...

اسناد مرجع