A generative AI system that creates personalized meditations grounded in tarot symbolism and emotional intention, using RAG, few-shot prompting, and LLM evaluation.
Can AI Understand How We Feel? 🧘🏽♀️
Most meditation apps are static. You tap a button labeled “stress” or “sleep” and get a generic script. But what if you could type how you actually feel—like “I feel like my life is falling apart”—and receive a meditation tailored just for you?
In this post, I’ll show how I used Gen AI, tarot archetypes, and retrieval-augmented generation (RAG) to build a personalized tarot meditation generator, an emotionally intelligent system that blends symbolic meaning with AI-powered reflection.
How Gen AI Can Help
Instead of using fixed categories like “calm” or “sleep,” this prototype:
- Accepts a natural-language emotional reflection
- Retrieves relevant tarot archetypes via vector search (Major Arcana)
- Grounds with spiritual teachings (Stoicism, Buddhism, etc.) via Google Search
- Generates a soothing, structured meditation using few-shot prompting
Implementation Highlight
You can find the full code in my Tarot Meditation Kaggle notebook, which was built for the Gen AI Intense Course Capstone 2025Q1. Here I’ll just share a few core pieces to give you a feel for how it comes together.
Sample Data
“The Fool” card meaning, with keywords and both upright and reversed interpretations:
{
"card_name": "The Fool",
"number": "0",
"keywords_upright": ["beginnings", "innocence", "spontaneity", "a free spirit"],
"keywords_reversed": ["holding back", "recklessness", "risk-taking"],
"short_meaning": "The Fool represents new beginnings, adventure, and potential. It's about trusting the journey, even without knowing where it leads.",
"upright_meaning": "The Fool encourages you to embrace a fresh start with curiosity and trust in the Universe. It's a time to leap into the unknown, trusting your instincts and allowing the magic of the moment to guide you.",
"reversed_meaning": "The reversed Fool may indicate hesitation, fear of the unknown, or being held back by self-doubt. It can also warn against impulsive or reckless behavior without considering the consequences.",
"love_meaning": {
"upright": "In love, the Fool represents spontaneity and the excitement of new relationships. It suggests embracing vulnerability and adventure in your connections.",
"reversed": "You may be avoiding commitment or acting recklessly in relationships. Alternatively, you could be longing for freedom from a restrictive partnership."
},
"career_meaning": {
"upright": "This card signals a new career path or entrepreneurial venture. Embrace learning opportunities and trust your enthusiasm.",
"reversed": "Be cautious about risky decisions or poorly researched ventures. Hesitation may be stalling your progress."
},
"spiritual_meaning": "Spiritually, the Fool invites you to step into the unknown with faith. Let go of control and embrace the journey, even if it doesn’t make sense yet.",
"quote": "“A journey of a thousand miles must begin with a single step.” — Lao Tzu",
"source": "Ultimate Guide to Tarot"
},
Embedding Tarot with ChromaDB
Create embeddings for each chunk (card):
# Set up Chroma
chroma_client = chromadb.Client()
db = chroma_client.get_or_create_collection(name=DB_NAME, embedding_function=embed_fn)
# Add tarot data to DB, along with metadata
db.add(
documents=documents,
ids=ids,
metadatas=metadatas
)
Retrieval-Augmented Generation (RAG)
Match the user’s emotional prompt with the most resonant tarot cards:
query = "I feel like my world is falling apart."
results = db.query(query_texts=[query], n_results=3)
retrieved_chunks = results["documents"][0]
# take a look at the first
Markdown(retrieved_chunks[0])
Response:
Card: The World Number: XXI
Keywords (Upright): completion, integration, accomplishment, travel Keywords (Reversed): seeking personal closure, short-cuts, delays
Short Meaning: The World represents successful completion, fulfillment, and the closing of a significant life cycle. It’s a moment of celebration, wholeness, and the start of a new chapter.
Generate Meditation with Grounding
Use Google Search for grounding:
# Enable Google Search grounding
config_with_search = types.GenerateContentConfig(
tools=[types.Tool(google_search=types.GoogleSearch())],
)
def run_prompt_with_search(prompt):
response = client.models.generate_content(
model="gemini-2.0-flash",
contents=prompt,
config=config_with_search
)
return response.candidates[0]
Sample generated meditation:
Markdown(response.content.parts[0].text)
Response:
{
"card": "The Tower, The Star, Death",
"mode": "sleep",
"theme": "Embracing Transformation and Finding Hope",
"affirmation": "I release what no longer serves me and open my heart to new possibilities with hope and faith.",
"quote": "Everything's destiny is to change, to be transformed, to perish. So that new things can be born. - Marcus Aurelius",
"guided_script": "As you settle into sleep, visualize the stars above you, shining brightly in the vast darkness. Let each breath release the tension of the day, the feeling that things are falling apart. Trust that even in chaos, there is a guiding light, and new beginnings await you. Surrender to the peace of this moment, knowing that you are safe and held in the universe's gentle embrace."
}
What This System Can’t Do (Yet)
- Grounding is hit or miss. While Gemini’s Google Search’s search capability can pull in spiritual quotes or teachings, not every result lands perfectly. Sometimes the meditations feel more generic if the retrieved context isn’t strong or aligned.
- Kept short to stay within the limit. To stay within free token limits, the meditations are intentionally brief. This keeps things lightweight, but it also limits the space for deeper, more layered reflections.
- Meaning is open to interpretation. Tarot and spirituality in general aren’t about one fixed truth. It’s symbolic, personal, and layered. Different users might connect to different tones, and some generations might resonate more than others.
Future Opportunities
- Go beyond the Marjor Arcana. Expanding to the full tarot deck, including the Minor Arcana and court cards, would allow for greater emotional nuance and variety in symbolic reflection.
- Support longer, more layered meditations. With more generous token budgets, future versions could integrate deeper insights from tarot interpretations and spiritual teachings, creating meditations that unfold more richly over time.
- Explore multi-card spreads. Incorporating common tarot layouts, like three-card readings, could enable more complex meditations that reflect past, present, and future energies.
Final Thoughts
AI doesn’t have to be cold or stiff. This project was an exploration to see if Gen AI could help us feel a little more seen. Gen AI is often used for productivity, but this is a soft reminder that reflection, softness, and inner dialogue matter too.