[Important]
تمت مراجعة الصفحة الرئيسية الصينية لإطار تطوير Agently AI، وتم تحديث المستندات التعليمية الجديدة لتبديل النماذج وAgenticRequest وWorkflow بالكامل، يرجى زيارة: Agently.cn للعرض
[Important]
سنقوم بإعادة كتابة صفحة الريبو الرئيسية قريبًا لنخبرك بالمزيد عن عملنا الأخير، يرجى الانتظار.
[Showcase Repo] جامع الأخبار اليومية: الإنجليزية | مشروع مولد تقرير ملخص الأخبار مفتوح المصدر
[hot]
النسخة الصينية من وثيقة التطوير من المستوى الضحل إلى العمق: انقر هنا للوصول إلى مهارات تطوير تطبيقات ماجستير إدارة الأعمال المعقدة وفتحها خطوة بخطوة
كيفية الاستخدام:
pip install -U Agently
الأفكار / تقرير الأخطاء: الإبلاغ عن المشكلات هنا
راسلنا عبر البريد الإلكتروني:[email protected]
مجموعة الديسكورد :
انقر هنا للانضمام أو مسح رمز الاستجابة السريعة أدناه
مجموعة WeChat (انضم إلى مجموعة WeChat):
انقر هنا للتقديم أو مسح رمز الاستجابة السريعة بالأسفل
إذا أعجبك هذا المشروع، من فضلك ️، شكرًا.
وثائق كولاب:
أمثلة على التعليمات البرمجية:
لبناء وكيل في العديد من المجالات المختلفة:
أو، لاستدعاء قدرات مثيل الوكيل في منطق التعليمات البرمجية للمساعدة:
اكتشف المزيد: قم بزيارة ساحة العرض التوضيحي
تثبيت حزمة وكيل بايثون:
pip install -U Agently
ثم نحن على استعداد للذهاب!
Agently هو إطار عمل تطويري يساعد المطورين على إنشاء تطبيق أصلي لوكيل الذكاء الاصطناعي بسرعة كبيرة.
يمكنك استخدام وبناء وكيل الذكاء الاصطناعي في التعليمات البرمجية الخاصة بك بطريقة بسيطة للغاية.
يمكنك إنشاء مثيل وكيل AI ثم التفاعل معه مثل استدعاء وظيفة في عدد قليل جدًا من الرموز مثل هذا أدناه.
انقر فوق زر التشغيل أدناه وشاهد السحر الأمر بهذه البساطة:
# Import and Init Settings
import Agently
agent = Agently . create_agent ()
agent
. set_settings ( "current_model" , "OpenAI" )
. set_settings ( "model.OpenAI.auth" , { "api_key" : "" })
# Interact with the agent instance like calling a function
result = agent
. input ( "Give me 3 words" )
. output ([( "String" , "one word" )])
. start ()
print ( result )
['apple', 'banana', 'carrot']
وقد تلاحظ أنه عندما نطبع قيمة result
، تكون القيمة عبارة عن list
تمامًا مثل تنسيق المعلمة الذي نضعه في .output()
.
في إطار عمل Agently، قمنا بالكثير من العمل مثل هذا لتسهيل الأمر على مطوري التطبيقات لدمج مثيلات Agent في كود أعمالهم، وهذا سيسمح لمطوري التطبيقات بالتركيز على كيفية بناء منطق أعمالهم بدلاً من معرفة كيفية تلبية احتياجاتهم لنماذج اللغة أو كيفية الحفاظ على رضا النماذج.
عندما نبدأ في استخدام وكيل الذكاء الاصطناعي في التعليمات البرمجية لمساعدتنا في التعامل مع منطق الأعمال، يمكننا أن نشعر بسهولة أنه يجب أن يكون هناك بعض الاختلافات عن طريقة تطوير البرامج التقليدية، ولكن ما هي الاختلافات بالضبط؟
أعتقد أن النقطة الأساسية هي استخدام وكيل الذكاء الاصطناعي لحل المشكلة بدلاً من منطق الكود الذي من صنع الإنسان.
في التطبيق الأصلي لوكيل الذكاء الاصطناعي، نضع مثيل وكيل الذكاء الاصطناعي في الكود الخاص بنا، ثم نطلب منه تنفيذ/حل المشكلة باستخدام اللغة الطبيعية أو التعبيرات المشابهة للغة الطبيعية.
تحل "اسأل واحصل على استجابة" محل "تحديد المشكلة - البرنامج - الكود لتحقيقها" التقليدي.
هل يمكن أن يكون ذلك صحيحا وسهلا كما نقول؟
بالتأكيد! يوفر إطار عمل الوكيل طريقة سهلة للتفاعل مع مثيل وكيل الذكاء الاصطناعي مما يجعل تطوير وحدة التطبيق سريعًا وسهلاً.
يوجد أدناه عرضان تجريبيان لتطبيق CLI في مجالين مختلفين تمامًا ولكن كلاهما تم إنشاؤه بواسطة 64 سطرًا من الأكواد المدعومة بواسطة Agently.
فيديو تجريبي
شفرة
import Agently
agent_factory = Agently . AgentFactory ( is_debug = False )
agent_factory
. set_settings ( "current_model" , "OpenAI" )
. set_settings ( "model.OpenAI.auth" , { "api_key" : "" })
agent = agent_factory . create_agent ()
meta_data = {
"table_meta" : [
{
"table_name" : "user" ,
"columns" : [
{ "column_name" : "user_id" , "desc" : "identity of user" , "value type" : "Number" },
{ "column_name" : "gender" , "desc" : "gender of user" , "value type" : [ "male" , "female" ] },
{ "column_name" : "age" , "desc" : "age of user" , "value type" : "Number" },
{ "column_name" : "customer_level" , "desc" : "level of customer account" , "value type" : [ 1 , 2 , 3 , 4 , 5 ] },
]
},
{
"table_name" : "order" ,
"columns" : [
{ "column_name" : "order_id" , "desc" : "identity of order" , "value type" : "Number" },
{ "column_name" : "customer_user_id" , "desc" : "identity of customer, same value as user_id" , "value type" : "Number" },
{ "column_name" : "item_name" , "desc" : "item name of this order" , "value type" : "String" },
{ "column_name" : "item_number" , "desc" : "how many items to buy in this order" , "value type" : "Number" },
{ "column_name" : "price" , "desc" : "how much of each item" , "value type" : "Number" },
{ "column_name" : "date" , "desc" : "what date did this order happend" , "value type" : "Date" },
]
},
]
}
is_finish = False
while not is_finish :
question = input ( "What do you want to know: " )
show_thinking = None
while str ( show_thinking ). lower () not in ( "y" , "n" ):
show_thinking = input ( "Do you want to observe the thinking process? [Y/N]: " )
show_thinking = False if show_thinking . lower () == "n" else True
print ( "[Generating...]" )
result = agent
. input ({
"table_meta" : meta_data [ "table_meta" ],
"question" : question
})
. instruct ([
"output SQL to query the database according meta data:{table_meta} that can anwser the question:{question}" ,
"output language: English" ,
])
. output ({
"thinkings" : [ "String" , "Your problem solving thinking step by step" ],
"SQL" : ( "String" , "final SQL only" ),
})
. start ()
if show_thinking :
thinking_process = " n " . join ( result [ "thinkings" ])
print ( "[Thinking Process] n " , thinking_process )
print ( "[SQL] n " , result [ "SQL" ])
while str ( is_finish ). lower () not in ( "y" , "n" ):
is_finish = input ( "Do you want to quit?[Y to quit / N to continue]: " )
is_finish = False if is_finish . lower () == "n" else True
import Agently
agent_factory = Agently . AgentFactory ( is_debug = False )
agent_factory
. set_settings ( "current_model" , "OpenAI" )
. set_settings ( "model.OpenAI.auth" , { "api_key" : "" })
writer_agent = agent_factory . create_agent ()
roleplay_agent = agent_factory . create_agent ()
# Create Character
character_desc = input ( "Describe the character you want to talk to with a few words: " )
is_accepted = ""
suggestions = ""
last_time_character_setting = {}
while is_accepted . lower () != "y" :
is_accepted = ""
input_dict = { "character_desc" : character_desc }
if suggestions != "" :
input_dict . update ({ "suggestions" : suggestions })
input_dict . update ({ "last_time_character_setting" : last_time_character_setting })
setting_result = writer_agent
. input ( input_dict )
. instruct ([
"Design a character based on {input.character_desc}." ,
"if {input.suggestions} exist, rewrite {input.last_time_character_setting} followed {input.suggestions}."
])
. output ({
"name" : ( "String" ,),
"age" : ( "Number" ,),
"character" : ( "String" , "Descriptions about the role of this character, the actions he/she likes to take, his/her behaviour habbits, etc." ),
"belief" : ( "String" , "Belief or mottos of this character" ),
"background_story" : [( "String" , "one part of background story of this character" )],
"response_examples" : [{ "Question" : ( "String" , "question that user may ask this character" ), "Response" : ( "String" , "short and quick response that this character will say." ) }],
})
. on_delta ( lambda data : print ( data , end = "" ))
. start ()
while is_accepted . lower () not in ( "y" , "n" ):
is_accepted = input ( "Are you satisfied with this character role setting? [Y/N]: " )
if is_accepted . lower () == "n" :
suggestions = input ( "Do you have some suggestions about this setting? (leave this empty will redo all the setting): " )
if suggestions != "" :
last_time_character_settings = setting_result
print ( "[Start Loading Character Setting to Agent...]" )
# Load Character to Agent then Chat with It
for key , value in setting_result . items ():
roleplay_agent . set_role ( key , value )
print ( "[Loading is Done. Let's Start Chatting](input '#exit' to quit)" )
roleplay_agent . active_session ()
chat_input = ""
while True :
chat_input = input ( "YOU: " )
if chat_input == "#exit" :
break
print ( f" { setting_result [ 'name' ] } : " , end = "" )
roleplay_agent
. input ( chat_input )
. instruct ( "Response {chat_input} follow your {ROLE} settings. Response like in a CHAT not a query or request!" )
. on_delta ( lambda data : print ( data , end = "" ))
. start ()
print ( "" )
print ( "Bye~" )
أعطى المنشور الخاص بالوكلاء المستقلين الذين يدعمون LLM بواسطة Lilian Weng من OpenAI مفهومًا جيدًا حقًا للبنية الأساسية لوكيل الذكاء الاصطناعي لكن المنشور لم يقدم شرحًا حول كيفية بناء وكيل الذكاء الاصطناعي.
تقدم بعض المشاريع الرائعة مثل LangChain وCamel-AI أفكارها حول كيفية بناء وكيل الذكاء الاصطناعي. في هذه المشاريع، يتم تصنيف الوكلاء إلى العديد من الأنواع المختلفة وفقًا لمهمة الوكيل أو عملية التفكير الخاصة بالوكيل.
ولكن إذا اتبعنا هذه الأفكار لبناء وكلاء، فهذا يعني أنه يجب علينا بناء وكيل جديد تمامًا إذا أردنا أن يكون لدينا وكيل جديد للعمل في مجال مختلف، على الرغم من أن جميع المشاريع توفر فئة ChatAgent الأساسية أو شيء من هذا القبيل سيتم إنشاء فئات فرعية جديدة للوكلاء وسيتم إنتاج المزيد والمزيد من أنواع الوكلاء مع زيادة عدد أنواع الوكلاء، يومًا ما، سيكون هناك عدد كبير جدًا من أنواع الوكلاء ليختارها المطور ومنصة الوكلاء سيكون من الصعب البحث عنهم للاختيار، من الصعب إدارتها ومن الصعب تحديثها.
لذلك لا يستطيع فريق Agently التوقف عن التساؤل عما إذا كانت هناك طريقة أفضل لتعزيز الوكيل وتسهيل مشاركة جميع المطورين فيها.
أيضًا، يبدو هيكل وكيل الذكاء الاصطناعي ومكوناته بسيطًا وسهل البناء في الوقت الحاضر، ولكن إذا نظرنا إلى المستقبل، فسيكون كل مكون أكثر تعقيدًا (إدارة الذاكرة على سبيل المثال) وسيتم إضافة المزيد والمزيد من المكونات الجديدة (أجهزة الاستشعار على سبيل المثال). .
ماذا لو توقفنا عن بناء الوكيل مثل كل غير مقسم ولكن قمنا بفصله في بنية مركزية تدير بيانات سياق وقت التشغيل وعملية وقت التشغيل وتتصل بمكونات إضافية مختلفة لتعزيز قدراتها في عملية وقت التشغيل لجعلها مناسبة لسيناريوهات الاستخدام المختلفة؟ "فرق تسد" كما قال الشعار الهندسي الشهير.
لقد حققنا ذلك في Agently 3.0 وعندما خضع Agently 3.0 لاختبار ألفا، كنا سعداء برؤية تصميم المكون الإضافي هذا لا يحل مشكلة إعادة بناء وكيل جديد تمامًا فحسب، بل ساعد أيضًا كل مطوري المكونات في التركيز على الهدف والأسئلة التي يهتم بها هذا المكون فقط دون تشتيت الانتباه، وهذا يجعل تطوير المكون الإضافي أمرًا سهلاً حقًا وبسيطًا.
فيما يلي مثال يوضح كيفية تطوير مكون إضافي لمكون الوكيل في إطار عمل Agently، نظرًا لأن إطار العمل قد تم تنفيذه في سياق إدارة بيانات وقت التشغيل، يمكن لمطوري المكونات الإضافية استخدام العديد من أدوات وقت التشغيل للمساعدة في إنشاء المكون الإضافي لمكون الوكيل من السهل جدا.
️ : الكود أدناه هو مثال لرمز البرنامج الإضافي، وهو يعمل في إطار العمل ولا يمكن تشغيله بشكل منفصل.
from . utils import ComponentABC
from Agently . utils import RuntimeCtxNamespace
# Create Plugin Class comply with Abstract Basic Class
class Role ( ComponentABC ):
def __init__ ( self , agent : object ):
self . agent = agent
# Framework pass runtime_ctx and storage through and component can use them
self . role_runtime_ctx = RuntimeCtxNamespace ( "role" , self . agent . agent_runtime_ctx )
self . role_storage = self . agent . global_storage . table ( "role" )
# Defined methods of this component
# Update runtime_ctx which follow the agent instance lifetime circle
def set_name ( self , name : str , * , target : str ):
self . role_runtime_ctx . set ( "NAME" , name )
return self . agent
def set ( self , key : any , value : any = None , * , target : str ):
if value is not None :
self . role_runtime_ctx . set ( key , value )
else :
self . role_runtime_ctx . set ( "DESC" , key )
return self . agent
def update ( self , key : any , value : any = None , * , target : str ):
if value is not None :
self . role_runtime_ctx . update ( key , value )
else :
self . role_runtime_ctx . update ( "DESC" , key )
return self . agent
def append ( self , key : any , value : any = None , * , target : str ):
if value is not None :
self . role_runtime_ctx . append ( key , value )
else :
self . role_runtime_ctx . append ( "DESC" , key )
return self . agent
def extend ( self , key : any , value : any = None , * , target : str ):
if value is not None :
self . role_runtime_ctx . extend ( key , value )
else :
self . role_runtime_ctx . extend ( "DESC" , key )
return self . agent
# Or save to / load from storage which keep the data in file storage or database
def save ( self , role_name : str = None ):
if role_name == None :
role_name = self . role_runtime_ctx . get ( "NAME" )
if role_name != None and role_name != "" :
self . role_storage
. set ( role_name , self . role_runtime_ctx . get ())
. save ()
return self . agent
else :
raise Exception ( "[Agent Component: Role] Role attr 'NAME' must be stated before save. Use .set_role_name() to specific that." )
def load ( self , role_name : str ):
role_data = self . role_storage . get ( role_name )
for key , value in role_data . items ():
self . role_runtime_ctx . update ( key , value )
return self . agent
# Pass the data to request standard slots on Prefix Stage
def _prefix ( self ):
return {
"role" : self . role_runtime_ctx . get (),
}
# Export component plugin interface to be called in agent runtime process
def export ( self ):
return {
"early" : None , # method to be called on Early Stage
"prefix" : self . _prefix , # method to be called on Prefix Stage
"suffix" : None , # mothod to be called on Suffix Stage
# Alias that application developers can use in agent instance
# Example:
# "alias": { "set_role_name": { "func": self.set_name } }
# => agent.set_role_name("Alice")
"alias" : {
"set_role_name" : { "func" : self . set_name },
"set_role" : { "func" : self . set },
"update_role" : { "func" : self . update },
"append_role" : { "func" : self . append },
"extend_role" : { "func" : self . extend },
"save_role" : { "func" : self . save },
"load_role" : { "func" : self . load },
},
}
# Export to Plugins Dir Auto Scaner
def export ():
return ( "Role" , Role )
يسمح Agently Framework أيضًا لمطوري المكونات الإضافية بحزم المكونات الإضافية الخاصة بهم خارج الحزمة الرئيسية لإطار العمل ومشاركة حزمة المكونات الإضافية الخاصة بهم بشكل فردي مع المطورين الآخرين، ويمكن للمطورين الذين يرغبون في استخدام مكون إضافي معين تنزيل حزمة المكونات الإضافية وفك ضغط الملفات في مجلد العمل الخاص بهم، ثم. تثبيت البرنامج المساعد بسهولة.
ستوضح هذه الرموز أدناه مدى سهولة هذا التثبيت.
️ : الكود أدناه هو مثال لتثبيت البرنامج المساعد، وهو يعمل فقط عندما تقوم بفك ضغط مجلد البرنامج المساعد في مجلد العمل الخاص بك.
import Agently
# Import install method from plugin folder
from session_plugin import install
# Then install
install ( Agently )
# That's all
# Now your agent can use new abilities enhanced by new plugin
إليك أيضًا حالة حقيقية عندما واجه Agently v3.0.1 مشكلة تجعل مكون الجلسة غير متاح. نستخدم تحديث حزمة البرنامج المساعد لإصلاح الخطأ دون تحديث حزمة إطار العمل بأكملها.
حسنًا، هذه هي المقدمة العامة حول إطار عمل تطوير وكيل Agently AI.
إذا كنت تريد التعمق أكثر، يمكنك أيضًا زيارة هذه المستندات/الروابط:
لا تنسى ️ هذا الريبو إذا أعجبك عملنا.
شكرا وترميز سعيد!