[Important]
การแก้ไขหน้าแรกภาษาจีนของกรอบการพัฒนา Agently AI เสร็จสมบูรณ์แล้ว และเอกสารบทช่วยสอนใหม่สำหรับการสลับโมเดล AgenticRequest และเวิร์กโฟลว์ได้รับการอัปเดตอย่างสมบูรณ์ โปรดไปที่: Agently.cn เพื่อดู
[Important]
เราจะเขียนหน้าแรก repo ใหม่เร็วๆ นี้เพื่อแจ้งให้คุณทราบเพิ่มเติมเกี่ยวกับงานล่าสุดของเรา โปรดรอสักครู่
[Showcase Repo] Agently Daily News Collector: อังกฤษ | . โครงการโอเพ่นซอร์สสรุปข่าว
[hot]
เอกสารการพัฒนาเวอร์ชันภาษาจีนตั้งแต่ตื้นไปจนถึงลึก: คลิกที่นี่เพื่อเข้าถึงและปลดล็อคทักษะการพัฒนาแอปพลิเคชัน LLM ที่ซับซ้อนทีละขั้นตอน
วิธีใช้:
pip install -U Agently
แนวคิด / รายงานข้อผิดพลาด: รายงานปัญหาที่นี่
? ส่งอีเมลถึงเรา: [email protected]
? กลุ่มความขัดแย้ง:
คลิกที่นี่เพื่อเข้าร่วมหรือสแกน QR Code ด้านล่าง
กลุ่ม WeChat (เข้าร่วมกลุ่ม WeChat):
คลิกที่นี่เพื่อสมัครหรือสแกน QR Code ด้านล่าง
หากคุณชอบโครงการนี้โปรด️ขอบคุณ
เอกสาร Colab:
ตัวอย่างรหัส:
หากต้องการสร้างตัวแทนในด้านต่างๆ มากมาย:
หรือเพื่อเรียกความสามารถของอินสแตนซ์เอเจนต์ในตรรกะโค้ดเพื่อช่วย:
สำรวจเพิ่มเติม: เยี่ยมชมสนามเด็กเล่นสาธิต
ติดตั้งแพ็คเกจ Agently Python:
pip install -U Agently
ถ้าอย่างนั้นเราก็พร้อมลุย!
Agently เป็นเฟรมเวิร์กการพัฒนาที่ช่วยให้นักพัฒนาสร้างแอปพลิเคชันแบบเนทีฟของตัวแทน AI ได้อย่างรวดเร็ว
คุณสามารถใช้และสร้างเอเจนต์ AI ในโค้ดของคุณได้ด้วยวิธีที่ง่ายมาก
คุณสามารถสร้างอินสแตนซ์เอเจนต์ 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 เข้ากับโค้ดธุรกิจของตนได้ง่ายขึ้น ซึ่งจะช่วยให้นักพัฒนาแอปพลิเคชันมุ่งเน้นไปที่วิธีสร้างตรรกะทางธุรกิจของตน แทนที่จะหาวิธีตอบสนอง กับโมเดลภาษาหรือวิธีทำให้โมเดลมีความพึงพอใจ
เมื่อเราเริ่มใช้เอเจนต์ AI ในโค้ดเพื่อช่วยเราจัดการตรรกะทางธุรกิจ เราจะรู้สึกได้อย่างง่ายดายว่าต้องมีความแตกต่างบางประการจากวิธีการพัฒนาซอฟต์แวร์แบบเดิม แต่อะไรคือความแตกต่างที่แท้จริง
ฉันคิดว่าประเด็นสำคัญคือการใช้ตัวแทน AI เพื่อแก้ไขปัญหาแทนตรรกะโค้ดที่มนุษย์สร้างขึ้น
ในแอปพลิเคชันเนทีฟของตัวแทน AI เราได้ใส่อินสแตนซ์ตัวแทน AI ไว้ในโค้ดของเรา จากนั้นเราจะขอให้ดำเนินการ / เพื่อแก้ไขปัญหาด้วยภาษาธรรมชาติหรือการแสดงออกที่เหมือนภาษาธรรมชาติ
"ถาม-รับคำตอบ" เกิดขึ้นจาก "กำหนดปัญหา - โปรแกรม - รหัสเพื่อให้เกิดขึ้น" แบบดั้งเดิม
นั่นจะเป็นจริงและง่ายอย่างที่เราพูดได้ไหม?
แน่นอน เฟรมเวิร์กของ Agently มอบวิธีที่ง่ายในการโต้ตอบกับอินสแตนซ์ของตัวแทน AI จะทำให้การพัฒนาโมดูลแอปพลิเคชันรวดเร็วและง่ายดาย
ด้านล่างนี้เป็นการสาธิตแอปพลิเคชัน 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 ได้ให้แนวคิดที่ดีเกี่ยวกับโครงสร้างพื้นฐานของตัวแทน AI แต่โพสต์ไม่ได้ให้คำอธิบายเกี่ยวกับวิธีการสร้างตัวแทน AI
โปรเจ็กต์ที่ยอดเยี่ยมบางโปรเจ็กต์อย่าง LangChain และ Camel-AI นำเสนอแนวคิดเกี่ยวกับวิธีสร้าง AI Agent ในโปรเจ็กต์เหล่านี้ Agent จะถูกแบ่งออกเป็นหลายประเภทตามงานของ Agent หรือกระบวนการคิดของ Agent
แต่ถ้าเราทำตามแนวคิดเหล่านี้เพื่อสร้างตัวแทน นั่นหมายความว่าเราจะต้องสร้างตัวแทนใหม่ทั้งหมดหากเราต้องการมีตัวแทนใหม่เพื่อทำงานในโดเมนอื่น แม้ว่าโครงการทั้งหมดจะมีคลาสพื้นฐานของ ChatAgent หรืออะไรทำนองนั้นก็ตาม คลาสย่อยของตัวแทนใหม่จะถูกสร้างขึ้นและจะมีการสร้างตัวแทนที่เฉพาะเจาะจงมากขึ้นเรื่อยๆ ด้วยจำนวนประเภทตัวแทนที่เพิ่มขึ้น วันหนึ่งจะมีตัวแทนหลายประเภทเกินกว่าที่นักพัฒนาจะเลือกและสำหรับแพลตฟอร์มตัวแทน ที่จะจัดการ พวกมันจะค้นหาได้ยาก ให้เลือก จัดการยาก และอัพเดตยาก
ทีมตัวแทนจึงไม่สามารถหยุดสงสัยได้ว่ามีวิธีที่ดีกว่าในการปรับปรุงตัวแทนและทำให้นักพัฒนาทั้งหมดเข้าร่วมได้ง่ายขึ้นหรือไม่
นอกจากนี้ โครงสร้างและส่วนประกอบของเอเจนต์ AI ดูเหมือนจะเรียบง่ายและง่ายต่อการสร้างในปัจจุบัน แต่หากเรามองไปข้างหน้า แต่ละส่วนประกอบจะซับซ้อนมากขึ้น (เช่น การจัดการหน่วยความจำ) และส่วนประกอบใหม่ๆ จะถูกเพิ่มเข้ามามากขึ้นเรื่อยๆ (เช่น เซ็นเซอร์) .
จะเกิดอะไรขึ้นถ้าเราหยุดสร้างเอเจนต์เหมือนกับส่วนที่ไม่มีการแบ่งแยก แต่เพื่อแยกมันออกเป็นโครงสร้างศูนย์กลางที่จัดการข้อมูลบริบทรันไทม์และกระบวนการรันไทม์ และเชื่อมต่อกับปลั๊กอินที่แตกต่างกันเพื่อเพิ่มความสามารถในกระบวนการรันไทม์เพื่อให้เหมาะสมกับสถานการณ์การใช้งานที่แตกต่างกัน “แบ่งแยกแล้วพิชิต” ดังคำขวัญทางวิศวกรรมชื่อดังที่ว่าไว้
เราทำให้มันเกิดขึ้นใน Agently 3.0 และเมื่อ Agently 3.0 ในการทดสอบอัลฟ่า เราดีใจที่ได้เห็นการออกแบบปลั๊กอินเพื่อปรับปรุงนี้ไม่เพียงแต่แก้ปัญหาเกี่ยวกับการสร้างตัวแทนใหม่ทั้งหมดเท่านั้น แต่ยังช่วยให้นักพัฒนาส่วนประกอบแต่ละรายมุ่งเน้นไปที่เป้าหมายด้วย และตั้งคำถามเฉพาะส่วนประกอบนั้นที่สนใจโดยไม่วอกแวก นั่นทำให้ปลั๊กอินส่วนประกอบพัฒนาง่ายมากและเขียนโค้ดได้ง่าย
นี่คือตัวอย่างที่แสดงวิธีการพัฒนาปลั๊กอินส่วนประกอบตัวแทนในกรอบงานตัวแทน เนื่องจากงานการจัดการข้อมูลบริบทรันไทม์ได้ดำเนินการโดยเฟรมเวิร์ก นักพัฒนาปลั๊กอินจึงสามารถใช้เครื่องมือรันไทม์จำนวนมากเพื่อช่วยสร้างปลั๊กอินส่วนประกอบตัวแทนที่ทำให้ทำงานได้ ค่อนข้างง่าย
: โค้ดด้านล่างเป็นตัวอย่างโค้ดปลั๊กอิน ซึ่งทำงานในกรอบงานและไม่สามารถรันแยกกันได้
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 )
เฟรมเวิร์กของ Agent ยังอนุญาตให้นักพัฒนาปลั๊กอินแพ็คปลั๊กอินของตนนอกแพ็คเกจหลักของเฟรมเวิร์ก และแบ่งปันแพ็คเกจปลั๊กอินของตนกับนักพัฒนารายอื่นทีละรายการ นักพัฒนาที่ต้องการใช้ปลั๊กอินเฉพาะสามารถดาวน์โหลดแพ็คเกจปลั๊กอิน จากนั้นแตกไฟล์ลงในโฟลเดอร์การทำงานของตน ติดตั้งปลั๊กอินได้อย่างง่ายดาย
รหัสเหล่านี้ด้านล่างจะแสดงให้เห็นว่าการติดตั้งนี้ทำได้ง่ายเพียงใด
: โค้ดด้านล่างเป็นตัวอย่างการติดตั้งปลั๊กอิน ซึ่งจะใช้ได้เฉพาะเมื่อคุณแตกโฟลเดอร์ปลั๊กอินในโฟลเดอร์การทำงานของคุณเท่านั้น
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
หากคุณต้องการเจาะลึกยิ่งขึ้น คุณสามารถไปที่เอกสาร/ลิงก์เหล่านี้:
อย่าลืม ️ repo นี้ ถ้าคุณชอบงานของเรา
ขอขอบคุณและขอให้มีความสุขกับการเขียนโค้ด!