Samuel . E . Zih
All posts

· 7 min read · Samuel . E . Zih

A geotag tells you where the poster is, not where the event is

Someone in San Francisco tweeting about a Tokyo earthquake must not put a dot in San Francisco. Getting that backwards is the difference between a map that means something and one that does not.

  • Applied AI
  • CrisisEcho
  • Data

The most consequential decision in CrisisEcho's preprocessing pipeline is eight lines long and looks like a priority ordering. It is the one that decides where the dot goes.

The obvious approach is wrong

A social post may carry GPS coordinates. It is enormously tempting to use them, because they are precise, structured, and free.

They are also answering a different question. A geotag tells you where the poster is, not where the event is. Someone in San Francisco tweeting about a Tokyo earthquake, a diaspora account reporting a flood back home, a journalist filing from a newsroom — every one of them puts a high-confidence dot in exactly the wrong place.

On a crisis map, a wrong dot is worse than no dot. It is a person deciding whether to evacuate on the basis of a number that describes a stranger's Wi-Fi.

The ordering that works

Source

Confidence

Why

NLP place extraction

0.90

spaCy NER pulls GPE/LOC entities from the text and resolves them against a cached gazetteer. The text describes the EVENT, which is the thing we are mapping.

GPS geotag

0.60

Deliberately weaker. Precise about the wrong subject; useful only as a fallback.

Neither

Marked unresolved and handed to a location-enrichment cascade later in retrieval, rather than guessed at.

The inversion — text beats coordinates — is the entire insight, and it is counterintuitive enough that I got it wrong first.

The third row matters as much as the first two. An unresolved post is an honest state. A post placed at the poster's location because we had nothing better is a lie with a confidence score attached.

The other half: one vector space

A related mistake took longer to see. Text embeddings and image embeddings started life in different models and different dimensionalities — Vertex AI text at 1408 dimensions, SigLIP images at 512.

You can compute a similarity between those. The number means nothing. Comparing across incompatible geometries produces a float that looks like evidence and is not.

Unifying both on SigLIP at 768 dimensions put text and image vectors in one cosine space, which is what makes image–text alignment a directly meaningful number rather than a coincidence.

sources → Kafka → preprocess_post → SourcePost + SigLIP embeddings → run_pipeline every 60s → hybrid retrieval → 3-step LLM agent → Crisis (if verified) → Alert

What I take from both

Two failures, one shape: a value that is precise, cheap and available, answering a subtly different question than the one you are asking. The geotag is precise about the poster. The cross-model cosine is precise about nothing.

Precision is not accuracy, and a confident wrong answer is the most expensive output a system can produce — because unlike a missing answer, nothing downstream will question it.

I care about the parts that do not demo well: what happens when the network is gone, when two people tap the same seat at the same instant, when a model is confident and wrong. That last one is the hardest, because it never looks like a bug.

More from the blog