我的第一個 FastAPI 微服務:當 Laravel 遇上智能文件辨識
作為一名主要使用 PHP (尤其是 Laravel) 進行開發的工程師,我始終對探索新的技術棧充滿熱情。最近,我將目光投向了 Python 生態系統,特別是 FastAPI,並成功地將其與我熟悉的 Laravel 應用程式整合,搭建了一個 AI 檔案辨識微服務。這篇文章將分享我從入門到實踐 FastAPI 的學習旅程,以及這個跨語言專案帶給我的思考。
為什麼引入 FastAPI?
在處理涉及 AI 模型推理的需求時,我意識到現有的 PHP 技術棧在某些方面可能不是最優解。經過一番研究和評估,我選擇了 Python 的 FastAPI。主要的考量點包括:
- AI/機器學習領域的優勢:Python 在 AI 領域擁有無可比擬的生態系統,諸如 PyTorch、TensorFlow 等深度學習框架,以及 YOLOv5、Tesseract OCR 等成熟的開源模型,都原生支援 Python。這使得整合先進的 AI 功能變得高效便捷。
- FastAPI 的高效與簡潔:FastAPI 以其出色的性能(基於 Starlette 和 Pydantic)和極簡的開發體驗吸引了我。對於需要快速響應的 AI 推理服務來說,其輕量級和高效率的特性非常適合。此外,自動生成的 API 文檔(Swagger UI / ReDoc)也極大地便利了開發與協作。
- 異步編程潛力: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()
)、請求數據的驗證(PydanticBaseModel
),這些概念都與 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
),確保laravel
和fastapi
容器能夠通過它們的服務名稱(例如http://fastapi:8000
)進行無縫通信,這是容器化環境下服務間通信的標準而有效的方法。 - AI 模型載入:像 YOLOv5 這樣的大模型,其載入過程可能耗時。我在
main.py
中將模型預載入放在應用啟動時,並加入了必要的錯誤處理,確保服務能夠穩健啟動。
結語與未來展望
這次構建 Laravel + FastAPI 檔案辨識微服務的經歷,不僅讓我親身體驗了兩種不同語言和框架如何高效協同工作,更深入了解了微服務架構在解決特定問題上的優勢。Laravel 憑藉其在 Web 開發上的成熟與便捷,承擔了前端和業務流程的重任;而 FastAPI 則以其在 AI 應用和高性能 API 上的專長,完美地補足了整個系統的智能處理能力。
這個專案雖然已經初步完成,但仍有許多值得探索和優化的空間。例如,引入 Laravel Queue 進行異步處理以提升用戶體驗、為 FastAPI 服務添加更強的 認證機制 以保障安全、以及考慮將文件存儲遷移到雲端服務以提高可擴展性等等。
我已經將這個專案開源在 GitHub (
沒有留言:
張貼留言