[Important]
Agently AI 開発フレームワークの中国語ホームページが改訂され、モデル切り替え、AgenticRequest、およびワークフローに関する新しいチュートリアル ドキュメントが完全に更新されました。参照するには、Agently.cn にアクセスしてください。
[Important]
最近の取り組みについて詳しくお知らせするために、近々リポジトリのホームページを書き換えます。お待ちください。
[ショーケース リポ]Agently Daily News Collector: 英語 | ニュース概要レポート ジェネレーター オープンソース プロジェクト
[hot]
浅いところから深いところまでの開発ドキュメントの中国語版: ここをクリックすると、複雑な LLM アプリケーション開発スキルに段階的にアクセスしてロックを解除できます
使用方法:
pip install -U Agently
アイデア / バグレポート: ここで問題を報告してください
メールでご連絡ください:[email protected]
ディスコードグループ:
ここをクリックして参加するか、下の QR コードをスキャンしてください
WeChat グループ (WeChat グループに参加):
ここをクリックして申請するか、下のQRコードをスキャンしてください
このプロジェクトが気に入っていただけましたら、ぜひ ️、よろしくお願いします。
コラボドキュメント:
コード例:
さまざまなフィールドでエージェントを構築するには:
または、コード ロジックでエージェント インスタンスの機能を呼び出して支援します。
さらに詳しく: デモプレイグラウンドにアクセスしてください
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
の値を出力すると、その値は.output()
に入力したパラメータの形式とまったく同じlist
であることに気づくかもしれません。
Agently フレームワークでは、アプリケーション開発者がエージェント インスタンスをビジネス コードに簡単に統合できるように、このような多くの作業を行ってきました。これにより、アプリケーション開発者は、対応方法を考えるのではなく、ビジネス ロジックを構築する方法に集中できるようになります。言語モデルやモデルを満足させる方法について。
ビジネス ロジックの処理を支援するためにコード内で AI エージェントを使用し始めると、従来のソフトウェア開発方法といくつかの違いがあることに簡単に気づくことができます。しかし、その違いは正確には何でしょうか?
重要な点は、人が作ったコードロジックではなく、AI エージェントを使用して問題を解決することだと思います。
AI エージェント ネイティブ アプリケーションでは、AI エージェント インスタンスをコードに組み込み、自然言語または自然言語に似た表現を使用して問題を実行/解決するように依頼します。
「Ask-Get Response」は、従来の「問題の定義 - プログラム - それを実現するためのコード」に代わるものです。
それは真実であり、私たちが言うほど簡単でしょうか?
確かに、Agently フレームワークは AI エージェント インスタンスと対話するための簡単な方法を提供し、アプリケーション モジュールの開発を迅速かつ簡単にします。
以下に 2 つの CLI アプリケーションのデモを示します。これらは 2 つのまったく異なるドメインにありますが、両方とも Agently を利用した 64 行のコードによって構築されています。
デモビデオ
コード
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 の Lilian Weng による LLM Powered Autonomous Agents に関する投稿では、AI エージェントの基本構造について非常に優れた概念が示されていますが、この投稿では AI エージェントの構築方法については説明されていませんでした。
LangChain や Camel-AI などのいくつかの素晴らしいプロジェクトでは、AI エージェントの構築方法に関するアイデアが提示されています。これらのプロジェクトでは、エージェントは、エージェントのタスクまたはエージェントの思考プロセスに応じてさまざまなタイプに分類されます。
しかし、これらの考え方に従ってエージェントを構築すると、すべてのプロジェクトが ChatAgent 基本クラスなどを提供しているにもかかわらず、新しいエージェントを別のドメインで動作させたい場合は、まったく新しいエージェントを構築する必要があることになります。新しいエージェントのサブクラスが構築され、より多くの特定のタイプのエージェントが生成されるようになり、エージェントのタイプの数が増加し、開発者やエージェント プラットフォームの種類が多すぎて選択できない日が来るでしょう。管理するのは難しいでしょう。選択するのは難しく、管理も更新も困難です。
そのため、Agently チームは、エージェントを強化し、すべての開発者が参加しやすくするためのより良い方法はないかと考えずにはいられません。
また、現時点では AI エージェントの構造とコンポーネントはシンプルで構築しやすいように見えますが、さらに先を見据えると、各コンポーネントはより複雑になり (たとえばメモリ管理)、さらに多くの新しいコンポーネントが追加されるでしょう (たとえばセンサー)。 。
エージェントを分割されていない全体のように構築するのをやめて、ランタイム コンテキスト データとランタイム プロセスを管理するセンター構造に分離し、さまざまなプラグインと接続してランタイム プロセスの機能を強化して、さまざまな使用シナリオに適したものにしたらどうなるでしょうか?エンジニアリングの有名なモットーにあるように、「分割して征服せよ」。
私たちはそれを 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 エージェント開発フレームワークについての概要です。
さらに詳しく知りたい場合は、次のドキュメント/リンクにアクセスすることもできます。
私たちの作品が気に入ったら、このレポを忘れないでください。
ありがとう、コーディングを楽しんでください!