
บทช่วยสอน Text-Embedding-3-Small API - คู่มือโมเดล Embedding ของ OpenAI
กำลังจะสร้าง search engine แบบ semantic หรือระบบ RAG (Retrieval-Augmented Generation) อยู่ใช่ไหม? Text-embedding-3-small คือโมเดล embedding รุ่นล่าสุดของ OpenAI ที่แปลงข้อความให้เป็นเวกเตอร์ตัวเลข เพื่อให้สามารถทำ similarity search และดึงข้อมูลที่เกี่ยวข้องได้อย่างทรงพลัง
ในคู่มือนี้ คุณจะได้เรียนรู้:
- Text embeddings คืออะไร และทำไมถึงสำคัญ
- วิธีใช้ text-embedding-3-small API
- ตัวอย่างโค้ดแบบครบถ้วนใน Python และ Node.js
- การกำหนดจำนวนมิติเองเพื่อปรับแต่งการใช้พื้นที่จัดเก็บ
- การเปรียบเทียบราคาและการปรับให้คุ้มต้นทุน
What is Text-Embedding-3-Small?#
Text-embedding-3-small เป็นโมเดล embedding ขนาดกะทัดรัดของ OpenAI ที่เปิดตัวในเดือนมกราคม 2024 แปลงข้อความให้เป็นเวกเตอร์ 1536 มิติที่สะท้อนความหมายเชิงความหมาย (semantic meaning) เพื่อให้สามารถ:
- Semantic Search: ค้นหาเอกสารที่เกี่ยวข้องจาก “ความหมาย” ไม่ใช่แค่คำค้น
- RAG Systems: ดึงบริบทมาใช้กับการตอบของ LLM
- Similarity Matching: เปรียบเทียบความคล้ายของข้อความเพื่อแนะนำหรือจับคู่
- Clustering: จัดกลุ่มเอกสารที่มีความคล้ายกัน
- Classification: จัดประเภทข้อความตามเนื้อหา
Model Specifications#
| Specification | Value |
|---|---|
| Model Name | text-embedding-3-small |
| Default Dimensions | 1536 |
| Custom Dimensions | 256, 512, 1024, 1536 |
| Max Input Tokens | 8,191 |
| Output | Normalized vector |
Quick Start#
Prerequisites#
- สมัครใช้งานที่ Crazyrouter
- รับ API key จากแดชบอร์ด
- ใช้ Python 3.8+ หรือ Node.js 16+ ขึ้นไป
Python Example#
from openai import OpenAI
client = OpenAI(
api_key="your-crazyrouter-api-key",
base_url="https://crazyrouter.com/v1"
)
# Generate embedding for a single text
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]}")
Node.js Example#
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
cURL Example#
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"
}'
Response:
{
"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, ...]
}
]
}
Batch Embedding#
ประมวลผลข้อความหลายรายการในคำขอ API เดียวเพื่อประสิทธิภาพที่ดียิ่งขึ้น:
from openai import OpenAI
client = OpenAI(
api_key="your-crazyrouter-api-key",
base_url="https://crazyrouter.com/v1"
)
# Batch embedding - multiple texts at once
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
)
# Access each 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
Custom Dimensions#
ลดต้นทุนพื้นที่จัดเก็บด้วยการใช้จำนวนมิติที่น้อยลง โมเดลรองรับการลดมิติ โดยยังคงคุณภาพได้ดี:
# Use 512 dimensions instead of 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
Dimension Comparison#
| Dimensions | Storage (per vector) | Use Case |
|---|---|---|
| 256 | 1 KB | แอปมือถือ, พื้นที่จัดเก็บจำกัด |
| 512 | 2 KB | สมดุลระหว่างประสิทธิภาพและขนาด |
| 1024 | 4 KB | ความแม่นยำสูง |
| 1536 | 6 KB | ความแม่นยำสูงสุด |
Building a Semantic Search System#
ตัวอย่างครบถ้วนของการสร้างระบบ semantic search:
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))
# Document database
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"
]
# Pre-compute embeddings for all documents
doc_embeddings = [get_embedding(doc) for doc in documents]
# Search function
def search(query, top_k=3):
query_embedding = get_embedding(query)
# Calculate similarities
similarities = [
cosine_similarity(query_embedding, doc_emb)
for doc_emb in doc_embeddings
]
# Get top results
results = sorted(
zip(documents, similarities),
key=lambda x: x[1],
reverse=True
)[:top_k]
return results
# Example search
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
Integration with Vector Databases#
Pinecone Integration#
import pinecone
from openai import OpenAI
# Initialize clients
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
ChromaDB Integration#
import chromadb
from openai import OpenAI
client = OpenAI(
api_key="your-crazyrouter-api-key",
base_url="https://crazyrouter.com/v1"
)
# Initialize 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]
# Add documents
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
)
Available Embedding Models#
Crazyrouter ให้คุณเข้าถึงโมเดล embedding ของ OpenAI ได้หลายรุ่น:
| Model | Dimensions | Price Ratio | Best For |
|---|---|---|---|
text-embedding-3-small | 1536 | 0.01 | การใช้งานทั่วไป คุ้มค่าที่สุด |
text-embedding-3-large | 3072 | 0.065 | งานที่ต้องการความแม่นยำสูงมาก |
text-embedding-ada-002 | 1536 | 0.05 | ความเข้ากันได้กับระบบเดิม (legacy) |
Pricing Comparison#
| Provider | Model | Price per 1M tokens |
|---|---|---|
| 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 |
Pricing Disclaimer: ราคาที่แสดงใช้เพื่อการสาธิตเท่านั้นและอาจมีการเปลี่ยนแปลง การคิดค่าบริการจริงจะอ้างอิงจากราคาปัจจุบันในขณะทำรายการ
ตัวอย่างการประหยัดต้นทุน:
สำหรับระบบ RAG ที่ประมวลผล 10M tokens ต่อเดือน:
- OpenAI Official: $200/เดือน
- Crazyrouter: $20/เดือน
- ประหยัด: 90%
Best Practices#
1. Batch Your Requests#
# Good - single API call for multiple texts
response = client.embeddings.create(
model="text-embedding-3-small",
input=["text1", "text2", "text3"] # Up to 2048 texts
)
# Bad - multiple API calls
for text in texts:
response = client.embeddings.create(
model="text-embedding-3-small",
input=text
)
2. Cache Embeddings#
import hashlib
import json
embedding_cache = {}
def get_embedding_cached(text):
# Create cache key
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. Use Appropriate Dimensions#
- 256 dimensions: แอปมือถือ, อุปกรณ์ IoT
- 512 dimensions: เว็บแอปที่มีข้อจำกัดด้านพื้นที่จัดเก็บ
- 1024 dimensions: แอปพลิเคชันทั่วไป
- 1536 dimensions: งานที่ต้องการความแม่นยำสูงสุด
Frequently Asked Questions#
What's the difference between text-embedding-3-small and text-embedding-3-large?#
Text-embedding-3-small สร้างเวกเตอร์ขนาด 1536 มิติ และถูกปรับให้คุ้มค่าด้านต้นทุน ในขณะที่ text-embedding-3-large สร้างเวกเตอร์ขนาด 3072 มิติ ให้ความแม่นยำสูงกว่า แต่มีค่าใช้จ่ายมากกว่าประมาณ 6.5 เท่า สำหรับงานส่วนใหญ่ text-embedding-3-small ให้ผลลัพธ์ที่ยอดเยี่ยมเพียงพอ
Can I reduce dimensions after generating embeddings?#
ได้ คุณสามารถใช้พารามิเตอร์ dimensions เพื่อสร้างเวกเตอร์ที่มีมิติน้อยลงตั้งแต่แรก วิธีนี้มีประสิทธิภาพกว่าการสร้างเวกเตอร์เต็มแล้วค่อยตัดทอนภายหลัง
How many texts can I embed in one request?#
คุณสามารถ embed ข้อความได้สูงสุด 2048 รายการในคำขอ API เดียว สำหรับชุดข้อมูลขนาดใหญ่ ควรแบ่งเป็น batch ละไม่เกิน 2048 รายการ
Are the embeddings normalized?#
ใช่ text-embedding-3-small จะคืนค่าเวกเตอร์ที่ normalize แล้ว (ความยาวเวกเตอร์เป็น 1) ดังนั้นคุณสามารถใช้ dot product แทน cosine similarity เพื่อคำนวณได้เร็วขึ้น
Getting Started#
- สมัครใช้งาน ที่ Crazyrouter
- รับ API key ของคุณ จากแดชบอร์ด
- ติดตั้ง SDK:
pip install openaiหรือnpm install openai - เริ่มสร้าง embeddings ด้วยโค้ดตัวอย่างด้านบน
Related Articles:
หากมีคำถาม ติดต่อได้ที่ support@crazyrouter.com


