AI 単語帳アプリ – day 13

30 days AI challenge

本記事は 2026/02/01 ~ 2026/03/01 の間毎日 AI アプリケーション開発(AI を搭載したアプリ開発 or AI を使用した開発)をテーマに 30 days AI challenge を行う 13 日目のブログポストです。

最近のトレンドについていけない、若者の好きなアイドルが分からない、よく聞く言葉の意味を毎回覚えられない、など最新のトレンドをなんとなくしか知らないことや単語の意味を覚えられないということはよくありますよね。

今回はそんな方へのアプリ、AI 単語帳アプリを作りました。

アプリの紹介

AI 単語帳と聞くとあまり面白そうではないですが、今回のアプリは知りたい単語(文章)を AI が検索し、その検索データをデータベースに登録、その登録データを元に AI がクイズを作成してくれます。

知りたい単語の意味を調べるだけにも使えますし、それを単語帳に登録し反復学習を行えます。

このように、登録したデータを選び AI がクイズを出してくれます。連続して不合格(正答率 80% 未満)となると、覚えが悪いリストに登録されていきます。

技術観点

今回技術観点で紹介したいのは Grounding 機能です。

今回単語の検索には Gemini を使っており、Gemini をはじめとした AI(LLM)には “カットオフ” と呼ばれる制限があります。カットオフとは、AIが学習したデータの最終更新日 を意味し、LLM は学習した日付より最新のデータを取得/返すことができないという制限があります。

そのため、多くの LLM モデルでは、その学習データが半年や 1 年以上前であることがあります。その場合、最新のトレンド情報を検索した際にその結果が見つからない状況が発生します。

それを解決するのが Grounding(Grounding with Google Search)機能です。Grounding をすることで、最新の検索結果(出典情報)を参照し AI の結果と結びつけることでより正確で新しい情報を取得できます。これで直近のトレンドも確認することができます(さすがにリアルタイムではなさそうですが、かなり最新のデータをとれるようです)。

Grounding 実装箇所のサンプルは以下です。Grounding Tool を定義し、AI 呼び出し時に引数に指定します。

/// <summary>
/// Grounding with Google Search を使用して最新データを含めた回答を取得
/// </summary>
public async Task<(string text, List<(string title, string uri)> sources)> GetChatResponseWithGroundingAsync(string userMessage)
{
    // Grounding ツールの設定
    var googleSearchTool = new Tool
    {
        GoogleSearch = new GoogleSearch()
    };

    var config = new GenerateContentConfig
    {
        Tools = new List<Tool> { googleSearchTool }
    };
  
  // コンテンツ生成
  try
    {
        var response = await _client.Models.GenerateContentAsync(modelId, allContents, config);
        var text = response.Candidates?[0]?.Content?.Parts?[0]?.Text;
    
  ~省略~            

    // ... モデル試行 + 出典情報抽出
    if (response.Candidates?[0]?.GroundingMetadata?.GroundingChunks != null)
    {
        foreach (var chunk in response.Candidates[0].GroundingMetadata.GroundingChunks)
        {
            sources.Add((chunk.Web.Title, chunk.Web.Uri));
        }
    }
}

上記メソッドを以下のように呼び出しています。

public async Task<(string explanation, List<(string title, string uri)> sources)> GetAiExplanationAsync(string term)
{
    var prompt = $@"次の単語や文章について、簡潔に意味と関連情報を説明してください。最新の情報も参考にしてください。";
    
    // Grounding 検索を使用
    var (response, sources) = await _geminiService.GetChatResponseWithGroundingAsync(prompt);
    return (response.Trim(), sources);
}

終わりに

カットオフからの Grounding ということを今日学びました。

LLM はモデルの精度もありますが、最新データやより正確な情報を取得したい場面ではこのように直近の出典を参照するような補助機能が必要です。

日ごろは仕事で M365 Copilot を使っており、Copilot は Web 検索を伴い割と最新情報を返してくれるのでこれまで気にしていませんでしたが、LLM を API から呼び出したことで、Web 検索(を含む AI)との差を感じることができました。

割と身近な単語帳というアプリを作ってみたことで新たな学びがありました。

今日も閲覧いただきありがとうございました。明日もよろしくお願いします!

コメント

タイトルとURLをコピーしました