Текст в вектор. Нужно там, где сравнивают смысл, а не слова: поиск по базе знаний, дедупликация тикетов, кластеризация отзывов.
resp = client.embeddings.create(
model="openai/text-embedding-3-small",
input=["Как отозвать ключ?", "Где посмотреть расход?"],
)
for item in resp.data:
print(item.index, len(item.embedding))Поле input принимает и строку, и массив строк. Батч дешевле и быстрее: один запрос на 256 текстов вместо 256 запросов экономит и время на сетевых обменах, и место в лимите RPM.
{
"object": "list",
"model": "openai/text-embedding-3-small",
"data": [
{"object": "embedding", "index": 0, "embedding": [0.0123, -0.0456, …]},
{"object": "embedding", "index": 1, "embedding": [0.0311, -0.0092, …]}
],
"usage": {"prompt_tokens": 18, "total_tokens": 18}
}Порядок в data совпадает с порядком входа, но полагаться лучше на поле index: оно для того и есть.
Часть моделей позволяет укоротить вектор параметром dimensions. Короткий вектор занимает меньше места в индексе и быстрее сравнивается, качество падает не пропорционально — часто это выгодный обмен.
| Что | Значение |
|---|---|
| Размерность по умолчанию | задаётся моделью, обычно 1536 |
| dimensions | укоротить вектор; поддерживают не все модели |
| Нормализация | векторы возвращаются нормированными — косинус равен скалярному произведению |
| Максимум на вход | предел контекста модели; длинный текст режьте на куски сами |