Review Forge は、Amazonの購入履歴CSVをもとに、商品ごとのレビュー文を半自動で作るための個人用Webアプリです。 リポジトリ名は amazon-review-writer。購入した商品を一覧で見ながら、星評価、ひとことメモ、文体を指定すると、ローカルで動かしているLLMがレビューのタイトルと本文を生成します。
目的は、レビュー投稿を機械的に増やすことではありません。 実際に使った感想を短いメモとして残し、それを読みやすい日本語に整える作業台を作ることです。 毎回ゼロから文章を考えるのは地味に重いので、「良かった点」「気になった点」「どう使ったか」だけ先に置いて、あとは自然な文章に展開してもらう流れにしました。
何をするアプリか
最初にやることは、Amazonのデータ開示などで取得した購入履歴CSVを data/csv/、または Your Orders/Your Amazon Orders/ に置くことです。 アプリ側でCSVを読み取り、商品名、注文日、価格、数量、ASINなどをSQLiteに保存します。
トップ画面では、取り込んだ商品をカード形式で表示します。 未レビュー、レビュー済み、すべての切り替え、商品名検索、30件単位のページネーションに対応しています。 ASINがある商品は、商品ページやレビュー一覧へ移動できるリンクも置いています。
この記事では、アイキャッチや構造説明には生成したビジュアルを使い、操作説明には実際に動かしている画面のスクリーンショットを使っています。 雰囲気を伝える画像と、実装の現在地が分かる画像を分けて見せる形にしました。

レビューを書く画面では、次の情報を入力します。
- 星評価
- 商品を使った感想メモ
- 文体のトーン
- 参考にしたい他の購入者レビュー
生成ボタンを押すと、Ollama経由でローカルLLMに投げ、結果をストリーミング表示します。 最近の更新で、本文だけでなくレビュータイトルも生成するようにしました。 生成後の文章はそのまま編集でき、タイトルだけ、本文だけ、全文まとめてコピーできます。
CSVからレビュー保存までの流れ

内部の流れは、かなりシンプルです。
- CSVを読み込む
- 商品をSQLiteに保存する
- 商品一覧からレビュー対象を選ぶ
- 星評価とメモを入力する
- Ollamaのローカルモデルでタイトルと本文を生成する
- 文章を編集してコピー、または履歴に保存する
DBは better-sqlite3 を使い、products、reviews、import_logs の3つを中心にしています。 reviews には draft、copied、posted のステータスを持たせました。 保存したあとに「コピー済み」「投稿済み」へ切り替えられるので、あとからどの商品まで処理したかを追いやすくしています。
重複商品への対応も入れています。 同じASIN、または同じ商品名で複数回購入しているものは、一覧上でまとまりやすいように扱っています。 日用品や消耗品は何度も買うので、購入履歴をそのまま並べるだけだと作業対象が見づらくなるためです。
実際のレビュー作成画面では、商品情報、星評価、メモ入力、生成フローを一画面で追えるようにしています。

レビュー作成画面で大事にしたこと

レビュー作成画面では、入力欄を増やしすぎないことを意識しました。 ユーザーが書くべきなのは、完成文ではなく素材です。
たとえば、次のような短いメモで十分です。
- 思ったより軽い
- 音は少し大きい
- 毎朝使っている
- 価格を考えると満足
この程度の断片を、星評価やトーン指定と一緒にLLMへ渡します。 トーンは、カジュアル、丁寧、短め、詳しめのように切り替えられます。 デフォルトは丁寧寄りにしました。 Amazonレビューは人に読まれる文章なので、強すぎる言い方や広告っぽい表現よりも、落ち着いた実体験として読める文体のほうが使いやすいと考えたからです。
参考レビュー欄も追加しています。 他の購入者レビューをそのまま真似るためではなく、商品に対してよく見られる観点や、触れるべきポイントを把握するための材料です。 プロンプト側でも、参考情報は観点として扱い、コピーや言い回しの流用を避けるようにしています。
生成後は、タイトルと本文を分けて表示します。 どちらもその場で編集でき、必要な部分だけコピーできます。

下の画像は、レビュー作成画面のコンセプトを少しリッチに見せるために生成したビジュアルです。 実画面そのものではありませんが、商品情報、評価、メモ、生成結果を一つの作業台にまとめる方向性は、このイメージに近いです。

技術構成
フロントエンドは Next.js App Router、React、TypeScriptです。 UIはTailwind CSSとshadcn系のコンポーネントをベースにし、lucide-reactのアイコン、sonnerのトースト、next-themesのテーマ切り替えを使っています。
バックエンド側はNext.jsのAPI Routesで完結させています。 CSV解析には papaparse、ローカルDBには better-sqlite3、レビュー生成にはOllamaを使っています。 環境変数では、OllamaのURL、モデル名、DBパス、CSVディレクトリ、エクスポート先を指定できます。
現時点の想定モデルは gemma4:e4b です。 ただし、LLMまわりは src/lib/ollama.ts に寄せているので、将来的に別モデルへ切り替えやすい形にしています。
レビュー生成は、APIからストリーミングで返しています。 画面側では生成中の文章が少しずつ流れてくるので、待ち時間がただの空白になりません。 生成が長くなりすぎたときに備えて、最近は num_predict も増やしました。
最近入れた改善
このプロジェクトは、最初の「レビュー本文を出す」だけの状態から、実際に使うための作業台へ少しずつ寄せています。 直近では、次のような改善を入れました。
- 全商品を対象にしたサーバーサイド検索
- ページネーション
- ASIN画像URLの複数パターン試行
- 重複商品の集約
- レビュータイトル生成
- 生成後本文の直接編集
- 参考レビュー入力欄
- 投稿済み、下書きへのステータス切り替え
- 保存時にレビュー状態を維持する処理
地味な改善が多いですが、こういう部分がないと日常の道具として使い続けにくくなります。 特に検索とステータス管理は重要でした。 購入履歴が増えるほど、未処理の商品にすぐたどり着けること、どこまで投稿したか分かることの価値が上がります。
完全自動化ではなく、手元の作業を軽くする
このアプリは、レビュー投稿そのものを自動化するものではありません。 生成された文章を確認し、必要なら編集し、コピーして使うためのアプリです。 note記事化に使うためのMarkdown素材出力もありますが、現時点では「素材を作る」段階です。
また、完全オフラインとまでは言いません。 レビュー生成とDBはローカルで動きますが、商品画像や商品ページへのリンクでは外部URLを使います。 ここは記事としても誇張せず、ローカルLLMを使った個人用レビュー作業台、という位置づけにしています。
作ってみて感じたこと
AIを入れる場所は、全部を任せる場所ではなく、「文章にするのが面倒なところ」だけで十分だと感じました。 レビューで大切なのは、実際に使った人の観点です。 軽い、うるさい、便利、合わなかった、思ったより良かった。 そういう小さな感想は人間が持っています。
Review Forgeは、その感想を整えるための道具です。 商品一覧、星評価、メモ、生成、コピー、保存。 この流れをひとつの画面体験としてまとめることで、レビューを書く作業が少しだけ軽くなりました。
今後は、履歴からの再編集、note素材出力の使い勝手、CSV仕様の違いへの耐性をもう少し磨いていきたいです。 レビューを書くためだけでなく、「買ったものを振り返る個人ログ」としても育てられる余地がありそうです。

