Amazon Titan Text Embeddings
Embedding mengubah teks jadi vektor yang bisa dibandingkan. Titan V2 adalah pilihan default di Bedrock, dan beberapa detailnya berdampak langsung ke desain pipeline-mu.
Intisari
amazon.titan-embed-text-v2:0: maksimum 8.192 token atau 50.000 karakter per masukan.- Ukuran vektor keluaran: 1.024 (default), 512, atau 256.
- Model embedding di Bedrock dibatasi per Requests Per Minute, bukan token per menit.
- Tidak menerima parameter inferensi seperti
maxTokenCountatautopP. - Perhitungan kemiripan dilakukan vector database-mu, bukan oleh model embedding.
Spesifikasi yang perlu dihafal
| Properti | Titan Text Embeddings V2 |
|---|---|
| Model ID | amazon.titan-embed-text-v2:0 |
| Maksimum masukan | 8.192 token / 50.000 karakter |
| Ukuran vektor | 1.024 (default), 512, 256 |
| Mode inferensi | On-demand dan Provisioned Throughput |
| Kasus pemakaian | RAG, pencarian dokumen, reranking, klasifikasi |
Rasio karakter ke token untuk bahasa Inggris kira-kira 4:1. Untuk bahasa Indonesia biasanya lebih boros, jadi perkirakan lebih konservatif saat menghitung ukuran potongan.
Memanggilnya
import json
import boto3
runtime = boto3.client("bedrock-runtime", region_name="us-east-1")
def embed(teks: str, dimensi: int = 1024) -> list[float]:
resp = runtime.invoke_model(
modelId="amazon.titan-embed-text-v2:0",
body=json.dumps({"inputText": teks, "dimensions": dimensi, "normalize": True}),
)
return json.loads(resp["body"].read())["embedding"]
v = embed("Bagaimana kebijakan cuti tahunan?")
print(len(v)) # 1024
Perhatikan: invoke_model, bukan converse. Converse API dirancang untuk
model percakapan. Model embedding tidak menghasilkan pesan, jadi ia dipanggil lewat API dasar dengan body
khas modelnya.
Kuota dihitung per permintaan
Ini detail kecil yang berdampak besar. Berbeda dari model teks yang dibatasi token per menit, model embedding di Bedrock dibatasi permintaan per menit. Konsekuensinya: mengirim satu potongan per permintaan membuang kuota. Untuk ingest besar, kelompokkan.
import time
from botocore.exceptions import ClientError
def embed_banyak(potongan: list[str], jeda: float = 0.05) -> list[list[float]]:
hasil = []
for teks in potongan:
for percobaan in range(5):
try:
hasil.append(embed(teks))
break
except ClientError as e:
if e.response["Error"]["Code"] != "ThrottlingException":
raise
time.sleep(2 ** percobaan) # backoff eksponensial
time.sleep(jeda)
return hasil
Untuk indexing berskala besar, dokumentasi menyebut adanya jalur batch yang dioptimalkan untuk throughput, sementara pemanggilan biasa dioptimalkan untuk latensi — yang mana yang direkomendasikan saat retrieval.
Memilih dimensi
| Dimensi | Penyimpanan | Kualitas | Kapan dipilih |
|---|---|---|---|
| 1.024 | Paling besar | Paling baik | Default; korpus kecil dan menengah |
| 512 | Setengahnya | Sedikit menurun | Kompromi untuk korpus besar |
| 256 | Seperempatnya | Menurun paling jelas | Korpus sangat besar, biaya jadi penentu |
Konsistensi itu mutlak. Dokumen dan pertanyaan harus di-embed dengan model dan dimensi yang sama. Mengganti salah satunya membuat seluruh indeks tidak valid — dan gejalanya bukan error, melainkan hasil pencarian yang tiba-tiba jadi omong kosong. Simpan nama model dan dimensinya bersama indeksmu.
Praktik yang berdampak
- Segmentasikan dokumen panjang jadi bagian logis (paragraf, seksi) — dokumentasinya menganjurkan ini untuk tugas retrieval, walaupun batas 8.192 token belum tercapai.
- Bersihkan teks sebelum embedding: header, footer, dan navigasi yang berulang mengencerkan sinyal.
- Simpan teks aslinya berdampingan dengan vektor — yang dikirim ke model adalah teksnya, bukan vektornya.
- Kalau kamu memakai Knowledge Bases, semua ini ditangani otomatis. Materi ini penting untuk saat kamu perlu membangun sendiri, dan untuk ujian.
Latihan: embed lima kalimat — tiga tentang cuti kerja, dua tentang topik lain — lalu hitung cosine
similarity antar semuanya dengan numpy. Buktikan tiga kalimat setopik saling lebih dekat. Ulangi dengan
dimensions=256 dan amati apakah pemisahannya masih sejelas itu.
Rangkuman ini sengaja dipangkas ke bagian yang dipakai di roadmap. Buka sumber aslinya saat kamu butuh detail lengkap atau referensi parameter.