1. Pengantar
Terakhir Diperbarui: 08-04-2024
Penyematan Teks
Penyematan teks mengacu pada proses transformasi data tekstual menjadi representasi numerik. Representasi numerik ini, yang sering kali berupa vektor, menangkap makna semantik dan hubungan antarkata dalam teks. Bayangkan seperti ini:
Teks seperti bahasa yang kompleks, penuh nuansa dan ambiguitas.
Penyematan teks menerjemahkan bahasa tersebut ke dalam format matematika yang lebih sederhana yang dapat dipahami dan dimanipulasi oleh komputer.
Manfaat Penyematan Teks
- Memungkinkan pemrosesan yang efisien: Representasi numerik jauh lebih cepat diproses oleh komputer dibandingkan dengan teks mentah. Hal ini sangat penting untuk tugas seperti mesin telusur, sistem rekomendasi, dan terjemahan mesin.
- Menangkap makna semantik: Embedding tidak hanya menangkap makna literal kata-kata. Model ini menangkap konteks dan hubungan antar-kata, sehingga memungkinkan analisis yang lebih bernuansa.
- Meningkatkan performa machine learning: Penyematan teks dapat digunakan sebagai fitur dalam model machine learning, sehingga menghasilkan performa yang lebih baik dalam tugas seperti analisis sentimen, klasifikasi teks, dan pemodelan topik.
Kasus penggunaan Penyematan Teks
Embedding teks, dengan mengubah teks menjadi representasi numerik, membuka berbagai aplikasi dalam Natural Language Processing (NLP). Berikut beberapa kasus penggunaan utama:
1. Mesin Telusur dan Pengambilan Informasi:
Embedding teks memungkinkan mesin telusur memahami makna semantik di balik kueri dan mencocokkannya dengan dokumen yang relevan, meskipun kata kunci persisnya tidak ada.
Dengan membandingkan embedding kueri penelusuran dengan embedding dokumen, mesin telusur dapat mengidentifikasi dokumen yang mencakup topik atau konsep serupa.
2. Sistem Rekomendasi:
Sistem rekomendasi menggunakan sematan teks untuk menganalisis perilaku dan preferensi pengguna yang dinyatakan melalui ulasan, rating, atau histori penjelajahan.
Kemudian, sistem dapat merekomendasikan item serupa dengan membandingkan embedding produk, artikel, atau konten lain yang telah berinteraksi dengan pengguna.
3. Deteksi Plagiarisme:
Membandingkan embedding dua bagian teks dapat membantu mengidentifikasi potensi plagiarisme dengan menemukan kesamaan signifikan dalam struktur semantiknya.
Ini hanyalah beberapa contoh, dan kemungkinannya terus bertambah seiring berkembangnya teknik penyematan teks. Seiring dengan makin baiknya pemahaman komputer terhadap bahasa melalui penyematan, kita dapat mengharapkan aplikasi yang lebih inovatif pada masa mendatang.
textembedding-gecko@003
Textembedding-gecko@003 adalah versi spesifik dari model penyematan teks terlatih yang ditawarkan oleh Google Cloud Platform (GCP) melalui Vertex AI dan rangkaian alat serta layanan AI-nya.
Yang akan Anda bangun
Dalam codelab ini, Anda akan membuat skrip Python. Skrip ini akan:
- Gunakan Vertex API untuk memanggil textembedding-gecko@003 dan mengubah teks menjadi embedding teks (vektor).
- Buat database simulasi yang terdiri dari teks dan vektornya
- Lakukan kueri ke database vektor simulasi kami dengan membandingkan vektor dan mendapatkan respons yang paling mungkin.
Yang akan Anda pelajari
- Cara menggunakan Embedding Teks di GCP
- Cara memanggil textembedding-gecko@003
- Cara menjalankannya di Workbench
- Cara menggunakan Vertex AI - Workbench untuk menjalankan skrip
Yang Anda butuhkan
- Chrome versi terbaru
- Pengetahuan tentang Python
- Project Google Cloud
- Akses ke Vertex AI - Workbench
2. Mempersiapkan
Membuat Instance Vertex AI Workbench
- Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.
- Buka pemilih project
- Pastikan penagihan diaktifkan untuk project Google Cloud Anda.
- Aktifkan Notebooks API.
Anda dapat membuat instance Vertex AI Workbench menggunakan konsol Google Cloud, gcloud CLI, atau Terraform. Untuk tujuan tutorial ini, kita akan membuatnya menggunakan Konsol Google Cloud. Informasi selengkapnya tentang metode lainnya dapat ditemukan di sini.
- Di konsol Google Cloud, buka halaman Instances yang dapat diakses di menu Vertex AI, bagian Notebooks, lalu klik Workbench.

- Buka Instance.
- Klik Buat baru.

- Pada dialog Buat instance, di bagian Detail, berikan informasi berikut untuk instance baru Anda:
Nama: Berikan nama untuk instance baru Anda. Nama harus dimulai dengan huruf, diikuti dengan maksimal 62 huruf kecil, angka, atau tanda hubung (-), dan tidak boleh diakhiri dengan tanda hubung.
Region dan Zona: Pilih region dan zona untuk instance baru. Untuk mendapatkan performa jaringan terbaik, pilih region yang paling dekat secara geografis dengan Anda.
Tidak perlu menginstal GPU
Di bagian Networking, berikan hal berikut:
Jaringan: Sesuaikan opsi jaringan untuk menggunakan jaringan di project saat ini atau jaringan VPC Bersama dari project host, jika dikonfigurasi. Jika Anda menggunakan VPC Bersama di project host, Anda juga harus memberikan peran Compute Network User (roles/compute.networkUser) ke Agen Layanan Notebooks dari project layanan.
Di kolom Network: Pilih jaringan yang Anda inginkan. Anda dapat memilih jaringan VPC, asalkan jaringan tersebut telah mengaktifkan Akses Google Pribadi atau dapat mengakses internet
Di kolom Subnetwork: Pilih subnetwork yang Anda inginkan. Anda dapat memilih yang default.
Di Properti instance, Anda dapat menggunakan instance default, yaitu e2-standard-4.

- Klik Buat.
Vertex AI Workbench membuat sebuah instance dan otomatis memulainya. Saat instance siap digunakan, Vertex AI Workbench akan mengaktifkan link Open JupyterLab. Klik tab tersebut.
Membuat Notebook Python 3
- Di dalam Jupyterlab, dari Peluncur, di bagian Notebook, klik ikon dengan logo Python yang bertuliskan Python3.

- Notebook Jupyter dibuat dengan nama Untitled dan ekstensi ipynb.

- Anda dapat mengganti namanya menggunakan bagian penjelajah file di sisi kiri atau membiarkannya seperti apa adanya.
Sekarang, kita dapat mulai memasukkan kode ke dalam notebook.
3. Mengimpor library yang diperlukan
Setelah instance dibuat dan Jupyterlab dibuka, kita perlu menginstal semua library yang diperlukan untuk codelab ini.
Kita akan memerlukan:
- numpy
- pandas
- TextEmbeddingInput, TextEmbeddingModel dari vertexai.language_models
Salin dan tempel kode di bawah dalam sel:
from vertexai.language_models import TextEmbeddingInput, TextEmbeddingModel
import numpy as np
import pandas as pd
Tampilan akan terlihat seperti ini:

4. Membuat database vektor simulasi
Untuk menguji kode, kita akan membuat database yang terdiri dari teks dan vektornya masing-masing yang diterjemahkan menggunakan model penyematan teks gecko@003.
Tujuannya adalah agar pengguna dapat menelusuri teks, menerjemahkannya ke vektor, menelusurinya di database kami, dan menampilkan hasil yang paling mendekati.
Database vektor kita akan menyimpan 3 rekaman, berikut cara membuatnya:
Salin dan tempel kode di bawah ini di sel baru.
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
Tampilannya akan terlihat seperti ini:

Mari kita analisis kodenya
Dalam variabel DOCUMENT1, DOCUMENT2, dan DOCUMENT3, kita menyimpan kamus yang akan meniru dokumen dengan judul dan kontennya. "Dokumen" ini merujuk pada manual simulasi mobil buatan Google.
Di baris berikutnya, kita membuat daftar dari 3 dokumen (kamus) tersebut.
documents = [DOCUMENT1, DOCUMENT2, DOCUMENT3]
Terakhir, dengan memanfaatkan pandas, kita membuat dataframe dari daftar tersebut yang akan disebut df_initial_db.
df_initial_db = pd.DataFrame(documents)
df_initial_db.columns = ['Title', 'Text']
df_initial_db
5. Membuat embedding teks
Sekarang kita akan mendapatkan embedding teks menggunakan model gecko@003 untuk setiap rekaman dalam database dokumen simulasi kita.
Salin dan tempel kode di bawah ke dalam sel baru:
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
Tampilannya akan terlihat seperti ini:

Mari kita analisis kodenya
Kita menentukan fungsi yang disebut embed_fn yang akan menerima sebagai input dataframe pandas yang berisi teks untuk melakukan embedding. Kemudian, fungsi ini menampilkan teks yang dienkode sebagai vektor.
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
Dalam daftar yang disebut list_embedded_values, kita akan menyimpan dan menambahkan teks yang dienkode dari setiap baris.
Dengan menggunakan metode iterrows dari pandas, kita dapat melakukan iterasi setiap baris dalam dataframe, mendapatkan nilai dari kolom Text (yang berisi informasi manual dari database simulasi kita).
Untuk mengirim teks biasa dan menampilkan vektornya menggunakan model gecko@003, kita menginisialisasi variabel model yang merupakan tempat kita menetapkan model yang akan digunakan dengan memanggil fungsi TextEmbeddingModel.from_pretrained.
model = TextEmbeddingModel.from_pretrained("textembedding-gecko@003")
embeddings = model.get_embeddings([(row['Text'])])
Kemudian, di embedding variabel, kita mengambil vektor teks yang kita kirim melalui fungsi model.get_embeddings.
Di akhir fungsi, kita membuat kolom baru di dataframe yang disebut Embedded text dan kolom ini akan berisi daftar vektor yang dibuat berdasarkan model gecko@003.
df_input['Embedded text'] = list_embedded_values
return df_input
Terakhir, dalam variabel df_embedded_values_db, kita mengambil dataframe yang berisi data asli dari database simulasi ditambah kolom baru yang berisi daftar vektor untuk setiap baris.
df_embedded_values_db = embed_fn(df_initial_db)
df_embedded_values_db
6. Mengajukan pertanyaan ke database vektor
Setelah database kita berisi teks dan vektornya, kita dapat melanjutkan untuk mengajukan pertanyaan dan membuat kueri database untuk menemukan jawabannya.
Untuk itu, salin dan tempel kode di bawah ke dalam sel baru:
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)
Hasilnya akan terlihat seperti ini:

Mari kita analisis kodenya
Mirip dengan fungsi dari langkah sebelumnya, kita terlebih dahulu melakukan inisialisasi variabel pertanyaan dengan apa yang ingin kita tanyakan ke database.
question='How do you shift gears in the Google car?'
Kemudian, di variabel model, kita menetapkan model yang ingin digunakan melalui fungsi TextEmbeddingModel.from_pretrained yang dalam hal ini adalah model gecko@003.
model = TextEmbeddingModel.from_pretrained("textembedding-gecko@003")
Dalam variabel embedding, kita memanggil fungsi model.get_embeddings dan meneruskan teks yang akan dikonversi menjadi vektor. Dalam hal ini, kita meneruskan pertanyaan yang akan diajukan.
embeddings = model.get_embeddings([(question)])
Terakhir, variabel text_to_search menyimpan daftar vektor yang diterjemahkan dari pertanyaan.
Kita mencetak panjang vektor hanya sebagai referensi.
text_to_search=embeddings[0].values
len(text_to_search)
7. Membandingkan vektor
Sekarang kita memiliki daftar vektor dalam database simulasi dan pertanyaan yang diubah menjadi vektor. Dengan demikian, kita sekarang dapat membandingkan vektor pertanyaan dengan semua vektor dalam database untuk mengetahui vektor mana yang paling mendekati jawaban atas pertanyaan kita dengan lebih akurat.
Untuk melakukannya, kita akan mengukur jarak antara vektor pertanyaan dan setiap vektor database. Ada beberapa teknik untuk mengukur jarak antar-vektor. Untuk codelab khusus ini, kita akan menggunakan jarak Euclidean atau norma L2.

Di python, kita dapat memanfaatkan fungsi numpy untuk melakukannya.
Salin dan tempel kode di bawah ke dalam sel baru:
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}')
Hasilnya akan terlihat seperti ini:

Mari kita analisis kodenya
Kita mulai dengan mengonversi kolom yang berisi teks tersemat atau vektor database kita menjadi daftar dan menyimpannya di list_embedded_text_from_db.
Kita juga menginisialisasi variabel shortest_distance ke 1 agar terus diperbarui hingga kita menemukan jarak terpendek yang sebenarnya.
list_embedded_text_from_db = df_embedded_values_db['Embedded text']
shortest_distance=1
Kemudian, menggunakan loop for, kita melakukan iterasi dan mendapatkan jarak antara vektor dari pertanyaan dan setiap vektor di database.
Dengan menggunakan fungsi numpy linalg.norm, kita menghitung jaraknya.
Jika jarak yang dihitung kurang dari jarak dalam variabel shortest_distance, maka jarak yang dihitung akan ditetapkan ke variabel ini
Kemudian, kita mengambil jarak terpendek serta posisi dalam daftar tempat jarak tersebut ditemukan. Dalam variabel shortest_distance dan 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. Hasil
Dengan mengetahui posisi dalam daftar vektor yang memiliki jarak terpendek antara pertanyaan dan database, kita dapat mencetak hasilnya.
Salin dan tempel kode di bawah ini di sel baru:
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'])
Setelah menjalankannya, Anda akan mendapatkan hasil seperti ini:

9. Selamat
Selamat, Anda telah berhasil membangun aplikasi pertama Anda menggunakan model textembedding-gecko@003 dalam kasus penggunaan nyata.
Anda telah mempelajari dasar-dasar penyematan teks dan cara menggunakan model gecko003 di GCP Workbench.
Sekarang Anda telah mengetahui langkah-langkah penting yang diperlukan untuk terus menerapkan pengetahuan Anda ke lebih banyak kasus penggunaan.
Apa selanjutnya?
Lihat beberapa codelab ini...