vectra-client 1.0.6 → 1.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +8 -5
- data/README.md +13 -0
- data/docs/_layouts/default.html +1 -0
- data/docs/_layouts/home.html +45 -0
- data/docs/_layouts/page.html +1 -0
- data/docs/api/cheatsheet.md +387 -0
- data/docs/api/methods.md +632 -0
- data/docs/api/overview.md +1 -1
- data/docs/assets/style.css +50 -1
- data/docs/examples/index.md +0 -1
- data/docs/guides/faq.md +215 -0
- data/docs/guides/recipes.md +612 -0
- data/docs/guides/testing.md +211 -0
- data/docs/providers/selection.md +215 -0
- data/lib/vectra/active_record.rb +52 -1
- data/lib/vectra/batch.rb +69 -0
- data/lib/vectra/cache.rb +49 -0
- data/lib/vectra/client.rb +144 -12
- data/lib/vectra/version.rb +1 -1
- metadata +7 -1
data/docs/guides/faq.md
ADDED
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
---
|
|
2
|
+
layout: page
|
|
3
|
+
title: FAQ
|
|
4
|
+
permalink: /guides/faq/
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# FAQ
|
|
8
|
+
|
|
9
|
+
Najčešća pitanja i kratki odgovori oko korištenja Vectre u produkciji.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## 1. Koju dimenziju (dimension) trebam koristiti?
|
|
14
|
+
|
|
15
|
+
**Kratko:** Uskladi `dimension` s modelom kojim generiraš embeddings.
|
|
16
|
+
|
|
17
|
+
- OpenAI `text-embedding-3-small` → 1536 dimenzija
|
|
18
|
+
- OpenAI `text-embedding-3-large` → 3072 dimenzija
|
|
19
|
+
- Cohere `embed-english-v3.0` → 1024 dimenzija
|
|
20
|
+
|
|
21
|
+
U Rails modelu / generatoru:
|
|
22
|
+
|
|
23
|
+
```ruby
|
|
24
|
+
has_vector :embedding,
|
|
25
|
+
dimension: 1536
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Ako dimenzija ne odgovara, Vectra će baciti **ValidationError** pri upsertu.
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## 2. Kad koristiti pgvector, a kad Qdrant / Pinecone / Weaviate?
|
|
33
|
+
|
|
34
|
+
**Pgvector (PostgreSQL):**
|
|
35
|
+
- Imaš već PostgreSQL i želiš **minimalne dodatne servise**
|
|
36
|
+
- Želiš **SQL** i ACID transakcije
|
|
37
|
+
- Dataset je srednje veličine (do par milijuna vektora)
|
|
38
|
+
|
|
39
|
+
**Qdrant:**
|
|
40
|
+
- Želiš **open source** i **self-hosted** rješenje
|
|
41
|
+
- Trebaš napredne filtere i dobar performance
|
|
42
|
+
- Želiš i opciju clouda (Qdrant Cloud)
|
|
43
|
+
|
|
44
|
+
**Pinecone:**
|
|
45
|
+
- Želiš **managed cloud** i "zero ops"
|
|
46
|
+
- Veći volumeni podataka, multi-region, SLA
|
|
47
|
+
|
|
48
|
+
**Weaviate:**
|
|
49
|
+
- Hoćeš **AI-native** vektorsku bazu s ugrađenim vektorizatorima
|
|
50
|
+
- Želiš GraphQL API i bogat schema model
|
|
51
|
+
|
|
52
|
+
Detaljnije usporedbe imaš i na [homepage-u](https://vectra-docs.netlify.app/api/methods).
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## 3. Kako spremati embeddings – trebam li ih normalizirati?
|
|
57
|
+
|
|
58
|
+
Preporuka:
|
|
59
|
+
|
|
60
|
+
- Normaliziraj vektore na L2 normu prije spremanja (bolja stabilnost cosine sličnosti)
|
|
61
|
+
|
|
62
|
+
```ruby
|
|
63
|
+
embedding = EmbeddingService.generate(text)
|
|
64
|
+
normalized = Vectra::Vector.normalize(embedding)
|
|
65
|
+
|
|
66
|
+
client.upsert(
|
|
67
|
+
index: 'documents',
|
|
68
|
+
vectors: [
|
|
69
|
+
{ id: 'doc-1', values: normalized, metadata: { title: 'Hello' } }
|
|
70
|
+
]
|
|
71
|
+
)
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
Ako koristiš pgvector i želiš direktan `cosine` / `inner product` preko SQL-a, i dalje je dobra praksa normalizirati embeddinge na aplikacijskoj strani.
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
## 4. Zašto ne dobivam nikakve rezultate iz pretrage?
|
|
79
|
+
|
|
80
|
+
Najčešći razlozi:
|
|
81
|
+
|
|
82
|
+
1. **Krivi index ili namespace**
|
|
83
|
+
- Provjeri da koristiš isti `index` i `namespace` kod `upsert` i `query`
|
|
84
|
+
|
|
85
|
+
2. **Filter previše restriktivan**
|
|
86
|
+
- Probaj maknuti `filter` i vidjeti dobivaš li rezultate
|
|
87
|
+
|
|
88
|
+
3. **Dimenzija ne odgovara**
|
|
89
|
+
- Ako je `dimension` u bazi 1536, a šalješ vektor s npr. 1024 elemenata → provider će baciti grešku ili ignorirati upit
|
|
90
|
+
|
|
91
|
+
4. **Embedding funkcija ne vraća ono što misliš**
|
|
92
|
+
- U testu ispiši prvih par elemenata i dužinu vektora
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
## 5. Kako odabrati metricu sličnosti (cosine / dot / L2)?
|
|
97
|
+
|
|
98
|
+
Vectra ti apstrahira metricu, ali provider ispod može koristiti različite metrike.
|
|
99
|
+
|
|
100
|
+
Praktično:
|
|
101
|
+
|
|
102
|
+
- Za većinu use-caseova → **cosine** ili **dot product** (na normaliziranim vektorima)
|
|
103
|
+
- Pgvector: koristi `cosine` ili `<->` operator, ali Vectra to sakriva iza unified API-ja
|
|
104
|
+
|
|
105
|
+
Ako nisi siguran, koristi default provider metricu + normalizirane embeddinge.
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
## 6. Kako razdvojiti tenant-e (multi-tenant SaaS)?
|
|
110
|
+
|
|
111
|
+
Koristi kombinaciju **namespace** + **metadata filter**:
|
|
112
|
+
|
|
113
|
+
```ruby
|
|
114
|
+
# Upsert
|
|
115
|
+
client.upsert(
|
|
116
|
+
index: 'documents',
|
|
117
|
+
vectors: [
|
|
118
|
+
{ id: 'doc-1', values: embedding, metadata: { tenant_id: tenant.id } }
|
|
119
|
+
],
|
|
120
|
+
namespace: "tenant_#{tenant.id}"
|
|
121
|
+
)
|
|
122
|
+
|
|
123
|
+
# Query
|
|
124
|
+
client.query(
|
|
125
|
+
index: 'documents',
|
|
126
|
+
vector: query_embedding,
|
|
127
|
+
namespace: "tenant_#{tenant.id}",
|
|
128
|
+
filter: { tenant_id: tenant.id }
|
|
129
|
+
)
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
Za konkretan primjer pogledaj [Recipes & Patterns](/guides/recipes/#multi-tenant-saas-namespace-isolation).
|
|
133
|
+
|
|
134
|
+
---
|
|
135
|
+
|
|
136
|
+
## 7. Kako testirati bez pravog providera?
|
|
137
|
+
|
|
138
|
+
Koristi **Memory provider** (`:memory`):
|
|
139
|
+
|
|
140
|
+
- U test environmentu:
|
|
141
|
+
|
|
142
|
+
```ruby
|
|
143
|
+
Vectra.configure do |config|
|
|
144
|
+
config.provider = :memory if Rails.env.test?
|
|
145
|
+
end
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
- Ili direktno u RSpec-u:
|
|
149
|
+
|
|
150
|
+
```ruby
|
|
151
|
+
let(:client) { Vectra.memory }
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
Detaljan vodič: [Testing Guide](/guides/testing/).
|
|
155
|
+
|
|
156
|
+
---
|
|
157
|
+
|
|
158
|
+
## 8. Koje health checkove trebam za production?
|
|
159
|
+
|
|
160
|
+
Minimalno:
|
|
161
|
+
|
|
162
|
+
- `client.healthy?` u background jobu ili health endpointu
|
|
163
|
+
- `client.ping` za mjerenje latencije
|
|
164
|
+
|
|
165
|
+
Primjer Rails endpointa:
|
|
166
|
+
|
|
167
|
+
```ruby
|
|
168
|
+
class HealthController < ApplicationController
|
|
169
|
+
def vectra
|
|
170
|
+
status = Vectra::Client.new.ping
|
|
171
|
+
|
|
172
|
+
if status[:healthy]
|
|
173
|
+
render json: status
|
|
174
|
+
else
|
|
175
|
+
render json: status, status: :service_unavailable
|
|
176
|
+
end
|
|
177
|
+
rescue => e
|
|
178
|
+
render json: { healthy: false, error: e.message }, status: :service_unavailable
|
|
179
|
+
end
|
|
180
|
+
end
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
Više u [Monitoring & Observability](/guides/monitoring/).
|
|
184
|
+
|
|
185
|
+
---
|
|
186
|
+
|
|
187
|
+
## 9. Kada koristiti batch upsert umjesto pojedinačnih poziva?
|
|
188
|
+
|
|
189
|
+
Uvijek kad:
|
|
190
|
+
|
|
191
|
+
- Imaš **više od ~20 vektora odjednom**
|
|
192
|
+
- Radiš inicijalni import (npr. 1000+ proizvoda)
|
|
193
|
+
|
|
194
|
+
```ruby
|
|
195
|
+
Vectra::Batch.upsert(
|
|
196
|
+
client: client,
|
|
197
|
+
index: 'products',
|
|
198
|
+
vectors: product_vectors,
|
|
199
|
+
batch_size: 100,
|
|
200
|
+
on_progress: ->(batch_index, total_batches, batch_count) do
|
|
201
|
+
Rails.logger.info "Batch #{batch_index + 1}/#{total_batches} (#{batch_count} vectors)"
|
|
202
|
+
end
|
|
203
|
+
)
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
---
|
|
207
|
+
|
|
208
|
+
## 10. Kako izabrati pravog providera za moj use-case?
|
|
209
|
+
|
|
210
|
+
Pogledaj [Provider Selection Guide](/providers/selection/) za konkretne scenarije:
|
|
211
|
+
|
|
212
|
+
- "Imam samo Postgres" → pgvector
|
|
213
|
+
- "Želim managed cloud" → Pinecone
|
|
214
|
+
- "Hoću OSS i da se mogu sam hostati" → Qdrant / Weaviate
|
|
215
|
+
|