[Important]
Домашняя страница платформы разработки Agently AI на китайском языке была пересмотрена, а новые учебные документы по переключению моделей, AgenticRequest и Workflow были полностью обновлены. Для просмотра посетите сайт Agently.cn.
[Important]
Скоро мы перепишем домашнюю страницу репозитория, чтобы рассказать вам больше о нашей недавней работе, пожалуйста, подождите.
[Репозиторий витрины]Agently Daily News Collector: English | Генератор сводных отчетов о новостях, проект с открытым исходным кодом
[hot]
Китайская версия документа по разработке от более мелкого к более глубокому: нажмите здесь, чтобы получить доступ и шаг за шагом разблокировать сложные навыки разработки приложений LLM.
Как использовать:
pip install -U Agently
?Идеи/Отчет об ошибках: сообщайте о проблемах здесь
? Напишите нам: [email protected]
? Группа Дискорда:
Нажмите здесь, чтобы присоединиться, или отсканируйте QR-код ниже.
WeChat Group (присоединитесь к группе WeChat):
Нажмите здесь, чтобы подать заявку, или отсканируйте QR-код ниже.
Если вам понравился этот проект, пожалуйста, ️, спасибо.
Документы Колаба:
Примеры кода:
Чтобы создать агента в самых разных областях:
Или, чтобы вызвать возможности экземпляра агента в логике кода, чтобы помочь:
Узнайте больше: посетите демонстрационную площадку
Установите пакет Agently Python:
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 мы проделали большую подобную работу, чтобы разработчикам приложений было проще интегрировать экземпляры агента в свой бизнес-код. Это позволит разработчикам приложений сосредоточиться на построении своей бизнес-логики, а не на том, как ее обслуживать. к языковым моделям или как обеспечить удовлетворенность моделей.
Когда мы начинаем использовать ИИ-агент в коде, чтобы помочь нам обрабатывать бизнес-логику, мы легко можем почувствовать, что должны быть некоторые отличия от традиционного способа разработки программного обеспечения. Но в чем именно эти различия?
Я думаю, что ключевым моментом является использование ИИ-агента для решения проблемы вместо логики искусственного кода.
В собственном приложении агента ИИ мы помещаем экземпляр агента ИИ в наш код, а затем просим его выполнить/решить проблему с использованием естественного языка или выражений, подобных естественному языку.
«Спроси-получи ответ» заменяет традиционное «Определи проблему — программу — код, чтобы это произошло».
Может ли это быть правдой и так просто, как мы говорим?
Конечно! Платформа 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~" )
Сообщение Лилиан Венг из OpenAI об автономных агентах на базе LLM дало действительно хорошее представление о базовой структуре агента ИИ, но в этом сообщении не было объяснено, как создать агент ИИ.
Некоторые замечательные проекты, такие как 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 также позволяет разработчикам плагинов упаковывать свои плагины за пределы основного пакета платформы и индивидуально делиться своим пакетом плагинов с другими разработчиками. Разработчики, которые хотят использовать конкретный плагин, могут просто загрузить пакет плагина, распаковать файлы в свою рабочую папку, а затем. установить плагин легко.
Эти коды ниже покажут, насколько простой может быть установка.
️ : Код ниже представляет собой пример установки плагина. Он работает только тогда, когда вы распаковываете папку плагина в свою рабочую папку.
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.
Если вы хотите погрузиться глубже, вы также можете посетить эти документы/ссылки:
Не забудьте ️ этот репозиторий, если вам нравится наша работа.
Спасибо и удачного кодирования!