> 백엔드 개발 > 파이썬 튜토리얼 > PydanticAI: 프로덕션용 AI 애플리케이션 구축을 위한 종합 가이드

PydanticAI: 프로덕션용 AI 애플리케이션 구축을 위한 종합 가이드

Barbara Streisand
풀어 주다: 2024-12-30 08:54:09
원래의
241명이 탐색했습니다.

PydanticAI: A Comprehensive Guide to Building Production-Ready AI Applications

PydanticAI는 Generative AI를 사용하여 프로덕션급 애플리케이션 개발을 간소화하도록 설계된 강력한 Python 프레임워크입니다. 널리 사용되는 데이터 검증 라이브러리인 Pydantic과 동일한 팀에 의해 구축되었으며 FastAPI의 혁신적이고 인체공학적인 디자인을 AI 애플리케이션 개발 분야에 도입하는 것을 목표로 합니다. PydanticAI는 유형 안전성, 모듈성 및 다른 Python 도구와의 원활한 통합에 중점을 둡니다.

핵심 개념

PydanticAI는 몇 가지 주요 개념을 중심으로 진행됩니다.

자치령 대표

에이전트는 LLM(대형 언어 모델)과 상호작용하기 위한 기본 인터페이스입니다. 에이전트는 다음을 포함한 다양한 구성요소의 컨테이너 역할을 합니다.

  • 시스템 프롬프트: 정적 문자열 또는 동적 함수로 정의된 LLM 지침
  • 기능 도구: LLM이 추가 정보를 얻거나 작업을 수행하기 위해 호출할 수 있는 기능
  • 구조화된 결과 유형: LLM이 실행 종료 시 반환해야 하는 데이터 유형
  • 종속성 유형: 시스템 프롬프트 기능, 도구 및 결과 유효성 검사기가 사용할 수 있는 데이터 또는 서비스.
  • LLM 모델: 에이전트가 사용할 LLM으로, 에이전트 생성 시 또는 런타임 시 설정할 수 있습니다.

에이전트는 재사용이 가능하도록 설계되었으며 일반적으로 한 번 인스턴스화되고 애플리케이션 전체에서 재사용됩니다.

시스템 프롬프트

시스템 프롬프트는 개발자가 LLM에 제공하는 지침입니다. 다음과 같을 수 있습니다:

  • 정적 시스템 프롬프트: 에이전트 생성자의 system_prompt 매개변수를 사용하여 에이전트가 생성될 때 정의됩니다.
  • 동적 시스템 프롬프트: @agent.system_prompt로 장식된 함수로 정의됩니다. 이는 RunContext 개체를 통해 종속성과 같은 런타임 정보에 액세스할 수 있습니다.

단일 에이전트는 런타임에 정의된 순서대로 추가되는 정적 및 동적 시스템 프롬프트를 모두 사용할 수 있습니다.

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.
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사

기능 도구

기능 도구를 사용하면 LLM이 외부 정보에 액세스하거나 시스템 프롬프트 자체 내에서 사용할 수 없는 작업을 수행할 수 있습니다. 도구는 여러 가지 방법으로 등록할 수 있습니다:

  • @agent.tool 데코레이터: RunContext를 통해 에이전트의 컨텍스트에 액세스해야 하는 도구용입니다.
  • @agent.tool_plain 데코레이터: 에이전트의 컨텍스트에 액세스할 필요가 없는 도구용입니다.
  • Agent 생성자의 tools 키워드 인수: Tool 클래스의 일반 함수 또는 인스턴스를 사용하여 도구 정의를 더 효과적으로 제어할 수 있습니다.
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.
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사

도구 매개변수는 함수 서명에서 추출되며 도구의 JSON 스키마를 구축하는 데 사용됩니다. 함수의 독스트링은 도구 설명과 스키마 내의 매개변수 설명을 생성하는 데 사용됩니다.

종속성

종속성은 종속성 주입 시스템을 통해 에이전트의 시스템 프롬프트, 도구 및 결과 유효성 검사기에 데이터와 서비스를 제공합니다. 종속성은 RunContext 개체를 통해 액세스됩니다. 모든 Python 유형이 될 수 있지만 데이터 클래스는 여러 종속성을 관리하는 편리한 방법입니다.

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!
로그인 후 복사
로그인 후 복사
로그인 후 복사

결과

결과는 에이전트 실행에서 반환된 최종 값입니다. RunResult(동기 및 비동기 실행의 경우) 또는 StreamedRunResult(스트리밍 실행의 경우)로 래핑되어 사용 데이터 및 메시지 기록에 대한 액세스를 제공합니다. 결과는 일반 텍스트이거나 구조화된 데이터일 수 있으며 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.

로그인 후 복사
로그인 후 복사
로그인 후 복사

@agent.result_validator 데코레이터를 통해 추가된 결과 유효성 검사기는 특히 유효성 검사에 IO가 필요하고 비동기식인 경우 유효성 검사 논리를 추가하는 방법을 제공합니다.

주요 특징

PydanticAI는 AI 애플리케이션 개발을 위한 강력한 선택이 되는 몇 가지 주요 기능을 자랑합니다.

  • 모델 불가지론: PydanticAI는 OpenAI, Anthropic, Gemini, Ollama, Groq 및 Mistral을 포함한 다양한 LLM을 지원합니다. 또한 다른 모델에 대한 지원을 구현하기 위한 간단한 인터페이스도 제공합니다.
  • 유형 안전성: mypy 및 pyright와 같은 정적 유형 검사기와 원활하게 작동하도록 설계되었습니다. 종속성 및 결과 유형의 유형 검사가 가능합니다.
  • Python 중심 디자인: 친숙한 Python 제어 흐름과 에이전트 구성을 활용하여 AI 프로젝트를 구축하므로 표준 Python 방식을 쉽게 적용할 수 있습니다.
  • 구조화된 응답: Pydantic을 사용하여 모델 출력을 검증하고 구조화하여 일관된 응답을 보장합니다.
  • 종속성 주입 시스템: 에이전트 구성 요소에 데이터와 서비스를 제공하여 테스트 가능성과 반복 개발을 향상시키는 종속성 주입 시스템을 제공합니다.
  • 스트리밍 응답: 즉각적인 검증을 통해 LLM 출력 스트리밍을 지원하여 빠르고 정확한 결과를 얻을 수 있습니다.

에이전트 작업

에이전트 실행

에이전트는 여러 가지 방법으로 실행할 수 있습니다.

  • run_sync(): 동기 실행용.
  • run(): 비동기 실행용.
  • run_stream(): 스트리밍 응답용입니다.
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.
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사

대화

에이전트 실행은 전체 대화를 나타낼 수 있지만 대화는 특히 상호 작용 간의 상태를 유지하는 경우 여러 실행으로 구성될 수도 있습니다. message_history 인수를 사용하여 이전 실행의 메시지를 전달하여 대화를 계속할 수 있습니다.

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는 토큰 및 요청 수를 제한하기 위해 settings.UsageLimits 구조를 제공합니다. Usage_limits 인수를 통해 실행 함수에 이러한 설정을 적용할 수 있습니다.

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.

로그인 후 복사
로그인 후 복사
로그인 후 복사

모델 설정

settings.ModelSettings 구조를 사용하면 온도, max_tokens 및 시간 제한과 같은 매개변수를 통해 모델 동작을 미세 조정할 수 있습니다. 실행 함수의 model_settings 인수를 통해 이를 적용할 수 있습니다.

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'
로그인 후 복사
로그인 후 복사

세부 기능 도구

도구 등록

도구는 @agent.tool 데코레이터(컨텍스트가 필요한 도구의 경우), @agent.tool_plain 데코레이터(컨텍스트가 없는 도구의 경우)를 사용하거나 에이전트 생성자의 도구 인수를 통해 등록할 수 있습니다.

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
로그인 후 복사
로그인 후 복사

도구 스키마

매개변수 설명은 독스트링에서 추출되어 도구의 JSON 스키마에 추가됩니다. 도구에 JSON 스키마에서 객체로 표현될 수 있는 단일 매개변수가 있는 경우 스키마는 해당 객체로 단순화됩니다.

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.
로그인 후 복사

동적 도구

도구 정의를 수정하거나 해당 단계에서 도구를 생략하기 위해 각 단계에서 호출되는 준비 기능을 사용하여 도구를 사용자 정의할 수 있습니다.

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)
로그인 후 복사

메시지 및 채팅 기록

메시지에 접근하기

에이전트 실행 중에 교환된 메시지는 RunResult 및 StreamedRunResult 개체의 all_messages() 및 new_messages() 메서드를 통해 액세스할 수 있습니다.

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
로그인 후 복사

메시지 재사용

메시지를 message_history 매개변수에 전달하여 여러 에이전트 실행에서 대화를 계속할 수 있습니다. message_history가 설정되고 비어 있지 않으면 새 시스템 프롬프트가 생성되지 않습니다.

메시지 형식

메시지 형식은 모델 독립적이므로 메시지를 다른 에이전트에서 사용하거나 다른 모델을 사용하는 동일한 에이전트에서 사용할 수 있습니다.

디버깅 및 모니터링

피단틱 장작불

PydanticAI는 전체 애플리케이션을 모니터링하고 디버깅할 수 있는 관찰 플랫폼인 Pydantic Logfire와 통합됩니다. Logfire는 다음 용도로 사용할 수 있습니다.

  • 실시간 디버깅: 애플리케이션에서 무슨 일이 일어나고 있는지 실시간으로 확인합니다.
  • 애플리케이션 성능 모니터링: SQL 쿼리 및 대시보드 사용

Logfire와 함께 PydanticAI를 사용하려면 logfire 옵션 그룹인 pip install 'pydantic-ai[logfire]'와 함께 설치하세요. 그런 다음 Logfire 프로젝트를 구성하고 환경을 인증해야 합니다.

설치 및 설정

설치

PydanticAI는 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.
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사

특정 모델을 사용하기 위해 슬림 설치도 가능합니다. 예를 들면 다음과 같습니다.

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!
로그인 후 복사
로그인 후 복사
로그인 후 복사

로그파이어 통합

Logfire와 함께 PydanticAI를 사용하려면 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.

로그인 후 복사
로그인 후 복사
로그인 후 복사

예제는 별도의 패키지로 제공됩니다.

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'
로그인 후 복사
로그인 후 복사

테스트 및 평가

단위 테스트

단위 테스트는 애플리케이션 코드가 예상대로 작동하는지 확인합니다. PydanticAI의 경우 다음 전략을 따르십시오.

  • pytest를 테스트 하네스로 사용하세요.
  • 실제 모델 대신 TestModel 또는 FunctionModel을 사용하세요.
  • Agent.override를 사용하여 애플리케이션 로직 내에서 모델을 교체하세요.
  • 테스트되지 않은 모델에 대한 우발적인 호출을 방지하려면 전역적으로 ALLOW_MODEL_REQUESTS=False를 설정하세요.
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
로그인 후 복사
로그인 후 복사

평가

평가는 LLM의 성능을 측정하는 데 사용되며 단위 테스트라기보다는 벤치마크에 가깝습니다. 평가는 LLM이 특정 응용 프로그램에 대해 어떻게 수행되는지 측정하는 데 중점을 둡니다. 이는 엔드투엔드 테스트, 종합적인 자체 포함 테스트, LLM을 사용하여 LLM을 평가하거나 프로덕션에서 에이전트 성능을 측정하여 수행할 수 있습니다.

사용 사례 예시

PydanticAI는 다양한 사용 사례에서 사용할 수 있습니다.

  • 룰렛 휠: 정수 종속성과 부울 결과가 있는 에이전트를 사용하여 룰렛 휠을 시뮬레이션합니다.
  • 채팅 애플리케이션: 여러 번 실행되는 채팅 애플리케이션을 만들고 message_history를 사용하여 이전 메시지를 전달합니다.
  • 은행 지원 에이전트: 도구, 종속성 주입 및 구조화된 응답을 사용하여 은행을 위한 지원 에이전트를 구축합니다.
  • 일기예보: 기능 도구와 종속성을 사용하여 위치와 날짜를 기반으로 일기예보를 반환하는 애플리케이션을 만듭니다.
  • SQL 생성: 결과 유효성 검사기를 사용한 유효성 검사와 함께 사용자 프롬프트에서 SQL 쿼리를 생성합니다.

결론

PydanticAI는 유형 안전성과 모듈성에 중점을 두고 AI 애플리케이션 개발을 위한 강력하고 유연한 프레임워크를 제공합니다. 데이터 검증 및 구조화를 위한 Pydantic의 사용은 종속성 주입 시스템과 결합되어 신뢰할 수 있고 유지 관리가 가능한 AI 애플리케이션을 구축하는 데 이상적인 도구가 됩니다. 광범위한 LLM 지원과 Pydantic Logfire와 같은 도구와의 원활한 통합을 통해 PydanticAI는 개발자가 강력하고 프로덕션에 즉시 사용 가능한 AI 기반 프로젝트를 효율적으로 구축할 수 있도록 지원합니다.

위 내용은 PydanticAI: 프로덕션용 AI 애플리케이션 구축을 위한 종합 가이드의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿