Почтовый клиент Shortwave хранит эмбеддинг каждого письма в Pinecone, а индекс делит на namespace по пользователю. В их разборе это названо одной из главных причин выбора Pinecone: поиск идёт только внутри ящика, чужие письма в него не попадают в принципе.
В задаче размерность 4, метрика cosine. Namespace — id пользователя: u1, u2, u3. В метаданных письма labels — массив меток: inbox, sent, starred, archive. Поля с id пользователя в метаданных нет.
Пользователь u2 спрашивает «где счёт за хостинг». Вектор запроса [0.2, 0.8, 0.4, 0.1]. Верните тело запроса для 3 ближайших писем u2 с меткой inbox.
В работе: Поиск по личным данным в мультитенантном индексе: почта, заметки, документы компании-клиента.
Pinecone · Pinecone (эмулятор: точный перебор)
Индекс
Размерность 4, метрика cosine.
Пример: векторы
| id | values | metadata |
|---|---|---|
m-201 | 0.21, 0.79, 0.38, 0.12 | {"labels": ["inbox"]} |
m-202 | 0.25, 0.75, 0.45, 0.05 | {"labels": ["sent"]} |
m-203 | 0.3, 0.7, 0.3, 0.2 | {"labels": ["inbox", "starred"]} |
m-204 | 0.8, 0.1, 0.2, 0.4 | {"labels": ["inbox"]} |
m-205 | 0.1, 0.6, 0.6, 0.1 | {"labels": ["archive"]} |
m-101 | 0.2, 0.8, 0.4, 0.1 | {"labels": ["inbox"]} |
m-301 | 0.22, 0.78, 0.41, 0.11 | {"labels": ["inbox"]} |
Ожидаемый ответ
m-201, m-203, m-204
index.query(): vector, topK и filter по метаданным. Ищем точным перебором по метрике индекса на 4 наборах векторов и сравниваем список id по порядку. Фильтр — по правилам Pinecone: $eq $ne $gt $gte $lt $lte $in $nin $exists $and $or.
{"vector": [ … ], "topK": 3, "filter": { … }}
Источник: кейс Shortwave: устройство ИИ-поиска по почте, 2023. Условие пересказано своими словами.
Посмотреть данные, проверить часть фильтра. На зачёт не влияет.
Здесь появится результат отправки.