LangChain:LLMがあなたのコードとやり取りできるようにします

'LangChain Enables LLM to interact with your code.'

写真:David Clode on Unsplash

ツールを使用してカスタム関数を実装する方法を学ぶ

イントロダクション

生成モデルは皆の注目を浴びています。多くのAIアプリケーションでは、もはや機械学習の専門家が必要ではなく、単にAPI呼び出しの方法を知っていれば十分です。

最近、私はハッカソンに参加しました。カスタムの固有名エンティティ認識を実装する必要がありましたが、直接LLMを使用し、そのfew-shot learnerの機能を利用して望む結果を得ました。ハッカソンに勝つには十分でした!(プロジェクトはこちらでチェックできます)。したがって、多くの実世界のアプリケーションでは、モデルの作成よりもこれらのLLMとの相互作用と使用方法に焦点が移っています。LangChainはそれを可能にするライブラリであり、最近いくつかの記事を書いています。

LangChainツール

ツールはLLMがその機能を拡張するために使用できるユーティリティです。ツールはチェーンやエージェント内でインスタンス化することができます。例えば、LLMは応答する前にWikipediaの検索を行うかもしれません。もちろん、エージェントは複数のツールを使用することができるので、通常はツールのリストを定義することが行われます。

では、ツールの構造を見てみましょう。ツールはいくつかのフィールドからなるクラスにすぎません

  • name (str): ツールの一意の名前を定義します
  • description (str): ツールの役立ちを自然言語で説明します。LLMはこの説明を読み取り、クエリに対してツールが必要かどうかを判断することができます。
  • return_direct (bool): ツールは例えばカスタム関数の出力を返すかもしれません。その出力をユーザーに直接表示するか(True)LLMによって前処理されるか(False)を選択します。
  • args_schema (Pydantic BaseModel): たとえば、ツールはユーザーのクエリから入力パラメータを取得する必要があるカスタム関数を使用するかもしれません。各パラメータについて詳細な情報を提供することで、LLMはこのステップをより簡単に行うことができます。

ツールの定義方法

ツールの定義には複数のアプローチがありますが、この記事ではいくつかを見ていきます。まず、必要なライブラリをインポートし、OpenAIモデルをインスタンス化します。これにはトークンが必要ですが、その取得方法については以前の記事を参照してください。

!pip install langchain!pip install openaifrom langchain import LLMMathChain, SerpAPIWrapperfrom langchain.agents import AgentType, initialize_agentfrom langchain.chat_models import ChatOpenAIfrom langchain.tools import BaseTool, StructuredTool, Tool, toolimport osos.environ["OPENAI_API_KEY"] = ... # ここにAPIトークンを入力してくださいllm = ChatOpenAI(temperature=0)

ツールをインスタンス化する最初の方法は、Toolクラスを使用することです。

例えば、ツールにウェブ検索の機能を持たせたい場合、GoogleのSerpAPIというAPIを使用します。ここでAPIを登録して取得することができます:https://serpapi.com/ SerpAPIWrapperクラスをインスタンス化し、from_functionメソッドを使用してツールを定義します。

funcフィールドには、このツールを使用して起動したいメソッドへのポインタを置く必要があります。これはSerpAPIのrunメソッドです。そして、名前と説明をツールに与えます。説明するよりもやってみるほうが簡単です。

search = SerpAPIWrapper()tools = [    Tool.from_function(        func=search.run,        name="検索",        description="現在のイベントに関する質問に答える必要があるときに便利です。"    ),]

これでエージェントに作成したツールのリストを提供することができます。この場合は1つだけです。

agent = initialize_agent(    tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True)agent.run(    "ボブ・ディランのガールフレンドは誰ですか?")

カスタムツール

私の意見では、カスタムツールを作成するための最も明確な方法は、BaseToolクラスを継承することです。

class CustomTool(BaseTool):    name = "custom_tool"    description = "VoAGI記事に関する質問に答える際に便利です"    def _run(        self, query: str, run_manager: Optional[CallbackManagerForToolRun] = None    ) -> str:        """ツールを使用します。"""        return "私はVoAGIの専門家ではありませんが、マルチェロはかなり優れていると思います! :I)"    async def _arun(        self, query: str, run_manager: Optional[AsyncCallbackManagerForToolRun] = None    ) -> str:        """ツールを非同期で使用します。"""        raise NotImplementedError("custom_searchは非同期をサポートしていません")

これはカスタムツールの実装です。このツールは、ユーザーがVoAGIに関する質問をするたびに使用されます。ただし、返される文字列は私が設定したものとは異なる場合があります。それは、Large Language Modelによってさらに処理されるからです。

もし直接何かを返したい場合は、以下のように「return_direct」フィールドを追加してください。

class CustomTool(BaseTool):    name = "custom_tool"    description = "VoAGI記事に関する質問に答える際に便利です"    return_direct=True    def _run(        self, query: str, run_manager: Optional[CallbackManagerForToolRun] = None    ) -> str:        """ツールを使用します。"""        return "私はVoAGIの専門家ではありませんが、マルチェロはかなり優れていると思います! :I)"    async def _arun(        self, query: str, run_manager: Optional[AsyncCallbackManagerForToolRun] = None    ) -> str:        """ツールを非同期で使用します。"""        raise NotImplementedError("custom_searchは非同期をサポートしていません")

非同期呼び出しには_arunメソッドを使用しない場合でも、BaseToolは抽象クラスであるため、すべての抽象メソッドを実装する必要があります。そうしないとエラーが発生します。

実際の例

ある日、友人が言いました。「ねえ、マルチェロ、AIとかその手のことをやっているんだから、医師の勤務時間を返し、予約を取るチャットボットを作ってくれない?」この問題を解決するために最初に考えたことは、LangChainを使用してLLMがユーザーと対話し、モデルがユーザーが勤務時間を見たいと要求したことを理解すると、単にCSVファイル(または好きな場合はデータフレーム)を返すことです。

したがって、同じことがこのユースケースでも使用できます。work_time.csvというCSVファイルがあると仮定しましょう。

import pandas as pdclass WorkingHours(BaseTool):    name = "working_hours"    description = "医療スタッフの勤務時間に関する質問に答える際に便利です"    return_direct=True+    def _run(        self, query: str, run_manager: Optional[CallbackManagerForToolRun] = None    ) -> str:        """ツールを使用します。"""        df = pd.read_csv("working_hours.csv") #リアルタイムのデータをDBから取得する必要があるかもしれません        return df    async def _arun(        self, query: str, run_manager: Optional[AsyncCallbackManagerForToolRun] = None    ) -> str:        """ツールを非同期で使用します。"""        raise NotImplementedError("custom_searchは非同期をサポートしていません")

これで、友人が望んだアプリのプロトタイプがわずか数行のコードで完成しました!もちろん、見た目をより良くするために優れたフロントエンド開発者と協力して作業してください!

最後の考察

LangChainは、LLMのパワーをさまざまなコンテキストで使用できる最近のライブラリです。私は、LLMを使用してコンテキストを理解し、ユーザーが要求していることを理解し、実際のタスクを解決するために独自のカスタム関数を実行することが非常に便利だと思います。これにより、柔軟性のあるコードを書くことができます。アプリに機能を追加するには、単に「この関数を使用するようにモデルに指示する」だけで済みます。興味がある場合は、この記事をVoAGIでフォローしてください!

💼 リンクトイン ️| 🐦 ツイッター | 💻 ウェブサイト

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more