一个允许创建AI成员团队并共同工作以实现共同目标的软件包。

dev-main 2024-03-25 06:45 UTC

This package is auto-updated.

Last update: 2024-09-25 07:59:44 UTC


README

一个允许创建AI成员团队并共同工作以实现共同目标的软件包。

安装

composer require sarfraznawaz2005/ai-team:dev-main

工作流程

  1. 👥 创建团队(可选:整体目标)
  2. 👤 创建成员(可选:提供给他们数据)
  3. 📋 定义成员角色
  4. 📝 分配任务给成员
  5. 🏃 运行

示例

这里我们创建了一个团队,包括两个分配了任务的成员。

$apiKey = getenv('GEMINI_API_KEY');

// define our team and overall goal
$myTeam = new Team('Provide short introduction of the cricketer.', new GoogleGeminiAI($apiKey));

// define members with roles, goals and tasks with same or different LLMs/AI models

$Researcher = (new Member('Researcher', 'You are a Researcher', new GoogleGeminiAI($apiKey)))
    ->assignTask('Provide the list of cricketers with more than one centuries.')
    ->withData(function () {
        // this could come from your database or api for example.
        return <<<data
  Name: Sachin Tendulkar
  Centuries: 100

  Name: Ricky Ponting
  Centuries: 71

  Name: Virat Kohli
  100s: 70

  Name: John Doe
  Centuries: 0
  data;
    });

$Analyst = (new Member('Analyst', 'You are an Analyst', new GoogleGeminiAI($apiKey)))
    ->assignTask('Retrieve the name of a cricketer with most centuries.');

// add members to the team
$myTeam->addMembers([$Researcher, $Analyst]);

// get team of members to do their work
$result = $myTeam->performTasks();
echo $result;

🙌 结果

Researcher performing the task:

Role: You are a Researcher

Task: Provide the list of cricketers with more than one centuries.

Researcher performed task with result:

1. Sachin Tendulkar (100 centuries)
2. Ricky Ponting (71 centuries)
3. Virat Kohli (70 centuries)


Analyst performing the task:

Role: You are an Analyst

Task: Retrieve the name of a cricketer with most centuries.

Analyst performed task with result:

Sachin Tendulkar


FINAL TEAM RESULT:

Sachin Tendulkar is a legendary Indian cricketer widely regarded as one of the greatest batsmen 
in the history of the sport. Known as the "Master Blaster," Tendulkar holds the record for most 
centuries (100) in international cricket.

更多示例请见此处

它是如何工作的?

每个成员执行自己的任务并将结果作为上下文传递给下一个成员。下一个成员使用这些信息作为上下文来执行自己的任务,并将自己的结果传递给下一个成员,依此类推。因此,每个成员的结果都传递给下一个成员,以构建集体知识和基于这些知识推断结果。

支持的LLM

LLM签名

(string $apiKey, array $options = [])

$options中,可以传递LLM设置,例如modeltemperaturetopP等。请确保它们符合LLM的要求/格式。

添加您自己的LLM

要添加您自己的LLM提供者,实现LLMProvider接口

interface LLMProvider {
    public function generateText(string $prompt): string;
}

使用说明

创建团队成员

签名

(string $name, string $role, LLMProvider $llmProvider, bool $verbose = true)
$awesomeMember = (new Member('Researcher', 'You are a Researcher', new GoogleGeminiAI($apiKey)))
 ->assignTask("Perform Awesome Task!");

向成员提供上下文数据

$awesomeMember = (new Member('Researcher', 'You are a Researcher', new GoogleGeminiAI($apiKey)))
 ->assignTask("Perform Awesome Task!")
  ->withData(function () {
  // this could come from your database or api for example.
  return <<<data
  Some Data
  data;
 });

或传递一个应该实现DataProviderInterface接口的类

$awesomeMember = (new Member('Researcher', 'You are a Researcher', new GoogleGeminiAI($apiKey)))
 ->assignTask("Perform Awesome Task!")
 ->withData(new MyDataProvider());

该软件包提供了两个内置数据提供者

创建团队

签名

(string $overallGoal = '', LLMProvider $llmProvider = null, ExecutionInterface $execution = null, $executionDelayMilliSeconds = 500)
$myTeam = new Team();

或提供团队的整体目标,在这种情况下,在所有成员返回结果后,LLM将再次用于整体目标,上下文为所有成员的结果。

$myTeam = new Team("Team's overall goal here...", new GoogleGeminiAI($apiKey));

向团队添加成员

$myTeam->addMembers([$researcher, $analyst]);

“Team”类的第三个参数是执行类型,目前仅支持“SequentialExecution”类型。

  • SequentialExecution:在此模式下,所有成员按顺序通过“addMembers”方法传递的顺序运行。在此模式下,每个成员将他的结果作为上下文传递给下一个成员,依此类推。

获取最终结果

调用以获取最终团队结果

echo $myTeam->performTasks();

注意 如上例所示,通过传递带有选项的LLM实例,团队和成员可以使用针对其任务专门化的不同LLM和模型。

不使用团队使用成员

可以单独使用一个或多个成员来完成工作,而不需要作为团队的一部分

$awesomeMember = (new Member('Researcher', 'You are a Researcher', new GoogleGeminiAI($apiKey)))
 ->assignTask("Perform Awesome Task!");

 $awesomeMember->performTask();
 $result = $awesomeMember->getResult();

查看示例

启用成员间的协作

通过“provideFeedbackTo”方法可以启用成员之间的协作或通信以完成给定任务。它具有以下签名

(array $members, $maxFeedbacks = 3, $feedbackDelayMilliSeconds = 2, $exitOnFailedFeedback = false)
  • $members 指定要与其协作的成员。
  • $maxFeedbacks 指定从 $members 获取期望结果的总尝试次数。
  • $feedbackDelayMilliSeconds 指定在新通信尝试之前延迟的时间。
  • $exitOnFailedFeedback 指定是否在协作失败时退出程序。

让我们用一个例子来理解。假设我们想要创建一个游戏。为此,我们创建了三个AI成员

  • 软件工程师
  • 代码审查员
  • 质量保证工程师

我们想要确保软件工程师编写的代码被代码审查员审查,并且由质量保证工程师进行质量保证。如果代码审查员或质量保证工程师在任何时候发现软件工程师编写的游戏代码中存在任何问题,他们会告知他错误,直到软件工程师提出可接受的结果。下面是如何实现这个过程的示例

$apiKey = getenv('GEMINI_API_KEY');

$SoftwareEngineer = (new Member(
    'Senior Software Engineer',
    'You are expert software engineer specializing in game development with over 10 years of 
    experience.',
    new GoogleGeminiAI($apiKey)
))->assignTask(
    'Create a simple shooter game to shoot at enemies that can be played by pressing spacebar 
    key to shoot at enemies. Enemies keep coming from the top and as the time passes, game 
    should get harder and enemies keep on coming they never stop. Your final answer must be 
    the html, css and javascript code, only the html, css and javascript code and nothing else.

You will get $100 if you are able to create error-free, working and really playable game!

Below are rules you must follow:
- Make sure entire code is in SINGLE and in SAME index.html file.
- Do not use external packages or libraries.
- Game boundaries must inside window boundaries.
- Do not assume anything and provide full working code without comments.
'
);

$CodeReviewer = (new Member(
    'Senior Code Reviewer',
    'You are expert code reviewer.',
    new GoogleGeminiAI($apiKey)
))
    ->assignTask(
        'Your job is to do code review of code written by software engineer and make sure it has
         no errors.'
    )
    // max 2 feedback attempts to try to get correct code answer from software engineer
    ->provideFeedbackTo([$SoftwareEngineer], 2);

$QAEngineer = (new Member(
    'Senior QA Engineer',
    'You are expert QA Engineer',
    new GoogleGeminiAI($apiKey)
))
    ->assignTask('Your job is to make sure game is playable and has no errors. Otherwise list the issues you identify.')
    // max 2 feedback attempts to try to get correct code answer from software engineer
    ->provideFeedbackTo([$SoftwareEngineer], 2);

$gameTeam = new Team();

$gameTeam
    ->addMembers([$SoftwareEngineer, $CodeReviewer, $QAEngineer])
    ->excludeResults([$CodeReviewer, $QAEngineer]);

$gameTeam->performTasks();

// save final results to file and remove member names from result
$gameTeam->saveToFile('game.html', true);

结果可能如下所示

Senior Software Engineer performing the task:

Role: You are expert software engineer specializing in game development with over 10 years of experience.

Task: Create a simple shooter game to shoot at enemies that can be played by pressing spacebar key to shoot at enemies.
Enemies keep coming from the top and as the time passes, game should get harder and enemies keep on coming they never stop.
Your final answer must be the html, css and javascript code, only the html, css and javascript code and nothing else.

Senior Software Engineer performed task with result:

[actual code written by software engineer skipped for brevity]

Senior Code Reviewer has entered into feedback loop with Senior Software Engineer.

Senior Code Reviewer has provided following feedback to Senior Software Engineer:

Seems like game is not working properly, fix the code so that it works as expected.

Feedback #1:

Senior Software Engineer has replied with following updated answer:

[actual code written by software engineer skipped for brevity]

Senior Code Reviewer has provided following feedback to Senior Software Engineer:

No further feedback

Successful collaboration between Senior Code Reviewer and Senior Software Engineer!

Senior Code Reviewer exiting the feedback loop with Senior Software Engineer.

Senior QA Engineer has entered into feedback loop with Senior Software Engineer.

Senior QA Engineer has provided following feedback to Senior Software Engineer:

Well done.

Senior QA Engineer is satisfied with answer of Senior Software Engineer!

Senior QA Engineer exiting the feedback loop with Senior Software Engineer.


FINAL TEAM RESULT:

Senior Software Engineer:

[actual code written by software engineer skipped for brevity]

在此查看示例代码实际输出在此

注意上面示例中使用了 excludeResults 方法。如果使用,该成员的结果将不会显示在最终团队输出中,并且也不会传递给任何其他成员,除非它们在反馈/通信循环中。

还请注意使用了 saveToFile 方法将最终结果保存到指定路径。

注意

不建议在生产环境中使用,请注意成本,自行承担风险!

可能我不会更新这个包很多(因此没有创建版本),因为缺乏时间,但通过 develop 分支欢迎提交PR。