本記事は 2026/02/01 ~ 2026/03/02 の間毎日 AI アプリケーション開発(AI を搭載したアプリ開発 or AI を使用した開発)をテーマに 30 days AI challenge を行う 26 日目のブログポストです。
今日は一般教養を学べる AI アプリを作りました。
アプリ概要
複数のジャンルを選ぶことができ、その中から AI が教養知識をピックアップして教えてくれます。
学習した内容を SQL Server に記録し、あとから復習することもできます。

特に目新しい機能の実装はありません。
教養を身に着けたいなとふと思った私に必要なアプリを作ったので、自己満アプリです笑


保存した教養データはデータベースに保存してあるので復習として AI がクイズを出してくれます。

技術要素
いつも通り SQL Server への接続は Microsoft.Data.SqlClient を使用しています。
手動でテーブル作成をしなくてもエラーにならないように、テーブルが存在しない場合は作成するような仕組みにしています。
毎回 IF NOT EXISTS クエリ箇所は呼び出されるので効率的ではないですが、そもそもこのアプリ自体そこまで頻繁に呼び出すものでもないのでこの実装で許容しています。
public async Task InitializeTableAsync()
{
using var connection = new SqlConnection(GetConnectionString());
await connection.OpenAsync();
var query = @"
IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Items')
BEGIN
CREATE TABLE Items (
Id INT IDENTITY(1,1) PRIMARY KEY,
Category NVARCHAR(50) NOT NULL,
Title NVARCHAR(500) NOT NULL,
Source NVARCHAR(500) NOT NULL DEFAULT '',
Quote NVARCHAR(MAX) NOT NULL DEFAULT '',
Explanation NVARCHAR(MAX) NOT NULL DEFAULT '',
Background NVARCHAR(MAX) NOT NULL DEFAULT '',
ReviewCount INT NOT NULL DEFAULT 0,
CorrectCount INT NOT NULL DEFAULT 0,
CreatedAt DATETIME2 NOT NULL DEFAULT GETUTCDATE(),
LastReviewedAt DATETIME2 NULL
)
END";
using var command = new SqlCommand(query, connection);
await command.ExecuteNonQueryAsync();
}
過去に学んだ教養(データベースに記録されているデータ)、今 AI にて表示されている教養(セッション中の表示済みデータ)とこれから生成する教養がかぶらないように、重複防止ロジックを組んでいます。
// Razor 側: DB と セッション中表示済みを統合
var dbTitles = await CultureService.GetExistingTitlesAsync();
var allExcluded = dbTitles.Union(sessionDisplayedTitles).Distinct().ToList();
currentLearnItem = await CultureService.LearnByCategoryAsync(category, allExcluded);
if (currentLearnItem != null && !string.IsNullOrEmpty(currentLearnItem.Title))
{
sessionDisplayedTitles.Add(currentLearnItem.Title);
}
終わりに
今日も学びアプリの作成となりました。
AI に絡めたアプリにすると、AI を教師と見立てた学習アプリになりがちだなと思いました。よく言えば、AI と学習は非常に親和性が高いですが、悪く言えばありがちな凡庸アプリとも言えますね笑。
(30 days challenge は継続が大事!と自分に言い聞かせ内容の質はあまり問わないようにします)
明日もよろしくお願いします。最後までご覧いただきありがとうございました。

コメント