Tentang codelab ini
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 hal itu seperti ini:
Teks seperti bahasa yang kompleks, penuh dengan perbedaan 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 untuk diproses oleh komputer dibandingkan dengan teks mentah. Hal ini sangat penting untuk tugas-tugas seperti mesin telusur, sistem rekomendasi, dan terjemahan mesin.
- Memperoleh makna semantik: Sematan lebih dari sekadar makna literal dari 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
Embedding teks, dengan mengubah teks menjadi representasi numerik, membuka berbagai aplikasi di Natural Language Processing (NLP). Berikut beberapa kasus penggunaan utama:
1. Mesin Telusur dan Pengambilan Informasi:
Penyematan 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.
Sistem kemudian dapat merekomendasikan item serupa dengan membandingkan penyematan 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 yang signifikan dalam struktur semantiknya.
Ini hanyalah beberapa contoh, dan kemungkinannya akan terus berkembang seiring berkembangnya teknik embedding 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 membangun 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
- Melakukan kueri ke database vektor yang disimulasikan 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 Buat instance, di bagian Detail, berikan informasi berikut untuk instance baru Anda:
Nama: Berikan nama untuk instance baru Anda. Nama harus diawali dengan huruf yang 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 Anda 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 tersebut.
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 opsi default.
Di properti Instance Anda dapat membiarkan properti default, ini adalah 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.
- Sebuah Jupyter notebook dibuat dengan nama Untitled dan ekstensi ipynb.
- Anda dapat mengganti namanya menggunakan bagian file browser di sisi kiri atau Anda dapat membiarkannya.
Sekarang, kita dapat mulai menempatkan kode di {i>notebook<i}.
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 yang disimulasikan
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 ini dalam 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
Kodenya 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 merujuk pada manual simulasi mobil buatan Google.
Pada baris berikutnya, kita membuat daftar dari 3 dokumen tersebut (kamus).
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
Kami menentukan fungsi bernama embedding_fn yang akan menerima sebagai input dataframe pandas yang berisi teks untuk melakukan embedding. Fungsi tersebut 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 embedding variabel, kita menangkap vektor teks yang kita kirim melalui fungsi model.get_embeddings.
Di akhir fungsi, kita membuat kolom baru dalam {i>dataframe<i} yang disebut {i>Embedded text<i} 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 {i>dataframe<i} yang berisi data asli dari {i>database<i} yang disimulasikan 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 ini ke 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, pertama-tama kita menginisialisasi 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 embeddings, kita memanggil fungsi model.get_embeddings dan meneruskan teks yang akan dikonversi ke vektor. Dalam hal ini, kita meneruskan pertanyaan untuk 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. Ini berarti kita sekarang dapat membandingkan vektor pertanyaan dengan semua vektor dalam {i>database<i} kita untuk mengetahui vektor mana yang paling dekat untuk menjawab pertanyaan kita dengan lebih akurat.
Untuk melakukannya, kita akan mengukur jarak antara vektor pertanyaan dan setiap vektor {i>database<i}. Ada beberapa teknik untuk mengukur jarak antara vektor. Untuk codelab khusus ini, kita akan menggunakan jarak Euclidean atau norma L2.
Dalam bahasa 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 yang disematkan atau vektor {i>database<i} kita menjadi sebuah daftar dan menyimpannya dalam list_embedded_text_from_db.
Kita juga melakukan inisialisasi variabel shortest_distance ke 1 agar dapat terus memperbaruinya hingga kita menemukan jarak terpendek 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, jarak yang dihitung akan ditetapkan ke variabel ini
Kemudian, kita mencatat 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 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 sesuatu 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...