AWSの最新モデル『Amazon Nova』を解説【比較結果あり】
はじめまして、ますみです!
株式会社Galirage(ガリレージ)という「生成AIに特化して、システム開発・アドバイザリー支援・研修支援をしているIT企業」で、代表をしております^^
この記事では「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の業界において、読まれ続ける「バイブル」となる本をまとめ上げました。
かなり自信のある一冊なため、もしもよろしければ、ご一読いただけますと幸いです^^
参考文献
Discussion