LangChain Agentsとは|Pythonによる実装方法まで徹底解説

当ページには広告が含まれています。

こんにちは、DXCEL WAVEの運営者(@dxcelwave)です!

こんな方におすすめ!
  • LangChain Agentsの概要について詳しく知りたい!
  • Pythonを用いてLangChain Agents基本機能を確認したい!
目次

LangChainとは?

【LangChain公式】https://python.langchain.com/en/latest/index.html

LangChainとは、ChatGPTを代表とするような大規模言語モデル(LLM)の機能を拡張し、サービスとして展開する際に役立つライブラリです。

LangChainの主要機能

LangChainの主要な機能として以下があります。

主要機能概要
Models様々な大規模言語モデルを同じインターフェース上で取り扱えるようにする機能
Promptsプロンプトの管理、最適化、シリアル化ができる機能
Memory言語モデルを用いてユーザーと対話した履歴を記憶する機能
Data connection言語モデルに外部データを投入し、外部データに基づく回答を生成する機能
Chainsチェーンを複数繋げて、一連の処理を連続実行する機能
Agentsユーザーからの要望をどんな手段・順序で応えるか決定・実行する機能

LangChainの各種機能の詳細を知りたい方は、こちらの記事をご覧下さい。

あわせて読みたい
LangChainとは?|概要・主要機能を徹底解説 LangChainの概要および主要機能であるModels・Prompts・Data Connection・Agents・Memory・Chainsについて解説します。

【参考】LangChainを用いたプログラミング実装におすすめの学習教材

LangChainライブラリを用いてプログラミングし、アプリケーションを実装したい方向けに、おすすめの学習教材をご紹介します。

LangChain|Agents(エージェント)

LangChain Agentsとは、言語モデルを使用して、ユーザーからの要望をどんな手段・順序で実行するか決定する機能です。

Langchain Agentsの機能を細分化すると、以下4つに分けられます。

  • Agent
  • Tools
  • Toolkit
  • Agent Executor

Tools

Tools(ツール)とは、エージェントが外部とやり取りをするための機能です。

Toolの参考事例

OpenAI社のGPT-4を代表とするLLMは「最新情報を知ることができない」という弱点がありました。これは、LLMが外部の世界と接続していないためです。

この問題の解決策としてLangChain Agentsが挙げられています。Agentsに用意されたToolsを用いることで、外部の世界と接続でき、最新データにアクセスできるようになるのです。

公開中のTool一覧

前述では最新データを得るためのツールを例に紹介しましたが、その他にも多数の種類のツールが公開されています。

Apify
ArXiv API Tool
AWS Lambda API
Shell Tool
Bing Search
ChatGPT Plugins
DuckDuckGo Search
File System Tools
Google Places
Google Search
Google Serper API
Gradio Tools
GraphQL tool
HuggingFace Tools
Human as a tool
Call the API
Use Metaphor as a tool
OpenWeatherMap API
Python REPL
Requests
SceneXplain
Search Tools
SerpAPI
Twilio
Wikipedia
YouTubeSearchTool
Zapier Natural Language Actions API
Example with SimpleSequentialChain

Agents

Agentsとは、プロンプトの内容に基づき、言語モデルがどのようなツールを用いて、どのようなアクションを取るべきか判断してくれる機能です。

Agentsの種類

LangChain Agentsには様々な種類のAgentが用意されています。

スクロールできます
zero-shot-react-description「Toolの説明文のみ」を渡すと、どのツールを使用するか決定してくれるエージェント。
react-docstoreドキュメントを検索するための「Search Tool」と、ドキュメント内の用語を検索するための「Lookup Tool」を渡すと、 指定のドキュメントストアと対話してくれるエージェント。
self-ask-with-search自問自答することで、Q&A精度を高めてくれるエージェント。
conversational-react-description会話用に最適化されたエージェント。 エージェントがユーザーとのチャットを通じて、必要な時にツールの呼出ができる。

Toolkits

Toolkitsとは、デフォルトでツールを搭載したAgentであり、特定のユースケースに応用されています。

LangChainには現在次のようなToolkitsが公開されています。

Azure Cognitive Services Toolkit
CSV Agent
Gmail Toolkit
Jira
JSON Agent
OpenAPI agents
Natural Language APIs
Pandas Dataframe Agent
PlayWright Browser Toolkit
PowerBI Dataset Agent
Python Agent
Spark Dataframe Agent
Spark SQL Agent
SQL Database Agent
Vectorstore Agent

Agent Executor

Agent Executorとは、エージェントが決定したアクションを実行するための機能です。

【LangChain事前準備】Python環境構築・OpenAI API取得

LangChain Agents機能構築に際して必要な事前準備を行います。

Pythonライブラリのインストール

プログラム実装に際して、以下に示すライブラリを事前にインストールしておきましょう。

OpenAI

ChatGPTを代表とするOpenAI社のAPI利用に際して必要となるライブラリです。

pip install openai

LangChain

LangChainの利用に際して必要となるライブラリです。

pip install langchain

【ChatGPT】OpenAI社のAPI発行

LangChain機能構築に際して、OpenAI社が提供するGPTモデルをAPI経由で呼び出す必要があります。

OpenAI社の公式サイトから「API シークレットキー」を事前に発行しておきましょう。なお、シークレットキーの発行方法はこちらの記事で詳しく解説しています。

あわせて読みたい
【Python×ChatGPT】チャットボット作成入門|OpenAI APIの利用申請手順も解説 「ChatGPT APIの利用手順」と「PythonでChatGPT APIを呼び出し、チャットボットを作成する方法」についてそれぞれ解説します。

LangChain AgentsをPythonを用いて実装する

それでは実際にLangChain AgentsをPythonを用いて実装する方法について解説します。今回は「米国株式銘柄の株価を自然言語で評価できるエージェント」を作成することとします。実装のポイントは以下6点です。

  1. Toolsを作成
  2. LLMを作成
  3. プロンプトを作成
  4. ToolとLLMを紐付け
  5. Agentを作成
  6. Agentを実行

Pythonライブラリのインストール

Pythonプログラムの先頭に、OpenAI社のサイトから取得したシークレットキーを配置します。

import openai
import os

# APIシークレットキーを記述
SECRET_KEY  = "............."

# API認証情報設定
os.environ["OPENAI_API_KEY"] = SECRET_KEY

Toolsを作成

LangChain Agentsが利用できるToolsを定義します。今回は次のようなToolを関数形式で作成します。

  • 直近の米国株式銘柄の株価を取得する関数
  • ある米国株式銘柄が指定の期間でどのくらい株価が変動したか確認するための関数

コード

以下関数にはyfinanceのライブラリを利用することとします。

from langchain.agents import tool
from datetime import datetime, timedelta
import yfinance as yf

# =================================================================================
# 関数作成
# =================================================================================

@tool
def current_stock_price(ticker:str) -> dict:
    """株式銘柄(米)の最新株価取得する関数"""
    data   = yf.Ticker(ticker).history(period="1d")
    result = {"price": data.iloc[0]["Close"], "currency": "USD"}
    return result

@tool
def stock_performance(ticker:str, days:int) -> dict:
    """ 過去days間で変動した株価[%] """
    start_date    = datetime.today() - timedelta(days=days)
    ticker_data   = yf.Ticker(ticker)
    history       = ticker_data.history(start=start_date)
    old_price     = history.iloc[0]["Close"]
    current_price = history.iloc[-1]["Close"]
    result        = {"percent_change": ((current_price - old_price) / old_price) * 100}
    return result


# =================================================================================
# ツール定義
# =================================================================================

tools = [current_stock_price, stock_performance]

出力イメージ

各種関数を実行した際の出力イメージは以下の通りです。

# 関数実行
current_stock_price("AAPL")
# 出力イメージ
# {'price': 195.7100067138672, 'currency': 'USD'}


# 関数実行
stock_performance("GOOG", 30)
# 出力イメージ
# {'percent_change': 3.7588251624831}

LLMを作成

Agentが実行するLLMを定義します。以下のコードを記載しましょう。

from langchain.chat_models import ChatOpenAI

llm = ChatOpenAI(model       = "gpt-3.5-turbo",   # モデル
                 temperature = 0,                 # 出力する単語のランダム性(0から2の範囲) 0であれば毎回返答内容固定
                )

プロンプトを作成

LLMに渡すプロンプトを作成します。以下のコードを実行しましょう。

from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder

prompt = ChatPromptTemplate.from_messages([
                    ("system", "あなたは米国株式銘柄の株価データをもとにパフォーマンスを評価します。"),
                    ("user", "{input}"),
                    MessagesPlaceholder(variable_name="agent_scratchpad"),
                ])

ここでプロンプトにはinputagent_scratchpadという2つの入力変数を渡しています。

inputはエージェントを利用するユーザーの質問です。agent_scratchpadは前述で定義したツール呼出時に得られるメッセージに該当します。

ToolsとLLMを紐付け

前述で作成したToolsとLLMをバインドします。以下のコードを実行しましょう。

LLMにToolsをバインドすることで、LLMが呼び出される毎に、併せて関数情報も渡されるよになります。

コード

from langchain.tools.render import format_tool_to_openai_function

llm_with_tools  = llm.bind(
                    functions = [format_tool_to_openai_function(t) for t in tools])

出力イメージ

上記引数のfunctionsに渡した中身は、次のような構造になっています。

print([format_tool_to_openai_function(t) for t in tools])

# 出力イメージ
# [{'name': 'current_stock_price', 
#   'description': 'current_stock_price(ticker: str) -> dict - 株式銘柄(米)の最新株価取得する関数', 
#   'parameters': {'title': 'current_stock_priceSchemaSchema', 
#                  'type': 'object', 
#                  'properties': {'ticker': {'title': 'Ticker', 
#                                            'type': 'string'}}, 
#                  'required': ['ticker']}}, 
#  {'name': 'stock_performance', 
#   'description': 'stock_performance(ticker: str, days: int) -> dict - 過去days間で変動した株価[%]', 
#   'parameters': {'title': 'stock_performanceSchemaSchema', 
#                  'type': 'object', 
#                  'properties': {'ticker': {'title': 'Ticker', 
#                                            'type': 'string'}, 
#                                 'days': {'title': 'Days', 
#                                          'type': 'integer'}}, 
#                  'required': ['ticker', 'days']}}]

Agentを作成

ここまで作成したTools、LLM、プロンプト情報をもとにエージェントを作成します。

from langchain.agents.format_scratchpad import format_to_openai_function_messages
from langchain.agents.output_parsers import OpenAIFunctionsAgentOutputParser

agent = (
            {
                "input": lambda x: x["input"],
                "agent_scratchpad": lambda x: format_to_openai_function_messages(
                    x["intermediate_steps"]
                ),
            }
            | prompt
            | llm_with_tools
            | OpenAIFunctionsAgentOutputParser()
        )

Agentを実行

最後にエージェントを実行するための関数を作成し、実際に利用してみましょう!

コード

from langchain.agents import AgentExecutor

def agent_execute(message:str) -> dict:
    # Agent Executorの定義
    agent_executor = AgentExecutor(
                            agent   = agent, 
                            tools   = tools, 
                            verbose = True, 
                            intermediate_steps=True
                                )
    # Agent Executor実行
    result = agent_executor.invoke({"input": message})
    
    return result

関数実行

実際に関数を実行してみましょう。

# 実行例(1)
agent_execute("Googleの直近の株価が知りたい")

# 出力イメージ
# > Entering new AgentExecutor chain...
#   Invoking: `current_stock_price` with `{'ticker': 'GOOGL'}`
#   {'price': 134.99000549316406, 'currency': 'USD'}Googleの直近の株価は134.99ドルです。

# > Finished chain.
#   {'input': 'Googleの直近の株価が知りたい', 'output': 'Googleの直近の株価は134.99ドルです。'}
# 実行例(2)
agent_execute("Googleの株価は過去30日でどれくらい変動したか?")


# 出力イメージ
# > Entering new AgentExecutor chain...
#   Invoking: `stock_performance` with `{'ticker': 'GOOGL', 'days': 30}`
#   {'percent_change': 3.6471128682878584}Googleの株価は過去30日間で約3.65%変動しました。

# > Finished chain.
#   {'input': 'Googleの株価は過去30日でどれくらい変動したか?',
#    'output': 'Googleの株価は過去30日間で約3.65%変動しました。'}

【参考】PythonによるLLM実装|ChatGPT・LangChain

本記事では、PythonでLLMを構築し、様々なタスクをこなす機能の実装方法を多数解説しています。

Python × ChatGPT関連記事

【あわせて読みたい】

Python × LangChain関連記事

【あわせて読みたい】

自然言語処理の学習におすすめの書籍

あわせて読みたい
自然言語処理(NLP)学習におすすめ入門本・動画教材8選|Pythonによる機械学習・ディープラーニング向け... 「自然言語処理の概要とそれを実装するPythonプログラミング手法を学びたい」「機械学習・AIを組み合わせたモデル開発手法を知りたい」このような要望にお答えします。

自然言語処理の概要について詳しく学びたい方向けに、厳選したおすすめの学習教材を紹介しています。

最後に

この記事が気に入ったら
フォローしてね!

本記事をシェア!
目次