【ITニュース解説】LLM-Powered Query Processing: From Natural Language to Tool Execution
2025年09月20日に「Dev.to」が公開したITニュース「LLM-Powered Query Processing: From Natural Language to Tool Execution」について初心者にもわかりやすく解説しています。
ITニュース概要
LLMが自然言語の問い合わせを解析し、適切なツールを自動で選択・実行するシステムをJavaで構築した。ユーザーの質問意図をLLMが理解し、「直接回答」「単一ツール実行」「複数ツール実行」に分類。ツールに定義されたスキーマから必要なパラメータを抽出し、自動実行することで、複雑な解析なしでインテリジェントな処理を実現する。
ITニュース解説
大規模言語モデル(LLM)を使って、ユーザーが自然な言葉で投げかける質問や指示を理解し、それに応じて適切なITツールを自動的に選び、実行するシステムを構築する取り組みが進められている。これは、AIエージェントと呼ばれる、まるで人間のように賢く振る舞うアプリケーションをゼロから作り上げる一連のプロジェクトの一部であり、特に今回は、LLMの持つ知的な能力を最大限に活用して、ユーザーの複雑な要求を解釈し、具体的な行動へと繋げる中核的な仕組みに焦点を当てている。
このシステムでは、ユーザーからの質問を大きく三つの種類に分類して処理する。一つ目は、LLMが自身の知識だけで直接答えられる「直接回答」の質問だ。「2+2は何か?」のような一般的な知識や簡単な計算に関する質問がこれにあたる。二つ目は、特定の「単一ツール」を使う必要がある質問で、「東京の天気はどう?」のように、天気予報を提供するような外部システムと連携して情報を取得する必要がある場合が該当する。そして三つ目は、「複数ツール」を組み合わせて使うことで初めて実現できる複雑な指示で、「天気予報を取得してファイルに保存して」のように、複数のステップや異なる種類のツールを連携させる必要がある。このシステムが画期的なのは、従来であればプログラマーが非常に複雑な「解析ロジック」を記述してユーザーの意図を読み解く必要があったのに対し、その最も難しい「意図理解」の部分をLLMの高度な能力に任せる点にある。
LLMがユーザーの質問を解析した結果は、「QueryAnalysis」という、システム内で扱いやすい情報のかたまりとして整理される。この「QueryAnalysis」には、質問が「直接回答」「単一ツール」「複数ツール」のどれに該当するかという「実行タイプ」に加え、単一ツールの場合は具体的なツール名や、ツールを実行するために必要な「パラメータ」(例えば、天気予報ツールであれば「場所」や「日付」などの情報)が格納される。また、このシステムに登録されている各ツールも強化されており、それぞれのツールがどのような「入力スキーマ」、つまりどんなパラメータをどんな形式で必要とするかという「設計図」を持つようになった。この設計図は、ツールを提供するサーバーから直接取得され、LLMがツールを使う際に、正しい情報を正確に引き出すための重要な手助けとなる。
「SimpleInference」というクラスが、ユーザーの質問を受け取ってから最終的な回答を生成するまでの一連の流れを管理する中心的な役割を担う。このクラスは、ユーザーからの質問をLLMに一度だけ送り、その際に質問の分類と、ツールを使う場合のパラメータ抽出の両方を行わせる。LLMから返ってきた「QueryAnalysis」の結果に基づいて、質問が直接回答なのか、単一ツールを使うべきなのかを判断し、それぞれの処理経路に振り分ける。さらに、ユーザーが「それが何?」や「あの情報」といった、前の会話の文脈に依存する表現を使っても正しく理解できるように、直前のツールの実行結果を一時的に記憶しておく仕組みも持っている。
LLMに正確に仕事を行わせるためには、どのような指示文(これを「プロンプト」と呼ぶ)を与えるかが非常に重要だ。このシステムでは、「ANALYSIS_PROMPT_TEMPLATE」という特定の指示文を使ってLLMに、ユーザーの質問の構文と意味を詳細に分析させ、質問の種類を分類させ、もしツールが必要なら最適なツールを選び、そのツールが求めるパラメータをすべて抽出し、そして特定の形式で回答するよう細かく指示する。特に工夫されているのは、プロンプトの中に利用可能なツールのリストと、それぞれのツールがどのような「入力スキーマ」(パラメータの設計図)を持つかを具体的に含める点だ。これにより、LLMはツールがどのような情報を必要とするかを正確に理解し、より賢く、間違いなくツールを選択し、パラメータを抽出できる。また、前の会話の文脈を示す「Previous result」もプロンプトに含めることで、LLMは「それ」や「あれ」といった代名詞を正しく解釈し、連続した自然な会話ができるよう工夫されている。
LLMが指示通りに特定の形式で応答してきた後、その応答をシステムが理解できる形に変換する「応答解析」の処理が行われる。例えば、「SINGLE_TOOL: weather-server:get_current_weather PARAMS: {"location": "Tokyo"}」のような形式で返ってきた情報を、システム内部で使える「QueryAnalysis」というデータ構造に正確に変換する。これにより、システムはLLMが何を意図し、どのツールをどのパラメータで実行すべきかを正確に把握できる。
例えば、「東京の明日の天気は?」という質問が入力されると、まずこの質問と、利用可能な天気予報ツール(とその入力スキーマ)がLLMに渡される。LLMは質問を解析し、「天気の取得」が目的であり、weather-serverのget_current_weatherツールを使うべきだと判断し、「location」に「Tokyo」というパラメータを抽出する。次に、システムはこの情報に基づいて実際の天気予報ツールを呼び出し、その結果(例えば「明日の東京は22℃で曇り」)を受け取る。最後に、このツールの結果をユーザーに自然な言葉で伝えるための応答文を生成し、「明日の東京の天気は22℃で曇りでしょう。」といった形でユーザーに提示する。
現在は単一のツールを処理する部分に焦点を当てているが、将来的には複数のツールを組み合わせてより複雑なタスクを実行する仕組みも構想されている。これには、「東京の天気予報を取得し、その結果をファイルに保存する」のように、ツールを順番に実行する「順次依存タスク」や、「東京、大阪、京都の天気を調べて、まとめて概要を伝える」のように、複数のツールを同時に実行し、その結果を統合して要約する「並列タスクと要約」が考えられている。「もし東京で雨が降っていたら、長期予報を取得する」のように、前のツールの結果に基づいて次に実行するツールを選ぶ「条件依存タスク」など、多様なパターンが検討されている。これらの複雑な連携を実現するためには、ユーザーの質問を細かく分解したり、ツール間で情報を適切に受け渡したり、最終的な結果を統合したりするなどの課題を解決していく必要がある。
今回構築された「SimpleInference」クラスは、LLMの推論能力を最大限に活用し、ユーザーの自然言語による質問の意図を正確に解析し、ツールが必要とするパラメータをスキーマ定義に基づいて抽出し、これらを単一のLLM呼び出しで効率的に行えるシステムを実現した。さらに、構造化されたプロンプトテンプレートを使うことで、システムの保守性と拡張性も高まっている。このシステムは、市販のAIアシスタントに匹敵する能力を持ちながらも、シンプルで管理しやすい設計になっている。次のステップでは、この強力なクエリ処理システムを基盤として、ユーザーが自然に会話できるチャットアプリケーションのインターフェースを構築する予定だ。