苛立ちながらキーボードを叩きつけたり、引き継いだコードベースを前に少し涙を流したりするくらいなら、その情報を A.I. に渡して会話したほうがよほど筋がいい。そうした情報に対して大規模言語モデル(LLM)の知識と推論能力を使い始めた瞬間、次に自然と見えてくるのは、既存のコードベースの上で動く新しいコードを生成することだ。つまり、世界中の誰でもプロンプトから機能実装まで進められるようにすること。こうした課題に取り組むために、下のデモは週末の1日か2日ほどで作ったものだ。作るのはかなり楽しかった。新しい学びや概念が多く、その過程で理解が一段深まったからだ。
Arthur - なんでも検索・取得
働く必要ある、Leh?

やろうとしたのは、自分のデータファクトリに関する情報を Deep Lake のベクトルストアに渡し、自分専用の知識ストア上で ChatGPT の推論能力を使って、既存環境で何が起きているのかを理解することだった。人間が残したレガシーコードベースを読み解くより、ずっと楽しかった(悪いけど、悪いとは思っていない)。というのも、コミュニケーションや会議が盛大な時間の無駄だったことは何度もあるし、返答の遅さ、ああもう、人間がこちらの質問に返してくるまでのラグには言葉がない…。というわけで、始めよう。この最初の一個を置いてしまえば、あらゆる種類の情報を調査し、取得し、推論し、さらにソーシャルメディア向けコンテンツであれコードであれ、新しい価値あるアウトプットを組み立てて生成する自律エージェントの工場を作れる。僕にとって、A.I. の労働市場への影響が、社会全体で真剣に議論されるべき理由はここにある。
断片的な A.I. の知能でさえ超人的な知能であり、生産性を1000倍にできるとしたら、つまり、単に全員に行き渡るだけの仕事がなくなるかもしれないとしたら、僕らは何をするのか? 一歩引いて考えると、そもそもなぜ人間にそんなに働いてほしいのだろう。たぶん本当に必要になるのは、仕事、収入、意味のあいだに引かれている矢印を組み替え、引き直すことだ。僕なら週4時間労働に喜んで投票して、残りの時間は遊んで学ぶ。言ってみただけ。
直面した課題

エージェントを作っていくなかで、いちばん詰まった難所は次のあたりだった。
- 正しいパッケージバージョンを使うこと
まずは既存プロジェクト(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 の中で定義しておくべきなのでは!?
- .json ファイルで定義された Azure Data Factory リソースを取り込み、チャンクに分ける方法を見極めること
調べてみると、ドキュメントや .PDF、GitHub のコードリポジトリなどを処理するチュートリアルは山ほどあるのに、.json への言及はほとんどない。ChatGPT に生成させても空振りだったので、.json と langchain JSON ローダーをじっくり読み込み、何をどう処理すべきだと思うかを一つずつ ChatGPT に噛み砕いて指示したところ、ようやく動いた。少なくとも僕の Google と YouTube 検索の1ページ目を見るかぎり、Azure Resource Manager(ARM)テンプレートでこれをやっている人はいなかった。なので、創意工夫するしかなかった。
解決策: 最初のプロトタイプでは、Azure Data Factory の parameters、variables、resources に加えて、resources の中にある個々のオブジェクトも保持できるようにしたかった。そこに入っているのが自分のパイプラインやアクティビティなどだからだ。これに、少数例を添えた指示と ChatGPT 向けの文脈を組み合わせることで、必要なものが得られた。
これから先
そんな流れで、75個の項目を自分の Deep Lake データセットにチャンク分割するところまで来た。そしてすでに、もっと多くのデータソースを取り込む必要を考えている(SQL スキーマもストアドプロシージャもデータそのものも全部問い合わせられるようにしよう!)。さらに、メモリに関わるメタデータの更新、マルチモーダルなデータレイク兼ベクトルストアに対する CRUD 操作、検索戦略やトークン文脈の最適化もある。というか、ツールを使って LLM の中から直接実行し、アクションまで起こせばよくないか? さらに言えば、LLM に自分のテストを書かせ、自分でデバッグし、検証させればよくないか? 控えめに言って、どんな規模のチームや組織でも生産性を1000倍にできる自律エージェントを本番投入するには、こうした要素はどれも欠かせない。
楽しい時代だ! 🤩🤩🤩
もともとは PubPub の erniesg.pubpub.org/pub/i8a0vp8z で公開したものです。