
Tutorial API Text-Embedding-3-Small - Panduan Model Embedding OpenAI
Sedang membina enjin carian semantik atau sistem RAG (Retrieval-Augmented Generation)? Text-embedding-3-small ialah model embedding terbaru OpenAI yang menukar teks kepada vektor berangka, membolehkan carian persamaan dan pengambilan kandungan yang berkuasa.
Dalam panduan ini, anda akan belajar:
- Apa itu embedding teks dan mengapa ia penting
- Cara menggunakan API text-embedding-3-small
- Contoh kod lengkap dalam Python dan Node.js
- Dimensi tersuai untuk pengoptimuman storan
- Perbandingan harga dan pengoptimuman kos
Apa itu Text-Embedding-3-Small?#
Text-embedding-3-small ialah model embedding padat OpenAI yang dikeluarkan pada Januari 2024. Ia menukar teks kepada vektor 1536 dimensi yang menangkap makna semantik, membolehkan:
- Carian Semantik: Cari dokumen berkaitan berdasarkan makna, bukan hanya kata kunci
- Sistem RAG: Mengambil konteks untuk respons LLM
- Pemadanan Persamaan: Bandingkan persamaan teks untuk cadangan
- Pengelompokan (Clustering): Kumpulkan dokumen yang serupa
- Klasifikasi: Mengkategorikan teks berdasarkan kandungan
Spesifikasi Model#
| Spesifikasi | Nilai |
|---|---|
| Nama Model | text-embedding-3-small |
| Dimensi Lalai | 1536 |
| Dimensi Tersuai | 256, 512, 1024, 1536 |
| Maks Token Input | 8,191 |
| Output | Vektor ternormal |
Mula Pantas#
Prasyarat#
- Daftar di Crazyrouter
- Dapatkan kunci API anda dari papan pemuka
- Python 3.8+ atau Node.js 16+
Contoh Python#
from openai import OpenAI
client = OpenAI(
api_key="your-crazyrouter-api-key",
base_url="https://crazyrouter.com/v1"
)
# Jana embedding untuk satu teks
response = client.embeddings.create(
model="text-embedding-3-small",
input="Machine learning is transforming industries worldwide."
)
embedding = response.data[0].embedding
print(f"Dimensions: {len(embedding)}") # Output: 1536
print(f"First 5 values: {embedding[:5]}")
Contoh Node.js#
import OpenAI from 'openai';
const client = new OpenAI({
apiKey: 'your-crazyrouter-api-key',
baseURL: 'https://crazyrouter.com/v1'
});
async function getEmbedding(text) {
const response = await client.embeddings.create({
model: 'text-embedding-3-small',
input: text
});
return response.data[0].embedding;
}
// Usage
const embedding = await getEmbedding('Machine learning is amazing');
console.log(`Dimensions: ${embedding.length}`); // Output: 1536
Contoh cURL#
curl -X POST https://crazyrouter.com/v1/embeddings \
-H "Authorization: Bearer your-api-key" \
-H "Content-Type: application/json" \
-d '{
"model": "text-embedding-3-small",
"input": "Hello world"
}'
Respons:
{
"object": "list",
"model": "text-embedding-3-small",
"usage": {
"prompt_tokens": 2,
"total_tokens": 2
},
"data": [
{
"object": "embedding",
"index": 0,
"embedding": [-0.0020785425, -0.049085874, 0.02094679, ...]
}
]
}
Embedding Berkelompok (Batch)#
Proses berbilang teks dalam satu panggilan API untuk kecekapan yang lebih baik:
from openai import OpenAI
client = OpenAI(
api_key="your-crazyrouter-api-key",
base_url="https://crazyrouter.com/v1"
)
# Embedding berkelompok - banyak teks serentak
texts = [
"Python is a programming language",
"JavaScript runs in browsers",
"Machine learning uses neural networks"
]
response = client.embeddings.create(
model="text-embedding-3-small",
input=texts
)
# Akses setiap embedding
for i, data in enumerate(response.data):
print(f"Text {i}: {len(data.embedding)} dimensions")
# Output:
# Text 0: 1536 dimensions
# Text 1: 1536 dimensions
# Text 2: 1536 dimensions
Dimensi Tersuai#
Kurangkan kos storan dengan menggunakan dimensi lebih kecil. Model ini menyokong pengurangan dimensi sambil mengekalkan kualiti:
# Guna 512 dimensi dan bukannya 1536
response = client.embeddings.create(
model="text-embedding-3-small",
input="Your text here",
dimensions=512 # Options: 256, 512, 1024, 1536
)
embedding = response.data[0].embedding
print(f"Dimensions: {len(embedding)}") # Output: 512
Perbandingan Dimensi#
| Dimensi | Storan (per vektor) | Kes Penggunaan |
|---|---|---|
| 256 | 1 KB | Aplikasi mudah alih, storan terhad |
| 512 | 2 KB | Prestasi seimbang |
| 1024 | 4 KB | Keperluan ketepatan tinggi |
| 1536 | 6 KB | Ketepatan maksimum |
Membina Sistem Carian Semantik#
Berikut contoh lengkap membina sistem carian semantik:
import numpy as np
from openai import OpenAI
client = OpenAI(
api_key="your-crazyrouter-api-key",
base_url="https://crazyrouter.com/v1"
)
def get_embedding(text):
"""Get embedding for a single text"""
response = client.embeddings.create(
model="text-embedding-3-small",
input=text
)
return response.data[0].embedding
def cosine_similarity(a, b):
"""Calculate cosine similarity between two vectors"""
return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))
# Pangkalan data dokumen
documents = [
"Python is great for data science and machine learning",
"JavaScript is essential for web development",
"Docker containers simplify deployment",
"Kubernetes orchestrates container workloads",
"PostgreSQL is a powerful relational database"
]
# Pra-kira embedding untuk semua dokumen
doc_embeddings = [get_embedding(doc) for doc in documents]
# Fungsi carian
def search(query, top_k=3):
query_embedding = get_embedding(query)
# Kira persamaan
similarities = [
cosine_similarity(query_embedding, doc_emb)
for doc_emb in doc_embeddings
]
# Dapatkan keputusan teratas
results = sorted(
zip(documents, similarities),
key=lambda x: x[1],
reverse=True
)[:top_k]
return results
# Contoh carian
results = search("How to deploy applications?")
for doc, score in results:
print(f"Score: {score:.4f} - {doc}")
# Output:
# Score: 0.8234 - Docker containers simplify deployment
# Score: 0.7891 - Kubernetes orchestrates container workloads
# Score: 0.6543 - PostgreSQL is a powerful relational database
Integrasi dengan Pangkalan Data Vektor#
Integrasi Pinecone#
import pinecone
from openai import OpenAI
# Inisialisasi klien
client = OpenAI(
api_key="your-crazyrouter-api-key",
base_url="https://crazyrouter.com/v1"
)
pinecone.init(api_key="your-pinecone-key")
index = pinecone.Index("your-index")
def embed_and_upsert(texts, ids):
"""Embed texts and store in Pinecone"""
response = client.embeddings.create(
model="text-embedding-3-small",
input=texts
)
vectors = [
(id, data.embedding)
for id, data in zip(ids, response.data)
]
index.upsert(vectors=vectors)
def search_pinecone(query, top_k=5):
"""Search Pinecone with query embedding"""
response = client.embeddings.create(
model="text-embedding-3-small",
input=query
)
results = index.query(
vector=response.data[0].embedding,
top_k=top_k
)
return results
Integrasi ChromaDB#
import chromadb
from openai import OpenAI
client = OpenAI(
api_key="your-crazyrouter-api-key",
base_url="https://crazyrouter.com/v1"
)
# Inisialisasi ChromaDB
chroma_client = chromadb.Client()
collection = chroma_client.create_collection("documents")
def get_embeddings(texts):
"""Get embeddings for multiple texts"""
response = client.embeddings.create(
model="text-embedding-3-small",
input=texts
)
return [data.embedding for data in response.data]
# Tambah dokumen
documents = ["doc1 content", "doc2 content", "doc3 content"]
embeddings = get_embeddings(documents)
collection.add(
embeddings=embeddings,
documents=documents,
ids=["doc1", "doc2", "doc3"]
)
# Query
query_embedding = get_embeddings(["search query"])[0]
results = collection.query(
query_embeddings=[query_embedding],
n_results=3
)
Model Embedding yang Tersedia#
Crazyrouter menyediakan akses kepada pelbagai model embedding OpenAI:
| Model | Dimensi | Nisbah Harga | Terbaik Untuk |
|---|---|---|---|
text-embedding-3-small | 1536 | 0.01 | Kegunaan umum, nilai terbaik |
text-embedding-3-large | 3072 | 0.065 | Keperluan ketepatan tinggi |
text-embedding-ada-002 | 1536 | 0.05 | Keserasian legasi |
Perbandingan Harga#
| Penyedia | Model | Harga per 1M token |
|---|---|---|
| OpenAI Official | text-embedding-3-small | $0.020 |
| Crazyrouter | text-embedding-3-small | $0.002 |
| OpenAI Official | text-embedding-3-large | $0.130 |
| Crazyrouter | text-embedding-3-large | $0.013 |
Penafian Harga: Harga yang ditunjukkan adalah untuk demonstrasi dan mungkin berubah. Pengebilan sebenar adalah berdasarkan harga masa nyata ketika permintaan dibuat.
Contoh Penjimatan Kos:
Untuk sistem RAG yang memproses 10M token/bulan:
- OpenAI Official: $200/bulan
- Crazyrouter: $20/bulan
- Penjimatan: 90%
Amalan Terbaik#
1. Kelompokkan Permintaan Anda#
# Baik - satu panggilan API untuk banyak teks
response = client.embeddings.create(
model="text-embedding-3-small",
input=["text1", "text2", "text3"] # Up to 2048 texts
)
# Tidak baik - banyak panggilan API
for text in texts:
response = client.embeddings.create(
model="text-embedding-3-small",
input=text
)
2. Cache Embedding#
import hashlib
import json
embedding_cache = {}
def get_embedding_cached(text):
# Cipta kekunci cache
cache_key = hashlib.md5(text.encode()).hexdigest()
if cache_key in embedding_cache:
return embedding_cache[cache_key]
response = client.embeddings.create(
model="text-embedding-3-small",
input=text
)
embedding = response.data[0].embedding
embedding_cache[cache_key] = embedding
return embedding
3. Guna Dimensi yang Sesuai#
- 256 dimensi: Aplikasi mudah alih, peranti IoT
- 512 dimensi: Aplikasi web dengan kekangan storan
- 1024 dimensi: Aplikasi standard
- 1536 dimensi: Keperluan ketepatan maksimum
Soalan Lazim#
Apa perbezaan antara text-embedding-3-small dan text-embedding-3-large?#
Text-embedding-3-small menghasilkan vektor 1536 dimensi dan dioptimumkan untuk kecekapan kos. Text-embedding-3-large menghasilkan vektor 3072 dimensi dengan ketepatan lebih tinggi tetapi pada kos 6.5x lebih mahal. Untuk kebanyakan aplikasi, text-embedding-3-small memberikan hasil yang sangat baik.
Bolehkah saya mengurangkan dimensi selepas menjana embedding?#
Ya, anda boleh menggunakan parameter dimensions untuk menjana vektor yang lebih kecil secara terus. Ini lebih cekap berbanding menjana vektor penuh dan memotongnya.
Berapa banyak teks yang boleh saya embed dalam satu permintaan?#
Anda boleh embed sehingga 2048 teks dalam satu permintaan API. Untuk set data besar, kelompokkan permintaan anda dalam kumpulan 2048.
Adakah embedding telah dinormalkan?#
Ya, text-embedding-3-small mengembalikan vektor ternormal (panjang unit), jadi anda boleh menggunakan hasil darab titik (dot product) sebagai ganti persamaan kosinus untuk pengiraan yang lebih pantas.
Mula Menggunakan#
- Daftar di Crazyrouter
- Dapatkan kunci API anda dari papan pemuka
- Pasang SDK:
pip install openaiataunpm install openai - Mula membuat embedding dengan contoh kod di atas
Artikel Berkaitan:
Untuk sebarang pertanyaan, hubungi support@crazyrouter.com


