참고: 이 제품은 독립적으로 개발되었으며 OpenAI와 제휴, 보증 또는 후원을 받지 않습니다.
Composer를 사용하여 이 패키지를 종속성으로 설치합니다.
composer require manuelkiessling/ai-tool-bridge
AI를 프로젝트에 통합할 때 가장 큰 과제는 AI와 나머지 애플리케이션 간의 상호 작용을 관리하는 것입니다. 이는 AI가 정보를 검색하거나 작업을 트리거하기 위해 API 호출을 해야 할 때 특히 복잡해집니다.
PHP용 AI Tool Bridge는 AI가 외부 시스템과 상호 작용해야 할 때 활용할 수 있는 "도구 기능"을 정의하는 간단한 인터페이스를 제공함으로써 이 문제를 우아하게 해결합니다.
중요한 최적화는 도구 기능에 필요한 JSON 구조를 생성하는 라이브러리의 기능입니다. AI에서 필요한 값만 요청한 다음 제공된 JSON 스키마를 기반으로 JSON을 생성함으로써 이를 수행합니다. 이 접근 방식은 애플리케이션 코드에 도달하는 최종 JSON의 유효성을 보장합니다.
이 라이브러리의 주요 기능은 다음과 같습니다.
당신이 전자상거래 사업을 하고 있고 제품 카탈로그를 탐색할 수 있는 AI 채팅 인터페이스를 제공하고 싶다고 가정해 보겠습니다. 이를 위해 ChatGPT API를 통해 OpenAI의 GPT-4 모델과 통합하기로 결정했습니다.
아마도 AI 도우미에게 "당신은 사용자에게 우리 제품 카탈로그에 대해 알려주는 친절하고 유용한 쇼핑 도우미입니다..." 등의 메시지를 표시할 것입니다.
그러나 전체 제품 카탈로그를 프롬프트에 추가할 수는 없습니다. 따라서 사용자가 AI에게 "제공되는 주방 도우미에 대해 알려주세요"라고 요청하는 경우 대화의 이 시점에서 AI가 전자상거래 백엔드 시스템의 정보가 필요하다는 점을 식별해야 합니다(예: 제품에 대한 요청). "주방 도우미"라는 쿼리를 사용하는 검색 API), AI에 대한 이 정보를 검색해야 하며 결과 정보를 AI 도우미에 다시 제공해야 하며 AI 도우미는 사용자를 위한 제품 정보를 요약할 수 있습니다.
AI는 외부 세계에서 이러한 정보를 검색할 때가 언제인지 가장 잘 알고 있습니다. 자신만의 코드를 작성하여 대화를 듣고 언제 Product Search API 호출을 해야 하는지 추측하는 것은 복잡하고 오류가 발생하기 쉬우며 강력한 AI를 사용한다는 아이디어를 약간 무의미하게 만들기 때문입니다.
가장 좋은 접근 방식은 AI가 외부 세계와 대화할 때가 왔다는 것을 인식하고 체계적이고 틀림없는 방식으로 그렇게 하도록 하는 것입니다.
해결책은 초기 시스템 프롬프트 내에서 AI가 마음대로 사용할 수 있는 하나 이상의 도구를 가지고 있음을 가르치는 것입니다.
이는 먼저 다음과 같이 소위 도구 기능 정의를 작성하여 수행됩니다.
<?php
declare (strict_types= 1 );
namespace ManuelKiessling AiToolBridge Example ;
use ManuelKiessling AiToolBridge ToolFunctionCallResult ;
use ManuelKiessling AiToolBridge ToolFunctionCallResultStatus ;
use ManuelKiessling AiToolBridge ToolFunction ;
class MyProductSearchToolFunction implements ToolFunction
{
public function getName (): string
{
return ' productSearch ' ;
}
public function getDescription (): string
{
return ' allows to search the product catalogue and retrieve information about products ' ;
}
public function getInputJsonSchema (): string
{
return <<<'JSON'
{
"type": "object",
"properties": {
"searchterms": {
"type": "string"
}
},
"required": [
"searchterms"
]
}
JSON;
}
public function invoke ( string $ json ): ToolFunctionCallResult
{
// we will talk about this in a minute
return new ToolFunctionCallResult (
$ this ,
ToolFunctionCallResultStatus :: SUCCESS ,
'' ,
[]
);
}
}
JSON 스키마의 이름, 설명 및 개체 키가 유용하고 설명적인지 확인하세요. 이는 AI가 이 도구 기능을 사용하는 시기와 방법을 이해하는 데 도움이 됩니다.
여러 도구 기능 정의를 정의할 수 있습니다. 예를 들어 사용자가 요청할 때 AI가 결제 바구니에 제품을 넣을 수 있도록 다른 도구 기능을 추가할 수 있습니다. 하지만 이 예제는 간단하게 유지하겠습니다.
다음으로 도구 브리지를 기존 AI 설정과 통합해야 합니다. 이 작업은 AiToolBridge
도우미를 사용하여 수행됩니다.
class Example
{
private AiToolBridge $ aiToolBridge ;
private MyAiService $ myAiService ;
public function __construct ()
{
$ this -> myAiService = new MyAiService ();
$ myProductSearchToolFunction = new MyProductSearchToolFunction ();
$ this -> aiToolBridge = new AiToolBridge (
new $ this -> myAiService ,
[ $ myProductSearchToolFunction ],
);
$ this -> myAiService -> setSystemPrompt (
" You are a friendly and helpful shopping assistant that informs the user about our product catalog...
{ $ this -> aiToolBridge -> getPrompt ()}"
);
}
}
이는 분명히 몇 가지 가정을 합니다. 즉, 애플리케이션이 구조화되는 방식과 AI 서비스를 통합하는 방식이 크게 다를 수 있습니다.
그러나 통합 지점은 항상 동일합니다. 이 라이브러리는 AI 도우미와 대화할 수 있어야 하므로 AiAssistantMessenger
인터페이스를 구현하는 개체를 제공해야 합니다. 기본 예제는 src/Example/MyAiService.php를 참조하세요.
또한 AiToolBridge 개체를 생성할 때 정의한 도구 기능을 연결해야 합니다.
다음으로, AI가 도구를 사용할 수 있다는 것을 이해하게 하려면 이 라이브러리에서 생성된 프롬프트를 사용하여 자체 AI "시스템" 프롬프트를 확장해야 합니다. 이렇게 하려면 위에 표시된 대로 AiToolBridge::getPrompt
메소드를 사용하십시오.
이제 애플리케이션과 이 라이브러리가 완전히 통합되고 설정되었습니다. 그러나 한 가지 핵심 부분이 누락되었습니다. 즉, AI가 도구 기능을 사용할 때 트리거되어야 하는 실제 동작입니다.
MyProductSearchToolFunction
클래스의 메소드 invoke
을 다시 살펴보겠습니다.
public function invoke ( string $ json ): ToolFunctionCallResult
{
return new ToolFunctionCallResult (
$ this ,
ToolFunctionCallResultStatus :: SUCCESS ,
'' ,
[]
);
}
이곳은 마법이 일어나야 하는 곳입니다. 즉, 실제 제품 검색을 수행하는 데 필요한 모든 로직(귀하의 로직)을 구현하는 곳입니다.
여기에서는 어떤 방식으로든 AI 통합을 고려할 필요가 없습니다. 이것이 바로 여러분을 위해 무거운 작업을 수행하는 것이 이 라이브러리의 요점입니다.
더 정확하게 말하면, invoke
메서드가 호출되면 무거운 작업은 이미 완료되었습니다. 메서드에서 JSON 스키마로 정의한 정확한 구조를 갖는 JSON 문자열을 사용하여 메서드가 호출된다는 점을 확신할 수 있습니다. MyProductSearchToolFunction::getInputJsonSchema
, 반면에 도구 기능을 사용할 때 AI가 유용하다고 간주하는 값으로 채워집니다.
예를 들어 AI-사용자 대화가 다음과 같이 진행된다면:
AI: Hello, how can I help you?
User: Tell me about some kitchen helpers on offer.
그러면 AI는 productSearch
도구 기능을 사용하여 kitchen helpers
를 검색해야 한다는 것을 인식하게 되며, 결과적으로 다음 JSON 문자열과 함께 MyProductSearchToolFunction::invoke
호출됩니다.
{
"searchterms" : " kitchen helpers "
}
ToolFunctionCallResult
객체를 반환하는 한 이 메서드를 구현하는 방법은 완전히 자유입니다. 이 예에서는 실제로 제품 검색을 수행하는 것이 합리적이지만 이를 수행하는 방법은 전적으로 귀하에게 달려 있습니다. 데이터베이스를 쿼리하고, API와 대화하거나 "주방 도우미"에 대한 생산 정보를 검색하는 기타 모든 작업을 수행합니다.
반환해야 하는 ToolFunctionCallResult
개체에서 관심 있는 두 가지 필드는 message
와 data
입니다. 이 예에서는 다음과 같습니다.
public function invoke ( string $ json ): ToolFunctionCallResult
{
$ jsonAsArray = json_decode ( $ json , true );
// use $jsonAsArray['searchterm'] when talking to a DB or an API...
return new ToolFunctionCallResult (
$ this ,
ToolFunctionCallResultStatus :: SUCCESS ,
' Found 2 matching products ' ,
[
[
' id ' => 84 ,
' name ' => ' Kawaii Chick Egg Separator ' ,
' price ' => 14.99 ,
' description ' => ' Whether you’re a beginner baker or an experienced cook, the Kawaii Chick Egg Separator is a must-have kitchen tool that will make separating eggs a breeze. '
],
[
' id ' => 2389 ,
' name ' => ' BlendJet 2 ' ,
' price ' => 49.99 ,
' description ' => ' Imagine the freedom of being able to go anywhere and blend your favorite smoothies, shakes, margaritas, frappés, or baby food without the limitations of a regular blender. '
]
]
);
}
data
형식은 특정 스키마로 제한되지 않습니다.
마지막 부분을 살펴보고 Example
클래스로 돌아가겠습니다. 구현에는 애플리케이션이 새로운 AI 보조 메시지를 검색할 때마다 호출되는 handleAssistantMessage
메서드가 있다고 가정합니다. 이는 애플리케이션의 매우 구체적인 구현 세부 사항입니다.
이것이 바로 장소입니다. 사용자에게 메시지를 보내기 전에! — 대화에 "연결"해야 하는 곳입니다. 이를 통해 도구 라이브러리는 AI의 도구 기능 요청을 감지하고 그에 따라 처리할 수 있습니다.
도구 기능이 호출되어 성공한 경우 AI 도우미에게 결과를 다시 제공해야 합니다. 이렇게 하면 AI 도우미가 제품 검색과 일치하는 제품에 대해 학습합니다.
<?php
declare (strict_types= 1 );
class Example
{
// ...
public function handleAssistantMessage ( string $ message ): void
{
$ toolFunctionCallResult = $ this -> aiToolBridge -> handleAssistantMessage ( $ message );
if ( is_null ( $ toolFunctionCallResult )) {
// The AI didn't use a tool function, thus its message is meant for the user
$ this -> sendAssistantMessageToUser ( $ message );
} else {
// The AI used a tool function, we now need to send the result to the AI
$ dataAsJson = json_encode ( $ toolFunctionCallResult -> data );
$ this -> sendUserMessageToAssistant ( $ toolFunctionCallResult -> message . ' ' . $ dataAsJson );
}
}
public function sendAssistantMessageToUser ( string $ message ): void
{
// whatever code is needed to show an AI assistant message to the user
}
public function sendUserMessageToAssistant ( string $ message ): void
{
// whatever code is needed to send a message to the AI assistant
}
}
보시다시피, AI 보조자에게 롤 기능 결과를 알릴 때 우리는 사용자가 보조자에게 이에 대해 말하는 역할을 합니다. AI 비서의 관점에서는 애초에 AI에게 도구를 제공하는 사람이 바로 사용자이기 때문입니다! 이러한 경우가 발생하는 이유를 이해하려면 src/AiToolBridge.php 메소드를 참조하십시오.
기여를 환영합니다! 기여하려면 CONTRIBUTING.md를 숙지하시기 바랍니다.
사용자 정보를 안전하게 유지하는 것이 최우선 과제이며 외부 보안 연구원의 기여를 환영합니다. 이 저장소에서 유지 관리되는 소프트웨어에서 보안 문제를 발견했다고 생각되면 SECURITY.md에서 취약점 보고서 제출에 대한 지침을 읽어보세요.
PHP용 AI Tool Bridge는 저작권 © Manuel Kießling이며 Free Software Foundation에서 게시한 GNU General Public License(GPL-3.0 이상)의 조건에 따라 사용이 허가되었습니다.
자세한 내용은 라이센스 및 공지 사항을 참조하십시오.