2025年6月20日 星期五

我的第一個 FastAPI 微服務:當 Laravel 遇上智能文件辨識

我的第一個 FastAPI 微服務:當 Laravel 遇上智能文件辨識

作為一名主要使用 PHP (尤其是 Laravel) 進行開發的工程師,我始終對探索新的技術棧充滿熱情。最近,我將目光投向了 Python 生態系統,特別是 FastAPI,並成功地將其與我熟悉的 Laravel 應用程式整合,搭建了一個 AI 檔案辨識微服務。這篇文章將分享我從入門到實踐 FastAPI 的學習旅程,以及這個跨語言專案帶給我的思考。

為什麼引入 FastAPI?

在處理涉及 AI 模型推理的需求時,我意識到現有的 PHP 技術棧在某些方面可能不是最優解。經過一番研究和評估,我選擇了 Python 的 FastAPI。主要的考量點包括:

  1. AI/機器學習領域的優勢:Python 在 AI 領域擁有無可比擬的生態系統,諸如 PyTorch、TensorFlow 等深度學習框架,以及 YOLOv5、Tesseract OCR 等成熟的開源模型,都原生支援 Python。這使得整合先進的 AI 功能變得高效便捷。
  2. FastAPI 的高效與簡潔:FastAPI 以其出色的性能(基於 Starlette 和 Pydantic)和極簡的開發體驗吸引了我。對於需要快速響應的 AI 推理服務來說,其輕量級和高效率的特性非常適合。此外,自動生成的 API 文檔(Swagger UI / ReDoc)也極大地便利了開發與協作。
  3. 異步編程潛力:FastAPI 對 async/await 的原生支持為處理高併發請求和進行非同步操作提供了強大的基礎,儘管在專案初期我尚未完全發揮其潛力,但這為未來的效能優化預留了空間。

專案架構:Laravel 與 FastAPI 的協同工作

我的專案目標是建立一個能夠智能處理上傳文件(圖片或 PDF)的服務:

  • 圖片 (JPEG/PNG):利用 YOLOv5 進行物件檢測,返回識別到的物件及其置信度。
  • PDF 文件:運用 Tesseract OCR 技術提取文件中的文字內容(支援英文和繁體中文)。

為此,我設計了一個清晰的微服務架構:

  • 前端與業務邏輯層 (Laravel)

    • 負責提供直觀的文件上傳界面。
    • 管理文件在伺服器上的存儲(storage/app/public/files)。
    • 將已存儲文件的公共 URL 和文件類型傳遞給 FastAPI 服務進行辨識。
    • 接收 FastAPI 返回的辨識結果,並將其與文件狀態一併更新到 MySQL 資料庫中。
    • 最終,將辨識結果以友好的方式展示給用戶。
  • AI 辨識服務 (FastAPI)

    • 作為一個獨立的 HTTP API 服務運行。
    • 接收 Laravel 發來的辨識請求(包含文件 URL 和類型)。
    • 根據文件類型,動態調用預載入的 YOLOv5 模型進行物件檢測,或使用 Tesseract OCR 進行文字提取。
    • 將處理後的結構化辨識結果返回給 Laravel。

整個專案都基於 Docker 和 Docker Compose 進行容器化部署,這不僅確保了開發與生產環境的一致性,也極大地簡化了服務間的通信和部署流程。

學習 FastAPI 的點滴與挑戰

從熟悉的 PHP 框架轉向 Python 和 FastAPI,是一個充滿新鮮感的過程。

我的學習體驗:

  • Python 的魅力:Python 語法簡潔,且擁有令人驚嘆的豐富庫資源。這讓我在實現 AI 相關功能時,能夠快速找到現成的解決方案並加以應用。
  • FastAPI 開發的效率:FastAPI 的設計哲學讓我覺得非常親切。路由的定義 (@app.post())、請求數據的驗證(Pydantic BaseModel),這些概念都與 Laravel 的開發模式有共通之處,但 FastAPI 在構建 API 上的聚焦性更強,開發效率令人印象深刻。
  • 對非同步的初探:雖然目前專案中的某些 I/O 操作(如 requests.get)在 Python 中仍是同步的,但 FastAPI 原生支持 async/await,讓我意識到可以進一步優化那些耗時操作,使其在後台運行,而不阻塞主線程,這將是未來性能提升的重要方向。

遇到的挑戰與解決方案:

  • 跨服務文件傳輸:最初考慮過直接在 API 請求中傳輸文件內容,但為了避免大文件傳輸的負擔,我決定採用**「Laravel 存儲文件,FastAPI 通過 URL 下載」**的模式。Laravel 上傳文件到 storage/app/public 後,將其公共 URL 發送給 FastAPI,FastAPI 再自行下載進行處理。這讓兩個服務之間的耦合度更低,也更具彈性。
  • Docker 內部網路通信:在 docker-compose.yml 中配置服務網路 (app-network),確保 laravelfastapi 容器能夠通過它們的服務名稱(例如 http://fastapi:8000)進行無縫通信,這是容器化環境下服務間通信的標準而有效的方法。
  • AI 模型載入:像 YOLOv5 這樣的大模型,其載入過程可能耗時。我在 main.py 中將模型預載入放在應用啟動時,並加入了必要的錯誤處理,確保服務能夠穩健啟動。

結語與未來展望

這次構建 Laravel + FastAPI 檔案辨識微服務的經歷,不僅讓我親身體驗了兩種不同語言和框架如何高效協同工作,更深入了解了微服務架構在解決特定問題上的優勢。Laravel 憑藉其在 Web 開發上的成熟與便捷,承擔了前端和業務流程的重任;而 FastAPI 則以其在 AI 應用和高性能 API 上的專長,完美地補足了整個系統的智能處理能力。

這個專案雖然已經初步完成,但仍有許多值得探索和優化的空間。例如,引入 Laravel Queue 進行異步處理以提升用戶體驗、為 FastAPI 服務添加更強的 認證機制 以保障安全、以及考慮將文件存儲遷移到雲端服務以提高可擴展性等等。

我已經將這個專案開源在 GitHub (https://github.com/BpsEason/laravel-fastapi-file-recognition.git),希望它能為那些希望探索跨技術棧整合、涉足 AI 領域的開發者提供一些啟發和實踐範例。跳出熟悉區,擁抱新技術,總是充滿挑戰但也充滿無限可能!


沒有留言:

張貼留言

網誌存檔