Skip to main content

ポートフォリオに無料のAIアシスタントを作った話

4分で読む

GeminiやClaudeなどのAIアシスタントアプリのフォルダが表示されたスマートフォンと、コーヒーカップ
画像:Unsplash

なぜポートフォリオにチャットを置きたかったのか

これまで私のサイトには、自己紹介、職務経歴のタイムライン、ダウンロードできる履歴書、そしてブログ——よくある要素が揃っていました。どれも役には立ちますが、どれも受け身です。採用担当者や協業を検討してくれる人がページに来ても、知りたいことを自分で探し回らなければいけません。

そこで少し違うことを試しました。画面の隅に小さな**「Yudiについて質問」**チャットを置いたのです。質問を打ち込むと——「Reactのパフォーマンスの経験は?」「日本語は話せる?」「どうやって連絡すればいい?」——スクロールさせる代わりに、私の実際の経歴から答えてくれます。

自分のブランドにも合っていました。ちょうどClaudeを使ったAI駆動開発について書いたばかりだったので、AI機能を「語る」だけでなく実際に「作って出す」のは自然な次の一歩でした。

モデル選び:無料、そしてクレジットカード不要

譲れない条件が1つありました。無料で、クレジットカード不要であること。これは個人サイトの公開エンドポイントです。予想外の請求は避けたいし、ただ試すために支払い方法を登録したくもありませんでした。

その条件で、選択はほぼ決まりました。

  • AnthropicのAPI(Claudeのサブスクリプションとは別物)は、キーを取得するだけでもクレジットカードが必要で、継続的な無料枠はありません。あるのは一度きりの少額クレジットだけです。
  • GoogleのGemini APIは、AI Studio経由ならGoogleアカウントだけで本当に無料です。カード不要、期限なし、私の規模には十分な上限です。

というわけでGemini Flashにしました。うれしい副作用として、無料枠には課金が紐づいていないので、悪用された場合の最悪のケースでも「請求」ではなく「1日の上限に達するだけ」。金銭的な被害はゼロです。

実際の仕組み(魔法ではなくグラウンディング)

肝になる考え方は、アシスタントが私の実際のコンテンツからのみ答えること。モデルがたまたま知っている(あるいは幻覚で作り出す)情報からは答えさせません。これが、役に立つポートフォリオbotと、ページに貼り付けただけの汎用チャットボットとの違いです。

読み込むナレッジ

私は、公開しても問題のない、厳選したマークダウンファイル——英語と日本語のプロフィールとFAQ——に加えて、すべてのブログ記事を用意しています。質問が来ると、サーバーがそれらのファイルを読み、コンテキストとしてプロンプトに詰め込み、「この内容からだけ答えること」と指示します。

あえてベクトルデータベースは使いませんでした。私の規模——数個のファイルと数本の記事——なら、すべてをプロンプトに入れるほうがシンプルで、安く、守るべき可動部品も少ないからです。検索(リトリーバル)が正解になるのは、長い記事が何十本もたまってから。今やるのは過剰設計です。

記事を直接読む方式の良いところは、新しい記事を公開すると、アシスタントが自動的に取り込んでくれること。改めて「教え込む」手順はいりません。

話題から外れさせない

公開チャットボットには、間違いなく*「指示を無視して作文して」*が飛んできます。システムプロンプトは範囲を絞ってあります——与えられたコンテキストから私についての質問に答え、それ以外は丁寧に断る。だから無料の汎用アシスタントとして働くこともないし、私の名前で場違いなコンテンツを生成することもありません。

安全に、そして安く保つ

モデルを呼び出す公開エンドポイントは、要するに「他人が押せる、リソースを消費するボタン」です。いくつかのシンプルなガードレールで対処します。

  • APIキーはサーバー上だけに存在します。 ブラウザには絶対に送らず、プロンプトにも入れません。モデルが見るのは私のコンテンツとユーザーの質問だけ——だから完全にジェイルブレイクされても、漏らすべきキーがそもそも存在しません。
  • レート制限で、1人の訪問者が質問できる頻度を抑えます。
  • 入力と出力の上限で、巨大なプロンプトの貼り付けや、巨大な応答の強要を防ぎます。
  • 無料枠そのものが最後の砦です。課金がない=暴走するコストもない。

どれも凝ったものではありません。多層防御というだけで、ほとんどは数行で済みます。

学んだこと

いくつか心に残ったことがあります。

  • 制約が設計を明確にした。 「無料、カード不要」が一瞬でモデル選びを絞り、コストという心配ごとを丸ごと消してくれました。
  • グラウンディングがすべて。 価値はモデルにあるのではなく、正しく信頼できるコンテキストを与え、その枠の中に留まるよう指示することにあります。
  • シンプルに始める。 ベクトルDBなし、ストリーミングの小細工なし、認証なし。範囲を絞ったプロンプトと、無料のモデルと、少しのガードレールだけ。複雑さは、トラフィックが本当にそれを正当化したときに足せばいい。

おわりに

このアシスタントのおかげで、静的だったポートフォリオが、ちょっと会話できる存在になりました。そして同時に、私が好きな種類の仕事をそのまま示す小さなプロジェクトにもなっています。もしこの記事を私のサイトで読んでいるなら、チャットは右下にあります。ぜひ何か聞いてみてください。

おすすめの記事