【ITニュース解説】Building a Human-in-the-Loop AI App with LangGraph and Ollama
2025年09月16日に「Dev.to」が公開したITニュース「Building a Human-in-the-Loop AI App with LangGraph and Ollama」について初心者にもわかりやすく解説しています。
ITニュース概要
LangGraphとOllamaを使い、人間が介入できるAIアプリをPythonで構築するチュートリアル。AIが生成したプロンプトを人間が確認・修正し、より適切な回答をAIに導かせることで、システムの信頼性と適応性を高める。ローカル環境で開発し、AIと人間の協調で動くアプリケーションの作り方を示す。
ITニュース解説
Human-in-the-Loop(HITL)AIシステムとは、AIが処理を進める途中で人間が一時的に介入し、AIの判断内容を確認したり、必要に応じて修正したりする仕組みを指す。AIの判断を完全に自動に任せるのではなく、人間の知識や判断を組み合わせることで、より信頼性が高く、意図に沿った結果を出すことを目的としている。この記事では、このようなHITLの考え方に基づいたAIアプリケーションを構築する手順を解説する。
今回構築するアプリケーションは、コマンドラインインターフェース(CLI)として動作するPythonプログラムである。その主な流れは、まずユーザーが入力した質問や指示(プロンプト)をAIが受け取り、そのプロンプトをより明確で効果的な形にAIが自動的に改善する。次に、改善されたプロンプトが人間のレビューにかけられ、人間はこれを承認するか、または手動で修正する。最終的に、人間によって確定されたプロンプトが再びAIに渡され、AIはそのプロンプトに基づいて包括的な最終回答を生成するというパイプラインを形成する。このシステムでは、AIワークフローの定義にLangGraphを使用し、AIモデルの実行にはOllamaをローカル環境で利用する。Pythonは、これら全ての要素を繋ぎ合わせ、アプリケーション全体の制御を担う。
主要な技術としては、まずLangGraphがある。これは、AIアプリケーションの処理の流れを、ノード(各処理ステップ)とエッジ(処理の繋がり)で構成されるグラフ構造として設計するためのツールである。このグラフ構造によって、処理の柔軟な構築や機能の追加が容易になり、また処理の途中の状態を記憶して、中断した箇所から再開できるなどの利点がある。次にOllamaは、大規模言語モデル(LLM)などのAIモデルを、自分のPCなどのローカル環境で手軽に実行できるようにするツールである。これにより、高速な処理、データのプライバシー保護、クラウドサービス利用料の削減といったメリットが得られる。Pythonは、これらのツールを呼び出し、処理の流れ全体を制御する役割を果たす。
具体的な実装ステップとしては、まず必要なライブラリのインストールから始める。LangGraph本体、LangChainとOllamaを連携させるためのlangchain-ollama、そしてコマンドラインの出力を視覚的に改善するrichを導入する。プログラムの冒頭では、これらのライブラリから必要な機能をインポートする。例えば、uuidはアプリケーションの実行ごとに一意な識別子を生成し、複数セッション間の干渉を防ぐ。StateGraphはLangGraphのワークフロー定義の中核であり、interruptとCommandは処理の一時停止と人間の入力受付に用いられる。InMemorySaverは処理途中の状態を記憶し、中断からの再開を可能にする。HumanMessageとSystemMessageはAIモデルへの指示形式を定義し、ChatOllamaはローカルOllamaモデルとの連携を担う。rich.printは、より見やすいコンソール出力を行う。その後、ChatOllamaを使ってAIモデルを初期化する。ここではphi4-miniモデルを使用し、temperature=0.7という設定で、AIの回答にある程度の創造性を与えつつ、安定性も保つように調整する。
次に、アプリケーションの「記憶」となるPromptStateというデータ構造を定義する。これはTypedDictとして実装され、original_prompt(ユーザーの初期入力)、improved_prompt(AIが改善したプロンプト)、final_prompt(人間レビュー後の確定プロンプト)、final_answer(AIによる最終回答)、step(現在の処理段階)といった情報を保持する。これにより、各処理ノードは最新のデータにアクセスし、処理を円滑に進めることができる。
「プロンプト改善」のステップでは、improve_prompt_node関数が、AIモデルを活用してユーザーのプロンプトをより効果的なものに書き換える。これはAI自身にプロンプトを最適化させるような機能である。この関数内では、AIに「プロンプトエンジニアリングの専門家」としての役割を与えるシステムメッセージを設定し、元のプロンプトをより明確で具体的な形に修正させる。例えば「機械学習について教えて」といった漠然としたプロンプトが、AIによって詳細な指示を含むプロンプトに変換される。
次の「人間によるレビュー」のステップは、HITLの最も重要な部分である。human_review_node関数が実行されると、アプリケーションは一時停止し、AIが改善したプロンプトをコンソールに表示する。人間は表示されたプロンプトを確認し、そのまま承認するか、または手動で修正を加えることができる。LangGraphのinterrupt機能がこの一時停止と人間の入力待ちを制御し、アプリケーションの状態を保持したまま人間の介入を可能にする。これにより、AIの出力に人間の専門知識や意図を反映させ、品質や方向性を調整できる。
プロンプトが確定された後、「最終回答生成」のステップでは、answer_prompt_node関数が、人間によって最終的に確定されたプロンプトに基づいて、AIが包括的な回答を生成する。この際も、AIに「役立つAIアシスタント」としてのシステムメッセージを与え、正確で論理的、かつ分かりやすい回答を生成するように指示する。これにより、最終的な出力は、人間によるチェックを経た高品質なものとなる。
これらの個々の処理ステップ(ノード)を組み合わせて、LangGraphでワークフローグラフを構築する。StateGraphのインスタンスを作成し、add_nodeメソッドで各処理関数をノードとして登録する。その後、add_edgeメソッドを使って、開始点から「プロンプト改善」へ、その次に「人間レビュー」へ、そして「最終回答生成」へ、最後に終了点へと続く処理の順序を定義する。このグラフはcompileメソッドで実行可能な形式に変換され、InMemorySaverによって処理途中の状態が自動的に保存される。
最後に、main関数として全ての部品を組み合わせて、コマンドラインからアプリケーションを実行できるようにする。この関数では、create_app()でLangGraphアプリケーションを構築し、各実行セッションに一意な識別子を設定する。ユーザーからプロンプトを受け取り、初期状態を設定した後、app.invoke()メソッドで処理を開始する。人間レビューの段階でアプリケーションが一時停止すると、結果に__interrupt__という情報が含まれるため、プログラムは改善されたプロンプトを表示し、ユーザーからの編集入力を受け付ける。ユーザーが入力した編集内容、または承認の情報をCommand(resume=...)として再度app.invoke()に渡すことで、中断された処理が再開され、最終的な回答が生成されて画面に表示される。
このようにして、AIの効率的な処理と人間の的確な判断を組み合わせた、堅牢なHuman-in-the-Loop AIアプリケーションが構築される。このアプローチは、AIの自動化と人間の品質管理が共存することで、信頼性の高い出力を必要とする様々な分野、例えば教育ツールやコンテンツ作成支援、企業における意思決定支援などにおいて、大きな価値を発揮する。