Xây Dựng Ứng Dụng AI Thông Minh với Pydantic AI
Giới thiệu
Trong bối cảnh phát triển AI, việc xây dựng các ứng dụng AI sẵn sàng cho sản xuất vẫn là một thách thức lớn. Các nhà phát triển thường gặp khó khăn với các đầu ra không ổn định, định dạng dữ liệu không nhất quán và sự phức tạp trong việc tích hợp các mô hình AI vào mã nguồn Python hiện có. Pydantic AI là một framework hữu ích giải quyết những vấn đề này bằng cách mang lại độ tin cậy và trải nghiệm phát triển của các thư viện Python hiện đại vào thế giới Generative AI.
Pydantic AI là gì và Tại sao Nó Quan Trọng?
Pydantic AI được thiết kế để giảm thiểu sự đau đầu khi xây dựng các ứng dụng có chất lượng sản xuất với Generative AI. Truyền thống phát triển AI thường diễn ra như sau:
- Bạn gửi một prompt đến một LLM
- Bạn nhận lại một chuỗi phản hồi có thể đúng định dạng hoặc không
- Bạn tốn hàng giờ viết logic phân tích tùy chỉnh
- Bạn xử lý các trường hợp biên, AI trả về định dạng không mong đợi
- Ứng dụng của bạn gặp sự cố trong sản xuất khi AI quyết định sáng tạo trong các phản hồi của nó
Pydantic AI loại bỏ sự hỗn loạn này bằng cách đảm bảo rằng các phản hồi của AI tuân thủ các cấu trúc dữ liệu đã được xác thực trước. Thay vì vật lộn với các phản hồi chuỗi không thể đoán trước, bạn nhận được các đối tượng Python kiểu mà tích hợp liền mạch với mã nguồn hiện có của bạn.
Các Bước Để Triển Khai Pydantic AI
1. Đảm bảo Tính An Toàn Kiểu và Xác Thực
Khi bạn định nghĩa một cấu trúc phản hồi, Pydantic AI đảm bảo rằng đầu ra của AI luôn tuân thủ cấu trúc đó. Ví dụ:
python
from pydantic import BaseModel
from pydantic_ai import Agent
# Định nghĩa chính xác những gì bạn mong đợi
class WeatherResponse(BaseModel):
temperature: int
condition: str
humidity: float
forecast_confidence: str # "cao", "trung bình", "thấp"
# Tạo một agent mà PHẢI trả về cấu trúc này
weather_agent = Agent('openai:gpt-4o', result_type=WeatherResponse)
# Điều này sẽ LUÔN trả về một đối tượng WeatherResponse, không bao giờ là chuỗi
result = await weather_agent.run("Thời tiết ở New York thế nào?")
print(f"Nhiệt độ: {result.data.temperature}°F") # Truy cập kiểu an toàn
2. Phản Hồi Cấu Trúc với Xác Thực Tích Hợp
Đầu ra sẽ được xác thực với Pydantic để đảm bảo nó là một SupportOutput, vì agent là chung, nó cũng sẽ được định kiểu là SupportOutput để hỗ trợ kiểm tra kiểu tĩnh. Điều này có nghĩa là:
- Không còn lỗi phân tích
- Định dạng dữ liệu nhất quán
- Phát hiện lỗi ngay lập tức
3. Triết Lý Thiết Kế Hướng Về Python
Pydantic AI tận dụng các thực tiễn chuẩn của Python mà bạn đã biết.
python
from typing import List, Optional
from enum import Enum
class Priority(str, Enum):
LOW = "thấp"
MEDIUM = "trung bình"
HIGH = "cao"
class Task(BaseModel):
title: str
description: str
priority: Priority
due_date: Optional[str] = None
tags: List[str] = []
Nếu bạn hiểu các mô hình Pydantic, bạn sẽ hiểu các phản hồi của Pydantic AI.
4. Xử Lý Lỗi và Thử Lại Tích Hợp
Khi xác thực thất bại, Pydantic AI không chỉ dừng lại, mà sẽ thử lại bằng cách gửi lỗi xác thực trở lại mô hình với hướng dẫn để sửa chữa phản hồi.
python
from pydantic_ai import ModelRetry
@agent.tool
def validate_email(email: str) -> str:
"""Xác thực định dạng địa chỉ email."""
if "@" not in email or "." not in email.split("@")[1]:
raise ModelRetry("Vui lòng cung cấp một địa chỉ email hợp lệ với @ và miền")
return email
Bắt Đầu: Triển Khai Pydantic AI Bước Từng Bước
Hãy cùng xây dựng một hiểu biết toàn diện thông qua các ví dụ ngày càng phức tạp.
Bước 1: Thiết Lập Agent Cơ Bản
Đầu tiên, cài đặt Pydantic AI và thiết lập môi trường của bạn:
bash
pip install pydantic-ai
export OPENAI_API_KEY='your-api-key-here'
Tạo phản hồi AI có cấu trúc đầu tiên của bạn:
python
from pydantic import BaseModel
from pydantic_ai import Agent
import asyncio
# Bước 1: Định nghĩa cấu trúc phản hồi của bạn
class BookRecommendation(BaseModel):
title: str
author: str
genre: str
rating: float # 1.0 đến 5.0
reason: str
similar_books: list[str] = []
# Bước 2: Tạo một agent với cấu trúc phản hồi này
book_agent = Agent(
'openai:gpt-4o',
result_type=BookRecommendation,
system_prompt="""Bạn là một thủ thư có kiến thức. Khi đề xuất sách,
luôn cung cấp xếp hạng từ 1.0 đến 5.0, và gợi ý 2-3 cuốn sách tương tự."""
)
# Bước 3: Sử dụng agent
async def get_recommendation():
result = await book_agent.run("Tôi thích tiểu thuyết trinh thám với các nhân vật phức tạp")
book = result.data # Đảm bảo đây là một đối tượng BookRecommendation
print(f"📚 {book.title} của {book.author}")
print(f"⭐ Xếp hạng: {book.rating}/5.0")
print(f"📝 Lý do: {book.reason}")
print(f"📖 Sách tương tự: {', '.join(book.similar_books)}")
# Chạy ví dụ
asyncio.run(get_recommendation())
Bước 2: Thêm Các Công Cụ Chức Năng cho Tích Hợp Ngoại Vi
Các công cụ chức năng cho phép các agent AI của bạn tương tác với các hệ thống và API bên ngoài:
python
from pydantic_ai import Agent
from datetime import datetime
import httpx
# Tạo một agent có thể truy cập các chức năng bên ngoài
weather_agent = Agent('openai:gpt-4o')
@weather_agent.tool
async def get_current_weather(city: str) -> dict:
"""Lấy thời tiết hiện tại cho một thành phố cụ thể bằng cách sử dụng API thời tiết."""
# Gọi API giả lập (trong sản xuất, sử dụng một API thời tiết thực)
weather_data = {
"temperature": 72,
"condition": "nắng",
"humidity": 45,
"wind_speed": 8
}
return weather_data
@weather_agent.tool
async def get_current_time() -> str:
"""Lấy ngày và giờ hiện tại."""
return datetime.now().strftime("%Y-%m-%d %H:%M:%S")
@weather_agent.tool
async def calculate_comfort_index(temperature: int, humidity: int) -> str:
"""Tính chỉ số thoải mái dựa trên nhiệt độ và độ ẩm."""
if temperature < 60 or temperature > 80:
return "không thoải mái"
elif humidity > 60:
return "khó chịu"
else:
return "thoải mái"
# Sử dụng agent với quyền truy cập vào tất cả các công cụ này
async def weather_demo():
result = await weather_agent.run(
"Thời tiết ở San Francisco thế nào và nó có thoải mái không?"
)
print(result.data)
Bước 3: Quản Lý Các Cuộc Hội Thoại Phức Tạp với Ngữ Cảnh
Pydantic AI cung cấp quyền truy cập vào các trao đổi tin nhắn trong suốt quá trình chạy agent. Những tin nhắn này có thể được sử dụng để tiếp tục một cuộc hội thoại mạch lạc và hiểu cách một agent hoạt động:
python
from pydantic_ai import Agent, RunContext
from pydantic import BaseModel
class UserPreferences(BaseModel):
user_id: str
preferences: dict
conversation_history: list = []
session_data: dict = {}
class PersonalizedResponse(BaseModel):
response: str
personalization_used: list[str]
recommendations: list[str] = []
# Agent với ngữ cảnh bền vững
personal_assistant = Agent(
'openai:gpt-4o',
deps_type=UserPreferences,
result_type=PersonalizedResponse,
system_prompt="""Bạn là một trợ lý cá nhân. Sử dụng sở thích của người dùng
và lịch sử cuộc hội thoại để cung cấp phản hồi cá nhân hóa."""
)
@personal_assistant.tool
async def save_preference(preference_key: str, preference_value: str, ctx: RunContext[UserPreferences]) -> str:
"""Lưu một sở thích của người dùng cho các cuộc hội thoại sau."""
ctx.deps.preferences[preference_key] = preference_value
return f"Đã lưu sở thích: {preference_key} = {preference_value}"
@personal_assistant.tool
async def get_user_history(ctx: RunContext[UserPreferences]) -> list:
"""Lấy lịch sử cuộc hội thoại của người dùng."""
return ctx.deps.conversation_history[-5:] # 5 tương tác cuối
async def personalized_conversation():
# Khởi tạo ngữ cảnh người dùng
user_context = UserPreferences(
user_id="user123",
preferences={"communication_style": "thân thiện", "interests": ["công nghệ", "sách"]},
conversation_history=["Hỏi về các tutorial Python", "Quan tâm đến phát triển AI"]
)
result = await personal_assistant.run(
"Tôi muốn tìm hiểu thêm về phát triển web",
deps=user_context
)
print(f"Phản hồi: {result.data.response}")
print(f"Cá nhân hóa đã sử dụng: {result.data.personalization_used}")
print(f"Gợi ý: {result.data.recommendations}")
Những Gì Xảy Ra Trong Hệ Thống?
Khi personal_assistant.run() được gọi với deps=user_context:
- Lời nhắc hệ thống của AI ngay lập tức có quyền truy cập vào ngữ cảnh được ngụ ý bởi user_context.
- Nếu AI quyết định cần lưu một sở thích (ví dụ: nếu người dùng nói "Tôi thích chế độ tối"), nó có thể gọi công cụ save_preference, và công cụ đó sẽ nhận cùng một đối tượng user_context (cụ thể là ctx.deps). Bất kỳ thay đổi nào được thực hiện trong công cụ sẽ tồn tại trong phiên chạy đó.
- Tương tự, nếu AI muốn nhớ lại các tương tác trước, nó có thể gọi get_user_history, điều này sẽ truy cập ctx.deps.conversation_history.
Mô hình mạnh mẽ này cho phép bạn xây dựng các agent AI có trạng thái thực sự hiểu và thích nghi với từng người dùng theo thời gian. Không còn những khoảnh khắc "bạn là ai?" nữa.
Pydantic AI không chỉ là một thư viện; nó là một triết lý để xây dựng các giải pháp AI mạnh mẽ và trực quan. Vậy bạn còn chờ gì nữa? Hãy tham gia, thử nghiệm và bắt đầu xây dựng thế hệ tiếp theo của các agent thông minh thực sự hiểu thế giới và người dùng xung quanh họ.