This is the behind-the-scenes record of building the Craft Map — an interactive map of Japan's 249 designated traditional crafts, each given a conversational voice powered by an AI model.
I am not an engineer. I had no prior experience with RAG, vector databases, or serverless functions. These notes cover four sessions across roughly 14.5 hours of building, failing, and finding out why.
The article this log accompanies: Vibe Coded, Never Finished
~2 hours. Zero prior RAG experience.
What I built: A locally-running RAG chatbot that answers questions in English or Japanese about 249 Japanese traditional crafts, using open government data.
The stack: Cursor (AI coding agent), Python, ChromaDB (local vector database), sentence-transformers for multilingual embeddings, Claude API for answer generation, LinkData/RDF API for craft data (CC0 license).
How it works: User question → search ChromaDB for relevant craft documents → pass matched documents as context to Claude → Claude generates an answer grounded in the data. RAG gives the AI a specific knowledge base to reference rather than relying on general training data alone.
Problems hit:
pip not found on Mac — fixed by switching to pip3 and python3.
JSON data not loading into RAG — ChromaDB needs natural language strings to embed properly. Fixed by converting each craft record into a readable sentence: "南部鉄器(NAMBU-TEKKI)は東北地方・岩手県の伝統的工芸品です。産地は盛岡市、奥州市。"
English queries not matching Japanese data — the multilingual model was doing something closer to string matching than true semantic search. Fixed with hybrid search: prefecture name queries use ChromaDB's metadata filter directly, bypassing embedding search. Embedding search remains as fallback for general queries. Real-world RAG lesson: structured metadata filtering plus semantic search together is often the right architecture.
~1.5 hours.
What I added: Fed all 10 engawa articles into the RAG. The bot can now answer questions not just about 249 crafts but about my ideas, frameworks, and perspective.
New in the stack: BeautifulSoup4 for web scraping, a script to auto-scrape all articles from taishiokano.com.
The routing problem: With 249 craft records and only 10 articles, the articles were getting buried in search results. Fixed by tagging documents with category metadata and routing queries: craft/prefecture queries hit the craft database directly, everything else searches articles first.
The moment it got interesting: After fixing the routing, I asked: "What does Taishi think about friction?" The bot returned a structured synthesis of my argument across multiple essays — threads from articles I wrote months apart, assembled into something coherent. It wasn't retrieval and it wasn't generation. Something in between.