🦀

LangChain/LangGraphを使ったDify.aiのワークフローの自動生成とチェック

2024/11/27に公開

1. はじめに

1.1. 目的

今回は、LangChainとLangGraphを使って、Dify.aiのワークフローを自動生成する実験的な取り組みについて紹介したいと思います。

前回の記事はこちらです。

1.2. 背景

この開発のきっかけは、「LangChainとLangGraphによるRAG・AIエージェント[実践]入門」(著:江間健司)という本との出会いでした。本書では、LangChainとLangGraphを使ったAIエージェントの実装方法が詳しく解説されています。

特に印象に残ったのは以下の点です:

  1. LangChain/LangGraphの基礎

    • LangChain/LangGraphの基礎を大量コードと共に理解することができました。
  2. AIエージェントデザインパターン

    • 本書で紹介されていたエージェントデザインのパターンを参考に、ワークフロー生成→チェック→フィードバックのループを実装
    • エラーハンドリングの考え方も本書から多くのヒントを得ました

本書は実践的な内容が豊富で、AIエージェント開発の良い入門書となっています。私の場合は本書の内容をベースに、Dify.aiのワークフロー生成という具体的なユースケースに応用してみました。

Dify.aiは素晴らしいLLMアプリケーション開発プラットフォームですが、ワークフローの作成には少し手間がかかります。
そこで、LangChainとLangGraphを使って、ワークフローのDSLファイルを自動生成するツールを作ってみました。

2. 技術的な特徴

2.1. LangGraph/LangChainの活用

このツールの特徴は、LangGraphを使ってステートマシンベースのワークフロー生成を実現していることです。以下が処理の流れです:

LangChain/LangGraphを用いることで、少ないコードでワークフロー生成→チェック→フィードバックのループを実現できました。

2.2. Anthropic API直接利用との比較

AnthropicのAPIを直接利用する場合と比較すると、以下のようなメリットとデメリットがあると感じました。

メリット

  • ステートマシンによる制御で、品質チェックと再生成のループを自動化
  • 構造化されたワークフローで、より安定した出力を実現
  • エラーハンドリングが組み込まれており、より堅牢な実装が可能

デメリット

  • セットアップの手間が増える
  • LangGraphの学習コストが必要

3. 実行手順

以下の手順で実行できます。

  1. リポジトリのクローン
git clone https://github.com/Tomatio13/DifyWorkFlowGenerator.git
cd DifyWorkFlowGenerator
  1. 依存パッケージのインストール
pip install langchain langchain-anthropic langgraph pydantic pyyaml
  1. 環境変数の設定
export ANTHROPIC_API_KEY="your-api-key"
  1. プロンプトファイルの準備
    workflow_generator_prompt.ymlをプロジェクトルートに配置します。

  2. 実行

python difyDslGenCheck.py

4. コードの解説

以下、ツールのコードでLangGraphを利用してワークフロー生成を実現している部分です。

def create_workflow_graph(generator: WorkflowGenerator) -> StateGraph:
    workflow = StateGraph(State)
    # ワークフロー生成ノード
    workflow.add_node("workflow_generator", generator.generate_workflow)
    # ワークフローチェックノード
    workflow.add_node("check", generator.check_workflow)
    # オペレータ確認ノード
    workflow.add_node("ask_operator", ask_operator)
    
    # エントリーポイントをワークフロー生成ノードに設定
    workflow.set_entry_point("workflow_generator")
    # ワークフロー生成ノードからチェックノードへのエッジ
    workflow.add_edge("workflow_generator", "check")
    
    # チェックノードの条件分岐-ワークフローの品質がOKなら終了、NGならオペレータ確認ノードへ
    workflow.add_conditional_edges(
        "check",
        lambda state: state.current_judge,
        {True: END, False: "ask_operator"}
    )
    # オペレータ確認ノードの条件分岐-オペレータが承認したら終了、そうでなければワークフロー生成ノードへ
    workflow.add_conditional_edges(
        "ask_operator",
        lambda state: state.operator_approved,
        {True: END, False: "workflow_generator"}
    )
   # ワークフローのコンパイル
   return workflow.compile()

LangGraphを使うことで、ワークフローの生成、チェック、フィードバックのループを実現できました。

5. プロンプトの改善(失敗)

LangChain/LangGraphの思想からすると短いプロンプトを多段に重ねて、より複雑なフローを生成するのがよいと思いますが、今回のワークフロー生成のプロンプトは1プロンプトが大きく、Claude-3-sonnetのコンテキスト長に依存しているので、正直あまり良くない点です。

以下のように多段で生成→チェックを繰り返すと、より良いワークフローが生成できると思います。
がっ、DSLプロンプト全体をコンテキストに入れないと、正しく生成されなかったので諦めました。。

6. おわりに

このツールは実験的な取り組みですが、AIエージェント開発の理解がぐっと深まりました。

ソースコードはGitHubで公開していますので、興味のある方はぜひ試してみてください。

最後に、素晴らしいプラットフォームを提供してくださっているDify.ai Teamの皆様に感謝申し上げます。彼らの革新的な取り組みがなければ、このような実験も実現できませんでした。

参考リンク

Discussion