August 8, 2026 · 7 min read

When One Correct Fact Became Too Important

When I first started playing around with AI and astrology, I gave an LLM my birth details and asked it to read my chart.

The result looked pretty good at first.

Some of the calculations were right. Some of the language was convincing. If I had stopped there, I might have thought the model understood the chart better than it really did.

But as I learned more astrology and started testing more charts, I noticed a quieter problem.

The model could get an important fact right and still give that fact the wrong amount of importance.

One of the clearest examples came from the soul planet.

In Vedic astrology, the technical term is Atmakaraka. It is the planet with the highest degree in the chart, and it is often treated as one of the deeper indicators. I usually explain it as the soul planet because that is easier to understand outside an astrology context.

The soul planet matters, so when two people have the same one, some overlap in the reading makes sense.

But in my tests, the overlap was too much.

Two different charts had Mercury as the soul planet, and both readings started leaning into the same themes: intelligence, words, analysis, communication.

The annoying part was that the model was not exactly wrong.

Mercury really was the soul indicator in both charts.

But the model had made that one fact too important.

That is when I realized this was not a hallucination problem. It was a weighting problem.

The model had a correct fact. It did not know how much that fact should matter compared to everything else in the chart.

The problem was not more data

My early instinct was to give the model more chart facts.

If one answer was too thin, add the planet placements. If that was not enough, add the dignity. Then add the house lords. Then the divisional chart. Then the dasha.

That made the prompt bigger, but it did not fully solve the problem.

The model was still receiving a flat menu of facts.

Simplified, it looked like this:

facts = {
    "soul_planet": "Mercury",
    "soul_planet_meaning": "intellect, communication, discernment",
    "first_house": "...",
    "fifth_house": "...",
    "ninth_house": "...",
    "current_dasha": "...",
}

All of those facts could be correct.

But correctness was not enough.

The model still had to decide which one should become the main story.

And because the soul planet is vivid and easy to explain, it kept pulling the reading toward itself.

The reading was not fake. It was just badly weighted.

One signal is not the whole chart

A person is not one placement, and a chart is not one signal.

That sounds obvious, but it matters a lot when you are building with an LLM.

The model is very good at turning one strong signal into a smooth paragraph. If the soul planet is Mercury, it can write beautifully about intellect, speech, learning, communication, and analysis.

The problem is that a beautiful paragraph can make one factor feel more central than it really is.

For the life-direction part of the reading, I did not want the model to choose the headline from whichever fact was easiest to narrate.

The chart has structure.

For the dharma part of the chart, the tradition I was building from looks especially at the 1st, 5th, and 9th houses.

The 1st shows the person's nature.

The 5th shows capacity, intelligence, and what is already available in the person.

The 9th shows dharma: direction, guidance, principle, and right use.

The soul planet belongs in that picture, but it should not automatically dominate it.

That was the design mistake.

I had given the model correct ingredients and let it decide the recipe.

What I changed

I stopped asking the model to decide the main story.

VyomaVeda now calculates the chart first and then calculates how much the different signals should matter before the LLM writes anything.

For this part of the product, the engine builds what I call a dharma signature. It decides the lead signal, the supporting signals, the tensions, and how confident the reading should be.

The LLM gets that structure after the ranking is already done.

Simplified, the handoff changed from this:

facts = compute_chart_facts(chart)
answer = llm_write(facts)

to this:

facts = compute_chart_facts(chart)
signature = build_dharma_signature(facts)
answer = llm_write(signature)

That looks like a small change, but it changes what the model is responsible for.

Before, the model had to decide what mattered.

Now, the engine decides that.

The model mostly turns the already-ranked structure into a natural reading.

What the signature contains

Simplified, it looked like this:

signature = {
    "lead": "9th-house direction",
    "supporting": [
        "1st-house nature",
        "5th-house capacity",
        "soul planet as a secondary note",
    ],
    "tensions": [...],
    "confidence": "medium",
}

The soul planet is still there.

It has not been removed or downgraded into something meaningless.

It just no longer gets to become the whole reading by default.

For example, two charts can both have Mercury as the soul planet:

chart_a = {
    "soul_planet": "Mercury",
    "ninth_lord": "Saturn",
    "ninth_lord_condition": "exalted",
    "ninth_lord_house": 6,
}

chart_b = {
    "soul_planet": "Mercury",
    "ninth_lord": "Jupiter",
    "ninth_lord_house": 10,
    "current_dasha_lord": "Jupiter",
}

Those charts should not have the same main story.

The first points more toward purpose discovered through disciplined service, problem-solving, and responsibility.

The second points more toward purpose expressed publicly, through visible work, guidance, teaching, or contribution, especially because the current period is activating that theme.

The same soul planet still matters in both.

But it no longer flattens them into the same person.

The prompt also became simpler

Once the engine decides the structure, the LLM prompt can be much narrower.

It does not need to discover the main story. It needs to write the story it was given.

Lead with the dharma principle.
Then explain the practical life area it works through.
Then weave in supporting factors.
Treat the soul planet as a secondary growth theme, not the headline.

That is a better job for the model.

It can still make the reading natural. It can still explain the chart in a way a person can actually read. But it is no longer deciding which fact deserves to lead.

What this changed

This made the readings feel less generic.

Not because the model became smarter.

Because it had less freedom to overuse the most obvious fact.

It also changed how I think about personalization.

Before building this, I thought the hard part was giving the AI enough information.

Now I think that is only half the problem.

More facts do not automatically make something personal. Sometimes one true fact becomes too loud, and everything else gets pulled into its orbit.

The harder question is ranking.

What should lead?

What should support?

What should stay in the background?

That is the difference between a reading that is technically correct and one that actually feels like it belongs to the person in front of it.