Pydantic AI 教學:用型別安全的方式打造 LLM Agent,從第一支程式到上線
做過 LLM 應用的人都知道,最痛的不是接 API,而是模型回傳的東西每次都長得不一樣。Pydantic AI 把 Pydantic 的型別驗證搬進 Agent 開發,讓輸出有結構、工具能被靜態檢查。這篇帶你從安裝寫到進階,附上我自己踩過的坑。
Pendahuluan: Mengapa Model Mengembalikan Sesuatu yang Berbeda Setiap Saat
Jika Anda pernah menggunakan API LLM, Anda mungkin sudah tidak asing dengan situasi ini: Anda meminta model untuk "mengembalikan sebuah JSON dengan nama dan skor", dan semuanya berjalan lancar selama sembilan kali pertama, tetapi pada kali kesepuluh, model menambahkan kalimat "Baik, berikut adalah hasilnya:" di awal JSON, sehingga json.loads() Anda gagal. Kemudian, Anda mulai menulis berbagai ekspresi reguler untuk membersihkan string dan menulis berbagai kondisi untuk memeriksa apakah kolom ada atau tidak - dan akhirnya, tujuh puluh persen kode "Aplikasi AI" Anda digunakan untuk melawan ketidakstabilan output model.
Saya sendiri pernah memelihara sebuah layanan klasifikasi internal, dan hanya dengan menangani model yang terkadang menghilangkan satu kolom, saya harus menambahkan tiga hari kerja. Setelah beralih ke Pydantic AI, sebagian besar kode pertahanan saya dihapus, karena kerangka kerja secara langsung menangani validasi. Artikel ini akan menjelaskan cara menggunakannya.
Apa itu Pydantic AI
Pydantic AI adalah kerangka kerja agen Python yang dikembangkan oleh tim Pydantic. Nama Pydantic mungkin sudah Anda kenal dari tempat lain - SDK resmi OpenAI, Anthropic, Google, serta LangChain dan LlamaIndex, banyak menggunakan Pydantic untuk validasi data. Dengan demikian, Pydantic adalah orang yang paling berhak untuk melakukan validasi.
Filosofi desain Pydantic AI sangat mirip dengan FastAPI: menggunakan tipe data asli Python untuk mendefinisikan perilaku dengan jelas, dan sisanya didelegasikan kepada kerangka kerja. Konsep intinya hanya beberapa - Agen, Alat, Ketergantungan, dan Keluaran Terstruktur. Anda tidak perlu menghafal berbagai kelas abstrak yang diciptakan oleh Pydantic, karena penulisan kode tetap menggunakan Python biasa, tetapi IDE Anda akan memberikan otomatisasi penyelesaian, dan pemeriksa tipe seperti Pyright atau mypy dapat menangkap kesalahan sebelum Anda menjalankan program.
Pydantic AI adalah model-agnostik, artinya tidak terikat dengan vendor model tertentu. OpenAI, Anthropic, Google, Groq, Coherence, Mistral, Ollama, dan lebih dari sepuluh vendor lainnya didukung, dan untuk beralih antar model, Anda hanya perlu mengubah satu string. Jika Anda ingin memahami perbedaan antara agen dan panggilan API biasa, Anda dapat membaca apa itu agen AI.
Apa yang Dapat Dilakukan dengan Pydantic AI
Dengan bahasa sederhana, Pydantic AI cocok untuk setiap skenario di mana "model perlu mengembalikan hasil yang dapat diandalkan":
- Pengambilan Terstruktur: Anda melemparkan sebuah surat keluhan ke dalam model dan meminta untuk mengeluarkan
emosi,kategori, dantingkat urgensidalam tiga kolom, dengan menjamin tipe data yang benar. - Klasifikasi dan Pelabelan: Anda memiliki banyak dokumen yang perlu diberi label, dan output dibatasi pada enum yang Anda definisikan, sehingga model tidak dapat memberikan jawaban yang salah.
- Agen Alat: Anda memungkinkan model untuk memanggil fungsi Anda - mencari database, memanggil API cuaca, atau melakukan perhitungan matematika, dan kerangka kerja akan menangani konversi tipe fungsi menjadi deskripsi alat yang dapat dipahami oleh model.
- RAG Pertanyaan-Jawaban: Dengan menggabungkan pencarian vektor, Anda dapat membuat sistem pertanyaan-jawaban yang memiliki dasar, dan bagian ini dapat Anda pelajari lebih lanjut melalui panduan implementasi RAG.
Dibandingkan dengan LangChain yang merupakan kerangka kerja besar yang mencakup semua hal, Pydantic AI secara sengaja dibuat sangat ramping. Jika Anda hanya perlu membuat output model lebih dapat diandalkan dan tidak ingin memikul seluruh ekosistem hanya untuk satu fungsi kecil, maka kurva pembelajaran Pydantic AI akan lebih ramah.
Cara Menggunakan Pydantic AI: Pertama Kali
1. Instalasi
bash
pip install pydantic-ai
Disarankan untuk membuka lingkungan virtual. Versi Python yang digunakan sebaiknya 3.9 atau lebih tinggi.
2. Pengaturan Kunci API
Sebagai contoh, untuk Anthropic, Anda dapat mengatur variabel lingkungan:
bash
export ANTHROPIC_API_KEY=kunci_anda
Jika Anda menggunakan OpenAI, maka Anda perlu mengatur OPENAI_API_KEY, dan seterusnya.
3. Menulis Agen Pertama
python
from pydantic_ai import Agent
agen = Agent('anthropic:claude-sonnet-4-6')
hasil = agen.run_sync('Jelaskan apa itu basis data vektor dalam satu kalimat')
print(hasil.output)
Parameter pertama adalah nama model, dengan format vendor:model. Untuk beralih ke OpenAI, Anda hanya perlu mengubahnya menjadi 'openai:gpt-4o', dan kode lainnya tidak perlu diubah - ini adalah kelebihan model-agnostik.
4. Membuat Output Terstruktur
Ini adalah inti dari Pydantic AI. Anda perlu mendefinisikan sebuah model Pydantic sebagai format output:
python
from pydantic import BaseModel
from pydantic_ai import Agent
class Review(BaseModel):
sentimen: str # positif / negatif / netral
skor: int # 1 sampai 5
ringkasan: str
agen = Agent('anthropic:claude-sonnet-4-6', output_type=Review)
hasil = agen.run_sync('Toko ini memiliki makanan yang enak, tapi saya menunggu hampir satu jam, agak berlebihan')
print(hasil.output.skor) # Anda dapat langsung mengambil nilai integer
print(hasil.output.sentimen) # Anda dapat langsung mengambil string
Jika output model tidak sesuai dengan tipe yang Anda definisikan, kerangka kerja akan secara otomatis meminta model untuk mencoba lagi. Ketika Anda mengakses hasil.output, itu sudah merupakan objek Python yang divalidasi, dan IDE Anda juga akan membantu Anda dengan otomatisasi penyelesaian untuk kolom-kolomnya.
5. Memberikan Alat kepada Agen
python
from pydantic_ai import Agent
agen = Agent('anthropic:claude-sonnet-4-6')
@agen.tool_plain
def dapatkan_cuaca(kota: str) -> str:
"""Cari cuaca kota yang ditentukan"""
return f'{kota} saat ini 28 derajat, cerah'
hasil = agen.run_sync('Cuaca seperti apa di Taipei sekarang?')
print(hasil.output)
String dokumen tersebut tidak hanya untuk dibaca - itu akan menjadi deskripsi alat yang dilihat oleh model. Tipe data fungsi (kota: str) juga akan dikonversi menjadi spesifikasi parameter yang dipahami oleh model, dan parameter tersebut juga akan divalidasi oleh Pydantic.
Tips Lanjutan
Injeksi Ketergantungan adalah fitur yang paling kurang dinilai dari Pydantic AI. Anda dapat menggunakan RunContext untuk mengirimkan koneksi database, identitas pengguna, klien API, dan lain-lain ke dalam agen dan alat dengan keamanan tipe:
python
from dataclasses import dataclass
from pydantic_ai import Agent, RunContext
@dataclass
class Ketergantungan:
id_pengguna: int
db: object # Koneksi database Anda
agen = Agent('anthropic:claude-sonnet-4-6', ketergantungan_type=Ketergantungan)
@agen.tool
def dapatkan_pesanan(ctx: RunContext[Ketergantungan]) -> str:
return f'Cari pesanan pengguna {ctx.ketergantungan.id_pengguna}'
Saat menulis tes, Anda dapat mengganti db dengan objek palsu, sehingga tidak perlu mengganggu database asli, yang sangat penting untuk penulisan tes unit.
Penggunaan Streaming: Untuk membuat efek mengetik secara real-time, gunakan agen.run_stream(), yang akan memvalidasi output terstruktur secara bertahap, sehingga pengalaman pengguna menjadi lebih baik.
Pengamatan: Pydantic AI terintegrasi dengan sangat baik dengan Logfire dari tim yang sama. Setelah terhubung, setiap panggilan model, setiap pemanggilan alat, berapa token yang digunakan, dan berapa lama waktu yang dibutuhkan, semua dapat dilihat. Aplikasi LLM paling sulit di-debug adalah "mengapa model memberikan jawaban seperti itu", dan dengan Pydantic AI, Anda tidak perlu menebak-nebak. Untuk merencanakan agen dengan lebih lengkap, Anda dapat membaca panduan pembangunan agen bersamaan dengan ini.
Kesalahan Umum dan Perhatian
- Menganggap menambahkan output_type sudah membuatnya 100% aman: Kerangka kerja akan meminta model untuk mencoba lagi jika validasi gagal, tetapi ada batasan untuk percobaan tersebut. Jika terus gagal, kerangka kerja akan melempar pengecualian, dan Anda masih perlu menangani pengecualian tersebut dengan try/except. Validasi tipe mengurangi "data kotor yang masuk ke dalam sistem", bukan "model tidak pernah salah".
- Menulis docstring alat dengan sembarangan: Model sepenuhnya mengandalkan docstring untuk menentukan kapan harus memanggil alat. Jika docstring tidak jelas, model mungkin akan memanggil alat secara salah atau tidak memanggilnya sama sekali. Tulislah docstring seperti Anda menulis panduan untuk model.
- Meletakkan terlalu banyak logika dalam alat tanpa menangani pengecualian: Jika kode dalam alat mengalami kesalahan, pesan kesalahan akan dikembalikan ke model, yang mungkin akan menghabiskan banyak token karena kesalahan tersebut. Pastikan Anda menangani pengecualian dengan baik.
- Mengabaikan biaya: Output terstruktur yang gagal dan pemanggilan alat berulang dapat menghabiskan token dengan cepat. Pastikan Anda terhubung dengan pengamatan sebelum meluncurkan, untuk melihat biaya yang sebenarnya.
- Menggunakan Pydantic AI seperti kerangka kerja besar: Pydantic AI secara sengaja dibuat ramping. Jika Anda membutuhkan pengaturan langkah yang kompleks atau koneksi yang sudah jadi, mungkin LlamaIndex atau solusi lain lebih sesuai, jangan memaksakan Pydantic AI.
Evaluasi dari TheAI Akademi
Secara jujur, ada banyak kerangka kerja agen di pasar, tetapi Pydantic AI menyelesaikan masalah yang sangat spesifik dan umum dihadapi oleh setiap pengembang LLM: ketidakandalan output. Pydantic AI tidak berusaha menjadi "kerangka kerja terkuat di alam semesta", tetapi hanya memindahkan "keamanan tipe" yang sudah menjadi perhatian di lingkungan Python ke dalam pengembangan AI. Bagi mereka yang sudah terbiasa dengan cara penulisan FastAPI atau Pydantic, hampir tidak ada biaya pembelajaran.
Pydantic AI tidak akan membuat model Anda lebih pintar, tetapi akan membuat kode Anda lebih dapat diandalkan - dan itulah yang akan menyelamatkan Anda setelah meluncurkan.
Jika Anda hanya ingin membuat demo atau bereksperimen, mungkin Anda tidak akan merasakan manfaatnya secara dalam; tetapi begitu aplikasi Anda benar-benar diluncurkan, digunakan oleh orang, dan perlu dipelihara dalam jangka panjang, nilai keamanan tipe dan pengamatan akan menjadi semakin jelas seiring waktu.
Pertanyaan yang Sering Diajukan
Pydantic AI 跟 LangChain 差在哪,該選哪個?
最大差別是「重量」。LangChain 是大型生態系,連接器、整合、抽象層都很多,適合需要複雜編排的大型專案,但學習曲線陡。Pydantic AI 刻意做得薄,核心只有 Agent、工具、依賴注入、結構化輸出幾個概念,主打型別安全。如果你的需求是「讓模型輸出變可靠、寫法貼近原生 Python」,Pydantic AI 上手快很多;如果你需要大量現成整合,LangChain 比較省事。兩者不衝突,看專案規模選。
一定要用 OpenAI 的模型嗎?可以接本地模型嗎?
不用。Pydantic AI 是 model-agnostic,支援 OpenAI、Anthropic、Google、Groq、Mistral、Cohere、Ollama 等十幾家,換模型通常只改建立 Agent 時那一個字串。要跑本地模型可以透過 Ollama,把模型字串指向本地服務即可,程式其他部分不用動。
結構化輸出真的能保證模型不亂回嗎?
不能保證模型本身不出錯,但能保證「不符合你定義型別的資料不會溜進系統」。當模型回的東西通不過 Pydantic 驗證,框架會自動把錯誤訊息丟回去要它重試。不過重試有次數上限,持續失敗會丟例外,所以你還是要用 try/except 處理最壞情況。它降低的是髒資料風險,不是模型的智商問題。
新手沒寫過 Pydantic,學這個會很難嗎?
如果你會基本 Python 跟型別註記(type hints),門檻不高。Pydantic 的核心就是「用 class 定義資料長什麼樣」,寫法很直覺。建議先花十分鐘看一下 Pydantic 怎麼定義 BaseModel,再回來寫 Agent,會順很多。真正的觀念門檻反而是 Agent 跟工具的設計思路,可以搭配我們的 Agent 開發指南一起學。