Panduan model dan modalitas10 November 2026Flatkey Team

Open AI Embeddings API: Membangun dan Memverifikasi Pencarian Semantik

Buat contoh kecil pencarian semantik dengan embedding OpenAI, lalu verifikasi pemetaan vektor, batas token, perubahan indeks, dan kualitas pengambilan hasil.

Open AI Embeddings API: Membangun dan Memverifikasi Pencarian Semantik

Mencari Open AI embeddings API? Endpoint embeddings OpenAI mengonversi teks menjadi vektor numerik sehingga aplikasi dapat mengambil bagian terkait. Permintaan tersebut hanyalah langkah pertama: fitur pencarian yang berguna juga memerlukan ID dokumen yang stabil, ruang vektor yang konsisten, serta pengujian yang memberi tahu Anda apakah pengambilan informasi membaik.

Panduan ini membuat contoh pencarian Python kecil, menunjukkan apa yang perlu disimpan bersama setiap vektor, dan memberikan daftar periksa untuk membawa eksperimen ke dalam produk. Panduan ini menggunakan OpenAI secara langsung. Kompatibilitas gateway dan ketersediaan model harus diverifikasi secara terpisah untuk setiap penyedia.

Open AI embeddings API: permintaan yang Anda perlukan

Kirim teks ke POST https://api.openai.com/v1/embeddings dengan model embedding dan kunci API. Pilih encoding_format="float" ketika aplikasi Anda mengharapkan array numerik. Untuk batch, gunakan index setiap item respons untuk menghubungkan kembali vektor ke inputnya. Respons juga menyertakan penggunaan token. Opsi dimensions didukung oleh model embedding generasi ketiga. Referensi API OpenAI.

Embedding bukanlah jawaban yang dihasilkan. Dalam aplikasi retrieval-augmented, pencarian terlebih dahulu memilih bagian sumber; panggilan pembuatan terpisah kemudian dapat menjawab menggunakan bagian-bagian tersebut. Menjaga tahap-tahap ini tetap terpisah memungkinkan Anda mendiagnosis hasil yang buruk: apakah pencarian mengambil bukti yang salah, atau model penjawab menyalahgunakan bukti yang baik?

Pilih model dan pertahankan konfigurasinya

Panjang vektor default yang didokumentasikan adalah 1.536 untuk text-embedding-3-small dan 3.072 untuk text-embedding-3-large. Model-model ini mendukung vektor output yang lebih pendek melalui dimensions. Vektor yang lebih pendek mengubah kompromi penyimpanan dan pengambilan informasi; ini bukan alasan untuk melewati evaluasi. Panduan embeddings OpenAI.

Mulailah dengan satu konfigurasi dan sekumpulan kecil kueri yang representatif. Catat model, jumlah dimensi yang diminta, dan versi pemrosesan teks bersama indeks. Dua vektor yang memiliki panjang sama tidak membuktikan bahwa keduanya berasal dari model yang kompatibel. Saat mengubah model atau aturan pemrosesan, buat indeks terpisah dan bandingkan sebelum mengalihkan lalu lintas produksi.

Contoh minimal pencarian semantik Python

Instal openai di lingkungan Python Anda dan sediakan OPENAI_API_KEY melalui pengelola rahasia atau konfigurasi lingkungan seperti biasa. Jauhkan kunci dari kontrol sumber dan kode browser. SDK Python resmi membaca variabel tersebut saat membangun OpenAI().

Simpan yang berikut ini sebagai search_demo.py. Contoh ini menggunakan tiga dokumen dukungan rekaan, melakukan embedding pada korpus dan kueri, lalu memberi peringkat dokumen dengan kemiripan kosinus. Menjalankannya membuat permintaan API yang dapat ditagihkan. Output bergantung pada respons layanan; contoh ini tidak menjanjikan skor atau peringkat tertentu.

import math
from openai import OpenAI

client = OpenAI(timeout=30.0, max_retries=2)
model = "text-embedding-3-small"
dimensions = 1536

documents = [
    {"id": "key-rotation", "text": "Replace an exposed API key and revoke the old credential."},
    {"id": "invoice-export", "text": "Download a monthly invoice from the billing workspace."},
    {"id": "request-timeout", "text": "Record the request ID and retry temporary upstream timeouts."},
]
query = "What should I do after accidentally sharing a secret key?"


def embed(texts):
    response = client.embeddings.create(
        model=model, input=texts,
        dimensions=dimensions, encoding_format="float",
    )
    ordered = sorted(response.data, key=lambda item: item.index)
    if [item.index for item in ordered] != list(range(len(texts))):
        raise ValueError("Unexpected embedding response indices")
    vectors = [item.embedding for item in ordered]
    if any(len(vector) != dimensions for vector in vectors):
        raise ValueError("Unexpected vector dimensions")
    print("Input tokens:", response.usage.prompt_tokens)
    return vectors


def cosine(a, b):
    if len(a) != len(b):
        raise ValueError("Vector dimensions do not match")
    denominator = math.sqrt(sum(x*x for x in a) * sum(y*y for y in b))
    if not denominator:
        raise ValueError("Cannot compare a zero vector")
    return sum(x*y for x, y in zip(a, b)) / denominator


vectors = embed([document["text"] for document in documents])
query_vector = embed([query])[0]
ranked = sorted(
    ((cosine(query_vector, vector), document["id"])
     for document, vector in zip(documents, vectors)),
    reverse=True,
)
for score, document_id in ranked:
    print(document_id, round(score, 4))

Jalankan python search_demo.py. Pastikan ketiga ID muncul satu kali dan setiap embedding memiliki panjang yang dikonfigurasi. Kemudian ubah kueri agar menanyakan tentang faktur. Ini adalah uji asap alur data, bukan bukti bahwa sistem siap untuk lalu lintas dukungan nyata. Contoh ini melakukan embedding korpus kembali pada setiap eksekusi demi kejelasan; layanan yang diterapkan biasanya harus menyimpan vektor dokumen secara persisten dan hanya melakukan embedding pada konten baru atau yang berubah.

Ubah demo menjadi indeks dokumen yang andal

Tata letak rekaman berikut adalah titik awal yang praktis. Ini adalah contoh desain aplikasi, bukan skema bidang yang diwajibkan oleh OpenAI.

Simpan bersama setiap chunkMengapa ini penting
document_id dan chunk_idPerbarui atau hapus konten yang tepat tanpa bergantung pada urutan array.
URL sumber, judul bagian, dan revisi sumberTampilkan sitasi yang berguna dan lacak jawaban yang kedaluwarsa.
Hash konten dan versi pemrosesanIdentifikasi chunk mana yang benar-benar perlu di-embed ulang.
Model dan jumlah dimensiMencegah tercampurnya konfigurasi vektor yang tidak kompatibel secara tidak sengaja.
Metadata tenant dan kontrol aksesFilter pengambilan ke dokumen yang boleh diakses oleh pengguna yang meminta.
Teks dan embeddingKembalikan bagian sumber setelah memilih vektornya.

Pisahkan dokumen pada batas yang bermakna, lalu periksa panjang token. Bagian yang berisi jawaban atas pertanyaan harus tetap dapat dipahami ketika diambil secara terpisah. Evaluasi tumpang tindih secara sengaja: tumpang tindih berlebihan dapat memenuhi kumpulan hasil dengan versi berulang dari bagian yang sama.

Untuk eksperimen pertama, loop dalam memori di atas sudah cukup. Seiring korpus bertambah, gunakan indeks atau penyimpanan vektor yang mendukung perilaku pemfilteran, penghapusan, dan pengambilan yang Anda perlukan. Uji operasi tersebut sebelum mengandalkan skor kemiripan. Bagian yang sangat mirip dari pelanggan yang salah tidak boleh pernah dikembalikan hanya karena menempati peringkat pertama.

Periksa batas input dan batch secara terpisah

Referensi endpoint OpenAI saat ini menetapkan maksimum 8.192 token per input dan maksimum agregat 300.000 token di seluruh input dalam satu permintaan; referensi tersebut juga mendokumentasikan maksimum 2.048 input batch. Teks kosong tidak valid. Hitung token, bukan karakter, dan sisakan ruang di bawah batas saat menyusun batch. Batasan endpoint.

Jika Anda menggunakan Azure OpenAI, konfigurasi endpoint, autentikasi, dan penamaan deployment memiliki pengaturannya sendiri. Ikuti petunjuk embedding Azure untuk layanan tersebut alih-alih mengasumsikan bahwa permintaan OpenAI langsung dapat disalin tanpa perubahan. Terapkan pemisahan yang sama saat menggunakan gateway: periksa terlebih dahulu endpoint, akses model, parameter yang didukung, dan akun penagihannya.

Perkirakan biaya tanpa menyembunyikan pembangunan ulang indeks

Biaya embedding mengikuti token input, jadi hitung ingestion dokumen, chunk yang berubah, dan embedding kueri secara terpisah. Gunakan harga saat ini dari halaman model yang relevan, seperti text-embedding-3-small, dan konfirmasikan apakah tarif yang dikutip berlaku untuk mode permintaan Anda.

Untuk contoh perencanaan, misalkan P adalah harga terverifikasi Anda per satu juta token input:

Ingestion awal: 50.000 chunk × 400 token = 20 juta token
Perubahan bulanan: 5.000 chunk × 400 token =  2 juta token
Kueri bulanan:  200.000 kueri × 20 token =  4 juta token

Biaya embedding awal = 20 × P
Biaya embedding berulang = (2 + 4) × P = 6 × P

Itu adalah asumsi beban kerja ilustratif, bukan harga Flatkey atau OpenAI. Tambahkan penyimpanan vektor, infrastruktur pencarian, dan panggilan pembuatan jawaban secara terpisah. Jika Anda mengubah model embedding, sertakan proses embedding ulang penuh dalam anggaran migrasi. Pipeline yang meng-embed ulang dokumen yang tidak berubah dapat menghabiskan biaya lebih besar daripada beban kerja yang sama dengan model lebih besar tetapi di-cache dengan benar.

Diagnosis kesalahan sebelum menambahkan percobaan ulang

GejalaPemeriksaan awal yang berguna
Kesalahan autentikasiKonfirmasikan bahwa kunci valid untuk endpoint dan akun yang Anda panggil.
Permintaan tidak validPeriksa isi kesalahan, string kosong, jumlah token, dan parameter yang didukung.
Kesalahan batas laju atau kuotaBedakan tekanan laju permintaan dari kuota akun yang habis.
Kesalahan server sementara atau waktu habisSimpan pengenal permintaan dan gunakan perilaku percobaan ulang yang dibatasi.
Kesalahan dimensi penyimpanan vektorBandingkan konfigurasi koleksi dengan panjang vektor aktual yang dikembalikan.
Hasil masuk akal tetapi tidak relevanPeriksa teks chunk, konsistensi model, dan contoh kueri sebelum menyalahkan jaringan.

Empat pemeriksaan pertama mengikuti panduan kesalahan OpenAI. Dua yang terakhir berkaitan dengan aplikasi dan indeks Anda. Patuhi panduan percobaan ulang dari server dan perhitungkan percobaan ulang SDK sebelum menambahkan loop percobaan ulang lain. Catat metadata operasional tanpa merekam kredensial atau teks dokumen pribadi yang tidak diperlukan.

Evaluasi pengambilan sebelum memilih model penjawab

Buat kumpulan kecil berlabel dari pertanyaan pengguna nyata, termasuk parafrasa, nama produk yang tepat, pertanyaan ambigu, dan pertanyaan yang tidak dapat dijawab oleh korpus Anda. Tuliskan dokumen sumber yang diharapkan untuk setiap kueri yang dapat dijawab sebelum menyetel sistem.

Untuk setiap konfigurasi kandidat, catat apakah sumber yang dapat diterima muncul dalam beberapa hasil pertama, seberapa banyak materi duplikat yang dikembalikan, latensi pengambilan, dan biaya per kueri. Tinjau setiap kegagalan secara individual. Jika kueri meminta kode kesalahan yang tepat, pencocokan kata kunci dapat melengkapi kemiripan semantik. Jika sumber tidak ada, mengubah dimensi embedding tidak dapat menciptakannya.

Simpan sebagian pertanyaan sebagai set terpisah untuk perbandingan akhir. Jangan memilih ambang kemiripan dari demo tiga dokumen dan memperlakukannya sebagai skor kepercayaan universal. Uji penerimaan yang berguna mencerminkan konsekuensi pengambilan yang salah dalam aplikasi Anda sendiri.

Peran Flatkey dalam aplikasi

Flatkey menyediakan router model yang kompatibel dengan OpenAI dan direktori model terkini. Gunakan dokumentasi integrasi Flatkey untuk mengevaluasi sisi pembuatan model dari aplikasi Anda. Contoh di atas memanggil OpenAI secara langsung; contoh tersebut tidak membuktikan bahwa model embedding atau setiap parameter embeddings tersedia melalui Flatkey.

Untuk aplikasi multi-penyedia, pertahankan konfigurasi pengambilan terpisah dari konfigurasi model penjawab Anda. Hal itu memungkinkan Anda membandingkan model penjawab tanpa membangun ulang indeks dokumen untuk setiap eksperimen. Tinjau panduan arsitektur API Flatkey saat merencanakan perutean, kontrol akun, dan pemeriksaan operasional.

Pertanyaan yang sering diajukan

Apakah API embeddings dapat menjawab pertanyaan dengan sendirinya?

API ini mengembalikan vektor. Aplikasi Anda menggunakannya untuk memilih konten terkait; model penjawab adalah komponen terpisah jika Anda memerlukan respons tertulis.

Dapatkah saya membandingkan vektor dari model embedding yang berbeda?

Jangan berasumsi bahwa vektor tersebut berbagi ruang koordinat yang bermakna, meskipun dimensinya sama. Pertahankan indeks khusus model dan evaluasi migrasi menggunakan pertanyaan serta dokumen sumber yang sama.

Haruskah saya langsung memilih model embedding terbesar?

Mulailah dari konfigurasi yang dapat Anda ukur. Bandingkan kualitas pengambilan, latensi, penyimpanan, dan biaya pada kueri Anda sendiri sebelum menerima indeks yang lebih besar atau model yang berbeda.

Apa yang sebaiknya saya bangun terlebih dahulu?

Gunakan Open AI embeddings API untuk menyematkan korpus kecil yang aman dari sisi izin, memverifikasi pemetaan dokumen-ke-vektor, dan menguji pengambilan dengan pertanyaan berlabel. Perluas korpus setelah siklus tersebut menghasilkan bukti yang andal.