こんにちは、DXCEL WAVEの運営者(@dxcelwave)です!
- LangChain Agentsの概要について詳しく知りたい!
- Pythonを用いてLangChain Agents基本機能を確認したい!
LangChainとは?
LangChainとは、ChatGPTを代表とするような大規模言語モデル(LLM)の機能を拡張し、サービスとして展開する際に役立つライブラリです。
LangChainの主要機能
LangChainの主要な機能として以下があります。
主要機能 | 概要 |
---|---|
Models | 様々な大規模言語モデルを同じインターフェース上で取り扱えるようにする機能 |
Prompts | プロンプトの管理、最適化、シリアル化ができる機能 |
Memory | 言語モデルを用いてユーザーと対話した履歴を記憶する機能 |
Data connection | 言語モデルに外部データを投入し、外部データに基づく回答を生成する機能 |
Chains | チェーンを複数繋げて、一連の処理を連続実行する機能 |
Agents | ユーザーからの要望をどんな手段・順序で応えるか決定・実行する機能 |
LangChainの各種機能の詳細を知りたい方は、こちらの記事をご覧下さい。
【参考】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 シークレットキー」を事前に発行しておきましょう。なお、シークレットキーの発行方法はこちらの記事で詳しく解説しています。
LangChain AgentsをPythonを用いて実装する
それでは実際にLangChain AgentsをPythonを用いて実装する方法について解説します。今回は「米国株式銘柄の株価を自然言語で評価できるエージェント」を作成することとします。実装のポイントは以下6点です。
- Toolsを作成
- LLMを作成
- プロンプトを作成
- ToolとLLMを紐付け
- Agentを作成
- 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"),
])
ここでプロンプトにはinput
とagent_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関連記事
自然言語処理の学習におすすめの書籍
自然言語処理の概要について詳しく学びたい方向けに、厳選したおすすめの学習教材を紹介しています。
最後に
お問い合わせフォーム
上記課題に向けてご気軽にご相談下さい。
お問い合わせはこちら