Эмбеддинги: базовое использование
Получаем векторные представления текста через OpenAI API. Разбираем модель text-embedding-3-small, экспоненциальный backoff с tenacity и лучшие практики батч-обработки.
Напишите функцию get_embedding с @retry, получите эмбеддинги для 5 разных фраз и посчитайте косинусное сходство между ними. Сравните семантически близкие и далёкие пары.
Скопируйте и адаптируйте под свой контекст. Текст в треугольных скобках — то, что нужно заменить.
from tenacity import retry, wait_random_exponential, stop_after_attempt
from openai import OpenAI
import numpy as np
client = OpenAI()
@retry(wait=wait_random_exponential(min=1, max=20), stop=stop_after_attempt(6))
def get_embedding(text: str, model="text-embedding-3-small") -> list[float]:
return client.embeddings.create(
input=[text], model=model
).data[0].embedding
def cosine_similarity(a, b):
return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))
texts = [
"The cat sat on the mat",
"A feline rested on the rug",
"Python is a programming language",
]
embeddings = [get_embedding(t) for t in texts]
print(cosine_similarity(embeddings[0], embeddings[1])) # ~0.92
print(cosine_similarity(embeddings[0], embeddings[2])) # ~0.6Вызывать API в цикле без retry — первый rate limit обрывает работу. Не кешировать эмбеддинги — каждый пересчёт стоит денег. Сравнивать вектора разных моделей — размерности несовместимы.
Передавайте список строк в input сразу батчем — один API-вызов вместо N. Используйте pickle или .parquet для кеша эмбеддингов на диске.
Любая задача семантического сравнения текста: поиск, классификация, рекомендации, дедупликация.
Точное лексическое совпадение — используйте BM25. Структурированные данные с числовыми признаками — классический ML эффективнее.