Logo Ernie.SG
Fork Work:自律エージェントがあるのになぜ働く?

Fork Work:自律エージェントがあるのになぜ働く?

2023年8月11日
約3分で読めます
利用できるタグはありません
Table of Contents

苛立ってキーボードを叩いたり、引き継いだコードベースを前に少し涙を流したりするより、その情報を A.I. に渡して会話するほうがずっと理にかなっている。大規模言語モデル (LLMs) の知識と推論能力をそうした情報に対して使い始めると、自然な次の段階は統合になる。既存のコードベースの上で動く新しいコードを生成し、世界中の誰もがプロンプトから機能へ進めるようにすることだ。この課題に取り組むため、下のデモは週末の 1、2 日で作った成果である。新しい学びが多く、いくつもの概念をより深く理解できたので、作るのはかなり楽しかった。

Arthur - Search and Retrieve Anything

なぜ働くの、leh?

私がやろうとしたのは、自分のデータファクトリに関する情報を Deep Lake ベクトルストアに渡し、カスタム知識ストアの上で ChatGPT の推論能力を使って、既存の構成で何が起きているのか理解することだった。人間が残したレガシーコードベースを読み解こうとするより、ずっと楽しかった。コミュニケーションや会議が大きな時間の無駄だったことは十分すぎるほどあったし、返事の遅さ、質問に対する人間側のラグにはもう言葉がない……だから、こうして始める。一つ目のレンガを置けば、あらゆる情報を調査し、探し出し、推論し、ソーシャルメディアの投稿でもコードでも、新しい価値ある出力を統合して生成する自律エージェントの工場を作れる。私にとって、これこそ A.I. の労働市場への影響が社会全体で真剣に議論されるべき理由だ。

断片的な A.I. 知能でさえ超人的知能になり、生産性を 1000 倍にできるとき、つまり、そもそも十分な仕事が残らないかもしれないとき、私たちは何をすればいいのか?一歩引いて考えると、そもそもなぜ人間にそんなに働いてほしいのだろう?本当に必要なのは、仕事、収入、意味の間にある矢印を再構成し、描き直すことかもしれない。私は喜んで週4時間労働に投票し、残りの時間を遊びと学びに使う。まあ、そう思うだけだ。

直面した課題

エージェントを作るなかで、最も詰まった難所は次の通りだった:

  1. 正しいパッケージバージョンを使う

始めるにあたり、既存プロジェクト (chat-with-code) から学ぶことにしたが、以下のようなエラーに何度も遭遇した:

RuntimeError: no validator found for <class 're.Pattern'>, see `arbitrary_types_allowed` in Config
Traceback:
File "/home/erniesg/.pyenv/versions/3.10.6/envs/lewagon/lib/python3.10/site-packages/streamlit/scriptrunner/script_runner.py", line 557, in _run_script
    exec(code, module.__dict__)
File "chatbot.py", line 2, in <module>
    import utils
File "/home/erniesg/code/erniesg/chat-with-code/utils.py", line 1, in <module>
    from langchain.document_loaders import TextLoader
File "/home/erniesg/.pyenv/versions/3.10.6/envs/lewagon/lib/python3.10/site-packages/langchain/__init__.py", line 6, in <module>
    from langchain.agents import MRKLChain, ReActChain, SelfAskWithSearchChain
File "/home/erniesg/.pyenv/versions/3.10.6/envs/lewagon/lib/python3.10/site-packages/langchain/agents/__init__.py", line 40, in <module>
    from langchain.agents.agent_toolkits import (
File "/home/erniesg/.pyenv/versions/3.10.6/envs/lewagon/lib/python3.10/site-packages/langchain/agents/agent_toolkits/__init__.py", line 12, in <module>
    from langchain.agents.agent_toolkits.csv.base import create_csv_agent
File "/home/erniesg/.pyenv/versions/3.10.6/envs/lewagon/lib/python3.10/site-packages/langchain/agents/agent_toolkits/csv/base.py", line 4, in <module>
    from langchain.agents.agent_toolkits.pandas.base import create_pandas_dataframe_agent
File "/home/erniesg/.pyenv/versions/3.10.6/envs/lewagon/lib/python3.10/site-packages/langchain/agents/agent_toolkits/pandas/base.py", line 18, in <module>
    from langchain.agents.types import AgentType
File "/home/erniesg/.pyenv/versions/3.10.6/envs/lewagon/lib/python3.10/site-packages/langchain/agents/types.py", line 5, in <module>
    from langchain.agents.chat.base import ChatAgent
File "/home/erniesg/.pyenv/versions/3.10.6/envs/lewagon/lib/python3.10/site-packages/langchain/agents/chat/base.py", line 6, in <module>
    from langchain.agents.chat.output_parser import ChatOutputParser
File "/home/erniesg/.pyenv/versions/3.10.6/envs/lewagon/lib/python3.10/site-packages/langchain/agents/chat/output_parser.py", line 12, in <module>
    class ChatOutputParser(AgentOutputParser):
File "pydantic/main.py", line 229, in pydantic.main.ModelMetaclass.__new__
File "pydantic/fields.py", line 491, in pydantic.fields.ModelField.infer
File "pydantic/fields.py", line 421, in pydantic.fields.ModelField.__init__
File "pydantic/fields.py", line 542, in pydantic.fields.ModelField.prepare
File "pydantic/fields.py", line 804, in pydantic.fields.ModelField.populate_validators
File "pydantic/validators.py", line 723, in find_validators

あるいは、こんなものもあった:

➜  chat-with-code git:(main) ✗ poetry run streamlit run chatbot.py                                         [🐍 lewagon]
2023-08-04 19:39:49.759 INFO    numexpr.utils: Note: NumExpr detected 12 cores but "NUMEXPR_MAX_THREADS" not set, so enforcing safe limit of 8.
2023-08-04 19:39:49.760 INFO    numexpr.utils: NumExpr defaulting to 8 threads.
 
  You can now view your Streamlit app in your browser.
 
  Network URL: http://172.19.237.74:8501
  External URL: http://180.129.59.54:8501
 
2023-08-04 19:39:51.484 Uncaught app exception
Traceback (most recent call last):
  File "/home/erniesg/.pyenv/versions/3.10.6/envs/lewagon/lib/python3.10/site-packages/streamlit/scriptrunner/script_runner.py", line 557, in _run_script
    exec(code, module.__dict__)
  File "/home/erniesg/code/erniesg/chat-with-code/chatbot.py", line 2, in <module>
    import utils
  File "/home/erniesg/code/erniesg/chat-with-code/utils.py", line 1, in <module>
    from langchain.document_loaders import TextLoader
  File "/home/erniesg/.pyenv/versions/3.10.6/envs/lewagon/lib/python3.10/site-packages/langchain/__init__.py", line 6, in <module>
    from langchain.agents import MRKLChain, ReActChain, SelfAskWithSearchChain
  File "/home/erniesg/.pyenv/versions/3.10.6/envs/lewagon/lib/python3.10/site-packages/langchain/agents/__init__.py", line 31, in <module>
    from langchain.agents.agent import (
  File "/home/erniesg/.pyenv/versions/3.10.6/envs/lewagon/lib/python3.10/site-packages/langchain/agents/agent.py", line 15, in <module>
    from langchain.agents.agent_iterator import AgentExecutorIterator
  File "/home/erniesg/.pyenv/versions/3.10.6/envs/lewagon/lib/python3.10/site-packages/langchain/agents/agent_iterator.py", line 21, in <module>
    from langchain.callbacks.manager import (
  File "/home/erniesg/.pyenv/versions/3.10.6/envs/lewagon/lib/python3.10/site-packages/langchain/callbacks/__init__.py", line 10, in <module>
    from langchain.callbacks.aim_callback import AimCallbackHandler
  File "/home/erniesg/.pyenv/versions/3.10.6/envs/lewagon/lib/python3.10/site-packages/langchain/callbacks/aim_callback.py", line 5, in <module>
    from langchain.schema import AgentAction, AgentFinish, LLMResult
  File "/home/erniesg/.pyenv/versions/3.10.6/envs/lewagon/lib/python3.10/site-packages/langchain/schema/__init__.py", line 4, in <module>
    from langchain.schema.memory import BaseChatMessageHistory, BaseMemory
  File "/home/erniesg/.pyenv/versions/3.10.6/envs/lewagon/lib/python3.10/site-packages/langchain/schema/memory.py", line 7, in <module>
    from langchain.schema.messages import AIMessage, BaseMessage, HumanMessage
  File "/home/erniesg/.pyenv/versions/3.10.6/envs/lewagon/lib/python3.10/site-packages/langchain/schema/messages.py", line 147, in <module>
    class HumanMessageChunk(HumanMessage, BaseMessageChunk):
  File "/home/erniesg/.pyenv/versions/3.10.6/envs/lewagon/lib/python3.10/site-packages/pydantic/main.py", line 352, in __new__

解決策:結局、特定の streamlit (1.25.0)pydanic version (1.10.12) を使う必要があった。こうしたパッケージ間の互換性問題はかなり頻繁に起きるので、管理のためのツールとベストプラクティスをもっと学ぶ必要がありそうだ。もしかすると、使う具体的なバージョンは常に poetry の中で定義すべきなのかもしれない!?

  1. .json ファイルで定義された Azure Data Factory リソースを読み込み、分割する方法を理解する

文書、PDF、GitHub のコードリポジトリなどを処理するチュートリアルはたくさんあるのに、.json への言及はほとんどなかった。ChatGPT に生成させても失敗したので、.jsonlangchain JSON ローダーをじっくり見て、私が正しいと思う手順を ChatGPT に段階的に案内したところ、ようやく動いた。少なくとも Google と YouTube の検索 1 ページ目を見る限り、Azure Resource Manager (ARM) テンプレートに対してこれをやった人はいなかったので、創意工夫が必要だった。

解決策:この初期プロトタイプでは、Azure Data Factory の parametersvariablesresources と、resources 内の個別オブジェクトを保持したかった。そこに pipelines や activities などが入るからだ。これに few-shot の指示と文脈を組み合わせることで、ChatGPT は必要なものを出してくれた。

これから

こうして 75 個の項目を Deep Lake のデータセットに分割して入れることになった。今はもう、さらに多くのデータソースを読み込み、すべての SQL スキーマや保存済みプロシージャ、データそのものまで問い合わせられるようにすること、メモリまわりのメタデータを更新すること、マルチモーダルなデータレイク兼ベクトルストア上で CRUD 操作を行うこと、検索方針とトークン文脈を最適化することまで考えている。そもそも、ツールを使って LLM の中で直接実行し、行動まで起こさせればいいのではないか。さらに言えば、LLM に自分でテストを書かせ、デバッグし、検証させればいい。これらはすべて、どんな規模のチームや組織でも控えめに言って生産性を 1000 倍にする自律エージェントを本番投入するうえで不可欠になる。

楽しい時代だ!🤩🤩🤩


PubPub の erniesg.pubpub.org/pub/i8a0vp8z で初出。