「RAG」とは少し異なる「Function Calling」 企業はどのように活用すべき?
近年では生成AIの利用も進んでおり、先進的な企業ではRAGを活用した自社情報の活用も行われつつあります。生成AIの活用を進める際に把握しておきたいのが、Function Callingという技術です。RAGと近しい用途で利用できるFunction Callingをうまく活用することで、さらに生成AIによる効果を得ることができます。
この記事では、Function Callingの概要やプロセス、具体的なユースケースなどについてご紹介します。
Function Callingとは?
Function Callingは、LLM(Large Language Model:大規模言語モデル)が特定のタスクを実行する際に、外部の関数を呼び出す必要性を検知し、教えてくれるプロセスを指します。
たとえば、LLMに「今日のイベント情報を教えてください」と質問するケースを想定します。LLMは今日のイベント情報について把握しているわけではないため、この質問に回答するためにはLLMは外部から情報を取得する必要があります。このとき、LLMは本日のイベント情報を取得する外部関数の呼び出しが必要であることを、呼び出し元のアプリケーションに返却します。これを受け、アプリケーションは本日のイベント情報を取得する関数を実施し、ユーザーに返却します。
Function Callingの必要性
なぜこのような仕組みが必要なのでしょうか。ポイントは「LLMの入力内容により外部関数の呼び出しの必要性が変わる」という点です。
上述した例では、イベント情報を確認する内容をLLMに入力したため、イベント情報の取得関数の実行が必要でした。一方で、単に「この文章を要約して」といった入力や「XXXに関するアイディアを出して」といった入力であれば、イベント情報を取得する関数を利用する必要はありません。
Function Callingにより、LLMが入力内容に応じてどの外部関数を呼び出すべきかを教えてくれることで、ユーザーのニーズに合わせた処理を実施することができるのです。
RAGとFunction Callingの比較
RAGについて知っている方であれば、Function CallingはRAGの仕組みと似ていると感じられるかもしれません。RAG(Retriever-Augmented Generation)は、情報検索とLLMを組み合わせた技術です。RAGでは、事前にLLMが保有していない独自情報を個別に構築したデータベースに格納しておきます。ユーザーがLLMに入力を行う際に、そのデータベースから必要な情報を取り出し、LLMに入力します。LLMは自身が持っている情報と、追加で入力された情報を基に、ユーザーの意図に沿った回答を作成します。
このように、RAGとFunction Callingは、いずれもLLMの機能拡張を目的としており、外部の情報源を活用する点で共通しています。しかし、両者の仕組みは異なります。RAGでは、事前に構築されたデータベースから情報を引き出すことでLLMにない情報を利用しますが、Function Callingでは入力内容を踏まえて必要な外部関数を判断します。つまり、RAGは「静的」な情報の取得に適しているのに対し、Function Callingは「動的」な処理を必要とするケースに有効です。
たとえば、RAGは社内情報など特定領域のデータを基に、ユーザーの質問に対して包括的な回答を提供する場合に効果的です。一方、Function Callingは、ユーザーの多様な入力内容に合わせて処理するタスクが変わるようなシステムにおいて、その柔軟性を発揮します。
このように、RAGとFunction Callingはどちらが優れているというものではなく、それぞれの手法を適切に使い分けるべきものです。これにより、LLMの能力を最大限に引き出し、ユーザーに対して最適な回答を提供できるようになります。
Function Callingの流れ
以下では、Function Callingを実施する流れを、より具体的にご紹介します。ここでは、ECサイトに設置するチャットボットをイメージして「商品の価格を教えてほしい」というユーザーからの質問に対応するケースを想定します。
ユーザーによる質問
まず、ECサイトを訪れたユーザーが、LLMを利用したチャットボットに対して「この商品の価格を教えてほしい」と質問をします。
LLMが実行すべき関数を返却
LLMはユーザーの質問を解析し、その内容に基づいてどの外部関数を呼び出すべきかを判断します。この場合、LLMは商品の価格情報を持っていませんので、商品の価格を取得するための外部関数が必要です。LLMは「価格を取得する関数」を呼び出す指示を生成します。
関数の実行
LLMから外部関数の呼び出しが必要である旨を受領したチャットボットは、価格を取得する関数を実行します。この関数は、社内の商品データベースにアクセスし、対象となる商品の最新価格情報を取得します。
結果の出力
関数から得られた価格情報をもとに、チャットボットはユーザーに対して「最新の商品価格は○○円です」と回答します。このような流れでFunction Callingを活用することで、ユーザーの質問に対して正確かつ迅速に回答することができます。
Function Callingを活用するメリット
Function Callingを活用するメリットはどのような点にあるのでしょうか。以下では、3つの観点からご紹介します。
自社サービスと生成AIの統合
Function Callingを用いることで、上述したチャットボットの例のように自社サービスとLLMをシームレスに統合することができます。既存のサービスにLLMを組み込む際に、Function Callingを用いることで効率的な連携が可能となります。Function Callingでは外部関数を呼び出す形で自社サービスとの連携を行うため、疎結合となり両者の独立性を保ちやすくなります。
たとえば、LLM自体に製品価格などの自社サービスに関する情報を学習させると、製品価格が変更になるたびに再学習のプロセスが必要となります。一方で、Function Callingにより両社の独立性を高めておけば、たとえ製品価格が変更になったとしても、呼び出し側のデータベースを変更するだけで済みます。
これにより、Function Callingによりサービス全体の運用を効率的に行うことができます。
LLM利用料の節約
RAGと比較すると、Function CallingはLLMの利用量を抑えやすい仕組みです。RAGの実施においては、データベースから取得した情報を生成AIに追加で入力することになり、トークン数が大きくなりがちです。一方でFunction Callingでは、特段追加でのデータ入力は行わないため、LLMへ入力するトークン数を抑えることができます。
このように、コスト節約の観点からもFunction Callingは有効な選択肢となります。
セキュリティの強化
見逃せない観点として、Function Callingの利用によるセキュリティの強化が挙げられます。RAGと異なり、Function Callingでは、LLMに対してユーザーの質問に対応するために必要な最小限のデータのみをインプットします。これにより、社内情報など機密性の高いデータをLLMへインプットする必要がなくなります。もちろん、RAG利用においても安全性の高い環境を用意し、入力データを再学習に利用しない契約の元、機密データを扱うことが可能です。しかしながら、そもそもデータを入力しないというのは最大のセキュリティ対策となります。
企業における想定ユースケース
具体的に、企業においてどのようにFunction Callingを利用することができるのでしょうか。ここでは、3つのケースをご紹介します。
カスタマーサポート
カスタマーサポートにおいては、顧客からの問い合わせに迅速かつ的確に対応することが求められます。ここで、Function Callingの活用が有効です。
たとえば、顧客が特定の商品についての在庫状況を問い合わせた場合、Function Callingを利用すればLLMは即座に在庫管理システムから必要な情報を取得し、「現在の在庫は○○個です」と回答することができます。このような対応を行うことができるチャットボットを構築できれば、コールセンターへの入電数を削減でき、オペレーターの負担を軽減することができるでしょう。また、必要な情報を素早く入手できるため、顧客満足度の向上にもつながります。
業務プロセス自動化
Function Callingは、企業の業務プロセスを自動化するための手段としても利用できます。たとえば、外部情報を必要とする定期的なレポート作成といった反復作業を実施する際に、Function Callingの活用が有効です。レポートの作成自体はLLMにお任せしてしまい、必要となるインプット情報を外部関数で取得する流れを構築できれば、レポート作成作業の大部分を自動化できます。
このように、業務効率化の観点でもFunction Callingの活用を検討することができます。
市場動向のリアルタイム分析
Function Callingを利用することで、市場動向をリアルタイムで分析することも可能です。一般的にLLMは過去のデータしか学習しておらず、現在や未来のデータを利用した回答生成が難しいという点が弱点ですが、Function Callingによりこの弱点を補うことができます。市場情報のようなリアルタイム性の高い情報も、Function Callingにより取り扱えます。
さまざまなデータソースから最新の市場情報を取得し、LLMにインプットすることで、トレンド分析や競合分析などもしやすくなります。企業は迅速にデータドリブンな意思決定をしやすくなり、たとえば新商品の発売時期や価格設定の戦略を立てる際にリアルタイムの市場データをもとにLLMに分析を行わせるような用途も実現できます。
Function Calling利用時の注意事項
最後に、Function Callingの利用における注意事項をまとめます。
Function Callingを利用できるLLMか
Function CallingはLLM側に実装される機能です。よって、利用するLLMによってFunction Callingに対応できるかどうかが変わります。
現時点(2024年11月)では、Chat GPTの以下のバージョンにてFunction Callingを利用することができます。
〇関数の並列呼び出しが可能であるバージョン
gpt-3.5-turbo (1106)
gpt-3.5-turbo (0125)
gpt-4 (1106-Preview)
gpt-4 (0125-Preview)
gpt-4 (vision-preview)
gpt-4 (2024-04-09)
gpt-4o (2024-05-13)
gpt-4o-mini (2024-07-18)
〇基本的な関数呼び出しが実施できるバージョン
gpt-4 (0613)
gpt-4-32k (0613)
gpt-3.5-turbo-16k (0613)
gpt-3.5-turbo (0613)
※参考:Microsoft「Azure OpenAI Service (プレビュー) で関数呼び出しを使用する方法」
LLMが関数を実行するわけではない
Function Callingを利用する際に誤解されがちなのが、Function CallingによりLLM自体が外部関数を実行してくれるわけではないという点です。LLMはあくまで「質問の意図に対応するためには、XXXという外部関数の実行が必要です」という内容までを返却し、実際の呼び出し処理はLLMへ質問を行ったアプリケーションが行うこととなります。
この流れを意識しておかないと、Function Callingの動きが理解しにくくなるため、注意が必要です。
プロンプトインジェクションによる情報流出リスク
Function Callingを利用する際には、プロンプトインジェクションによる情報流出に気を付けなければなりません。
プロンプトインジェクションとは、LLMに対して悪意のある入力を与えることで、意図しない動作や情報流出を引き起こす攻撃手法です。プロンプトインジェクションにより不正に外部関数を呼び出しする処理を行わされてしまうことにより、意図しない形で外部関数を実行され、本来提供するべきでない情報が提供されてしまう可能性があります。
対策として、入力データのサニタイジングやエンコーディング、プリペアドステートメントの使用などが必要です。
まとめ
この記事では、Function Callingについて詳しく解説しました。LLMの機能拡張方法としてRAGについては多くの企業で採用が進んでいる一方で、Function Callingについてはまだまだ利用が進んでいないのではないでしょうか。Function Callingにより、LLMの活用方法をさらに広げることができます。LLMを活用されている企業においては、抑えておきたい技術といえるでしょう。