إطار عمل ديناميكي بسيط متعدد الوكلاء يعتمد على الوكلاء الذريين والمعلم. يستخدم قوة Pydantic للتحقق من صحة البيانات والمخطط والتسلسل.
إنشاء وكلاء مكونين من موجه النظام، مع لغة مشتركة إما لاستدعاءات الوظائف أو طفرات GraphQL
يستخدم جهاز التوجيه LLM لمعالجة مطالبات المستخدم "المركبة" المعقدة، وتوجيهها تلقائيًا إلى أفضل تسلسل لوكلاءك
يتم الإنشاء عبر OpenAI أو AWS Bedrock أو groq
ملاحظة: !! framework is at an early stage !!
- ستتم الإشارة إلى التغييرات العاجلة من خلال زيادة الإصدار الثانوي (الرئيسي لا يزال عند الصفر).
إطار عمل الوكلاء القائم على LLM باستخدام نهج البرمجة الموجهة للوكيل لتنسيق الوكلاء باستخدام لغة مشتركة.
يمكن أن تعتمد لغة الوكيل على استدعاء الوظائف أو على GraphQL .
يعتبر إطار العمل عامًا ويسمح بتعريف الوكلاء من حيث الاسم والوصف ومكالمات الإدخال المقبولة ومكالمات الإخراج المسموح بها.
يتواصل الوكلاء بشكل غير مباشر باستخدام السبورة. تتكون اللغة من استدعاءات (Function أو GraphQL): يحدد كل وكيل ما يفهمه كمدخل، وما يستدعيه قادر على توليده. بهذه الطريقة، يمكن للوكلاء فهم مخرجات بعضهم البعض.
يأخذ جهاز التوجيه مطالبة المستخدم ويقوم بإنشاء خطة تنفيذ الوكيل.
تستخدم خطة التنفيذ أفضل تسلسل للوكلاء الأكثر ملاءمة للتعامل مع مطالبة المستخدم.
يقوم جهاز التوجيه بإعادة كتابة مطالبة المستخدم لتناسب كل وكيل، مما يؤدي إلى تحسين الجودة وتجنب المخرجات غير المرغوب فيها.
ملاحظة: بشكل اختياري، يمكن تشغيل جهاز التوجيه بشكل منفصل، مما يسمح بتعليقات الإنسان في الحلقة حول خطة التنفيذ التي أنشأها جهاز التوجيه. بهذه الطريقة، يمكن للمستخدم التعاون بشكل أكبر مع جهاز التوجيه، قبل أن يتم تنفيذ الوكلاء المولدين فعليًا.
وأخيرًا، يتم إرجاع المخرجات في شكل قائمة مرتبة من استدعاءات (Function أو 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 !
}
وكيل صانع الغطاء النباتي:
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', ' }', '}']
تثبيت بايثون 3.11 والشعر
تثبيت التبعيات.
poetry install
بالنسبة لـ OpenAI:
export OPENAI_API_KEY="xxx"
أضف ذلك إلى البرنامج النصي لتهيئة Shell ( ~/.zprofile
أو ما شابه)
تحميل في المحطة الحالية:
source ~/.zprofile
البرنامج النصي للاختبار:
./test.sh
راجع مثال التعليمات البرمجية المصدر لمزيد من التفاصيل.