LangChain/LangGraphを使ったDify.aiのワークフローの自動生成とチェック
1. はじめに
1.1. 目的
今回は、LangChainとLangGraphを使って、Dify.aiのワークフローを自動生成する実験的な取り組みについて紹介したいと思います。
前回の記事はこちらです。
1.2. 背景
この開発のきっかけは、「LangChainとLangGraphによるRAG・AIエージェント[実践]入門」(著:江間健司)という本との出会いでした。本書では、LangChainとLangGraphを使ったAIエージェントの実装方法が詳しく解説されています。
特に印象に残ったのは以下の点です:
-
LangChain/LangGraphの基礎
- LangChain/LangGraphの基礎を大量コードと共に理解することができました。
-
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. 実行手順
以下の手順で実行できます。
- リポジトリのクローン
git clone https://github.com/Tomatio13/DifyWorkFlowGenerator.git
cd DifyWorkFlowGenerator
- 依存パッケージのインストール
pip install langchain langchain-anthropic langgraph pydantic pyyaml
- 環境変数の設定
export ANTHROPIC_API_KEY="your-api-key"
-
プロンプトファイルの準備
workflow_generator_prompt.yml
をプロジェクトルートに配置します。 -
実行
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