I've found myself that generating words is perhaps the most difficult but also the most philosophically rewarding part of constructing a language.
All of the other answers in to this question are correct in some way worth pursuing. Roots can really tell the origins of a language. We know part of what Indo-European culture and technology was because of common root words. We know some of the cultural origins of Uralic speakers based on common root words.
The number of root words in a language can also vary. English has tons of them since it lacks the morphology to generate (certain) concepts from others, whereas Eskimo languages have much fewer root words (Central Alaskan Yup'ik has only a couple thousand), since most ideas can be explained through suffixing a root. I might also add that concepts can be explained by phrases, which is what many languages also do.
My recommendation is to think of what culture you're trying to portray when generating root words for its language. It's kind of a personal thing, I find, with a lot of interpretation and artfulness to it.
It may also not be absolutely necessary to come up with all the root words at once and then try to generate them. What I often do is when I need a word, try to first come up with one using existing roots, then if I can't find existing roots, come up with other root words to generate my new derivated word from.
For example, if I need a word for fireplace and need it, I might rationalize that I want it to be comprised of the words for "fire" and "pile" as it's a pile of burning wood.
If I don't have the words for "fire" and "pile", I might decide to make them roots or even compound words themselves. What is worth considering when deciding if a word is a root word, a compound, a derivation or a phrase is whether or not the meaning of it can (or should) be explained through existing concepts. So a fire might not be directly explainable, at least to a child or a layman, but a fireplace is a place you make fire.
You mentioned that you liked consistency, so I decided to tack on this section to the answer about the inconsistencies of roots and how they can often be consistent on a deeper level which may be harder to read.
A common misconception is that roots are complete words. This is not necessarily the case. Roots do not need to ever show up as words in a language. They can be less than or more than a complete word.
Take for example the English word "rhythm". In its basic noun form, it is pronounced "rith-um", with two syllables. When it however takes the suffix "-ic", it becomes "rhythmic" without the schwa sound before the M. This is because the root is the Greek loan word Ρυθμός - rhythmos, a masculine noun which never shows up in Greek without a suffix. In English, however, grammatical case suffixes are dropped (as English doesn't use them) but the root rhythm as it is spelled is unpronounceable in its root form, according to English phonology.
Another good example is the root for kebab in Turkish, which is kebab. However, words in Turkish cannot end on voiced consonants, so the word for kebab in Turkish is kebap. Whenever it takes a suffix, the P turns back into a B, for example:
Kebabım. - My kebab.
A root can be as simple as a single consonant, so long as your language has rules to turn such roots into words. Roots may also overwhelmingly be of one class of words, for example the vast majority of words in Japanese are nouns and even more roots are nouns.
Roots for for a certain word class may also reflect the grammar of that word class too. In Arabic, most verb roots are 3 consonants and the grammar is what order they come in and which vowels they have. For K-T-B, we have:
Kitāb. - Book.
Kutiba. - It is written.
Yaktubu. - He writes.
Another way to make roots create interesting behavior is to give them "ghost phonemes". What I mean by that is a sound, which may not even show up in any word using it, but modifies how suffixes behave.
Say we have a two suffixes; -sene and -bo, and two roots: ne and ke(n), with the (n) being our ghost phoneme. What I've decided (n) does in this case is voice voiceless fricatives and turn voiced stops into nasals.
So when added together, they behave like this:
Nesene - Nebo
Kezene - Kemo
This is quite often how irregularities work in natural languages. A previously existing phoneme disappears from the language but the behavior of the phonemes around it remain affected by it in some way, creating interesting and seemingly irregular results.