1. Pengantar
Terakhir Diperbarui: 08-04-2024
Embedding Teks
Penyematan teks mengacu pada proses mengubah 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 dengan nuansa dan ambiguitas.
Penyematan teks menerjemahkan bahasa tersebut ke dalam format matematika yang lebih sederhana yang dapat dipahami dan dimanipulasi oleh komputer.
Manfaat Embedding Teks
- Memungkinkan pemrosesan yang efisien: Representasi numerik jauh lebih cepat diproses 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. Model ini menangkap konteks dan hubungan antarkata, sehingga memungkinkan analisis yang lebih nuansanya.
- 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
Dengan mengubah teks menjadi representasi numerik, embedding teks membuka berbagai aplikasi dalam Natural Language Processing (NLP). Berikut beberapa kasus penggunaan utamanya:
1. Mesin Telusur dan Pengambilan Informasi:
Embed teks memungkinkan mesin telusur memahami makna semantik di balik kueri dan mencocokkannya dengan dokumen yang relevan, meskipun kata kunci yang sama persis tidak ada.
Dengan membandingkan penyematan kueri penelusuran dengan penyematan dokumen, mesin telusur dapat mengidentifikasi dokumen yang membahas topik atau konsep yang serupa.
2. Sistem Rekomendasi:
Sistem rekomendasi menggunakan penyematan teks untuk menganalisis perilaku dan preferensi pengguna yang diungkapkan melalui ulasan, rating, atau histori penjelajahan.
Selanjutnya, sistem dapat merekomendasikan item serupa dengan membandingkan penyematan produk, artikel, atau konten lain yang telah berinteraksi dengan pengguna.
3. Deteksi Plagiarisme:
Membandingkan penyematan dua bagian teks dapat membantu mengidentifikasi potensi plagiarisme dengan menemukan kesamaan yang signifikan dalam struktur semantiknya.
Ini hanyalah beberapa contoh, dan kemungkinannya terus berkembang seiring dengan perkembangan teknik penyematan teks. Seiring komputer mendapatkan pemahaman yang lebih baik tentang bahasa melalui penyematan, kita dapat mengharapkan aplikasi yang lebih inovatif di masa mendatang.
textembedding-gecko@003
Textembedding-gecko@003 adalah versi tertentu 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 mem-build skrip Python. Skrip ini akan:
- Gunakan Vertex API untuk memanggil textembedding-gecko@003 dan mengubah teks menjadi penyematan teks (vektor).
- Membuat database simulasi yang terbuat 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 Notebook, lalu klik Workbench.
- Buka Instance.
- Klik Buat baru.
- Pada dialog Create instance, di bagian Details, 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 ada yang dikonfigurasi. Jika 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 default.
Di Properti instance, Anda dapat membiarkan 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 tombol 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 file browser di sebelah kiri atau membiarkannya 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.
Kita 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 data, berikut cara membuatnya:
Salin dan tempel kode di bawah 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 mengemulasi dokumen dengan judul dan kontennya. "Dokumen" ini mereferensikan simulasi manual 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 penyematan teks menggunakan model gecko@003 untuk setiap kumpulan data dalam database dokumen simulasi.
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 penyematan. Fungsi ini kemudian 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 adalah tempat 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 melakukan inisialisasi model variabel 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, dalam penyematan variabel, kita menangkap vektor teks yang kita kirim melalui fungsi model.get_embeddings.
Di akhir fungsi, kita membuat kolom baru dalam dataframe yang disebut Teks tersemat 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 berisi teks dan vektornya, kita dapat melanjutkan untuk mengajukan pertanyaan dan membuat kueri database untuk menemukan jawaban.
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
Serupa dengan fungsi dari langkah sebelumnya, pertama-tama kita melakukan inisialisasi variabel pertanyaan dengan hal 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")
Pada variabel embeddings, 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. Artinya, kita sekarang dapat membandingkan vektor pertanyaan dengan semua vektor dalam database untuk mengetahui mana yang paling mendekati jawaban pertanyaan kita dengan lebih akurat.
Untuk melakukannya, kita akan mengukur jarak antara vektor pertanyaan dan setiap vektor database. Ada beberapa teknik untuk mengukur jarak antara 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 menyimpan teks tersemat atau vektor database menjadi daftar dan menyimpannya di list_embedded_text_from_db.
Kita juga melakukan inisialisasi variabel shortest_distance ke 1 untuk terus memperbaruinya 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 di variabel shortest_distance, jarak yang dihitung akan ditetapkan ke variabel ini
Kemudian, kita mengambil jarak terpendek serta posisi dalam daftar tempatnya 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 menyimpan 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 tampilan seperti ini:
9. Selamat
Selamat, Anda telah berhasil mem-build aplikasi pertama menggunakan model textembedding-gecko@003 dalam kasus penggunaan yang sebenarnya.
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...