Chapter 17
How Meaning Becomes Space
Of the two arms in Chapter 16, this chapter looks inside the vector arm.
A graph has Nodes and relations; a document has text a person reads. A vector is an array of numbers. It is the least visible part of the system, and in search that array does one job: it places a sentence inside a space of meaning. What matters is less the vector itself than which space, and at what unit, it was placed in.
1. Pieces are large, vectors are small
A Chunk from Chapter 12 is about two thousand characters. An embedding model's window is about five hundred tokens. Those are different units.
At first each Chunk carried one vector, so the model read the opening and silently discarded the rest. Measured, that discarded 42.6 percent of the Korean text and 12.3 percent of the English.
Three ways out were measured against the same questions: read only the opening; average the vectors of several pieces; re-cut the Chunk to the model's window. Averaging was worse than the baseline, because different content inside one Chunk smears into one vector. Re-cutting scored best, but the Chunk is the storage unit of the source text, and cutting it smaller loses Concept links and unsettles synchronization and excerpts.
So Vinc uses parent and child. The Chunk stays at two thousand characters and carries one vector per piece of at most five hundred tokens. A hit on a child returns the parent Chunk. Retrieval quality equals re-cutting exactly, because the same pieces were encoded by the same model. The price is one extra table for the vectors; what it buys is leaving the unit of source text alone.
2. There is one model, and it lives in one place
The desktop app's sidecar carries no embedding stack, to avoid a multi-gigabyte binary. So search on the desktop is full text only.
On the hosted graph exactly one process holds a model: the encoder container. It fills the pieces of documents and it turns questions into vectors. The sidecar calls it only when an encoder address is configured. The source text never leaves the store; the encoder fetches pieces over an internal path and posts vectors back.
For a while that encoder slept when idle. On the first question after a pause, about nine searches answered from full text alone while it woke, and each response said so. In September 2026 it was changed to keep one instance awake.
3. A multilingual model, quantized in house
The source text in this graph is English and Korean. The first model was English only and had no Korean syllable tokens, so Korean broke into letters and retrieval collapsed. Switching to a multilingual model nearly doubled Korean retrieval quality and cost English five percent. That trade was the decision.
Quantization nearly undid it. The publisher's int8 build overflowed an intermediate value on processors lacking a particular instruction, and Korean quality fell again. Quantizing the same model again with range reduction restores the original quality. So what ships is a self-built int8. Quantization happens once, in a build step with memory to spare, and never while running. If the built file is missing or does not match the model, the encoder stops at startup. It neither falls back quietly to the original nor swaps in the publisher's build: the original does not fit in the encoder's memory, so the slow but correct path is, in this place, an out-of-memory crash.
One lesson came out of the same measurement. The first round was invalid: documents labelled Korean were queried by their titles and file names, which were all ASCII. Korean retrieval was never measured while its score was being read. A measurement that quietly measures the wrong thing is worse than none, because it produces confident numbers.
4. Dimension is a storage contract
If the vector store expects 768 dimensions and a new model produces 1024, swapping the model does not finish the job. Model, dimension and the table that holds the vectors are one contract.
So changing the model is not a configuration change. Another model's vectors are another space, and mixing two spaces is worse than having none. Declaring a new model uses none of the existing vectors and queues every document for refilling. While it refills, the vector arm is switched off entirely: answering from a half-filled corpus tilts the ranking toward whichever documents were processed first. Search answers from full text alone meanwhile, and the response states that the vector arm is off.
Vinc walked this path for real on 11 September 2026, rebuilding the whole hosted graph from a 768-dimension multilingual model to a 1024-dimension one. The new store was built in a new file while the original was only read, so the way back is the same rebuild in the other direction. What it cost, and what broke on the first attempt, is in Part 4 with the numbers.
5. A vector is a coordinate, not the memory
A successful vector search does not mean memory has been recovered. One search result carries three kinds of information: the source text, the vector, and the related Nodes. The text supplies evidence, the graph supplies meaning and relations, and the vector is used to find nearby candidates.
Two vectors being close means two texts are close in this model's space of meaning. It does not mean they are the same memory. So Vinc uses vector search to produce candidates and never leaves the question of which memory it is to vector similarity alone. That judgment is the resolution step of the next chapter.
A vector is not the final form memory takes. It is a coordinate for finding it.
Continue with Chapter 18, How Search Results Get Confirmed as Memory.