cloudwego/eino

⭐ 5,755 🍴 460 Go📄 Apache License 2.0 GitHubで見る →

主な特徴

  • 豊富なコンポーネント抽象化(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",
})

ドキュメント・リソース

公式ドキュメント

サンプル・デモ

  • 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つのリポジトリで構成されるエコシステムです:

  1. cloudwego/eino: コアフレームワーク(型定義、ストリーミング、編排)
  2. cloudwego/eino-ext: コンポーネント実装(OpenAI、Claude、Gemini等)
  3. 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

設計パターン・手法

  • インターフェースベースの抽象化
  • ジェネリクスによる型安全な編排
  • ストリームファーストの設計
  • アスペクト指向プログラミング(コールバック)
  • オプションパターンによる設定

データフロー・処理フロー

  1. 入力データがグラフの開始ノードに渡される
  2. 各ノードが順次または並列に処理を実行
  3. ストリームデータは自動的に処理される
    • 非ストリーム入力が必要なノードへは自動連結
    • ストリーム入力が必要なノードへは自動ボクシング
    • 複数ストリームの自動マージ
    • ファンアウト時の自動コピー
  4. 分岐条件に基づいて動的にルーティング
  5. 最終ノードから結果を返す

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開発を本格的に行う場合、現時点で最も完成度の高いフレームワークの一つと言えるでしょう。