[{"content":"技術記事とは別に、趣味について書いていくページです。まだ準備中ですが、 少しずつ更新していく予定です。\n書いていきたいこと (準備中) しばらくお待ちください。\n","permalink":"https://www.kanjtomi1967.net/ja/hobby/","summary":"\u003cp\u003e技術記事とは別に、趣味について書いていくページです。まだ準備中ですが、\n少しずつ更新していく予定です。\u003c/p\u003e\n\u003ch2 id=\"書いていきたいこと\"\u003e書いていきたいこと\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e(準備中)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eしばらくお待ちください。\u003c/p\u003e","title":"趣味の部屋"},{"content":"経歴・自己紹介などをまとめていく予定のページです。まだ準備中ですが、 少しずつ更新していきます。\n書いていきたいこと (準備中) しばらくお待ちください。\n","permalink":"https://www.kanjtomi1967.net/ja/history/","summary":"\u003cp\u003e経歴・自己紹介などをまとめていく予定のページです。まだ準備中ですが、\n少しずつ更新していきます。\u003c/p\u003e\n\u003ch2 id=\"書いていきたいこと\"\u003e書いていきたいこと\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e(準備中)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eしばらくお待ちください。\u003c/p\u003e","title":"履歴の部屋"},{"content":"このブログの検索ページには、キーワード検索とは別に「AIに聞く」という RAG(Retrieval-Augmented Generation)ベースの自然言語検索を用意しています。 この記事では使い方と、裏側でどう動いているかを簡単にまとめます。\n使い方 /search/ を開く\nページ上部の既存キーワード検索(PaperMod標準のfuse.js)とは別に、 「AIに聞く」の質問欄が表示される\n自然文で質問を入力する\n例:「CloudFrontで直下じゃないディレクトリのindex.htmlが403になるのはなぜ?」\n送信するとCloudflare Turnstileによるボット検証が裏で走り、 検証を通過するとバックエンドに問い合わせが飛ぶ\n数秒待つと回答と、根拠にした記事へのリンク(sources)が表示される\n質問がこのブログの記事でカバーされていない内容の場合は、 外部知識で答えるのではなく「記事に情報がない」と正直に返す設計になっています。 あくまでこのブログの内容だけを根拠に回答する検索機能です。\n裏側の仕組み インデックス作成(ビルド時) rag-index/(Java 17 / Maven製CLI)が、content/posts/配下の非draft記事を すべて読み込み、##見出し単位(見出しが無い/長すぎる場合は約1500文字の スライディングウィンドウ)でチャンクに分割します。各チャンクをVoyage AIの 埋め込みAPI(voyage-3-lite)でベクトル化し、{id, slug, title, url, chunkText, embedding} の配列としてindex.jsonにまとめ、専用のS3バケット (www.kanjtomi1967.net-rag-index)へアップロードします。\nこのインデックス作成はJenkinsのデプロイパイプラインでBuildとDeployの間に 毎回実行される(Rebuild RAG Indexステージ)ため、記事を追加・更新して git pushすれば、次のデプロイで自動的に検索対象へ反映されます。\n質問応答(実行時) 質問はAPI Gateway経由でLambda(blog-rag、lambda-rag/、Java 17)の POST /askが受け取ります。\nCloudflare Turnstileトークンをサーバー側で検証 コールドスタート時にindex.jsonをS3からダウンロードし、 ウォーム状態の間はメモリ上に保持 質問文をVoyage AIで埋め込み、全チャンクとのコサイン類似度で ブルートフォースにランキング(このコーパス規模ならベクトルDBは不要) 上位4チャンクを取得 取得したチャンクを根拠としてClaude(claude-haiku-4-5)に渡し、 その内容に基づいて回答を生成 {answer, sources: [{title, url}]}を返す API Gatewayのステージには控えめなスロットル(burst 5 / rate 2)もかけてあり、 スクリプトによる乱用でClaude APIの課金が跳ね上がらないよう二重に対策しています。\nまとめ 記事本文だけを根拠にするので、ハルシネーションのリスクを抑えつつ 「このブログのどこに書いてあったか忘れた」を解消できる 記事を書いてpushすれば自動でインデックスが更新される Turnstile + スロットリングでコストと乱用を両方抑えている 気になる記事を検索キーワードで思い出せないときは、ぜひ「AIに聞く」を 試してみてください。\n","permalink":"https://www.kanjtomi1967.net/ja/posts/2026-08-25-rag-search-usage/","summary":"\u003cp\u003eこのブログの\u003ca href=\"/ja/search/\"\u003e検索ページ\u003c/a\u003eには、キーワード検索とは別に「AIに聞く」という\nRAG(Retrieval-Augmented Generation)ベースの自然言語検索を用意しています。\nこの記事では使い方と、裏側でどう動いているかを簡単にまとめます。\u003c/p\u003e\n\u003ch2 id=\"使い方\"\u003e使い方\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"/ja/search/\"\u003e\u003ccode\u003e/search/\u003c/code\u003e\u003c/a\u003e を開く\u003c/p\u003e","title":"「AIに聞く」の使い方 - このブログのRAG検索について"},{"content":"これは自動デプロイのテスト記事です。\n","permalink":"https://www.kanjtomi1967.net/ja/posts/test-post/","summary":"\u003cp\u003eこれは自動デプロイのテスト記事です。\u003c/p\u003e","title":"Test Post"},{"content":"このブログでは、AWS・AI-nativeインフラ・エンタープライズサポート関連の技術メモを 書いていきます。\n使っている技術スタック Hugo: 静的サイトジェネレーター AWS: S3 + CloudFront + Route 53 + ACM Jenkins: ローカル(Windows)でCI/CDを実行 GitHub: ソース管理 1 2 3 # サンプルコードブロック hugo new posts/my-new-post.md hugo server -D よろしくお願いします。\n","permalink":"https://www.kanjtomi1967.net/ja/posts/2026-08-02-hello-world/","summary":"\u003cp\u003eこのブログでは、AWS・AI-nativeインフラ・エンタープライズサポート関連の技術メモを\n書いていきます。\u003c/p\u003e\n\u003ch2 id=\"使っている技術スタック\"\u003e使っている技術スタック\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eHugo\u003c/strong\u003e: 静的サイトジェネレーター\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: ローカル(Windows)でCI/CDを実行\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eGitHub\u003c/strong\u003e: ソース管理\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# サンプルコードブロック\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\u003eよろしくお願いします。\u003c/p\u003e","title":"はじめまして"}]