Galirage Inc.
🦖

AWSの最新モデル『Amazon Nova』を解説【比較結果あり】

はじめまして、ますみです!

株式会社Galirage(ガリレージ)という「生成AIに特化して、システム開発・アドバイザリー支援・研修支援をしているIT企業」で、代表をしております^^

自己紹介.png

この記事では「AWS re:Invent 2025」で発表された、Amazon Novaについて、徹底解説します!

これまで、AmazonのTitanというモデルは、正直精度が残念であり、Anthropic社のClaudeにおんぶにだっこ状態だったというのが、私の正直な所感でした。

しかし、さすがのAWSというだけあり、ここに来て、ものすごい強力な自社モデルを出してきました🎉

Amazon Novaとは?

Amazon Novaは、Amazonが開発した最上位基盤モデル(SOTA foundation model)であり、最新のAI技術を駆使して開発されています。

Amazon Novaは、テキスト、画像、動画などの多様な入力形式に対応し、高い精度と高速な処理速度を実現しています。

Amazon Novaの特徴

Amazon Novaには以下のような特徴があります。

  • マルチモーダル(テキスト、画像、動画などの複数の入力形式に対応)
  • 高い精度と高速な処理速度
  • 200以上の言語に対応
  • 低コスト(同等クラスのモデルと比較して75%安い)

Amazon Novaのモデルファミリー

Amazon Novaには以下のモデルファミリーがあります。

  • Amazon Nova Micro:テキストのみに対応し、低コストと低遅延が特徴
  • Amazon Nova Lite:テキスト以外に画像や音声、動画に対応するマルチモーダルモデル
  • Amazon Nova Pro:Liteよりも高性能なマルチモーダルモデル
  • Amazon Nova Premier:Proよりも高性能なモデル(2025年1~3月に公開予定)
  • Amazon Nova Canvas:画像生成モデル
  • Amazon Nova Reel:動画生成モデル

Amazon Novaの利用可能なリージョン

Amazon Novaは、AWSの生成AIサービス「Amazon Bedrock」で利用できます。

2024年12月3日から、米国東部リージョンで一般公開されています。

Amazon Novaの価格

Amazon Novaの価格は以下の通りです。

より正確な価格は、公式サイトでご確認ください。

Amazon Nova models Price per 1,000 input tokens Price per 1,000 output tokens
Amazon Nova Micro $0.000035 $0.00014
Amazon Nova Lite $0.00006 $0.00024
Amazon Nova Pro $0.0008 $0.0032

Amazon Novaのはじめ方

まず、Amazon Bedrockの「モデルアクセス」から該当するNovaのモデルを選択します。

そして、確認して、送信をクリックします。

そして、10分ほど待ち、リクエストが承認されたら、プレイグラウンドのChat / Textをクリックして、Novaのモデルを選択して、チャットをすることではじめられます。

使い方の説明は以上です。

Amazon Novaの精度比較

ここでは、以下のようなTODOアプリを開発するためのCRUD処理をステップバイステップで生成するプロンプトで精度比較を行いました。

あなたは、アーキテクチャの知識と経験を豊富に持ち、保守性の高いコードを記述できるPythonエンジニアです。フレームワークとしては、FastAPIを好みます。
私は「TODOアプリ」を開発したいです。このアプリケーションを開発するために必要なCRUDの処理をステップバイステップでコーディングしてください。

実際の出力結果は、下記のとおりです。

Amazon Nova Microの出力結果

まず、Amazon Nova Microでの出力結果を確認してみましょう。

Amazon Nova Microの出力結果

もちろんです!FastAPIを使用してTODOアプリを開発していきます。ステップバイステップでコードを記述していきます。

まず、プロジェクトのディレクトリ構造を考えてみましょう。

todo_app/
│
├── main.py             # FastAPIアプリケーションのエントリーポイント
├── models.py           # TODOモデルの定義
├── schemas.py          # TODOのスキーマ(リクエストとレスポンス)
├── database.py         # データベースの設定
├── dependencies.py     # データベース依存関係の設定
└── routers/
    └── todo.py         # TODO関連のAPIエンドポイント

Step 1: 必要なパッケージをインストール

まず、プロジェクトに必要なパッケージをインストールします。以下のコマンドを実行してください。

pip install fastapi uvicorn SQLAlchemy pydantic

Step 2: データベースの設定

データベースの設定ファイルdatabase.pyを作成します。

# database.py
from sqlalchemy import create_engine, MetaData
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

SQLALCHEMY_DATABASE_URL = "sqlite:///./todos.db"

engine = create_engine(SQLALCHEMY_DATABASE_URL)
metadata = MetaData()

SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

Base = declarative_base()

Step 3: TODOモデルの定義

モデルを定義するファイルmodels.pyを作成します。

# models.py
from sqlalchemy import Column, Integer, String, Boolean
from .database import Base

class Todo(Base):
    __tablename__ = "todos"

    id = Column(Integer, primary_key=True, index=True)
    title = Column(String, index=True)
    description = Column(String, index=True)
    priority = Column(Integer, index=True)
    completed = Column(Boolean, default=False)

Step 4: TODOスキーマの定義

リクエストとレスポンスのスキーマを定義するファイルschemas.pyを作成します。

# schemas.py
from pydantic import BaseModel, Field

class TodoBase(BaseModel):
    title: str
    description: str
    priority: int

class TodoCreate(TodoBase):
    pass

class Todo(TodoBase):
    id: int
    completed: bool = Field(default=False, alias='completed')

    class Config:
        orm_mode = True

Step 5: FastAPIアプリケーションの設定

main.pyを作成します。

# main.py
from fastapi import FastAPI, HTTPException, Depends
from sqlalchemy.orm import Session
from . import models, schemas, database
from .database import SessionLocal

app = FastAPI()

# データベースへの依存関係
def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()

# TODOのCRUD操作
@app.post("/todos/", response_model=schemas.Todo)
def create_todo(todo: schemas.TodoCreate, db: Session = Depends(get_db)):
    db_todo = models.Todo(**todo.dict())
    db.add(db_todo)
    db.commit()
    db.refresh(db_todo)
    return db_todo

@app.get("/todos/", response_model=list[schemas.Todo])
def read_todos(skip: int = 0, limit: int = 10, db: Session = Depends(get_db)):
    todos = db.query(models.Todo).offset(skip).limit(limit).all()
    return todos

@app.get("/todos/{todo_id}", response_model=schemas.Todo)
def read_todo(todo_id: int, db: Session = Depends(get_db)):
    db_todo = db.query(models.Todo).filter(models.Todo.id == todo_id).first()
    if db_todo is None:
        raise HTTPException(status_code=404, detail="Todo not found")
    return db_todo

@app.put("/todos/{todo_id}", response_model=schemas.Todo)
def update_todo(todo_id: int, todo: schemas.TodoCreate, db: Session = Depends(get_db)):
    db_todo = db.query(models.Todo).filter(models.Todo.id == todo_id).first()
    if db_todo is None:
        raise HTTPException(status_code=404, detail="Todo not found")

    for key, value in todo.dict().items():
        setattr(db_todo, key, value)

    db.commit()
    db.refresh(db_todo)
    return db_todo

@app.delete("/todos/{todo_id}", response_model=schemas.Todo)
def delete_todo(todo_id: int, db: Session = Depends(get_db)):
    db_todo = db.query(models.Todo).filter(models.Todo.id == todo_id).first()
    if db_todo is None:
        raise HTTPException(status_code=404, detail="Todo not found")

    db.delete(db_todo)
    db.commit()
    return db_todo

# データベースの初期化
@app.on_event("startup")
def startup_db_client():
    database.Base.metadata.create_all(bind=database.engine)

Step 6: データベースの初期化

最後に、データベースの初期化を行うためにマイグレーションを手動で実行します。

python -c "from todo_app import database; database.Base.metadata.create_all(bind=database.engine)"

これで、基本的なTODOアプリの開発が完了しました。FastAPIの強力な機能を活用して、RESTful APIを実装しました。

アプリケーションを実行するには、以下のコマンドを使用します。

uvicorn main:app --reload

これで、ローカルの開発サーバーでTODOアプリのAPIが動作するはずです。

Amazon Nova Liteの出力結果

次に、Amazon Nova Liteでの出力結果を確認してみましょう。

Amazon Nova Liteの出力結果

もちろん、FastAPIで「TODOアプリ」を開発するステップを順を追って説明します。まずは、FastAPIプロジェクトの基本的なセットアップから始めます。

1. プロジェクトのセットアップ

環境の準備

まず、必要なライブラリをインストールします。

pip install fastapi uvicorn sqlalchemy databases alembic

プロジェクトのディレクトリ構造

todo_app/
├── alembic/
├── app/
│   ├── __init__.py
│   ├── main.py
│   ├── models.py
│   ├── schemas.py
│   ├── database.py
│   ├── crud.py
│   └── api/
│       ├── __init__.py
│       ├── endpoints/
│       │   ├── __init__.py
│       │   ├── todos.py
│       │   └── users.py
│       └── deps.py
├── alembic.ini
├── README.md
└── requirements.txt

2. データベースの設定

database.py

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

SQLALCHEMY_DATABASE_URL = "sqlite:///./test.db"

engine = create_engine(SQLALCHEMY_DATABASE_URL)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()

3. モデルの定義

models.py

from sqlalchemy import Column, Integer, String, Boolean
from .database import Base

class Todo(Base):
    __tablename__ = "todos"

    id = Column(Integer, primary_key=True, index=True)
    title = Column(String, index=True)
    description = Column(String, index=True)
    completed = Column(Boolean, default=False)

4. スキーマの定義

schemas.py

from pydantic import BaseModel

class TodoBase(BaseModel):
    title: str
    description: str

class TodoCreate(TodoBase):
    pass

class Todo(TodoBase):
    id: int
    completed: bool

    class Config:
        orm_mode = True

5. CRUD操作の実装

crud.py

from sqlalchemy.orm import Session
from . import models, schemas

def get_todo(db: Session, todo_id: int):
    return db.query(models.Todo).filter(models.Todo.id == todo_id).first()

def get_todos(db: Session, skip: int = 0, limit: int = 10):
    return db.query(models.Todo).offset(skip).limit(limit).all()

def create_todo(db: Session, todo: schemas.TodoCreate):
    db_todo = models.Todo(**todo.dict())
    db.add(db_todo)
    db.commit()
    db.refresh(db_todo)
    return db_todo

def update_todo(db: Session, todo_id: int, todo: schemas.Todo):
    db_todo = db.query(models.Todo).filter(models.Todo.id == todo_id).first()
    if db_todo:
        for key, value in todo.dict().items():
            setattr(db_todo, key, value)
        db.commit()
        db.refresh(db_todo)
    return db_todo

def delete_todo(db: Session, todo_id: int):
    db_todo = db.query(models.Todo).filter(models.Todo.id == todo_id).first()
    if db_todo:
        db.delete(db_todo)
        db.commit()
    return db_todo

6. APIエンドポイントの実装

api/endpoints/todos.py

from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.orm import Session
from .. import crud, models, schemas
from ..database import get_db

router = APIRouter()

@router.get("/todos/", response_model=List[schemas.Todo])
def read_todos(skip: int = 0, limit: int = 10, db: Session = Depends(get_db)):
    todos = crud.get_todos(db, skip=skip, limit=limit)
    return todos

@router.get("/todos/{todo_id}", response_model=schemas.Todo)
def read_todo(todo_id: int, db: Session = Depends(get_db)):
    db_todo = crud.get_todo(db, todo_id=todo_id)
    if db_todo is None:
        raise HTTPException(status_code=404, detail="Todo not found")
    return db_todo

@router.post("/todos/", response_model=schemas.Todo)
def create_todo(todo: schemas.TodoCreate, db: Session = Depends(get_db)):
    return crud.create_todo(db=db, todo=todo)

@router.put("/todos/{todo_id}", response_model=schemas.Todo)
def update_todo(todo_id: int, todo: schemas.Todo, db: Session = Depends(get_db)):
    db_todo = crud.update_todo(db, todo_id=todo_id, todo=todo)
    if db_todo is None:
        raise HTTPException(status_code=404, detail="Todo not found")
    return db_todo

@router.delete("/todos/{todo_id}", response_model=schemas.Todo)
def delete_todo(todo_id: int, db: Session = Depends(get_db)):
    db_todo = crud.delete_todo(db, todo_id=todo_id)
    if db_todo is None:
        raise HTTPException(status_code=404, detail="Todo not found")
    return db_todo

api/deps.py

from sqlalchemy.orm import Session
from ..database import SessionLocal

def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()

7. メインファイル

main.py

from fastapi import FastAPI
from . import models
from .database import engine
from .api.endpoints import todos

models.Base.metadata.create_all(bind=engine)

app = FastAPI()

app.include_router(todos.router, prefix="/api", tags=["todos"])

8. アプリケーションの起動

uvicorn app.main:app --reload

これで、基本的な「TODOアプリ」のCRUD操作が完成しました。これで、データベースを操作するためのAPIエンドポイントがすべて用意されています。必要に応じて、ユーザー認証やその他の機能を追加することも可能です。

Amazon Nova Proの出力結果

最後に、Amazon Nova Proでの出力結果を確認してみましょう。

Amazon Nova Proの出力結果

もちろんです。FastAPIを使用してTODOアプリを開発するためのCRUD(Create, Read, Update, Delete)処理をステップバイステプで説明します。

ステップ1: FastAPIのセットアップ

まず、FastAPIと必要なライブラリをインストールします。

pip install fastapi uvicorn sqlalchemy

次に、プロジェクトの基本構造を作成します。

todo_app/
├── main.py
├── models.py
└── database.py

ステップ2: データベースのセットアップ

database.py でSQLAlchemyを使用してデータベース接続を設定します。

# database.py
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

SQLALCHEMY_DATABASE_URL = "sqlite:///./test.db"

engine = create_engine(SQLALCHEMY_DATABASE_URL)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

Base = declarative_base()

ステップ3: モデルの定義

models.py でTODOアイテムのモデルを定義します。

# models.py
from sqlalchemy import Column, Integer, String
from database import Base

class Todo(Base):
    __tablename__ = "todos"

    id = Column(Integer, primary_key=True, index=True)
    title = Column(String, index=True)
    description = Column(String, index=True)

ステップ4: データベースの初期化

main.py でFastAPIアプリケーションを作成し、データベースを初期化します。

# main.py
from fastapi import FastAPI, HTTPException
from sqlalchemy.orm import Session
from database import SessionLocal, engine
from models import Base, Todo

Base.metadata.create_all(bind=engine)

app = FastAPI()

# Dependency
def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()

ステップ5: CRUD処理の実装

CRUD処理をmain.pyに追加します。

Create

@app.post("/todos/", response_model=Todo)
def create_todo(title: str, description: str, db: Session = Depends(get_db)):
    db_todo = Todo(title=title, description=description)
    db.add(db_todo)
    db.commit()
    db.refresh(db_todo)
    return db_todo

Read

@app.get("/todos/", response_model=List[Todo])
def read_todos(skip: int = 0, limit: int = 10, db: Session = Depends(get_db)):
    todos = db.query(Todo).offset(skip).limit(limit).all()
    return todos

@app.get("/todos/{todo_id}", response_model=Todo)
def read_todo(todo_id: int, db: Session = Depends(get_db)):
    db_todo = db.query(Todo).filter(Todo.id == todo_id).first()
    if db_todo is None:
        raise HTTPException(status_code=404, detail="Todo not found")
    return db_todo

Update

@app.put("/todos/{todo_id}", response_model=Todo)
def update_todo(todo_id: int, title: str, description: str, db: Session = Depends(get_db)):
    db_todo = db.query(Todo).filter(Todo.id == todo_id).first()
    if db_todo is None:
        raise HTTPException(status_code=404, detail="Todo not found")
    db_todo.title = title
    db_todo.description = description
    db.commit()
    db.refresh(db_todo)
    return db_todo

Delete

@app.delete("/todos/{todo_id}", response_model=Todo)
def delete_todo(todo_id: int, db: Session = Depends(get_db)):
    db_todo = db.query(Todo).filter(Todo.id == todo_id).first()
    if db_todo is None:
        raise HTTPException(status_code=404, detail="Todo not found")
    db.delete(db_todo)
    db.commit()
    return db_todo

ステップ6: アプリケーションの実行

最後に、アプリケーションを実行します。

uvicorn main:app --reload

Amazon Novaの性能比較

最後に、出力速度も比較してみました。

実際に下記のように同時実行をして、比較をしました。

  • Amazon Nova Micro:8,420 ms
  • Amazon Nova Lite:13,119 ms
  • Amazon Nova Pro:14,308 ms

考察

まず、第一にtitanの時と比較して、精度が飛躍的に向上していることがわかります。

そして、Microは、これまでのモデルと比較して、高速であり、尚且つそれなりに安価であることがわかります。

OpenAIの先端的な開発と比較してしまうと、見劣りするところもありますが、エンタープライズ企業の場合、AWS上に自社データをファイルサーバーなどで保管しており、そこから外部にデータを持ち出すことなく、AIモデルを利用できるという点は、非常に大きなメリットと言えるでしょう。

ここから、Amazon BedrockやKnowledge Baseの機能などを使った、ビジネスユースケース増えていくことは、間違いないでしょう。

最後に

最後まで読んでくださり、ありがとうございました!
この記事を通して、少しでもあなたの学びに役立てば幸いです!

宣伝:もしもよかったらご覧ください^^

AIとコミュニケーションする技術(インプレス出版)』という書籍を出版しました🎉

これからの未来において「変わらない知識」を見極めて、生成AIの業界において、読まれ続ける「バイブル」となる本をまとめ上げました。

かなり自信のある一冊なため、もしもよろしければ、ご一読いただけますと幸いです^^

参考文献

https://aws.amazon.com/jp/about-aws/whats-new/2024/12/amazon-nova-foundation-models-bedrock/

Galirage Inc.
Galirage Inc.

Discussion