2025年6月19日 星期四

Python 初學者指南:使用 Laravel + FastAPI 建立你的第一個 AI 微服務

PHP 大師的 Python 初體驗:用 FastAPI 打造我們的 AI 微服務

大家好,我是個在 PHP 和 Laravel 世界打滾多年的老兵。最近,為了專案需求,我們決定引入一些 Python 驅動的 AI 功能。作為一個 PHP 資深工程師,初次接觸 Python 雖然有些陌生,但當我看到 FastAPI 框架時,簡直驚艷了!它的高效、簡潔以及自動文件生成功能,讓我這個習慣 Laravel 優秀開發體驗的人也能迅速上手。

在我們的 laravel-fastapi-ai 專案中,Laravel 依然是我們的「網頁門面」,負責處理使用者介面和基本的請求分發。而那個神經兮兮的「AI 大腦」,我們就交給了 Python 的 FastAPI 來處理。這篇文章,我將從 PHP 開發者的角度,帶你這位同樣是 Python 初學者的朋友,一起解讀 fastapi-app/main.py 這個檔案,看看 Python 是怎麼實現我們需要的 AI 微服務的。

專案 GitHub 連結:https://github.com/BpsEason/laravel-fastapi-ai.git

FastAPI:一個 PHP 開發者會愛上的 Python 框架

身為 PHP 開發者,我們習慣了 Laravel 的「魔術」和強大功能。初看 Python 框架,FastAPI 讓我感到熟悉而又耳目一新:

  • 速度與現代化: 就像 Laravel 利用 php-fpm 提供高性能一樣,FastAPI 基於 ASGI (Asynchronous Server Gateway Interface) 標準,天生支援異步處理,這意味著它可以非常高效地處理並發請求,就像我們用 async/await 在 PHP 中處理非阻塞操作一樣。
  • 路由定義的清晰性: 就像 Route::get('/path', [Controller::class, 'method']) 一樣,FastAPI 使用裝飾器(@app.post)來定義路由,直觀明瞭。
  • 資料驗證與型別提示: 這是我個人最欣賞的一點。PHP 7.4 之後引入了嚴格型別,Laravel 的 Form Request 也能做很好的驗證。FastAPI 則更進一步,結合 Python 的型別提示和 Pydantic 庫,直接在函式簽名中定義請求和回應的資料結構,自動進行驗證和序列化/反序列化。這點簡直是開發者的福音,減少了大量的手動驗證程式碼,錯誤訊息也相當友好。
  • 自動 API 文件: 類似 Swagger 或 Postman 的功能,FastAPI 自動生成互動式 API 文件。這對於後端開發者來說,簡直是把寫文件的力氣都省下來了,而且直接可以在上面測試 API,對於前端協作更是極大的便利!

main.py 剖析:我們的 Python AI 微服務

好的,不囉嗦,直接來看 fastapi-app/main.py。我會用我們 PHP 開發者習慣的思維方式來解釋它:

Python
# 引入必要的模組,類似於 PHP 的 use 語句
from fastapi import FastAPI, HTTPException # FastAPI 核心框架和 HTTP 例外類
from pydantic import BaseModel # 用於資料模型定義和驗證的庫,類似於 Laravel 的 Request Validator/Model Castings
from transformers import pipeline # Hugging Face 的 AI 模型工具,用於簡化 AI 模型載入和使用
from fastapi.middleware.cors import CORSMiddleware # 處理跨域請求的中介軟體,類似於 Laravel 的 Middleware

# 初始化我們的 FastAPI 應用程式實例,就像 new Application() 或 app()
# title 就像 Laravel 專案的 APP_NAME
app = FastAPI(title="Sentiment Analysis Microservice")

# 這部分是設定 CORS (跨域資源共享),對我們前端與後端分離的架構很重要。
# 想像一下 Laravel 專案的 CORS 設定檔 (config/cors.php),它告訴瀏覽器哪些網站可以訪問我們的 API。
app.add_middleware(
    CORSMiddleware,
    allow_origins=["http://localhost:8000"], # 允許 Laravel 前端 (8000 埠) 訪問
    allow_credentials=True, # 允許帶有認證資訊的請求
    allow_methods=["*"], # 允許所有 HTTP 方法 (GET, POST, etc.)
    allow_headers=["*"], # 允許所有 HTTP 標頭
)

# 載入 Hugging Face 情感分析模型
# 這行程式碼做的事情,類似於你在 PHP 中引入一個外部 SDK 或服務類,並初始化它。
# 它會自動從 Hugging Face 下載一個預訓練的情感分析模型。
# "sentiment-analysis" 是任務類型,model="distilbert-base-uncased-finetuned-sst-2-english" 是我們選擇的模型名稱。
sentiment_analyzer = pipeline("sentiment-analysis", model="distilbert-base-uncased-finetuned-sst-2-english")

# Pydantic 模型:定義請求資料的結構
# 想像這就像 Laravel 的 Form Request,它定義了請求體 (request body) 應該長什麼樣子。
# 'text: str' 告訴 FastAPI,我們預期收到一個名為 'text' 的字串。
class Comment(BaseModel):
    text: str # 評論內容,類型為字串

# Pydantic 模型:定義回應資料的結構
# 這類似於 Laravel API 回應的資源 (Resource) 或一個固定的 JSON 結構。
# 它確保我們回傳給前端的資料格式是一致且可預期的。
class SentimentResponse(BaseModel):
    label: str # 情感標籤 (例如 "POSITIVE" 或 "NEGATIVE")
    score: float # 置信度分數 (0.0 到 1.0 之間)

# 定義 API 端點:處理前端發送的評論分析請求
# 就像 Laravel 的 Route::post('/analyze', ...)
# `@app.post("/analyze-sentiment/", ...)` 就是一個裝飾器,它將下面的函式註冊為 POST 請求的處理器。
# `response_model=SentimentResponse` 確保這個端點的回應會自動被序列化並驗證為 SentimentResponse 的結構。
@app.post("/analyze-sentiment/", response_model=SentimentResponse)
# 異步函式定義:`async def` 類似於 PHP 8+ 的 Fibers 或 AMP/ReactPHP 中的異步概念。
# `comment: Comment` 這裡是型別提示,FastAPI 會自動將請求體解析並驗證為 Comment 物件,如果格式不符,會自動拋出 422 Unprocessable Entity 錯誤。
async def analyze_sentiment(comment: Comment):
    # 檢查評論內容是否為空。`strip()` 類似於 PHP 的 `trim()`。
    if not comment.text.strip():
        # 如果為空,拋出 HTTP 異常。這就像 Laravel 拋出 `ValidationException` 或 `Abort 400`。
        raise HTTPException(status_code=400, detail="Comment cannot be empty")

    # 執行情感分析。`sentiment_analyzer` 是一個函式,傳入文本會返回分析結果。
    # 結果是一個列表 (Python 的 List,類似 PHP 的陣列),我們取第一個元素 `[0]`。
    result = sentiment_analyzer(comment.text)[0]
    
    # 返回情感分析結果。FastAPI 會自動將這個 Pydantic 物件轉換為 JSON 回應。
    return SentimentResponse(label=result["label"], score=result["score"])

PHP 開發者的重點筆記

  1. 依賴管理: 就像 Composer 對於 PHP,Python 有 piprequirements.txt。專案中的 fastapi-app/requirements.txt 列出了所有 Python 依賴,Dockerfile 會自動用 pip install -r requirements.txt 安裝它們。
  2. Web 服務器: 我們 PHP 常用 Nginx + PHP-FPM,或者 Laravel 自帶的 php artisan serve。FastAPI 通常搭配 Uvicorn 這樣的 ASGI 服務器。在 Docker Compose 中,它已經配置好了,我們無需直接操作。
  3. 異步程式設計 (async/await): 這是 Python 現代 Web 框架的趨勢,旨在提高性能。你可能對 asyncawait 感到陌生,但你可以把它想像成處理「等待」時間的高效方式。當 FastAPI 在等待 AI 模型完成分析時,它不會傻傻地阻塞住,而是可以去處理其他進來的請求。對於初學階段,你暫時可以將帶有 async def 的函式理解為「可以被 FastAPI 調用的 API 處理函式」。
  4. Python 的類型提示: PHP 7 之後引入了型別提示,Python 也廣泛使用它。這在 FastAPI 中特別有用,它能自動幫你做資料驗證和轉換,極大減少了錯誤並提升了開發效率。

接下來:動手試試看!

作為一個 PHP 工程師,你會發現 Python 在某些領域(特別是 AI 和數據科學)有其獨特的優勢。FastAPI 讓這種跨語言的整合變得異常簡單。

  1. 運行專案: 按照 README.md 的指示,啟動 docker-compose up --build -d。你會看到 http://localhost:8000 (Laravel) 和 http://localhost:8001/docs (FastAPI 的自動文件) 都可以訪問。
  2. 體驗 API 文件: 訪問 http://localhost:8001/docs,你可以直接在瀏覽器中看到 /analyze-sentiment/ 這個 API 的定義,並進行測試。這就像 Swagger UI 或 Postman 的即時版本,非常好用!
  3. 修改與觀察:
    • 試著在 main.py 中修改 Comment 模型的 text 類型為 int,然後從 Laravel 傳入字串,看看 FastAPI 會報什麼錯。這能幫助你理解 Pydantic 的驗證機制。
    • analyze_sentiment 函式中,嘗試加入 print(comment.text),然後透過 docker-compose logs fastapi 查看 FastAP 的日誌輸出,這類似於你在 PHP 中用 dd()var_dump() 調試。

希望這篇文章能幫助你這位資深 PHP 工程師,順利踏入 Python 和 FastAPI 的世界,並更好地理解 laravel-fastapi-ai 專案的 Python 部分。你會發現,掌握多種語言的工具,會讓你的開發能力更加如虎添翼!

沒有留言:

張貼留言

網誌存檔