cloudwego/eino
主な特徴
- コンポーネントベースアーキテクチャ(ChatModel、Tool、Retriever、Document Loader等の抽象化)
- 強力なオーケストレーションフレームワーク(Chain APIとGraph API)
- 完全なストリーム処理サポート(自動連結、ボックス化/アンボックス化、マージ、コピー)
- 拡張可能なアスペクトシステム(コールバック)による横断的関心事の処理
- 型安全性とコンパイル時チェック
- 4つのストリーミングパラダイム(Invoke、Stream、Collect、Transform)
- マルチモーダルコンテンツ(テキスト、画像)のサポート
- ツール呼び出しとファンクション実行の組み込みサポート
リポジトリ解析: cloudwego/eino
基本情報
- リポジトリ名: cloudwego/eino
- 主要言語: Go
- スター数: 6,304
- フォーク数: 487
- 最終更新: 2025年7月31日 (fix: ut data race #374)
- ライセンス: Apache License 2.0
- トピックス: LLM, AI, Go, Framework, LangChain-inspired, Agent, Tool Calling, Stream Processing
概要
一言で言うと
Eino(アイ・ノウと発音)は、Go言語でLLMアプリケーションを構築するための究極のフレームワークで、LangChainやLlamaIndexの概念をGoの慣習に従って実装したものです。
詳細説明
Einoは、LLM(Large Language Model)アプリケーション開発のための包括的なGo言語フレームワークです。LangChainやLlamaIndexなどの人気フレームワークからインスピレーションを得ながら、Go言語の慣習や設計パターンに従って実装されています。コンポーネントベースのアーキテクチャ、強力なオーケストレーション機能、完全なストリーム処理サポート、拡張可能なアスペクトシステムを提供し、プロダクション環境での利用を前提とした設計となっています。
主な特徴
- コンポーネントベースアーキテクチャ(ChatModel、Tool、Retriever、Document Loader等の抽象化)
- 強力なオーケストレーションフレームワーク(Chain APIとGraph API)
- 完全なストリーム処理サポート(自動連結、ボックス化/アンボックス化、マージ、コピー)
- 拡張可能なアスペクトシステム(コールバック)による横断的関心事の処理
- 型安全性とコンパイル時チェック
- 4つのストリーミングパラダイム(Invoke、Stream、Collect、Transform)
- マルチモーダルコンテンツ(テキスト、画像)のサポート
- ツール呼び出しとファンクション実行の組み込みサポート
使用方法
インストール
前提条件
- Go 1.18以上
- 有効なgo.modファイルがあるGoプロジェクト
インストール手順
# go getでインストール
go get github.com/cloudwego/eino
# 拡張コンポーネントも必要な場合
go get github.com/cloudwego/eino-ext
基本的な使い方
Hello World相当の例
import (
"github.com/cloudwego/eino/schema"
"github.com/cloudwego/eino-ext/components/model/openai"
)
// チャットモデルの作成
model, _ := openai.NewChatModel(ctx, config)
// シンプルな応答生成
message, _ := model.Generate(ctx, []*schema.Message{
schema.SystemMessage("you are a helpful assistant."),
schema.UserMessage("what does the future AI App look like?"),
})
実践的な使用例
import (
"github.com/cloudwego/eino/compose"
)
// ChatTemplate -> ChatModel のチェーンを作成
chain, _ := compose.NewChain[map[string]any, *schema.Message]().
AppendChatTemplate(prompt).
AppendChatModel(model).
Compile(ctx)
// チェーンの実行
result, _ := chain.Invoke(ctx, map[string]any{
"query": "what's your name?",
})
// ストリーミング処理
stream, _ := chain.Stream(ctx, map[string]any{
"query": "tell me a story",
})
for {
chunk, err := stream.Recv()
if err == io.EOF {
break
}
// チャンクを処理
}
高度な使い方
import (
"github.com/cloudwego/eino/flow/agent/react"
)
// ReActエージェントの設定
config := react.AgentConfig{
ToolCallingModel: chatModel,
ToolsConfig: compose.ToolsNodeConfig{
Tools: map[string]schema.Tool{
"weather": weatherTool,
"search": searchTool,
},
},
MaxStep: 10,
}
// エージェントの作成と使用
agent, _ := react.NewAgent(ctx, config)
response, _ := agent.Generate(ctx, []*schema.Message{
schema.UserMessage("What's the weather in Beijing?"),
})
// 複雑なグラフの構築
graph := compose.NewGraph[State, Output]()
graph.AddNode("input", inputNode)
graph.AddNode("process", processNode)
graph.AddNode("output", outputNode)
graph.AddEdge("input", "process")
graph.AddConditionalEdge("process", branchLogic)
compiled, _ := graph.Compile(ctx)
ドキュメント・リソース
公式ドキュメント
- README.md: プロジェクト概要、基本的な使い方、コア概念の説明
- README.zh_CN.md: 中国語版README(より詳細な説明を含む)
- CONTRIBUTING.md: コントリビューションガイドライン
- CODE_OF_CONDUCT.md: 行動規範
サンプル・デモ
- EinoExamples: 完全なサンプルアプリケーションと使用例のリポジトリ
- テストファイル(*_test.go): 各コンポーネントの使用方法を示すユニットテスト
チュートリアル・ガイド
- コンポーネント別のdoc.goファイル(各パッケージ内)
- Lark/Feishuユーザーグループでのサポート
- Eino DevOps: 可視化とデバッグツール
技術的詳細
アーキテクチャ
全体構造
Einoはコンポーネント抽象化、オーケストレーションフレームワーク、ストリーム処理、アスペクトシステムの4つの主要層から構成されています。各コンポーネントは一貫したインターフェースに従い、明確な入出力型を定義しており、コンパイル時の型安全性を保証します。
ディレクトリ構成
eino/
├── components/ # コンポーネント抽象化とインターフェース
│ ├── document/ # ドキュメント処理とパーシング
│ ├── embedding/ # テキスト埋め込みコンポーネント
│ ├── indexer/ # ドキュメントインデックシング
│ ├── model/ # チャットモデルインターフェース
│ ├── prompt/ # プロンプトテンプレート
│ ├── retriever/ # ドキュメント検索
│ └── tool/ # ツール/ファンクション呼び出し
├── compose/ # オーケストレーションフレームワーク
│ ├── chain*.go # Chain API実装
│ ├── graph*.go # Graph API実装
│ └── stream*.go # ストリーム処理ユーティリティ
├── schema/ # コアデータ構造
├── flow/ # 事前構築済み複雑フロー
│ └── agent/ # エージェント実装(ReAct等)
├── callbacks/ # アスペクト/コールバックシステム
└── internal/ # 内部ユーティリティ
主要コンポーネント
-
ChatModelインターフェース: LLMとの対話を抽象化
- 場所:
components/model/interface.go - 依存: schema.Message
- インターフェース: Generate(), Stream()
- 場所:
-
Toolコンポーネント: 外部ツール/関数の呼び出し
- 場所:
components/tool/interface.go - 依存: schema.ToolInfo
- インターフェース: Info(), Run()
- 場所:
-
Chain/Graph: ワークフローオーケストレーション
- 場所:
compose/chain.go,compose/graph.go - 依存: 各種コンポーネント
- インターフェース: Compile(), Invoke(), Stream()
- 場所:
技術スタック
コア技術
- 言語: Go 1.18+ (ジェネリクス、コンテキスト、インターフェースを活用)
- フレームワーク: スタンドアロンフレームワーク(特定のWebフレームワークに依存しない)
- 主要ライブラリ:
- 標準ライブラリのみ(coreパッケージ)
- cloudwego/eino-ext: 実装コンポーネント
開発・運用ツール
- ビルドツール: Go Modules (go.mod)
- テスト: 各パッケージにユニットテストを含む
- CI/CD: GitHub Actions(テスト、リント、ビルド)
- デプロイ: ライブラリとしてgo getで配布
設計パターン・手法
- コンポーネント抽象化: すべてのコンポーネントが一貫したインターフェースに従う
- イミュータビリティ: WithXXX()メソッドによる新インスタンス返却
- ストリームファースト設計: フレームワーク全体でのネイティブストリームサポート
- アスペクト指向プログラミング: コールバックによる横断的関心事の処理
- 型安全性: コンパイル時の強力な型チェック
データフロー・処理フロー
- 入力: ユーザーメッセージまたは任意のデータ
- コンポーネント処理: Chain/Graphで定義された順序で実行
- ストリーム管理: 必要に応じて自動的にストリーム化/非ストリーム化
- アスペクト処理: コールバックの自動呼び出し
- 出力: 最終結果またはストリーム
API・インターフェース
公開API
コンポーネントインターフェース
- 目的: 各種コンポーネントの統一的なインターフェース提供
- 使用例:
// ChatModelインターフェース
type ChatModel interface {
Generate(ctx context.Context, messages []*Message, opts ...GenerateOption) (*Message, error)
Stream(ctx context.Context, messages []*Message, opts ...StreamOption) (*StreamReader[*Message], error)
}
// Toolインターフェース
type Tool interface {
Info() ToolInfo
Run(ctx context.Context, arguments string) (string, error)
}
オーケストレーションAPI
- 目的: 複雑なワークフローの構築と実行
- 使用例:
// Graph APIの使用例
graph := compose.NewGraph[State, Output]()
graph.AddNode("start", startNode)
graph.AddNode("end", endNode)
graph.AddEdge("start", "end")
compiled, _ := graph.Compile(ctx)
result, _ := compiled.Invoke(ctx, initialState)
設定・カスタマイズ
オプションパターン
// 各コンポーネントはOptionパターンを使用
model.Generate(ctx, messages,
model.WithTemperature(0.7),
model.WithMaxTokens(1000),
)
拡張・プラグイン開発
カスタムコンポーネントの作成:
- 適切なインターフェースを実装(ChatModel、Tool等)
- 必要に応じてcallbacksをサポート
- Optionパターンで設定可能にする
- eino-extリポジトリに追加してコミュニティで共有
パフォーマンス・スケーラビリティ
パフォーマンス特性
- ベンチマーク結果: Goのネイティブパフォーマンスを活用
- 最適化手法:
- ゴルーチンによる並行処理
- ストリーム処理によるメモリ効率化
- ゼロコピー最適化
スケーラビリティ
- 水平スケーリング: Graph APIで複数ノードを並列実行
- 垂直スケーリング: 各コンポーネントの実装に依存
- バックプレッシャー制御: ストリーム処理で自然に実現
制限事項
- Go 1.18以上が必須(ジェネリクス使用のため)
- 外部LLMサービスのAPI制限に依存
- ストリーム処理時のエラーハンドリングに注意が必要
評価・所感
技術的評価
強み
- Go言語の特性を活かしたクリーンな設計
- 強力な型安全性とコンパイル時チェック
- 完全なストリームサポートによるリアルタイム処理
- 柔軟なオーケストレーション機能(Chain/Graph)
- プロダクション向けの堅牢なアーキテクチャ
改善の余地
- ドキュメントの更なる充実(英語版と中国語版の差がある)
- より多くの実装例とチュートリアル
- コミュニティの拡大(現在は主にLark/Feishuユーザー)
向いている用途
- プロダクション環境でのLLMアプリケーション構築
- マイクロサービスアーキテクチャでのAI機能統合
- 高パフォーマンスが要求されるリアルタイムAIシステム
- 複雑なワークフローを持つAIエージェントの開発
- Goエコシステムとのシームレスな統合
向いていない用途
- Pythonエコシステムの既存ライブラリを直接利用したい場合
- プロトタイピングや学習目的の簡易な実験
- Web UIが主体のアプリケーション(バックエンドAPIとしては適している)
総評
Einoは、Go言語でLLMアプリケーションを構築するための非常によく設計されたフレームワークです。特に、型安全性、パフォーマンス、ストリーム処理を重視するプロダクション環境での使用に適しています。LangChainやLlamaIndexの概念をGoの作法に合わせて再設計しており、Go開発者にとって自然な使い勝手を提供しています。現在も活発に開発が続けられており、将来性のあるプロジェクトです。