注意:本產品是獨立開發的,不隸屬於 OpenAI、不認可或贊助。
使用 Composer 安裝此套件作為依賴項。
composer require manuelkiessling/ai-tool-bridge
將人工智慧整合到任何專案時的主要挑戰是管理人工智慧與應用程式其餘部分之間的互動。當 AI 需要呼叫 API 來檢索資訊或觸發操作時,這變得尤其複雜。
PHP 的 AI Tool Bridge 透過提供一個簡單的介面來定義 AI 在需要與外部系統互動時可以使用的“工具功能”,從而優雅地解決了這個問題。
一個重要的最佳化是該函式庫能夠為工具函數產生所需的 JSON 結構。它透過僅從 AI 請求所需的值,然後根據提供的 JSON 模式產生 JSON 來實現這一點。這種方法保證了到達應用程式程式碼的最終 JSON 的有效性。
該庫的主要功能包括:
假設您有一家電子商務企業,並且您希望提供一個允許瀏覽產品目錄的 AI 聊天介面。為此,您決定透過 ChatGPT API 與 OpenAI 的 GPT-4 模型整合。
您可能會提示人工智慧助理「您是一位友好且樂於助人的購物助理,可以向使用者介紹我們的產品目錄...」等等。
但是,您無法將整個產品目錄新增至提示。因此,當您的用戶要求人工智慧「告訴我一些提供的廚房幫手」時,您需要確定在對話的這一點上,人工智慧需要來自您的電子商務後端系統的資訊(例如,透過向您的產品發出請求)透過查詢「廚房助理」搜尋 API),您需要為 AI 檢索此訊息,並且需要將結果資訊提供回 AI 助手,然後 AI 助理可以為使用者匯總產品資訊。
人工智慧最清楚何時需要從外部世界檢索這些資訊。因為讓您自己的程式碼監聽對話並讓它猜測何時進行 Product Search API 呼叫非常複雜且容易出錯,並且使得使用強大的 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 設定整合。這是使用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 助理對話,因此您必須提供實作AiAssistantMessenger
介面的物件。有關簡單範例,請參閱 src/Example/MyAiService.php。
您還需要附加在建立 AiToolBridge 物件時定義的工具函數。
接下來,為了讓 AI 理解它可以使用您的工具,您需要使用該庫產生的提示來擴展您自己的 AI「系統」提示。為此,請使用方法AiToolBridge::getPrompt
如上所示。
您的應用程式和該庫現已完全整合和設定。然而,缺少一個核心部分——人工智慧使用你的工具功能時應該觸發的實際行為。
我們再看一下MyProductSearchToolFunction
類別的方法invoke
:
public function invoke ( string $ json ): ToolFunctionCallResult
{
return new ToolFunctionCallResult (
$ this ,
ToolFunctionCallResultStatus :: SUCCESS ,
'' ,
[]
);
}
這就是魔法需要發生的地方 - 也就是說,這是實現實際產品搜尋所需的所有邏輯(您的邏輯)的地方。
在這裡,您不需要以任何方式考慮人工智慧整合——這正是這個程式庫的目的,為您完成繁重的工作。
更準確地說,當調用invoke
方法時,繁重的工作已經完成 - 您可以放心,該方法將使用 JSON 字串調用,一方面具有您在方法中使用 JSON Schema 定義的精確結構MyProductSearchToolFunction::getInputJsonSchema
,另一方面填入了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
類別。我們假設在您的實作中,有一個方法handleAssistantMessage
,每當您的應用程式檢索新的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提供工具的首先是使用者!請參閱方法 src/AiToolBridge.php 以了解為什麼會發生這種情況。
歡迎貢獻!要做出貢獻,請熟悉 CONTRIBUTING.md。
確保使用者資訊安全是首要任務,我們歡迎外部安全研究人員的貢獻。如果您認為在此儲存庫中維護的軟體中發現了安全性問題,請閱讀 SECURITY.md 以取得提交漏洞報告的說明。
AI Tool Bridge for PHP 版權所有 © Manuel Kießling,並根據自由軟體基金會發布的 GNU 通用公共授權(GPL-3.0 或更高版本)的條款獲得使用許可。
請參閱許可證和通知以了解更多資訊。