Lightweight-AGI: Go言語と大規模言語モデルを使用した軽量な汎用人工知能エージェントを作った話
みなさん、こんにちは!株式会社ナレッジワークのざわきん(@zawawahoge)です。
概要
今回は、軽量で効果的な汎用人工知能(AGI)エージェントを構築するために、Go言語とLLMクライアント(例えば、OpenAIのGPT-4またはGPT-3.5)を活用した 「Lightweight AGI(LW-AGI)」 を作りましたのでご紹介します!
このエージェントは、目標のリファインメント、タスクの実行、結果の評価、さらなるタスクの優先付けなど、さまざまな目的を達成する能力を持っています。また、その柔軟なアーキテクチャにより、ゲーム、問題解決、知識獲得など、さまざまな分野に適用できます。
↓ ソースコード全部を GitHub で公開しています
主な特徴
Lightweight AGIは、以下の主要な機能を提供しています。
- 目標のリファインメント: 主要な目標をより小さく、管理しやすい目標に洗練する独自の革新的なアプローチ。これにより、AGIエージェントが複雑な問題を効果的に解決できます。
- タスク生成: 洗練された目標に基づいて、タスクとマイルストーンを生成します。
- 実行エージェント: LLMモデルを使用してタスクを実行します。
- 評価エージェント: タスクの結果とその効果を評価します。
- 優先付けエージェント: タスクの関連性と重要性に基づいて、タスクの優先順位を決定します。
- タスクコンテキストエージェント: 将来のタスクのため、タスク結果などコンテキストを保存します。
- インメモリベクトルストア: 効率的なインメモリベクトルストアをサポートし、埋め込みベクトルを保存できます。これにより、手軽に高速な類似性検索ができます。
LW-AGI 処理の流れ
目標のリファインメント
「目標のリファインメント」では、ある目的をエージェントに与えると、より詳細な目的に変換します。
I want to learn how to play chess.
のようなざっくりした目標を最初に与えると、洗練された目標が出力されます。
======= Objective ======
I want to learn how to play chess.
======= Refined Objective ======
I want to learn the basic rules, strategies, and tactics of chess to play at an intermediate level.
この目的を細分化し、マイルストーンを自動で置くようになっていますが、そのマイルストーンにおける目標もリファインメントをすることで明確になります。
======= Milestones ======
1. Familiarize with the chessboard layout and the movement of each piece.
2. Learn the basic rules of chess, including check, checkmate, and stalemate.
3. Study and practice basic opening principles and strategies.
4. Understand and apply the concept of piece value and material advantage in gameplay.
5. Learn common tactical patterns, such as forks, pins, and skewers.
6. Develop an understanding of basic endgame strategies and techniques.
7. Regularly practice playing chess games against opponents of varying skill levels.
8. Analyze your own games and learn from your mistakes.
9. Study famous chess games and learn from the strategies and tactics of renowned players.
10. Participate in local chess tournaments or online matches to gain experience and improve your skills.
======= Milestone Objective ======
Familiarize with the chessboard layout and the movement of each piece.
======= Refined Milestone Objective ======
Learn the chessboard layout, including the initial positioning of each chess piece, and understand the rules governing their movements and captures.
タスク実行〜タスク結果評価
マイルストーンから分解されたタスクを実行していきます。その際、ベクトルストアに保存された過去のタスク結果から近い文脈のものを取り出します。
タスクが完了すると、タスクの結果に対する評価を行います。スコアを0~100点満点でつけ、その理由も出力します。
現在は特に得られた値を使って分岐をしているわけではないですが、フィードバックとして自己改善していくこともできるでしょう。
======= Task ======
Identify and label each chess piece and its corresponding starting position on the chessboard.
======= Relevant Context ======
...
======= Task Result ======
In a standard chess game, the chessboard consists of 8x8 squares, alternating between light and dark colors. Each player starts with 16 chess pieces, and they are positioned as follows:
....
======= Task Evaluation ======
100%: This is a good result because it accurately identifies and labels each chess piece, provides their corresponding starting positions on the chessboard, and describes the rules governing their movements and captures.
タスク優先付け
最後にタスクの優先づけを行います。
- 最終目的に基づき、各タスクの重要性を判断する。
- タスク間の依存関係や、実行順序に影響を与える可能性のある外部制約(例:納期、リソース)を考慮する。
3.最も重要で緊急性の高いタスクを先頭に、タスクの順序を適宜変更する。
このようなステップを取ってタスクを行う順番を入れ替えます。
ただし、現段階では緊急性の尺度は導入していないため、重要なものから順番に行なっていくことになります。
======= Prioritized Tasks ======
["Study the movements and capture rules for each chess piece (pawn, knight, bishop, rook, queen, and king).","Learn and apply chess rules such as en
...
その他の特徴: インメモリベクトルストア
インメモリベクトルストアといういうとかっこよいですが、要は Go の map で埋め込みベクトルを保存する実装です。
pinecone などの高性能なベクトルストアが使われることが多いですが、ローカルでちょこっと試したい場合にはインメモリで保持しておいて、必要ならば json で dump しておくくらいの使い方が便利と思い採用しています。
インターフェイスで抽象化しているので、将来的な外部ベクトルストアへの接続も容易にできるようにしています。
インストール方法
GitHubリポジトリ からプロジェクトをクローンして、必要なパッケージをインストールし、OpenAI APIキーを設定することで、簡単に始めることができます。
使用方法
go run ./cmd/main.go
でメインプログラムを実行すると、AGIエージェントがチェスのプレイ方法を学習するために、タスクの実行、結果の評価、目標のリファインメントを開始します。
シーケンス図とフローチャート
リポジトリには、エージェントの動作を理解するためのシーケンス図とフローチャートを用意しています。これにより、AGIエージェントの内部動作を簡単に把握し、改善や拡張を行うことができます。
コントリビューション
プルリクエストは大歓迎です。大きな変更については、まずissueを開いて、変更したい内容を議論してください。テストも追加してもらえるとありがたいです。
ライセンス
MITライセンスにより、自由に使用、改変、再配布が可能です。
開発した背景
元々、汎用的なエージェントを作りたい欲求はあったのですが、 babyagi を見てから火がつき、ついぞ勢いで作ってしまいました。
LangChainに代表されるLLM関連のライブラリはほとんどが Python で書かれており、 Go がやや出遅れている気がしているので、そこの空気に一石を投じられればと思っています。(GoもPythonも好き勢)
今後の課題
というか今後やりたいこと一覧です。
他のLLMプロバイダーへの対応
現在はOpenAIのGPT-4またはGPT-3.5のみをサポートしていますが、今後、他のLLMプロバイダーにも対応できるように拡張していきたいです。
タスク優先度の改善
タスクの優先度付けのアルゴリズムを改善し、エージェントが効果的に目標達成に近づくためのタスクを選択できるようにします。
エージェント間の協調
複数のエージェントが協力してタスクを達成できるように、エージェント間のコミュニケーション機能を実装します。
現状、単一フローになっているので、エージェントとエージェントを対話させ、協調させることでより効率的に目標達成に近づけるようにします。
外部サービスとの連携
処理が可能なタスクの幅を広げるため、出力に応じて外部環境と相互作用できるようにしたいです。
AGIによる自己学習
GPT-4 に相談してたら、AGIなら自己学習しなきゃね、と言われたので、これもやってみたいです。良い案があれば募集します。
まとめ
Lightweight AGIは、GolangとOpenAIのGPT-4またはGPT-3.5のようなLLMクライアントを活用して、シンプルで効果的な汎用人工知能(AGI)エージェントを実現するプロジェクトです。柔軟なアーキテクチャにより、ゲーム、問題解決、知識獲得など、さまざまな分野に適用できます。興味のある方は、ぜひGitHubリポジトリをチェックして、コントリビューションを検討してみてください!
プロジェクトのGitHubリポジトリ
(スターをポチッとしていただけるとめっちゃ喜びます!)
ぜひ拡散してもらえると嬉しいです!!
Discussion