본문 바로가기
프로그래밍/Web

Laravel Prism 사용하기(번역) - 3 -

by 사악신 2024. 10. 15.

도구 호출

AI 어시스턴트가 날씨를 확인하거나 실시간 데이터를 조회할 수 있기를 바라셨나요? Prism의 도구 호출 기능을 통해 이제 가능합니다! 이 강력한 기능을 통해 AI가 외부 서비스 및 데이터 소스와 상호 작용할 수 있어, 그 어느 때보다 다재다능하고 유용해졌습니다.

도구란 무엇인가요?

Prism에서 도구는 AI가 특정 작업을 수행하는 데 사용할 수 있는 특별한 객체입니다. AI의 스위스 아미 나이프라고 생각하세요 - 각 도구는 날씨 확인이나 데이터베이스 검색과 같은 특정 기능을 가지고 있습니다.

Prism의 도구를 구성하는 요소는 다음과 같습니다:

  • 이름: 도구의 고유 식별자
  • 설명: 도구가 하는 일에 대한 간단한 설명
  • 매개변수: 도구가 작업을 수행하는 데 필요한 정보
  • 함수: 도구가 호출될 때 실행되는 실제 코드

도구 만들기

실제로 어떻게 작동하는지 보기 위해 간단한 날씨 도구를 만들어 보겠습니다:

<?php

$weatherTool = Tool::as('weather')
    ->for('현재 날씨 상태 가져오기')
    ->withParameter('city', '날씨를 확인할 도시')
    ->using(function (string $city) {
        // 실제 시나리오에서는 여기서 날씨 API를 호출할 것입니다
        return "{$city}의 날씨는 맑고 22°C입니다.";
    });

Prism 요청에서 도구 사용하기

이제 날씨 도구를 만들었으니, Prism 요청에서 사용해 보겠습니다:

<?php

$prism = Prism::text()
    ->using('anthropic', 'claude-3-sonnet')
    ->withPrompt("오늘 파리의 날씨는 어떤가요? 코트를 가져가야 할까요?")
    ->withTools([$weatherTool])
    ->withMaxSteps(3); // 도구 사용 및 응답 생성을 위해 최대 3회 반복 허용

$response = $prism();

이 예시에서 AI는 질문에 답하기 전에 날씨 도구를 사용하여 파리에 대한 정보를 얻을 수 있습니다.

다단계 호출

때로는 AI가 여러 도구를 사용하거나 도구를 사용한 후 그 결과를 처리해야 할 수 있습니다. 이럴 때 다단계 호출이 유용합니다. withMaxSteps(3)을 설정함으로써, AI가 최대 3번의 개별 호출을 할 수 있도록 허용합니다. 이는 다음과 같은 과정을 포함할 수 있습니다:

  1. 파리의 날씨 도구 호출
  2. 날씨 정보 처리
  3. 코트를 가져가야 할지에 대한 최종 응답 생성

응답 처리하기

도구를 사용한 요청을 한 후, 결과를 검사할 수 있습니다:

echo $response->text; // AI의 최종 답변

foreach ($response->steps as $step) {
    if (!empty($step->toolCalls)) {
        foreach ($step->toolCalls as $toolCall) {
            echo "사용된 도구: " . $toolCall->name . "\n";
            echo "인수: " . json_encode($toolCall->arguments()) . "\n";
        }
    }
    echo "단계 결과: " . $step->text . "\n\n";
}

이를 통해 최종 답변뿐만 아니라 AI가 어떤 도구를 사용했고 왜 사용했는지를 포함하여 결론에 도달한 과정을 볼 수 있습니다. 여전히 모든 텍스트 결과 출력에 접근할 수 있습니다.

복잡한 도구 정의하기

때로는 도구가 더 복잡해서 Closure를 사용하는 것이 적절하지 않을 수 있습니다. 이 경우 도구를 호출 가능한 클래스로 정의할 수 있습니다.

다음은 SerpAPI를 사용한 간단한 검색 도구의 예시입니다.

php

<?php

declare(strict_types=1);

namespace App\Tools;

use EchoLabs\Prism\Tool;
use Illuminate\Support\Facades\Http;

class SearchTool extends Tool
{
    public function __construct()
    {
        $this
            ->as('search')
            ->for('현재 이벤트를 검색해야 할 때 유용함')
            ->withParameter('query', '자세한 검색 쿼리. 한 번에 한 주제를 검색하는 것이 가장 좋음.', 'string')
            ->using($this);
    }

    public function __invoke(string $query): string
    {
        $response = Http::get('https://serpapi.com/search', [
            'engine' => 'google',
            'q' => $query,
            'google_domain' => 'google.com',
            'gl' => 'us',
            'hl' => 'en',
            'api_key' => env('SERPAPI_API_KEY'),
        ]);

        $results = collect($response->json('organic_results'));

        $results->map(function ($result) {
            return [
                'title' => $result['title'],
                'link' => $result['link'],
                'snippet' => $result['snippet'],
            ];
        })->take(4);

        return view('prompts.search-tool-results', [
            'results' => $results,
        ])->render();
    }
}

blade

<links>
    @foreach ($results as $result)
        <link>
        <title>{{ $result['title'] }}</title>
        <url>{{ $result['link'] }}</url>
        <snippet>{{ $result['snippet'] }}</snippet>
        </link>
    @endforeach
</links>

항상 응답 끝에 출처를 인용하세요

<example-sources>
    출처:
    - [제목](url)
    - [제목](url)
</example-sources>

그런 다음 Prism에 도구를 등록하기만 하면 됩니다.

php

<?php

$prism = Prism::text()
    ->using('anthropic', 'claude-3-sonnet')
    ->withPrompt("오늘 파리의 날씨는 어떤가요?")
    ->withTools([new SearchTool])
    ->withMaxSteps(3);

echo $prism()->text;

도구 사용을 위한 모범 사례

  1. 간단하게 유지하세요: 잘 정의된 소수의 도구로 시작하세요.
  2. 설명을 자세히 작성하세요: 도구와 매개변수에 대해 명확한 설명을 제공하세요.
  3. 오류를 우아하게 처리하세요: 도구 함수가 예상치 못한 입력을 처리할 수 있도록 하세요.
  4. 사용량을 모니터링하세요: 도구가 얼마나 자주, 왜 호출되는지 주시하세요.

Prism에서 도구 호출을 활용함으로써, AI에게 실제 세계의 데이터에 접근하고 작업을 수행할 수 있는 능력을 부여하여, Laravel 애플리케이션에서 진정으로 강력한 어시스턴트로 만들 수 있습니다!

반응형

댓글