Простая динамическая мультиагентная структура, основанная на атомных агентах и Instructor. Использует возможности Pydantic для проверки и сериализации данных и схемы.
создавать агентов, созданных из системного приглашения, с общим языком либо вызовов функций , либо мутаций GraphQL.
маршрутизатор использует LLM для обработки сложных «составных» пользовательских запросов и автоматически направляет их к лучшей последовательности ваших агентов.
генерировать через OpenAI или AWS Bedrock или groq
примечание: !! framework is at an early stage !!
- критические изменения будут обозначаться увеличением младшей версии (основная версия по-прежнему равна нулю).
Структура агентов на основе LLM, использующая подход агентно-ориентированного программирования для управления агентами с использованием общего языка.
Язык агента может быть либо основан на вызове функций , либо основан на GraphQL .
Структура является общей и позволяет определять агентов с точки зрения имени, описания, принятых входных вызовов и разрешенных выходных вызовов.
Агенты общаются косвенно, используя доску. Язык состоит из вызовов (функций или мутаций GraphQL): каждый агент указывает, что он понимает как входные данные и какие вызовы он может генерировать. Таким образом, агенты могут понимать выходные данные друг друга.
Маршрутизатор принимает приглашение пользователя и генерирует план выполнения агента.
План выполнения использует лучшую последовательность наиболее подходящих агентов для обработки запроса пользователя.
Маршрутизатор перезаписывает приглашение пользователя в соответствии с требованиями каждого агента, что повышает качество и позволяет избежать нежелательного вывода.
Примечание. При необходимости маршрутизатор можно запускать отдельно, что позволяет оперативно получать обратную связь от человека по плану выполнения, сгенерированному маршрутизатором. Таким образом, пользователь может больше сотрудничать с маршрутизатором до фактического выполнения генеративных агентов.
Наконец, выходные данные возвращаются в виде упорядоченного списка вызовов (функций или GraphQL).
Чтобы узнать больше об этом подходе, вы можете прочитать эту статью на Medium.
framework is at an early stage
. Оценщик в настоящее время не реализован. При интеграции, в зависимости от того, какие определения агентов используются, клиенту необходимо:
Это демо-версия конструктора мира Sim Life. Он использует 3 агента (Существо, Создатель растительности, Создатель отношений) для обработки запросов пользователя. Агенты определяются с точки зрения функций. Результатом является серия вызовов функций, которые клиент может реализовать для создания мира Sim Life.
Функция AddCreature:
function_add_creature = FunctionSpecSchema (
agent_name = creature_agent_name ,
function_name = "AddCreature" ,
description = "Adds a new creature to the world (not vegetation)" ,
parameters = [
ParameterSpec ( name = "creature_name" , type = ParameterType . string ),
ParameterSpec ( name = "allowed_terrain" , type = ParameterType . string , allowed_values = terrain_types ),
ParameterSpec ( name = "age" , type = ParameterType . int ),
ParameterSpec ( name = "icon_name" , type = ParameterType . string , allowed_values = creature_icons ),
]
)
Функция AddCreatureRelationship:
function_add_relationship = FunctionSpecSchema (
agent_name = relationship_agent_name ,
function_name = "AddCreatureRelationship" ,
description = "Adds a new relationship between two creatures" ,
parameters = [
ParameterSpec (
name = "from_name" , type = ParameterType . string
),
ParameterSpec (
name = "to_name" , type = ParameterType . string
),
ParameterSpec (
name = "relationship_name" ,
type = ParameterType . string ,
allowed_values = [ "eats" , "buys" , "feeds" , "sells" ],
),
],
)
Агент Creature Creator определяется декларативно в терминах:
Агенты могут сотрудничать и обмениваться информацией косвенно, повторно используя одни и те же определения функций через доску.
def build_creature_agent ():
agent_definition = FunctionAgentDefinition (
agent_name = "Creature Creator" ,
description = "Creates new creatures given the user prompt. Ensures that ALL creatures mentioned by the user are created." ,
accepted_functions = [ function_add_creature , function_add_relationship ],
input_schema = FunctionAgentInputSchema ,
initial_input = FunctionAgentInputSchema (
functions_allowed_to_generate = [ function_add_creature ],
previously_generated_functions = []
),
output_schema = FunctionAgentOutputSchema ,
topics = [ "creature" ]
)
return agent_definition
Примечания об агенте Creature Creator:
function_add_relationship
. Более подробную информацию смотрите в примере исходного кода. Это демо-версия конструктора мира Sim Life. Он использует 3 агента (Существо, Создатель растительности, Создатель отношений) для обработки запросов пользователя. Агенты определяются декларативно в терминах входной схемы GraphQL и допускают генерируемые мутации. Результатом является серия мутаций GraphQL, которые клиент может выполнить для создания мира Sim Life.
Схема GraphQL:
type Creature {
id : ID !
creature_name : String !
allowed_terrain : TerrainType !
age : Int !
icon_name : IconType !
}
type Vegetation {
id : ID !
vegetation_name : String !
icon_name : IconType !
allowed_terrain : TerrainType !
}
type Relationship {
id : ID !
from_name : String !
to_name : String !
relationship_kind : RelationshipType !
}
...
Мутации GraphQL, которые мы хотим, чтобы агенты генерировали, различны для каждого агента:
Агент Создателя Существ:
type Mutation {
addCreature ( input : CreatureInput ! ): Creature !
}
input CreatureInput {
creature_name : String !
allowed_terrain : TerrainType !
age : Int !
icon_name : IconType !
}
Агент Vegetation Creator:
type Mutation {
addVegetation ( input : VegetationInput ! ): Vegetation !
}
input VegetationInput {
vegetation_name : String !
icon_name : IconType !
allowed_terrain : TerrainType !
}
Агент Creature Creator определяется декларативно в терминах:
По сути, агент представляет собой комбинацию схем ввода и вывода вместе с подсказкой.
Агенты сотрудничают и обмениваются информацией косвенно через доску, повторно используя одни и те же схемы GraphQL и вызовы мутаций.
creatures_graphql = _read_schema ( "creature.graphql" )
creature_mutations_graphql = _read_schema ( "creature.mutations.graphql" )
def build_creature_agent ():
agent_definition = GraphQLAgentDefinition (
agent_name = "Creature Creator" ,
description = "Creates new creatures given the user prompt. Ensures that ALL creatures mentioned by the user are created." ,
accepted_graphql_schemas = [ creatures_graphql , creature_mutations_graphql ],
input_schema = GraphQLAgentInputSchema ,
initial_input = GraphQLAgentInputSchema (
mutations_allowed_to_generate = [ creature_mutations_graphql ],
previously_generated_mutations = []
),
output_schema = GraphQLAgentOutputSchema ,
topics = [ "creature" ]
)
return agent_definition
Примечания об этом агенте:
creature_mutations_graphql
из файла «creature.mutations.graphql».creature_mutations_graphql
).creatures_graphql
из файла «creature.graphql».Агентов можно использовать вместе для создания чат-бота:
from gpt_multi_atomic_agents import functions_expert_service , config
from . import agents
def run_chat_loop ( given_user_prompt : str | None = None ) -> list :
CHAT_AGENT_DESCRIPTION = "Handles users questions about an ecosystem game like Sim Life"
agent_definitions = [
build_creature_agent (), build_relationship_agent (), build_vegatation_agent () # for more capabilities, add more agents here
]
_config = config . Config (
ai_platform = config . AI_PLATFORM_Enum . bedrock_anthropic ,
model = config . ANTHROPIC_MODEL ,
max_tokens = config . ANTHROPIC_MAX_TOKENS ,
is_debug = False
)
return functions_expert_service . run_chat_loop ( agent_definitions = agent_definitions , chat_agent_description = CHAT_AGENT_DESCRIPTION , _config = _config , given_user_prompt = given_user_prompt )
примечание: если
given_user_prompt
не установлено, тоrun_chat_loop()
будет ждать ввода пользователя с клавиатуры.
Более подробную информацию смотрите в примере исходного кода.
ПОЛЬЗОВАТЕЛЬСКИЙ ВВОД:
Add a sheep that eats grass
ВЫХОД:
Generated 3 function calls
[Agent: Creature Creator] AddCreature( creature_name=sheep, icon_name=sheep-icon, land_type=prairie, age=1 )
[Agent: Plant Creator] AddPlant( plant_name=grass, icon_name=grass-icon, land_type=prairie )
[Agent: Relationship Creator] AddCreatureRelationship( from_name=sheep, to_name=grass, relationship_name=eats )
Поскольку платформа имеет динамический маршрутизатор, она может обрабатывать более сложные «составные» запросы, такие как:
Добавьте корову, которая ест траву. Добавьте человека – корова человека кормит. Добавьте и инопланетянина, пожирающего человека. Человек тоже ест коров.
Маршрутизатор определяет, какие агенты использовать, в каком порядке их запускать и какое приглашение отправлять каждому агенту.
При необходимости маршрутизатор может быть повторно запущен с учетом отзывов пользователей о созданном им плане перед фактическим выполнением агентов.
Затем рекомендованные агенты выполняются по порядку, а их результаты накапливаются на общей доске.
Наконец, платформа объединяет полученные вызовы и возвращает их клиенту.
ПОЛЬЗОВАТЕЛЬСКИЙ ВВОД:
Add a sheep that eats grass
ВЫХОД:
['mutation {n addCreature(input: {n creature_name: "sheep",n allowed_terrain: GRASSLAND,n age: 2,n icon_name: SHEEPn }) {n creature_namen allowed_terrainn agen icon_namen }n }']
['mutation {', ' addVegetation(input: {', ' vegetation_name: "Grass",', ' icon_name: GRASS,', ' allowed_terrain: LAND', ' }) {', ' vegetation_name', ' icon_name', ' allowed_terrain', ' }', '}']
['mutation {', ' addCreatureRelationship(input: {', ' from_name: "Sheep",', ' to_name: "Grass",', ' relationship_kind: EATS', ' }) {', ' id', ' }', '}']
Установите Python 3.11 и поэзию
Установите зависимости.
poetry install
Для ОпенАИ:
export OPENAI_API_KEY="xxx"
Добавьте это в сценарий инициализации оболочки ( ~/.zprofile
или аналогичный)
Загрузка в текущий терминал:
source ~/.zprofile
Тестовый скрипт:
./test.sh
Более подробную информацию смотрите в примере исходного кода.