POST
/api/ai/v1/embeddings
نیازمند کلید API
امبدینگ، متن را به برداری از اعداد تبدیل میکند که معنای آن را نمایندگی میکند؛ پایهٔ جستجوی معنایی، دستهبندی، خوشهبندی و RAG (پاسخگویی بر اساس اسناد شما). هزینه فقط بر اساس توکنهای ورودی محاسبه میشود و مدلهای امبدینگ بسیار ارزاناند.
درخواست
res = client.embeddings.create(
model="text-embedding-3-small",
input=["خرید اکانت ChatGPT Plus", "اشتراک Claude Pro", "شارژ کیف پول"],
)
vectors = [d.embedding for d in res.data]
print(len(vectors), "بردار با", len(vectors[0]), "بُعد —", res.usage.total_tokens, "توکن")
const res = await client.embeddings.create({
model: "text-embedding-3-small",
input: ["خرید اکانت ChatGPT Plus", "اشتراک Claude Pro", "شارژ کیف پول"],
});
const vectors = res.data.map((d) => d.embedding);
console.log(vectors.length, "بردار —", res.usage.total_tokens, "توکن");
curl https://netarz.ir/api/ai/v1/embeddings \
-H "Authorization: Bearer $NETARZ_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model": "text-embedding-3-small", "input": ["خرید اکانت ChatGPT Plus", "اشتراک Claude Pro"]}'
{
"object": "list",
"data": [
{ "object": "embedding", "index": 0, "embedding": [0.0123, -0.0456, 0.0789, "…"] },
{ "object": "embedding", "index": 1, "embedding": [0.0311, -0.0022, 0.0154, "…"] }
],
"model": "text-embedding-3-small",
"usage": { "prompt_tokens": 18, "total_tokens": 18 }
}
پارامترها
| پارامتر | توضیح |
|---|---|
model الزامی | یک مدل از نوع امبدینگ؛ مثلاً text-embedding-3-small، text-embedding-3-large، gemini-embedding-001 یا gemini-embedding-2؛ و از راه OpenRouter مدلهایی مثل openrouter/voyageai/voyage-4 و openrouter/qwen/qwen3-embedding-8b. فهرست |
input الزامی | یک رشته یا آرایهای از رشتهها (چند متن در یک درخواست ارزانتر و سریعتر است). |
dimensions | کوتاهکردن بردار خروجی (در مدلهای text-embedding-3 و Gemini) برای صرفهجویی در فضای ذخیرهسازی. |
encoding_format | float (پیشفرض) یا base64. |
نمونهٔ کامل: جستجوی معنایی + RAG
import numpy as np
from openai import OpenAI
client = OpenAI(base_url="https://netarz.ir/api/ai/v1", api_key="sk-ntz-v1-...")
EMB = "text-embedding-3-small"
# ۱) اسناد خود را یک بار بردار کنید و ذخیره کنید (پایگاهدادهٔ برداری، pgvector، یا حتی یک فایل)
docs = [
"سفارشهای دیجیتال بلافاصله پس از پرداخت تحویل داده میشوند.",
"کشبک هر خرید هفت روز بعد از تکمیل سفارش آزاد میشود.",
"برای خرید سازمانی فاکتور رسمی صادر میشود.",
]
doc_vectors = np.array([d.embedding for d in client.embeddings.create(model=EMB, input=docs).data])
def search(question: str, k: int = 2) -> list[str]:
q = np.array(client.embeddings.create(model=EMB, input=question).data[0].embedding)
scores = doc_vectors @ q / (np.linalg.norm(doc_vectors, axis=1) * np.linalg.norm(q)) # شباهت کسینوسی
return [docs[i] for i in scores.argsort()[::-1][:k]]
# ۲) پاسخ را با همان کلید از یک مدل گفتوگو بگیرید (RAG)
question = "کشبک کی به حسابم میآید؟"
context = "\n".join(search(question))
answer = client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{"role": "system", "content": f"فقط بر اساس این اطلاعات پاسخ بدهید:\n{context}"},
{"role": "user", "content": question},
],
max_tokens=150,
)
print(answer.choices[0].message.content)
نکات
- برای پرسش و اسناد از یک مدل استفاده کنید؛ بردارهای مدلهای مختلف با هم قابل مقایسه نیستند.
- حداکثر طول ورودی هر مدل در
context_lengthفهرست مدلها آمده (مثلاً ۸۱۹۱ توکن برای text-embedding-3). متنهای بلند را تکهتکه کنید. - تعداد ابعاد بردار در
capabilities.dimensionsآمده است. - برای فارسی،
text-embedding-3-largeو مدلهای Gemini Embedding کیفیت بهتری نسبت بهtext-embedding-ada-002دارند.