My naive approach would be to just place a grid over the IQ map, and find which grid-square my symbol lands in.
And that's (more or less) exactly how it's done: it's called a hard decision, and your grid is what we'd call the decision boundaries. It's a result of applying the Maximum Likelihood criterion to the decision process.
Of course, in that decision, a sample that hits a constellation point (nearly) exactly is not distinguishable from a sample that was somewhere "in the middle" between two constellation points (and hence close to one of the decision boundaries).
You can't tell "absolutely certain" from "I'm about 51% sure" decisions that way! So, this hard deciding throws away valuable information.
If you find a way to encode the decision information and the certainty of that decsion into numbers, then you get a *soft-output decider". The most common way of finding a single number that describes that is through likelihood ratios, i.e. divide how likely one symbol is by the likelihood of a different symbol. Because ratios are unelegant to deal with, apply a logarithm to it, and get a LLR.
Now, you want bits, not something like "I'm almost certain this was a 0 or 1", but don't forget:
In modern systems, you use channel coding. If you have an algorithm that doesn't only consider single symbols, but sequences of symbols, then you can use these soft-outputs to infer the likeliest sequence that was sent more reliably.
As said in my comment to your question, you really shouldn't start learning about QAM mapping by reading about soft-output decision on QAM. Start with soft-output BPSK, and then learn about the hard- and soft-output Viterbi sequence estimator. (For Viterbi, you'll need working knowledge of simple convolutional channel codes, but that should be comparatively simple when considering you're doing LLRs on QAM...)