หมายเหตุ: ผลิตภัณฑ์นี้ได้รับการพัฒนาอย่างอิสระและไม่มีส่วนเกี่ยวข้อง รับรอง หรือสนับสนุนโดย OpenAI
ติดตั้งแพ็คเกจนี้เป็นการพึ่งพาโดยใช้ Composer
composer require manuelkiessling/ai-tool-bridge
ความท้าทายที่สำคัญเมื่อรวม AI เข้ากับโครงการคือการจัดการการโต้ตอบระหว่าง AI และแอปพลิเคชันที่เหลือของคุณ สิ่งนี้จะซับซ้อนเป็นพิเศษเมื่อ AI จำเป็นต้องทำการเรียก API เพื่อดึงข้อมูลหรือกระตุ้นการดำเนินการ
AI Tool Bridge สำหรับ PHP แก้ปัญหานี้ได้อย่างสวยงามด้วยการนำเสนออินเทอร์เฟซที่ตรงไปตรงมาเพื่อกำหนด "ฟังก์ชันเครื่องมือ" ที่ AI สามารถนำมาใช้เมื่อจำเป็นต้องโต้ตอบกับระบบภายนอก
การเพิ่มประสิทธิภาพที่สำคัญคือความสามารถของไลบรารีในการสร้างโครงสร้าง JSON ที่จำเป็นสำหรับฟังก์ชันเครื่องมือ ทำได้โดยการขอเฉพาะค่าที่ต้องการจาก AI จากนั้นสร้าง JSON ตามสคีมา JSON ที่ให้มา วิธีการนี้รับประกันความถูกต้องของ JSON สุดท้ายที่เข้าถึงโค้ดแอปพลิเคชันของคุณ
คุณสมบัติที่สำคัญของห้องสมุดนี้ได้แก่:
สมมติว่าคุณมีธุรกิจอีคอมเมิร์ซและคุณต้องการจัดให้มีอินเทอร์เฟซการแชท AI ซึ่งช่วยให้เรียกดูแคตตาล็อกผลิตภัณฑ์ของคุณได้ ในการทำเช่นนั้น คุณได้ตัดสินใจผสานรวมกับโมเดล GPT-4 ของ OpenAI ผ่านทาง ChatGPT API
คุณอาจแจ้งผู้ช่วย AI ตามแนว "คุณเป็นผู้ช่วยช้อปปิ้งที่เป็นมิตรและช่วยเหลือดีซึ่งแจ้งผู้ใช้เกี่ยวกับแค็ตตาล็อกผลิตภัณฑ์ของเรา..." และอื่นๆ
อย่างไรก็ตาม คุณไม่สามารถเพิ่มแค็ตตาล็อกผลิตภัณฑ์ทั้งหมดของคุณลงในพร้อมท์ได้ ดังนั้น เมื่อผู้ใช้ของคุณขอให้ AI "บอกฉันเกี่ยวกับผู้ช่วยในครัวที่นำเสนอ" คุณต้องระบุว่า ณ จุดนี้ของการสนทนา AI ต้องการข้อมูลจากระบบแบ็กเอนด์อีคอมเมิร์ซของคุณ (เช่น โดยการร้องขอไปยังผลิตภัณฑ์ของคุณ ค้นหา API ด้วยข้อความค้นหา "ผู้ช่วยในครัว") คุณต้องดึงข้อมูลนี้สำหรับ 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 สามารถใส่สินค้าลงในตะกร้าชำระเงินเมื่อผู้ใช้ร้องขอ เราจะเก็บตัวอย่างนี้ให้เรียบง่าย
ถัดไป คุณต้องรวม Tool Bridge เข้ากับการตั้งค่า 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 ใช้ฟังก์ชันเครื่องมือของคุณ
ลองดูที่วิธี invoke
คลาส MyProductSearchToolFunction
อีกครั้ง:
public function invoke ( string $ json ): ToolFunctionCallResult
{
return new ToolFunctionCallResult (
$ this ,
ToolFunctionCallResultStatus :: SUCCESS ,
'' ,
[]
);
}
นี่คือจุดที่ความมหัศจรรย์ต้องเกิดขึ้น นั่นคือ นี่คือที่ที่จะใช้ตรรกะทั้งหมด — ตรรกะของคุณ — ที่จำเป็นในการค้นหาผลิตภัณฑ์จริง
ที่นี่ คุณไม่จำเป็นต้องพิจารณาการบูรณาการ AI แต่อย่างใด นี่คือจุดประสงค์ของไลบรารีนี้ที่จะช่วยยกของหนักให้กับคุณ
แม่นยำยิ่งขึ้น เมื่อเรียกใช้เมธอด invoke
ใช้ การยกของหนักได้เสร็จสิ้นแล้ว คุณสามารถมั่นใจได้ว่าเมธอดนั้นจะถูกเรียกใช้ด้วยสตริง JSON ซึ่งด้านหนึ่งมีโครงสร้างที่แม่นยำที่คุณได้กำหนดไว้ด้วย JSON Schema ในเมธอด MyProductSearchToolFunction::getInputJsonSchema
และในทางกลับกัน จะเต็มไปด้วยค่าที่ AI ถือว่ามีประโยชน์เมื่อใช้ฟังก์ชันเครื่องมือ
ตัวอย่างเช่น หาก AI—การสนทนาของผู้ใช้เป็นดังนี้:
AI: Hello, how can I help you?
User: Tell me about some kitchen helpers on offer.
จากนั้น AI จะรับรู้ว่าควรใช้ฟังก์ชันเครื่องมือ productSearch
เพื่อค้นหา kitchen helpers
ซึ่งท้ายที่สุดจะส่งผลให้มีการเรียกไปยัง MyProductSearchToolFunction::invoke
ด้วยสตริง JSON ต่อไปนี้:
{
"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 และจัดการตามนั้น
หากมีการเรียกใช้ฟังก์ชันเครื่องมือและประสบความสำเร็จ เราจำเป็นต้องป้อนผลลัพธ์กลับไปยังผู้ช่วย 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 เพื่อดูคำแนะนำในการส่งรายงานช่องโหว่
AI Tool Bridge สำหรับ PHP เป็นลิขสิทธิ์ © Manuel Kießling และได้รับอนุญาตให้ใช้ภายใต้เงื่อนไขของ GNU General Public License (GPL-3.0 หรือใหม่กว่า) ตามที่เผยแพร่โดย Free Software Foundation
โปรดดูใบอนุญาตและประกาศสำหรับข้อมูลเพิ่มเติม