cloudwego/eino

⭐ 6,304 🍴 487 Go📄 Apache License 2.0 GitHubで見る →

主な特徴

  • コンポーネントベースアーキテクチャ(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()メソッドによる新インスタンス返却
  • ストリームファースト設計: フレームワーク全体でのネイティブストリームサポート
  • アスペクト指向プログラミング: コールバックによる横断的関心事の処理
  • 型安全性: コンパイル時の強力な型チェック

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

  1. 入力: ユーザーメッセージまたは任意のデータ
  2. コンポーネント処理: Chain/Graphで定義された順序で実行
  3. ストリーム管理: 必要に応じて自動的にストリーム化/非ストリーム化
  4. アスペクト処理: コールバックの自動呼び出し
  5. 出力: 最終結果またはストリーム

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),
)

拡張・プラグイン開発

カスタムコンポーネントの作成:

  1. 適切なインターフェースを実装(ChatModel、Tool等)
  2. 必要に応じてcallbacksをサポート
  3. Optionパターンで設定可能にする
  4. 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開発者にとって自然な使い勝手を提供しています。現在も活発に開発が続けられており、将来性のあるプロジェクトです。