Эмбеддинг — числовой вектор, представляющий текст. Похожие по смыслу тексты получают близкие векторы. Это основа семантического поиска в RAG-системах.
Аналогия
Представь пространство с координатами. Каждое слово — точка:
- «кот» и «кошка» — почти в одном месте
- «кот» и «автомобиль» — далеко друг от друга
- «Python» и «программирование» — рядом
Эмбеддинг — это и есть координаты в таком пространстве, только с сотнями измерений.
Как ChromaDB создаёт эмбеддинги
ChromaDB автоматически создаёт эмбеддинги при add() через встроенную модель all-MiniLM-L6-v2:
import chromadb
collection = chromadb.PersistentClient("./db").get_or_create_collection("docs")
# ChromaDB сам считает эмбеддинги для каждого текста
collection.add(
documents=["Python — язык программирования", "Кот сидит на диване"],
ids=["doc_0", "doc_1"]
)
# При поиске вопрос тоже превращается в эмбеддинг
results = collection.query(
query_texts=["Как начать программировать?"],
n_results=1
)
# Вернёт "Python — язык программирования" как ближайший по смыслу
Косинусное расстояние
ChromaDB использует косинусное расстояние (0 до 2):
distance = 0.0 → тексты идентичны
distance = 0.3 → очень похожи (релевантность ~70%)
distance = 0.7 → слабая связь
distance = 2.0 → противоположные по смыслу
results = collection.query(query_texts=["вопрос"], n_results=5, include=["distances"])
for dist in results["distances"][0]:
relevance = 1 - dist
print(f"Релевантность: {relevance:.1%}")
Почему не обычный поиск по словам?
Вопрос: "Как написать функцию?"
Текст: "def позволяет объявить подпрограмму в Python"
При поиске по словам — нет совпадений. При семантическом поиске — высокая релевантность, потому что смыслы близки.
Ограничения встроенной модели ChromaDB
- Модель
all-MiniLM-L6-v2— английский лучше, чем русский - Для лучшего качества на русском: OpenAI
text-embedding-3-smallилиtext-embedding-ada-002
# Пример с OpenAI эмбеддингами (для справки)
import chromadb
from chromadb.utils.embedding_functions import OpenAIEmbeddingFunction
ef = OpenAIEmbeddingFunction(api_key="sk-...", model_name="text-embedding-3-small")
collection = client.get_or_create_collection("docs", embedding_function=ef)
💬 Комментарии (0)
Комментариев пока нет
Станьте первым, кто поделится мнением об этой статье!