結局、[Vue]にAIってどうなの?
最近考えてたんだけど、[Vue.js]のコンポーネントにAIを組み込む話。よく見るようになったよね。でも、それって本当に意味あるのかなって。単なる流行り?それとも、ちゃんとユーザー体験を良くするものなのか…。
正直、最初は半信半半疑だった。でも、ちょっと試してみたら…うん、これは思ったより使えるかもしれない。特に、ユーザーが何をしていいか分からない、みたいな曖昧な状況を助けるのが得意みたいだね。これは従来のコンポーネントにはなかった視点かも。
要するに、ただの部品じゃなくて、ちょっとした「アシスタント」がコンポーネントの中に住んでる感じ。ちゃんと使えば、だけど。
手始めは、やっぱり「賢い検索」から
じゃあ具体的に何ができるの?って話で。一番わかりやすいのが、たぶん検索機能の強化。スマートサーチってやつ。
ユーザーが2、3文字タイプしただけで、「もしかして、これ探してます?」みたいに候補を出す。ただの履歴やキーワードの一致じゃなくて、文脈を読んで提案してくれるのがミソ。
例えば「ケーキ 作り方」って入力途中でも、「初心者向けの簡単なケーキレシピ」とか「チョコレートケーキのプロのコツ」みたいな、一歩踏み込んだ候補を出せる。…まあ、プロンプト次第だけどね。
この「先回り」ができると、ユーザーは思考を中断されずに済むし、自分が何を求めていたのかを再発見することさえある。これは体験として、かなり大きい。
で、どうやって作るの?Composableにまとめるのがキモ
じゃあ、この「賢い検索」をどうやって作るか。意外と、骨格はシンプルなんだよね。[Vue 3]なら[Composition API]を使って、AI関連のロジックを`Composable`に切り出すのが定石かな。
コンポーネント側は、見た目とユーザー操作に集中する。
<template>
<div class="smart-search">
<input
v-model="query"
@input="handleInput"
placeholder="何かを探す..."
/>
<div v-if="isLoading" class="loading">
AIが候補を考えています...
</div>
<div v-if="suggestions.length > 0" class="suggestions">
<div
v-for="suggestion in suggestions"
:key="suggestion.id"
@click="selectSuggestion(suggestion)"
>
{{ suggestion.text }}
</div>
</div>
</div>
</template>
<script setup>
import { ref } from 'vue'
import { useAISearch } from '@/composables/useAISearch'
const query = ref('')
const { suggestions, isLoading, getSuggestions } = useAISearch()
// 300ms待ってからAPIを叩く(毎回叩かないように)
const handleInput = debounce(async () => {
if (query.value.length > 2) {
await getSuggestions(query.value)
}
}, 300)
const selectSuggestion = (suggestion) => {
query.value = suggestion.text
// ... 選択後の処理
}
</script>
大事なのはここから。実際のAIとの通信部分は、`useAISearch.js`みたいなファイルに分離する。こうすると、コンポーネントがごちゃごちゃしなくて済むし、他の場所でも再利用できる。
// composables/useAISearch.js
import { ref } from 'vue'
import axios from 'axios'
export function useAISearch() {
const suggestions = ref([])
const isLoading = ref(false)
const getSuggestions = async (query) => {
isLoading.value = true
suggestions.value = [] // 古い候補をクリア
try {
const response = await axios.post(
'https://api.openai.com/v1/chat/completions', // ここは自分の使うAPIエンドポイント
{
model: 'gpt-3.5-turbo',
messages: [
{
role: "system",
content: "あなたは優秀な検索アシスタントです。ユーザーの入力に基づき、関連性の高い検索候補を3つ提案してください。1行に1つずつ、候補のみを返してください。"
},
{
role: "user",
content: `次の入力に対する検索候補: "${query}"`
}
],
max_tokens: 60,
temperature: 0.5
},
{
headers: {
'Authorization': `Bearer ${process.env.VUE_APP_OPENAI_API_KEY}`
}
}
)
const content = response.data.choices[0].message.content
suggestions.value = content.split('\n').filter(s => s).map((text, i) => ({ id: i, text }))
} catch (error) {
console.error('AI候補の取得エラー:', error)
// エラー時は何も表示しない、とか。
} finally {
isLoading.value = false
}
}
return { suggestions, isLoading, getSuggestions }
}
ここ、`messages`の中の`system`プロンプト。ここでAIの役割を定義するのがすごく重要。「あなたは優秀な検索アシスタントです」みたいに。この一文で、返答の質が全然変わってくるから面白い。
あと、APIキーをコードに直接書かないこと。これは基本だけど、つい忘れがち。`.env`ファイルを使うのが鉄則だね。
検索だけじゃない、他の使い道も考えてみる
賢い検索は良い例だけど、応用範囲はもっと広い。例えば…
- 賢いフォームバリデーション:ただ「メールアドレスの形式が違います」って言うだけじゃなくて、「もしかして `.com` が抜けていませんか?」みたいに修正案を提示する。ユーザーのイライラが一つ減るかも。
- コンテンツの自動要約:長い記事やドキュメントの最初に、AIが生成した3行要約を表示する。ユーザーは全体を読むべきか、すぐに判断できる。
- 自然言語での操作:「来週火曜日の予定を赤色で表示して」みたいな文章でカレンダーを操作するとか。まだちょっと難しいけど、夢はあるよね。
でも、これって「銀の弾丸」じゃないよね
ここまで良いことばかり話したけど、もちろん万能じゃない。何でもAIにすれば良いってもんじゃない。APIコールにはお金もかかるし、レスポンスに時間もかかる。サーバーが落ちるかもしれないし。
海外のサービス、例えば[OpenAI API]を使うのが一般的だけど、最近は国内でも[ELYZA]みたいな良い感じの言語モデルが出てきてる。日本語のニュアンスをうまく扱いたいなら、そっちを検討するのもアリだね。用途とか、プライバシーポリシーとか、色々比較する必要はあるけど。
だから、どこでAIの力を使って、どこで使わないか。その見極めが、たぶん一番大事なスキルになる。
じゃあ、AIを使うべき時と、そうでない時
自分なりに整理してみると、こんな感じかな。判断基準として。
| AIを使うべきシナリオ | 従来のロジックで十分なシナリオ |
|---|---|
| ユーザーの意図が曖昧な時。自由入力の検索とか、質問応答とか。 | ルールが明確に決まっている時。郵便番号の桁数チェックとか。 |
| 文脈の理解が必要な場面。エラーメッセージを親切にしたい、とか。 | リアルタイム性が最優先される操作。例えば、入力中の文字数カウンターとか。 |
| パーソナライズされた体験を提供したい時。ユーザーの過去の行動から次を推薦する、とか。 | 状態が有限で、すべて事前に定義できる場合。ドロップダウンの選択肢とか。 |
| 「正解」が一つじゃない創造的なタスク。文章の要約、キャッチコピーの提案など。 | オフラインでも確実に動作する必要がある機能。APIが使えないと意味ないからね。 |
最後に、注意点とか...ハマりやすい罠
いくつか、やってみて気づいたことがある。
- なんでもAIに頼りすぎない:さっきも言ったけど、これが一番。本当にユーザー体験が向上する場所にだけ、ピンポイントで使うべき。技術的に面白いからって理由だけで入れると、大体うまくいかない。
- プライバシーへの配慮、忘れがち:ユーザーが入力した内容を外部のAPIに送るってことだからね。「このデータはAIの提案のために外部に送信されます」みたいな注意書きは、場合によっては必要。透明性は大事。
- エラーハンドリングは念入りに:APIは失敗するもの。AIが応答しない時に、アプリ全体が動かなくなるとか、最悪。必ず、AIなしでも最低限機能する「フォールバック」を用意しておくこと。
- ローディング状態を見せる:AIの応答は一瞬じゃない。コンマ数秒〜数秒かかることもある。その間、ユーザーを不安にさせないように「考え中...」みたいな表示は絶対必要。体感速度を上げる工夫だね。
結局、AIはただのツール。すごいツールだけど、使い所を間違えれば意味がない。大事なのは、これを使うことで「ユーザーが本当に楽になるのか?」「体験が楽しくなるのか?」を問い続けることなんだろうな、と。
あなたなら、どんなコンポーネントにAIを組み込んでみたいですか?もし何かアイデアがあったら、聞かせてほしいな。
