cloudwego/eino
主な特徴
- 豊富なコンポーネント抽象化(ChatModel、Tool、Retriever、ChatTemplate等)
- 2つの編排API(ChainとGraph)による柔軟なワークフロー構築
- 完全なストリーム処理サポート(自動連結、ボクシング、マージ、コピー)
- コンパイル時の型チェックによる安全性
- 並行処理の自動管理
- アスペクト(コールバック)による横断的関心事の処理
- 4つのストリーミングパラダイム(Invoke、Stream、Collect、Transform)
- ReActエージェントなどの事前構築済みフロー
- Visual Studio CodeとGoLand向けの開発ツール
- 本番環境向けの包括的な監視・トレーシング機能
リポジトリ解析: cloudwego/eino
基本情報
- リポジトリ名: cloudwego/eino
- 主要言語: Go
- スター数: 5,755
- フォーク数: 460
- 最終更新: 2025年7月時点でアクティブ
- ライセンス: Apache License 2.0
- トピックス: llm, ai-agent, langchain, llamaindex, golang, orchestration, streaming, framework
概要
一言で言うと
LangChainやLlamaIndexに触発されたGo言語での究極のLLMアプリケーション開発フレームワークで、シンプルさ、スケーラビリティ、信頼性を重視した設計。
詳細説明
Eino(「アイノウ」と発音、"I know"に似ている)は、CloudWeGo(ByteDance)が開発したGo言語向けのLLMアプリケーション開発フレームワークです。PythonのLangChainやLlamaIndexなどの優れたフレームワークから学びつつ、Go言語の特性を活かした設計を採用しています。
主な特徴として、再利用可能なコンポーネント抽象化、強力な編排(オーケストレーション)フレームワーク、ストリーム処理の完全サポート、型安全性、並行処理管理などを提供します。ByteDance内部での実践経験に基づいて開発され、プロダクション環境での使用を前提とした設計となっています。
主な特徴
- 豊富なコンポーネント抽象化(ChatModel、Tool、Retriever、ChatTemplate等)
- 2つの編排API(ChainとGraph)による柔軟なワークフロー構築
- 完全なストリーム処理サポート(自動連結、ボクシング、マージ、コピー)
- コンパイル時の型チェックによる安全性
- 並行処理の自動管理
- アスペクト(コールバック)による横断的関心事の処理
- 4つのストリーミングパラダイム(Invoke、Stream、Collect、Transform)
- ReActエージェントなどの事前構築済みフロー
- Visual Studio CodeとGoLand向けの開発ツール
- 本番環境向けの包括的な監視・トレーシング機能
使用方法
インストール
前提条件
- Go 1.18以降
- kin-openapi v0.118.0(JSONSchema実装のため固定)
インストール手順
# 方法1: go getで直接インストール
go get github.com/cloudwego/eino
# 方法2: go.modに追加
require (
github.com/cloudwego/eino latest
)
基本的な使い方
Hello World相当の例
// 単一コンポーネントの使用
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?"),
})
実践的な使用例
// Chainによる編排: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?",
})
高度な使い方
// GraphによるTool呼び出しの実装
graph := compose.NewGraph[map[string]any, *schema.Message]()
// ノードの追加
_ = graph.AddChatTemplateNode("node_template", chatTpl)
_ = graph.AddChatModelNode("node_model", chatModel)
_ = graph.AddToolsNode("node_tools", toolsNode)
_ = graph.AddLambdaNode("node_converter", takeOne)
// エッジの設定
_ = graph.AddEdge(compose.START, "node_template")
_ = graph.AddEdge("node_template", "node_model")
_ = graph.AddBranch("node_model", branchFunc) // 条件分岐
_ = graph.AddEdge("node_tools", "node_converter")
_ = graph.AddEdge("node_converter", compose.END)
// コンパイルと実行
compiledGraph, _ := graph.Compile(ctx)
out, _ := compiledGraph.Invoke(ctx, map[string]any{
"query": "Beijing's weather this weekend",
})
ドキュメント・リソース
公式ドキュメント
- README.md: フレームワークの概要と基本的な使い方
- README.zh_CN.md: 中国語版ドキュメント
- Eino User Manual: https://www.cloudwego.io/zh/docs/eino/ (包括的なユーザーマニュアル)
- Quick Start Guide: https://www.cloudwego.io/zh/docs/eino/quick_start/ (クイックスタートガイド)
サンプル・デモ
- flow/agent/react/: ReActエージェントの完全実装
- flow/retriever/: MultiQueryRetrieverなどの実装例
- flow/agent/multiagent/host/: マルチエージェントホスティングの例
- EinoExamples: https://github.com/cloudwego/eino-examples (別リポジトリ)
チュートリアル・ガイド
- コンポーネント使用例(eino-examples/components/)
- 編排パターン例(eino-examples/compose/)
- フロー実装例(eino-examples/flow/)
技術的詳細
アーキテクチャ
全体構造
Einoは3つのリポジトリで構成されるエコシステムです:
- cloudwego/eino: コアフレームワーク(型定義、ストリーミング、編排)
- cloudwego/eino-ext: コンポーネント実装(OpenAI、Claude、Gemini等)
- cloudwego/eino-examples: サンプルアプリケーションとベストプラクティス
ディレクトリ構成
eino/
├── callbacks/ # コールバック機構の実装
├── components/ # コンポーネント抽象化の定義
├── compose/ # 編排フレームワーク(Chain & Graph)
├── flow/ # 事前構築済みフロー
│ └── agent/ # エージェント実装
│ └── react/ # ReActエージェント
├── schema/ # 型定義とインターフェース
├── internal/ # 内部実装
└── utils/ # ユーティリティ関数
主要コンポーネント
-
ChatModel: LLMとの対話インターフェース
- 場所:
components/model/ - 依存: schema.Message
- インターフェース: Generate(), Stream()
- 場所:
-
Tool: 外部ツール統合
- 場所:
components/tool/ - 依存: JSONSchema
- インターフェース: Execute()
- 場所:
-
Retriever: コンテンツ検索
- 場所:
components/retriever/ - 依存: Document
- インターフェース: Retrieve()
- 場所:
技術スタック
コア技術
- 言語: Go 1.18+(ジェネリクス使用)
- JSONSchema: kin-openapi v0.118.0
- テンプレート: gonja(Jinja2互換)
- 主要ライブラリ:
- bytedance/sonic: 高速JSON処理
- stretchr/testify: テストフレームワーク
- go.uber.org/mock: モック生成
開発・運用ツール
- IDE拡張: GoLand 2023.2+、VS Code 1.97.x対応
- 可視化: グラフの視覚的編集とデバッグ
- トレーシング: Fornax Trace、Langfuse、APMPlus統合
- CI/CD: GitHub Actions
設計パターン・手法
- インターフェースベースの抽象化
- ジェネリクスによる型安全な編排
- ストリームファーストの設計
- アスペクト指向プログラミング(コールバック)
- オプションパターンによる設定
データフロー・処理フロー
- 入力データがグラフの開始ノードに渡される
- 各ノードが順次または並列に処理を実行
- ストリームデータは自動的に処理される
- 非ストリーム入力が必要なノードへは自動連結
- ストリーム入力が必要なノードへは自動ボクシング
- 複数ストリームの自動マージ
- ファンアウト時の自動コピー
- 分岐条件に基づいて動的にルーティング
- 最終ノードから結果を返す
API・インターフェース
公開API
Chain API
- 目的: シンプルな順次処理フロー
- 使用例:
chain := compose.NewChain[InputType, OutputType]().
AppendChatTemplate(template).
AppendChatModel(model).
AppendLambda(func(ctx context.Context, msg *schema.Message) (string, error) {
return msg.Content, nil
}).
Compile(ctx)
Graph API
- 目的: 複雑なワークフロー(分岐、並列処理)
- 使用例:
graph := compose.NewGraph[InputType, OutputType]()
graph.AddChatModelNode("model", chatModel)
graph.AddBranch("model", func(ctx context.Context, msg *schema.Message) string {
if len(msg.ToolCalls) > 0 {
return "tools"
}
return compose.END
})
設定・カスタマイズ
コールバック設定
handler := callbacks.NewHandlerBuilder().
OnStartFn(func(ctx context.Context, info *callbacks.RunInfo, input callbacks.CallbackInput) context.Context {
log.Infof("onStart, runInfo: %v, input: %v", info, input)
return ctx
}).
OnEndFn(func(ctx context.Context, info *callbacks.RunInfo, output callbacks.CallbackOutput) context.Context {
log.Infof("onEnd, runInfo: %v, output: %v", info, output)
return ctx
}).
Build()
// グローバル適用
compiledGraph.Invoke(ctx, input, compose.WithCallbacks(handler))
// 特定ノードのみ
compiledGraph.Invoke(ctx, input, compose.WithCallbacks(handler).DesignateNode("node_1"))
拡張・プラグイン開発
コンポーネントインターフェースを実装することで、カスタムコンポーネントを作成可能:
type CustomRetriever struct{}
func (r *CustomRetriever) Retrieve(ctx context.Context, query string, opts ...retriever.Option) ([]*schema.Document, error) {
// カスタム実装
}
パフォーマンス・スケーラビリティ
パフォーマンス特性
- ストリーム処理により大容量データでもメモリ効率的
- 並列ノード実行による高速化
- 型チェックはコンパイル時のみでランタイムオーバーヘッドなし
- sonic使用による高速JSON処理
スケーラビリティ
- グラフの並列実行サポート
- 状態管理のスレッドセーフ実装
- 水平スケーリング対応(ステートレス設計)
- ByteDance内部での大規模利用実績
制限事項
- Go 1.18以降が必要(ジェネリクス使用のため)
- kin-openapi v0.118.0に固定(Go 1.18互換性のため)
- ストリーミング時の一部モデル(Claude等)での制約
評価・所感
技術的評価
強み
- Go言語の特性を活かした型安全な設計
- 包括的なストリーム処理サポート
- プロダクション環境での実績(ByteDance)
- 優れた開発者体験(IDE統合、可視化ツール)
- LangChain/LlamaIndexの良い部分を取り入れつつGo向けに最適化
改善の余地
- ドキュメントが主に中国語(英語版は限定的)
- コンポーネント実装が別リポジトリで管理の複雑性
- エコシステムがまだ発展途上(Pythonと比較して)
向いている用途
- Go言語でのLLMアプリケーション開発
- 高パフォーマンスが要求されるAIサービス
- マイクロサービスアーキテクチャへの統合
- ストリーミング処理が重要なリアルタイムアプリケーション
- エンタープライズ環境でのAI機能実装
向いていない用途
- プロトタイピングや実験的開発(Pythonの方が柔軟)
- 小規模な個人プロジェクト(オーバーエンジニアリング)
- LLMプロバイダーの頻繁な切り替えが必要な場合
総評
EinoはGo言語でLLMアプリケーションを構築するための包括的で洗練されたフレームワークです。ByteDanceの実践経験に基づいた設計により、プロダクション環境での信頼性とパフォーマンスを重視しています。特にストリーム処理の抽象化、型安全性、並行処理管理などの機能は優れており、Go言語の特性を最大限に活用しています。一方で、Pythonエコシステムと比較するとまだ成長段階にあり、ドキュメントの言語障壁もあります。しかし、Go言語でのAI開発を本格的に行う場合、現時点で最も完成度の高いフレームワークの一つと言えるでしょう。