Chuyển đến nội dung chính

レッスン 20: Capstone プロジェクト — エンドツーエンドの NLP プラットフォームの構築

プロジェクトの概要: 完全な NLP プラットフォームの構築 — 特定のドメイン (医療、法律、または電子商取引) のテキスト分類 + NER + QA。パイプライン: データ → トレーニング → 評価 → サービス提供 → モニタリング。ベスト プラクティスのチェックリストとキャリア ロードマップ。

🧠 AI と ML — レッスン 19 レッスン 20: Capstone プロジェクト — NLP の構築 プラットフォームのエンドツーエンド

NLP の基礎から上級まで: 自然言語処理をマスターする

パート 6: NLP の作成と現代のトレンド

xdev.asia

はじめに

これは要約レッスンです。これまでの 19 レッスンのすべての知識を統合したエンドツーエンドの NLP プラットフォーム を構築します。ドメイン (医療、法律、電子商取引) を選択し、完全なパイプラインを構築します。


1. プロジェクトの概要

目標

3 つの機能を備えたドメイン E コマース向けの ベトナム NLP プラットフォーム を構築:

  1. センチメント分析: 製品レビューを分類 (肯定的/中立的/否定的)
  2. NER: エンティティ (製品、ブランド、属性) を抽出します。
  3. QA: 製品説明からの Q&A

技術スタック

┌─────────────────────────────────────────────────────────┐
│                 NLP PLATFORM ARCHITECTURE                │
│                                                         │
│  Frontend: Streamlit / Gradio                           │
│      │                                                  │
│      ▼                                                  │
│  API Layer: FastAPI                                     │
│      │                                                  │
│      ├──▶ Sentiment Model (PhoBERT fine-tuned)         │
│      ├──▶ NER Model (PhoBERT + CRF)                   │
│      └──▶ QA Pipeline (RAG: BGE-M3 + GPT-4o-mini)     │
│                                                         │
│  Infrastructure:                                        │
│      ├── PostgreSQL + pgvector (embeddings)             │
│      ├── Redis (caching)                                │
│      ├── Prometheus + Grafana (monitoring)              │
│      └── Docker + Docker Compose                        │
└─────────────────────────────────────────────────────────┘

2. フェーズ 1: データの収集と準備

import pandas as pd
from underthesea import word_tokenize
from datasets import Dataset

# 1. Thu thập data (từ Shopee reviews, Tiki, etc.)
reviews = pd.read_csv("ecommerce_reviews.csv")

# 2. Preprocessing pipeline
def preprocess(text: str) -> str:
    # Word segmentation cho tiếng Việt
    segmented = word_tokenize(text, format="text")
    return segmented

reviews["processed"] = reviews["text"].apply(preprocess)

# 3. Label annotation
# Sentiment: 0=negative, 1=neutral, 2=positive
# NER: IOB tagging cho entities

# 4. Train/Val/Test split (70/15/15)
from sklearn.model_selection import train_test_split
train, temp = train_test_split(reviews, test_size=0.3, random_state=42)
val, test = train_test_split(temp, test_size=0.5, random_state=42)

3. フェーズ 2: モデルのトレーニング

3.1 感情の分類

from transformers import AutoTokenizer, AutoModelForSequenceClassification, Trainer

tokenizer = AutoTokenizer.from_pretrained("vinai/phobert-base-v2")
model = AutoModelForSequenceClassification.from_pretrained(
    "vinai/phobert-base-v2", num_labels=3
)

# Fine-tune với Trainer API (xem Bài 13)
# Target: F1-macro > 0.85

3.2 カスタム NER

from transformers import AutoModelForTokenClassification

# Custom entity types cho e-commerce:
# PRODUCT, BRAND, ATTRIBUTE, PRICE
labels = ["O", "B-PRODUCT", "I-PRODUCT", "B-BRAND", "I-BRAND",
          "B-ATTRIBUTE", "I-ATTRIBUTE", "B-PRICE", "I-PRICE"]

model = AutoModelForTokenClassification.from_pretrained(
    "vinai/phobert-base-v2", num_labels=len(labels)
)
# Fine-tune (xem Bài 14)
# Target: Entity-level F1 > 0.80

3.3 RAG ベースの QA

from sentence_transformers import SentenceTransformer

# Embed product descriptions
embedder = SentenceTransformer("BAAI/bge-m3")

# Store embeddings in pgvector
# Retrieve relevant descriptions → GPT-4o-mini answer

4. フェーズ 3: API 開発

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI(title="Vietnamese E-commerce NLP Platform")

class AnalysisRequest(BaseModel):
    text: str

class AnalysisResponse(BaseModel):
    sentiment: dict   # {label, score}
    entities: list    # [{text, type, score}]
    summary: str | None

@app.post("/analyze", response_model=AnalysisResponse)
async def analyze(request: AnalysisRequest):
    """Phân tích toàn diện: sentiment + NER + summary."""
    # 1. Sentiment
    sentiment_result = sentiment_model(request.text)

    # 2. NER
    entities = ner_model(request.text)

    # 3. Summary (nếu text dài)
    summary = None
    if len(request.text) > 200:
        summary = summarizer(request.text)

    return AnalysisResponse(
        sentiment=sentiment_result,
        entities=entities,
        summary=summary,
    )

@app.post("/qa")
async def question_answer(question: str, product_id: str):
    """RAG-based QA cho product."""
    # 1. Retrieve relevant passages
    # 2. Generate answer with LLM
    pass

5. フェーズ 4: 導入とモニタリング

Docker Compose

# docker-compose.yml
services:
  api:
    build: .
    ports: ["8000:8000"]
    environment:
      - MODEL_PATH=/models
      - DEVICE=cpu

  postgres:
    image: pgvector/pgvector:pg16
    volumes: ["pgdata:/var/lib/postgresql/data"]

  redis:
    image: redis:alpine

  prometheus:
    image: prom/prometheus
    volumes: ["./prometheus.yml:/etc/prometheus/prometheus.yml"]

  grafana:
    image: grafana/grafana
    ports: ["3000:3000"]

6. 評価チェックリスト

基準ターゲットメトリクス
センチメントの正確さ> 85%F1マクロ
NER品質> 80%エンティティ F1
QA 関連性> 90%人間の評価
API レイテンシ< 200msp95 latency
Uptime> 99.5%可用性

7. キャリアロードマップ

NLP Engineer Level Map:

Junior (0-2 năm):
├── Thành thạo Python, PyTorch
├── Hiểu Transformer, BERT, GPT
├── Fine-tune pre-trained models
└── Basic deployment (FastAPI)

Mid-level (2-4 năm):
├── Design NLP pipelines end-to-end
├── RAG architecture
├── Model optimization (quantization, ONNX)
├── MLOps practices
└── Domain expertise (healthcare, legal, finance)

Senior (4+ năm):
├── Architecture decisions (NLP vs LLM vs hybrid)
├── Scale to millions of requests
├── Research & implement latest papers
├── Lead NLP team
└── Cost optimization strategies

シリーズの概要

20 回のレッスンを終えると、次のことを習得できるようになります。

パート知識
プラットフォーム前処理、トークン化
出演BoW、TF-IDF、Word2Vec、文埋め込み
ディープラーニングRNN、LSTM、アテンション、トランス
事前トレーニング済みBERT、GPT、ハグフェイスエコシステム
アプリケーション分類、NER、QA、要約、翻訳
制作ベトナムの NLP、MLOps、LLM トレンド、Capstone

🎓 基礎から上級までの NLP シリーズを完了できましたこと、おめでとうございます!