Інтеграція Pinecone для векторного сховища AI в мобільних додатках
Pinecone — керована векторна база даних з REST API та клієнтськими SDK. Для мобільних додатків це означає: не потрібно розгортати та обслуговувати власний векторний рушій. Оновлення індексу, репліка, масштабування — все на стороні Pinecone.
Коли Pinecone замість pgvector
pgvector — правильний вибір для початку. Pinecone потрібен коли:
- Корпус > 1 млн векторів і затримка пошуку критична (< 50 мс на 99-му перцентилі)
- Потрібні простори імен для ізоляції даних різних користувачів або тенантів
- Вимагається фільтрація метаданих з високою кардинальністю (тисячі унікальних значень)
- Команда не хоче займатися настройкою pgvector HNSW-індексів при зростанні даних
Для більшості B2C мобільних продуктів pgvector достатній. Pinecone — це вибір при серйозному навантаженні або багатотенантності.
Архітектура: Pinecone не викликається з мобільного напрямо
Не можна зберігати ключ API Pinecone в мобільному додатку. Правильна схема:
Мобільний клієнт
↓ REST API (з JWT-аутентифікацією)
Ваш бекенд
↓ Pinecone SDK (Node.js / Python / Java)
Pinecone Index
Мобільний клієнт відправляє текстовий запит. Бекенд створює вбудовування, виконує пошук у Pinecone, повертає відформатований результат.
Простори імен для мобільних додатків
Простір імен у Pinecone — це логічна ізоляція всередину одного індексу. Для мобільного додатка з користувацькими даними:
# Upsert даних користувача в його простір імен
index.upsert(
vectors=[
{
"id": f"doc_{doc_id}",
"values": embedding,
"metadata": {
"content": chunk_text,
"source": filename,
"created_at": timestamp
}
}
],
namespace=f"user_{user_id}" # ізоляція даних користувача
)
# Пошук тільки по даних конкретного користувача
results = index.query(
vector=query_embedding,
top_k=5,
namespace=f"user_{user_id}",
include_metadata=True
)
Це критично важливо для додатків з особистими документами — без просторів імен дані всіх користувачів перемішуються в одному індексі.
Фільтрація метаданих
Pinecone підтримує фільтрацію за метаданими під час пошуку. Синтаксис схожий на MongoDB:
results = index.query(
vector=query_embedding,
top_k=10,
filter={
"language": {"$eq": "ru"},
"category": {"$in": ["support", "faq"]},
"created_at": {"$gte": 1700000000}
}
)
Важливе обмеження: Pinecone фільтрує ПІСЛЯ ANN-пошуку на pod-based індексах. На Serverless індексах — до (pre-filter). Якщо плануєте висока селективні фільтри, використовуйте Serverless.
Upsert з мобільного: завантаження документів користувача
Коли користувач завантажує документ через мобільний додаток:
- Клієнт відправляє файл на бекенд
- Бекенд ділить на чанки, створює вбудовування пакетом
- Upsert у Pinecone (пакет до 100 векторів за раз — рекомендований ліміт)
- Бекенд повідомляє клієнту про успіх
Пакетна обробка важлива: 1000 векторів одним upsert займає стільки ж часу, як 10 пакетів по 100, але один великий запит менш стійкий до мережевих помилок.
// Node.js бекенд — пакетний upsert
const BATCH_SIZE = 100;
for (let i = 0; i < vectors.length; i += BATCH_SIZE) {
const batch = vectors.slice(i, i + BATCH_SIZE);
await index.upsert({ vectors: batch, namespace: userId });
}
Вартість та оптимізація
Pinecone Serverless тарифікується за операціями читання/запису. Для мобільного додатка основні видатки — запити пошуку. Оптимізація:
- Кешуйте результати для повторюваних запитів (Redis з TTL 5–15 хвилин)
- Зменшуйте розмірність вбудовувань, якщо якість дозволяє (
text-embedding-3-smallзdimensions: 512— удвічі дешевше зберігання) - Використовуйте
top_k = 5–10, не 50+
Етапи інтеграції
Створення проекту Pinecone та індексу → розробка бекенд-сервісу для upsert та query → реалізація стратегії просторів імен → мобільний API для завантаження документів та пошуку → тестування затримки та якості пошуку → моніторинг операцій через Pinecone Console.
Інтеграція Pinecone в існуючий бекенд з мобільним клієнтом — 2–3 тижні. З нуля, включаючи ingestion pipeline та мобільний UI — 4–6 тижнів.







