【ITニュース解説】Building My Smart 2nd Brain, Part 2: Human-in-the-Loop Querying with Robust Checkpointing
2025年09月24日に「Dev.to」が公開したITニュース「Building My Smart 2nd Brain, Part 2: Human-in-the-Loop Querying with Robust Checkpointing」について初心者にもわかりやすく解説しています。
ITニュース概要
「Smart 2nd Brain」は、質問を受け取ると、ベクターデータベースから関連情報を探し、LLMがその情報と対話履歴から回答を生成する。生成された回答は人間が確認・修正し、承認されたものが長期知識として保存される。処理の状態は自動で保存される仕組みだ。
ITニュース解説
「スマートな第2の脳」を構築するプロジェクトの第2部では、ユーザーからの質問に応答するシステムの内部動作に焦点を当てる。このシステムは、LangGraphというフレームワークを使って構築されており、ユーザーの質問を理解し、回答を生成し、その回答を人間が確認・修正した上で、システムに永続的な知識として保存するまでの一連の流れが定義されている。
ユーザーが質問をすると、システムはまず「retriever(検索器)」ノードで関連情報を探し、次に「answer(回答生成)」ノードでその情報をもとに答えを作り、「review(レビュー)」ノードで人間が回答を確認し、「validated_store(検証済み保存)」ノードで新しい知識として保存するという段階を経る。
最初の「retrieverノード」の役割は、ユーザーの質問に関連する情報を大量のデータから探し出すことだ。このデータは、事前にテキストの意味を数値の羅列(埋め込みベクトル)に変換され、ベクターデータベースに保存されている。埋め込みベクトルは、テキストの意味的な類似性を数値で表現したもので、ベクターデータベースは、これらの埋め込みを基に高速に類似情報を検索するために特化している。検索方法には、ベクターデータベースが提供する基本的な検索機能と、より高度な検索戦略を適用できる「retriever」インターフェースがある。retrieverは、単に似た情報を探すだけでなく、検索するドキュメントの数(例: 上位5件)、検索の閾値、結果の並べ替えなど、詳細な検索戦略を決定できるため、システムの検索機能の柔軟性と頑健性を高める。このシステムでは、retrieverが利用可能であればそちらを優先し、例えば「k=5」という設定で最も関連性の高い上位5つのドキュメントを取得するよう指示している。
次に「answerノード」では、retrieverノードで取得された関連ドキュメント、ユーザーからの現在の質問、そしてこれまでの会話履歴をすべてまとめて、LLM(大規模言語モデル)に渡す。LLMはこれらの情報を基に、人間と対話しているかのような自然な言葉で回答を生成する。この際、事前に用意された「プロンプトテンプレート」が使用される。このテンプレートには、LLMの役割(例: 「親切な知識アシスタント」)や、回答生成に関する具体的な指示が含まれている。例えば、「提供された知識ベースのコンテキストに主に依拠して回答する」や「知識が不十分な場合は『利用可能な知識に基づくと、私にはわかりません』と答える」といった指示により、LLMは自身の学習データではなく、ベクターデータベースから検索された情報に基づいて回答し、あいまいな回答を避けるよう制御される。また、過去の会話履歴を含めることで、LLMは文脈を理解し、より一貫性のある対話を生成できる。
回答が生成された後、「reviewノード」で「Human-in-the-Loop(HITL)」、つまり人間参加型のレビュープロセスが行われる。これは、LLMが生成した回答の品質を人間が確認し、必要に応じて修正するための重要な段階である。LangGraphの機能により、このノードで処理を一時停止し、外部システム(ユーザーインターフェースなど)からの人間の入力を待つことができる。システムは、回答の承認、却下、または修正(編集済みの回答も含む)のいずれかのフィードバックを人間から受け取るまで、待機状態に入る。人間からのフィードバックがない場合や自動処理が許可されている場合は、回答は自動的に承認される。却下された場合は最終的な回答は生成されず、修正された場合は人間の手による修正版が最終回答となる。このHITLの仕組みによって、LLMの生成する回答の精度と信頼性が向上し、誤情報の拡散が防がれる。
最終的に承認または修正された回答は、「validated_storeノード」でシステムに永続的な知識として保存される。このノードでは、最終的な回答があるか、そして人間によって承認または修正されたものであるかを確認し、これらの条件を満たせば回答は「検証済み」として扱われる。特に「再利用可能」または「検証済み」と分類された知識タイプの場合、その回答はベクターデータベースに新しいドキュメントとして追加される。この際、いつ、誰が、どのような質問に対して、どのようなフィードバックでこの知識が生成されたかといったメタデータ(付随情報)も一緒に保存される。これにより、システムの知識ベースは継続的に拡充され、将来の質問に対してより正確で豊富な情報を提供できるようになる。もしベクターデータベースが利用できない場合でも、会話履歴はLangGraphのチェックポイントメモリに保存され、システムの連続性は保たれる。
このシステム全体の堅牢性を支える重要な機能が「チェックポイント」である。LangGraphは、各処理ノードが完了するたびに、システムの現在の状態(入力、出力、メタデータなど)を「チェックポイント」として保存する。これにより、もし途中でシステムが停止したり、人間からの入力待ちで一時停止したりしても、その時点の状態が正確に記録されるため、中断した場所から処理を安全に再開できる。これは、これまでの作業が無駄になることなく、いつでも中断したところから再開することを可能にする機能である。このプロジェクトでは、SqliteSaverというファイルベースの軽量なチェックポイント機能が利用されており、外部の複雑なデータベースサービスを必要とせず、手軽に堅牢な状態管理を実現している。
これらの各コンポーネントを組み合わせて「スマートな第2の脳」のグラフを構築するためには、まずLLM(AzureChatOpenAI)、埋め込みモデル(AzureOpenAIEmbeddings)、そしてベクターデータベース(ChromaDB)といった主要な要素を初期化する必要がある。これらのモデルは、APIキーやエンドポイントなどの設定情報を基に構成され、それぞれの役割(テキスト生成、埋め込み生成、データ保存・検索)を果たす準備が整えられる。そして、MasterGraphBuilderというクラスがこれらの初期化されたコンポーネントを受け取り、上述した一連のノード(retriever, answer, review, validated_store)を定義し、それらの間の接続を設定することで、全体の処理フロー、すなわち「グラフ」を構築する。この構築されたグラフは「コンパイル」され、実行可能な状態となる。ユーザーからのリクエストがあると、このコンパイル済みのグラフが呼び出され、質問に対する回答生成プロセスが開始されるのである。
このように、「スマートな第2の脳」は、関連情報の検索、大規模言語モデルによる回答生成、人間によるレビュー、そして永続的な知識の保存という多段階のプロセスを経て、ユーザーに高品質な情報を提供する。そして、その背後には、処理の中断と再開を可能にするチェックポイント機能が、システムの信頼性と使いやすさを支えている。これにより、単なる自動応答システムではなく、人間と協力しながら成長し、進化する「第2の脳」が実現される。