Short answer: Route fuzzy personalization and document recall to vectors, and multi-hop entity questions to a graph, then assemble with tagged authority.
Vectors handle meaning-like notes; graphs walk typed links. Engram and Weaviate collections fit the vector side. Do not let similarity outrank path-proven facts in the prompt. Hybrid failure is usually assembly failure: tag plane and authority per snippet. The router is the architecture, not one index pretending to understand genealogy.
Vector stores and knowledge graphs solve different retrieval problems, which is why hybrid architectures keep winning in production. Vectors excel at fuzzy recall: find notes and passages that mean something like the query, even when wording drifts. Graphs excel at explicit structure: walk from account to site to asset to open work order without hoping two chunks happened to co-embed. Agent memory that needs both personalization and multi-hop entity reasoning should not pick a winner. It should route.
This chapter separates what each substrate is for, shows how Weaviate Engram and Weaviate collections fit the vector side while a graph plane handles relational hops, explains assembly rules so similarity scores do not outrank path-proven facts, and walks a clock-fusee bench through a dual retrieve. Next we step back from substrate pairing to time-based layering—working, session, and long-term tiers.
What job does the vector plane still own in a hybrid design?
After multi-agent ownership is settled, teams often ask whether a graph replaces Engram. It should not. Experiential memory is mostly similarity-shaped. “How does Priya like torque notes recorded” is not a path query; it is a preference recall. Engram’s hybrid retrieval—lexical plus dense—over user-scoped memories remains the right default for that plane. Document RAG over a Weaviate collection is also vector-shaped for SOPs and manuals when the question is “what does the guide say,” not “how are these five entities linked.”
The vector plane’s strengths are cold-start friendliness, tolerance for paraphrase, and fast top-k over unstructured text. Its weakness is structural blindness. Similarity can retrieve two true sentences that do not form a valid chain. It can also miss a critical intermediate entity that never appeared near the query wording. That is not a reason to abandon vectors. It is a reason to stop asking them to answer multi-hop questions alone.
In a Weaviate-centered stack, keep Engram as the experiential vector memory API and keep organizational text in collections with hybrid search. Those remain first-class even when a graph joins the system. The hybrid label means the orchestrator can call more than one retrieve, not that you abandon the memory product that already models scopes, hybrid search, and fetch-by-id for personalization.
When must the graph plane take the lead?
The graph earns its keep when the answer depends on typed relationships. Which fusee chain batch was installed on which movement? Which supplier lot feeds which subassembly that failed inspection? Who approved the change that altered the allowable torque range? These questions need traversal, identity resolution, and often temporal edges—not a nearest-neighbor list.
Graph-augmented retrieval patterns in industry practice usually start with an entry point (entity linking or a vector hit that names a node), then expand one or two hops along allowed edge types, then return path-backed context to the model. Limiting hop depth matters; unbounded walks explode. So does keeping provenance: the agent should be able to cite the path, not only a blended paragraph.
Write policies differ by plane. Engram accepts gated conversational extracts. Graph nodes and edges should update through structured extraction or transactional systems of record, with clear identity keys. Treating every chat utterance as a new edge is how graphs rot. Treating every relational question as another Engram search is how agents invent phantom links. A useful operational test is whether a wrong answer can be traced to a missing edge, a bad embedding neighbor, or a preference the user never stated. If your logs cannot tell those apart, the hybrid is only decorative.
How do you assemble vector hits and graph paths without letting similarity bully structure?
Hybrid failure is usually assembly failure. Teams run vector search and graph traversal, concatenate both into one prompt, and let the model improvise. Better: tag every snippet with its plane and authority. Graph paths that answer the relational ask are primary for that ask. Vector SOP hits remain primary for procedure text. Engram hits remain primary for preference and prior decisions about the person. When a graph path and a chat memory disagree about an entity fact, the graph (or the system of record behind it) wins until a governed update lands.
Routing should be intentional. Classify the turn: preference, document lookup, multi-hop entity, or mixed. Preference → Engram. Document → collection hybrid search. Multi-hop → graph, optionally seeded by a vector entity mention search. Mixed → parallel retrieves with the conflict rule above. Reciprocal fusion across unlike objects is optional seasoning, not a substitute for plane tags. If you fuse, fuse within a plane first, then assemble across planes by policy. Cost and latency also argue for routing: graph traversal on every chit-chat turn wastes budget, while skipping the graph on a lineage question saves milliseconds and loses the only correct answer shape.
Observability should show which path edges and which memory ids entered the prompt. Hybrid systems that cannot explain a wrong hop or a wrong preference will not stay trusted.
What does vector-plus-graph look like at a clock fusee bench?
A workshop assistant helps a clockmaker at a fusee-chain bench. Preferences live in Engram. The house lubrication SOP lives in a Weaviate collection. The movement graph links serial → fusee → chain batch → supplier lot. Scenario id: clock-fusee-chain-bench-8.
from weaviate.engram import EngramClient
from weaviate.engram.retrieval import HybridRetrieval, FetchRetrieval
engram = EngramClient()
user_id = "clockmaker-priya"
group = "personalization"
scenario = "clock-fusee-chain-bench-8"
def hybrid_turn(intent: str, query: str, movement_id: str | None = None):
context = {"scenario": scenario, "engram": [], "sops": [], "graph_paths": []}
if intent in ("preference", "mixed"):
context["engram"] = engram.memories.search(
query=query,
retrieval=HybridRetrieval(alpha=0.55, limit=5),
scopes={"user_id": user_id, "properties": {"group": group}},
)
pinned = engram.memories.get(
memory_id="mem_priya_torque_note_style_v1",
retrieval=FetchRetrieval(),
)
if pinned:
context["engram"] = list(context["engram"]) + [pinned]
if intent in ("sop", "mixed"):
# context["sops"] = StudioSops.query.hybrid(query=..., filters=in_force)
context["sops"] = []
if intent in ("lineage", "mixed") and movement_id:
# graph: Movement -INSTALLED-> Fusee -USES-> ChainBatch -FROM-> SupplierLot
# context["graph_paths"] = traverse(movement_id, max_hops=2)
context["graph_paths"] = [f"path:{movement_id}->fusee->chain_batch"]
context["rule"] = (
"graph owns lineage facts; SOP collection owns lubrication procedure; "
"Engram owns how Priya wants notes phrased"
)
return context
Ask “which supplier lot is on movement 4412” and the graph path leads. Ask “how does Priya label torque checks” and Engram leads. Ask “what oil does the SOP allow after chain install” and the collection leads. The hybrid architecture is the router and the tagged assembly—not a single index that pretends embeddings understand fusee genealogy.
Vector-plus-graph hybrids work when each substrate keeps its job: Engram and Weaviate collections for similarity-shaped memory and documents, a graph for typed multi-hop truth, and assembly rules that stop similarity from overruling structure. Our next chapter, What are working, session, and long-term memory tiers?, reorganizes the same concerns along time and volatility instead of along retrieval substrate.