[{"content":"A page for a career history / self-introduction, still under construction. I\u0026rsquo;ll fill this in gradually.\nTopics I\u0026rsquo;d like to cover (coming soon) Thanks for your patience.\n","permalink":"https://www.kanjtomi1967.net/en/history/","summary":"\u003cp\u003eA page for a career history / self-introduction, still under\nconstruction. I\u0026rsquo;ll fill this in gradually.\u003c/p\u003e\n\u003ch2 id=\"topics-id-like-to-cover\"\u003eTopics I\u0026rsquo;d like to cover\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e(coming soon)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThanks for your patience.\u003c/p\u003e","title":"History Room"},{"content":"A page for writing about hobbies, separate from the technical posts. Still under construction — I\u0026rsquo;ll fill this in gradually.\nTopics I\u0026rsquo;d like to cover (coming soon) Thanks for your patience.\n","permalink":"https://www.kanjtomi1967.net/en/hobby/","summary":"\u003cp\u003eA page for writing about hobbies, separate from the technical posts.\nStill under construction — I\u0026rsquo;ll fill this in gradually.\u003c/p\u003e\n\u003ch2 id=\"topics-id-like-to-cover\"\u003eTopics I\u0026rsquo;d like to cover\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e(coming soon)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThanks for your patience.\u003c/p\u003e","title":"Hobby Room"},{"content":"The search page on this blog has a natural-language \u0026ldquo;Ask AI\u0026rdquo; search powered by RAG (Retrieval-Augmented Generation), separate from the regular keyword search. This post covers how to use it, and how it works under the hood.\nHow to use it Open /search/\nAbove the existing keyword search (PaperMod\u0026rsquo;s built-in fuse.js search), you\u0026rsquo;ll see an \u0026ldquo;Ask AI\u0026rdquo; question box\nType a question in plain language\nExample: \u0026ldquo;Why does a non-root directory on CloudFront return a 403 instead of serving index.html?\u0026rdquo;\nSubmitting runs a Cloudflare Turnstile bot check in the background; once it passes, the question is sent to the backend\nAfter a few seconds you\u0026rsquo;ll see an answer along with links to the source articles it was grounded in\nIf a question isn\u0026rsquo;t covered by anything on this blog, the model is instructed to say so honestly rather than answering from outside knowledge. This is a search feature grounded only in this blog\u0026rsquo;s own content.\nHow it works Indexing (build time) rag-index/ (a Java 17 / Maven CLI) reads every non-draft post under content/posts/, splits each into chunks (by ## heading, falling back to ~1500-character sliding windows for long or heading-less sections), embeds each chunk with Voyage AI\u0026rsquo;s embeddings API (voyage-3-lite), and uploads the resulting array of {id, slug, title, url, chunkText, embedding} as index.json to a dedicated S3 bucket (www.kanjtomi1967.net-rag-index).\nThis indexing step runs on every Jenkins deploy, between Build and Deploy (the Rebuild RAG Index stage). So pushing a new or updated post automatically shows up in the search index on the next deploy.\nAnswering a question (runtime) Questions go through API Gateway to a Lambda function (blog-rag, in lambda-rag/, Java 17) on POST /ask.\nVerify the Cloudflare Turnstile token server-side On a cold start, download index.json from S3 and keep it in memory for the lifetime of the execution environment (warm invocations reuse it) Embed the question via Voyage AI and rank every chunk by cosine similarity, brute-force (fine at this corpus size — no vector DB needed) Take the top 4 chunks Pass those chunks as grounding context to Claude (claude-haiku-4-5) and have it answer based on them Return {answer, sources: [{title, url}]} The API Gateway stage also has a conservative throttle (burst 5 / rate 2) as a second line of defense against a scripted caller running up the Claude bill.\nSummary Answers are grounded only in the blog\u0026rsquo;s own posts, which keeps hallucination risk low and helps with \u0026ldquo;I remember reading this somewhere but can\u0026rsquo;t find it\u0026rdquo; Push a post and the index updates automatically on the next deploy Turnstile + throttling keep both cost and abuse in check If you can\u0026rsquo;t quite recall the keyword for something you read here, give \u0026ldquo;Ask AI\u0026rdquo; a try.\n","permalink":"https://www.kanjtomi1967.net/en/posts/2026-08-25-rag-search-usage/","summary":"\u003cp\u003eThe \u003ca href=\"/en/search/\"\u003esearch page\u003c/a\u003e on this blog has a natural-language \u0026ldquo;Ask AI\u0026rdquo;\nsearch powered by RAG (Retrieval-Augmented Generation), separate from the\nregular keyword search. This post covers how to use it, and how it works\nunder the hood.\u003c/p\u003e\n\u003ch2 id=\"how-to-use-it\"\u003eHow to use it\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003eOpen \u003ca href=\"/en/search/\"\u003e\u003ccode\u003e/search/\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAbove the existing keyword search (PaperMod\u0026rsquo;s built-in fuse.js search),\nyou\u0026rsquo;ll see an \u0026ldquo;Ask AI\u0026rdquo; question box\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eType a question in plain language\u003c/p\u003e\n\u003cp\u003eExample: \u0026ldquo;Why does a non-root directory on CloudFront return a 403\ninstead of serving index.html?\u0026rdquo;\u003c/p\u003e","title":"How to Use \"Ask AI\" - RAG Search on This Blog"},{"content":"This is a test post for the automated deployment pipeline.\n","permalink":"https://www.kanjtomi1967.net/en/posts/test-post/","summary":"\u003cp\u003eThis is a test post for the automated deployment pipeline.\u003c/p\u003e","title":"Test Post"},{"content":"On this blog I write technical notes about AWS, AI-native infrastructure, and enterprise support work.\nTech stack Hugo: static site generator AWS: S3 + CloudFront + Route 53 + ACM Jenkins: CI/CD, running locally on Windows GitHub: source control 1 2 3 # example code block hugo new posts/my-new-post.md hugo server -D Thanks for reading.\n","permalink":"https://www.kanjtomi1967.net/en/posts/2026-08-02-hello-world/","summary":"\u003cp\u003eOn this blog I write technical notes about AWS, AI-native infrastructure,\nand enterprise support work.\u003c/p\u003e\n\u003ch2 id=\"tech-stack\"\u003eTech stack\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eHugo\u003c/strong\u003e: static site generator\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eAWS\u003c/strong\u003e: S3 + CloudFront + Route 53 + ACM\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eJenkins\u003c/strong\u003e: CI/CD, running locally on Windows\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eGitHub\u003c/strong\u003e: source control\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# example code block\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ehugo new posts/my-new-post.md\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ehugo server -D\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003eThanks for reading.\u003c/p\u003e","title":"Hello, World"}]