← Semua pembelajaran / AWS untuk AI Engineer
Fase 4 · RAG & Knowledge Bases

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 maxTokenCount atau topP.
  • Perhitungan kemiripan dilakukan vector database-mu, bukan oleh model embedding.

Spesifikasi yang perlu dihafal

PropertiTitan Text Embeddings V2
Model IDamazon.titan-embed-text-v2:0
Maksimum masukan8.192 token / 50.000 karakter
Ukuran vektor1.024 (default), 512, 256
Mode inferensiOn-demand dan Provisioned Throughput
Kasus pemakaianRAG, 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

DimensiPenyimpananKualitasKapan dipilih
1.024Paling besarPaling baikDefault; korpus kecil dan menengah
512SetengahnyaSedikit menurunKompromi untuk korpus besar
256SeperempatnyaMenurun paling jelasKorpus 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

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.