PydanticAI ialah rangka kerja Python yang berkuasa direka untuk menyelaraskan pembangunan aplikasi gred pengeluaran menggunakan Generative AI. Ia dibina oleh pasukan yang sama di belakang Pydantic, perpustakaan pengesahan data yang digunakan secara meluas, dan bertujuan untuk membawa reka bentuk inovatif dan ergonomik FastAPI ke bidang pembangunan aplikasi AI. PydanticAI memfokuskan pada keselamatan jenis, modulariti dan penyepaduan lancar dengan alatan Python yang lain.
PydanticAI berkisar pada beberapa konsep utama:
Agen ialah antara muka utama untuk berinteraksi dengan Model Bahasa Besar (LLM). Ejen bertindak sebagai bekas untuk pelbagai komponen, termasuk:
Ejen direka bentuk untuk kebolehgunaan semula dan biasanya digunakan sekali dan digunakan semula sepanjang aplikasi.
Gesaan sistem ialah arahan yang diberikan kepada LLM oleh pembangun. Mereka boleh menjadi:
Ejen tunggal boleh menggunakan kedua-dua gesaan sistem statik dan dinamik, yang dilampirkan mengikut tertib yang ditakrifkan semasa masa jalan.
from pydantic_ai import Agent, RunContext from datetime import date agent = Agent( 'openai:gpt-4o', deps_type=str, system_prompt="Use the customer's name while replying to them.", ) @agent.system_prompt def add_the_users_name(ctx: RunContext[str]) -> str: return f"The user's name is {ctx.deps}." @agent.system_prompt def add_the_date() -> str: return f'The date is {date.today()}.' result = agent.run_sync('What is the date?', deps='Frank') print(result.data) #> Hello Frank, the date today is 2032-01-02.
Alat fungsi membolehkan LLM mengakses maklumat luaran atau melakukan tindakan yang tidak tersedia dalam gesaan sistem itu sendiri. Alat boleh didaftarkan dalam beberapa cara:
from pydantic_ai import Agent, RunContext from datetime import date agent = Agent( 'openai:gpt-4o', deps_type=str, system_prompt="Use the customer's name while replying to them.", ) @agent.system_prompt def add_the_users_name(ctx: RunContext[str]) -> str: return f"The user's name is {ctx.deps}." @agent.system_prompt def add_the_date() -> str: return f'The date is {date.today()}.' result = agent.run_sync('What is the date?', deps='Frank') print(result.data) #> Hello Frank, the date today is 2032-01-02.
Parameter alat diekstrak daripada tandatangan fungsi dan digunakan untuk membina skema JSON alat. Rentetan doktrin fungsi digunakan untuk menjana perihalan alat dan perihalan parameter dalam skema.
Pergantungan menyediakan data dan perkhidmatan kepada gesaan sistem, alatan dan pengesah hasil ejen melalui sistem suntikan pergantungan. Ketergantungan diakses melalui objek RunContext. Mereka boleh menjadi mana-mana jenis Python, tetapi kelas data ialah cara yang mudah untuk mengurus berbilang kebergantungan.
import random from pydantic_ai import Agent, RunContext agent = Agent( 'gemini-1.5-flash', deps_type=str, system_prompt=( "You're a dice game, you should roll the die and see if the number " "you get back matches the user's guess. If so, tell them they're a winner. " "Use the player's name in the response." ), ) @agent.tool_plain def roll_die() -> str: """Roll a six-sided die and return the result.""" return str(random.randint(1, 6)) @agent.tool def get_player_name(ctx: RunContext[str]) -> str: """Get the player's name.""" return ctx.deps dice_result = agent.run_sync('My guess is 4', deps='Anne') print(dice_result.data) #> Congratulations Anne, you guessed correctly! You're a winner!
Hasil ialah nilai akhir yang dikembalikan daripada ejen yang dikendalikan. Ia dibalut dengan RunResult (untuk larian segerak dan tak segerak) atau StreamedRunResult (untuk larian distrim), menyediakan akses kepada data penggunaan dan sejarah mesej. Keputusan boleh berupa teks biasa atau data berstruktur dan disahkan menggunakan Pydantic.
from dataclasses import dataclass import httpx from pydantic_ai import Agent, RunContext @dataclass class MyDeps: api_key: str http_client: httpx.AsyncClient agent = Agent( 'openai:gpt-4o', deps_type=MyDeps, ) @agent.system_prompt async def get_system_prompt(ctx: RunContext[MyDeps]) -> str: response = await ctx.deps.http_client.get( 'https://example.com', headers={'Authorization': f'Bearer {ctx.deps.api_key}'}, ) response.raise_for_status() return f'Prompt: {response.text}' async def main(): async with httpx.AsyncClient() as client: deps = MyDeps('foobar', client) result = await agent.run('Tell me a joke.', deps=deps) print(result.data) #> Did you hear about the toothpaste scandal? They called it Colgate.
Pengesah hasil, ditambah melalui penghias @agent.result_validator, menyediakan cara untuk menambah logik pengesahan selanjutnya, terutamanya apabila pengesahan memerlukan IO dan tidak segerak.
PydanticAI menawarkan beberapa ciri utama yang menjadikannya pilihan yang menarik untuk pembangunan aplikasi AI:
Agen boleh dijalankan dalam beberapa cara:
from pydantic_ai import Agent, RunContext from datetime import date agent = Agent( 'openai:gpt-4o', deps_type=str, system_prompt="Use the customer's name while replying to them.", ) @agent.system_prompt def add_the_users_name(ctx: RunContext[str]) -> str: return f"The user's name is {ctx.deps}." @agent.system_prompt def add_the_date() -> str: return f'The date is {date.today()}.' result = agent.run_sync('What is the date?', deps='Frank') print(result.data) #> Hello Frank, the date today is 2032-01-02.
Larian ejen mungkin mewakili keseluruhan perbualan, tetapi perbualan juga boleh terdiri daripada berbilang larian, terutamanya apabila mengekalkan keadaan antara interaksi. Anda boleh menghantar mesej daripada larian sebelumnya menggunakan argumen message_history untuk meneruskan perbualan.
import random from pydantic_ai import Agent, RunContext agent = Agent( 'gemini-1.5-flash', deps_type=str, system_prompt=( "You're a dice game, you should roll the die and see if the number " "you get back matches the user's guess. If so, tell them they're a winner. " "Use the player's name in the response." ), ) @agent.tool_plain def roll_die() -> str: """Roll a six-sided die and return the result.""" return str(random.randint(1, 6)) @agent.tool def get_player_name(ctx: RunContext[str]) -> str: """Get the player's name.""" return ctx.deps dice_result = agent.run_sync('My guess is 4', deps='Anne') print(dice_result.data) #> Congratulations Anne, you guessed correctly! You're a winner!
PydanticAI menyediakan struktur tetapan.UsageLimits untuk mengehadkan bilangan token dan permintaan. Anda boleh menggunakan tetapan ini melalui argumen usage_limits pada fungsi run.
from dataclasses import dataclass import httpx from pydantic_ai import Agent, RunContext @dataclass class MyDeps: api_key: str http_client: httpx.AsyncClient agent = Agent( 'openai:gpt-4o', deps_type=MyDeps, ) @agent.system_prompt async def get_system_prompt(ctx: RunContext[MyDeps]) -> str: response = await ctx.deps.http_client.get( 'https://example.com', headers={'Authorization': f'Bearer {ctx.deps.api_key}'}, ) response.raise_for_status() return f'Prompt: {response.text}' async def main(): async with httpx.AsyncClient() as client: deps = MyDeps('foobar', client) result = await agent.run('Tell me a joke.', deps=deps) print(result.data) #> Did you hear about the toothpaste scandal? They called it Colgate.
Struktur tetapan.ModelSettings membolehkan anda memperhalusi gelagat model melalui parameter seperti suhu, token_maks dan tamat masa. Anda boleh menggunakan ini melalui hujah model_settings dalam fungsi run.
from pydantic import BaseModel from pydantic_ai import Agent class CityLocation(BaseModel): city: str country: str agent = Agent('gemini-1.5-flash', result_type=CityLocation) result = agent.run_sync('Where were the olympics held in 2012?') print(result.data) #> city='London' country='United Kingdom'
Alat boleh didaftarkan menggunakan penghias @agent.tool (untuk alatan yang memerlukan konteks), penghias @agent.tool_plain (untuk alatan tanpa konteks) atau melalui argumen alatan dalam pembina Ejen.
from pydantic_ai import Agent agent = Agent('openai:gpt-4o') # Synchronous run result_sync = agent.run_sync('What is the capital of Italy?') print(result_sync.data) #> Rome # Asynchronous run async def main(): result = await agent.run('What is the capital of France?') print(result.data) #> Paris async with agent.run_stream('What is the capital of the UK?') as response: print(await response.get_data()) #> London
Perihalan parameter diekstrak daripada docstrings dan ditambahkan pada skema JSON alat. Jika alat mempunyai parameter tunggal yang boleh diwakili sebagai objek dalam skema JSON, skema dipermudahkan menjadi objek itu sahaja.
from pydantic_ai import Agent agent = Agent('openai:gpt-4o', system_prompt='Be a helpful assistant.') result1 = agent.run_sync('Tell me a joke.') print(result1.data) #> Did you hear about the toothpaste scandal? They called it Colgate. result2 = agent.run_sync('Explain?', message_history=result1.new_messages()) print(result2.data) #> This is an excellent joke invent by Samuel Colvin, it needs no explanation.
Alat boleh disesuaikan dengan fungsi penyediaan, yang dipanggil pada setiap langkah untuk mengubah suai definisi alat atau meninggalkan alat daripada langkah itu.
from pydantic_ai import Agent from pydantic_ai.settings import UsageLimits from pydantic_ai.exceptions import UsageLimitExceeded agent = Agent('claude-3-5-sonnet-latest') try: result_sync = agent.run_sync( 'What is the capital of Italy? Answer with a paragraph.', usage_limits=UsageLimits(response_tokens_limit=10), ) except UsageLimitExceeded as e: print(e) #> Exceeded the response_tokens_limit of 10 (response_tokens=32)
Mesej yang ditukar semasa ejen dijalankan boleh diakses melalui kaedah all_messages() dan new_messages() pada objek RunResult dan StreamedRunResult.
from pydantic_ai import Agent agent = Agent('openai:gpt-4o') result_sync = agent.run_sync( 'What is the capital of Italy?', model_settings={'temperature': 0.0}, ) print(result_sync.data) #> Rome
Mesej boleh dihantar ke parameter message_history untuk meneruskan perbualan merentasi berbilang ejen dijalankan. Apabila mesej_history ditetapkan dan tidak kosong, gesaan sistem baharu tidak dijana.
Format mesej adalah bebas model yang membenarkan mesej digunakan dalam ejen yang berbeza atau dengan ejen yang sama menggunakan model yang berbeza.
PydanticAI disepadukan dengan Pydantic Logfire, platform kebolehmerhatian yang membolehkan anda memantau dan nyahpepijat keseluruhan aplikasi anda. Logfire boleh digunakan untuk:
Untuk menggunakan PydanticAI dengan Logfire, pasang dengan kumpulan pilihan logfire: pip install 'pydantic-ai[logfire]'. Anda kemudiannya perlu mengkonfigurasi projek Logfire dan mengesahkan persekitaran anda.
PydanticAI boleh dipasang menggunakan pip:
from pydantic_ai import Agent, RunContext from datetime import date agent = Agent( 'openai:gpt-4o', deps_type=str, system_prompt="Use the customer's name while replying to them.", ) @agent.system_prompt def add_the_users_name(ctx: RunContext[str]) -> str: return f"The user's name is {ctx.deps}." @agent.system_prompt def add_the_date() -> str: return f'The date is {date.today()}.' result = agent.run_sync('What is the date?', deps='Frank') print(result.data) #> Hello Frank, the date today is 2032-01-02.
Pemasangan tipis juga tersedia untuk menggunakan model tertentu, contohnya:
import random from pydantic_ai import Agent, RunContext agent = Agent( 'gemini-1.5-flash', deps_type=str, system_prompt=( "You're a dice game, you should roll the die and see if the number " "you get back matches the user's guess. If so, tell them they're a winner. " "Use the player's name in the response." ), ) @agent.tool_plain def roll_die() -> str: """Roll a six-sided die and return the result.""" return str(random.randint(1, 6)) @agent.tool def get_player_name(ctx: RunContext[str]) -> str: """Get the player's name.""" return ctx.deps dice_result = agent.run_sync('My guess is 4', deps='Anne') print(dice_result.data) #> Congratulations Anne, you guessed correctly! You're a winner!
Untuk menggunakan PydanticAI dengan Logfire, pasangkannya dengan kumpulan pilihan logfire:
from dataclasses import dataclass import httpx from pydantic_ai import Agent, RunContext @dataclass class MyDeps: api_key: str http_client: httpx.AsyncClient agent = Agent( 'openai:gpt-4o', deps_type=MyDeps, ) @agent.system_prompt async def get_system_prompt(ctx: RunContext[MyDeps]) -> str: response = await ctx.deps.http_client.get( 'https://example.com', headers={'Authorization': f'Bearer {ctx.deps.api_key}'}, ) response.raise_for_status() return f'Prompt: {response.text}' async def main(): async with httpx.AsyncClient() as client: deps = MyDeps('foobar', client) result = await agent.run('Tell me a joke.', deps=deps) print(result.data) #> Did you hear about the toothpaste scandal? They called it Colgate.
Contoh tersedia sebagai pakej berasingan:
from pydantic import BaseModel from pydantic_ai import Agent class CityLocation(BaseModel): city: str country: str agent = Agent('gemini-1.5-flash', result_type=CityLocation) result = agent.run_sync('Where were the olympics held in 2012?') print(result.data) #> city='London' country='United Kingdom'
Ujian unit mengesahkan bahawa kod aplikasi anda berkelakuan seperti yang diharapkan. Untuk PydanticAI, ikut strategi ini:
from pydantic_ai import Agent agent = Agent('openai:gpt-4o') # Synchronous run result_sync = agent.run_sync('What is the capital of Italy?') print(result_sync.data) #> Rome # Asynchronous run async def main(): result = await agent.run('What is the capital of France?') print(result.data) #> Paris async with agent.run_stream('What is the capital of the UK?') as response: print(await response.get_data()) #> London
Evals digunakan untuk mengukur prestasi LLM dan lebih seperti penanda aras daripada ujian unit. Evals memberi tumpuan kepada mengukur prestasi LLM untuk aplikasi tertentu. Ini boleh dilakukan melalui ujian hujung ke hujung, ujian serba lengkap sintetik, menggunakan LLM untuk menilai LLM atau dengan mengukur prestasi ejen dalam pengeluaran.
PydanticAI boleh digunakan dalam pelbagai jenis kes penggunaan:
PydanticAI menawarkan rangka kerja yang teguh dan fleksibel untuk membangunkan aplikasi AI dengan penekanan yang kuat pada keselamatan jenis dan modulariti. Penggunaan Pydantic untuk pengesahan dan penstrukturan data, ditambah dengan sistem suntikan kebergantungannya, menjadikannya alat yang ideal untuk membina aplikasi AI yang boleh dipercayai dan boleh diselenggara. Dengan sokongan LLM yang luas dan penyepaduan lancar dengan alatan seperti Pydantic Logfire, PydanticAI membolehkan pembangun membina projek dipacu AI yang berkuasa dan sedia pengeluaran dengan cekap.
Atas ialah kandungan terperinci PydanticAI: Panduan Komprehensif untuk Membina Aplikasi AI Sedia Pengeluaran. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!