LangChainの新機能 🕸️LangGraphを試す
LangGraphというLangChainの新機能が公開されていたので、google colab上でチュートリアルをざっと試してみました。
ライブラリーのインストールなど
!pip install -U langchain langgraph langchain_openai langchainhub tavily-python
from langchain import hub
from langchain.agents import create_openai_functions_agent
from langchain_openai.chat_models import ChatOpenAI
from langchain_community.tools.tavily_search import TavilySearchResults
環境変数の設定
import os
from google.colab import userdata
os.environ["OPENAI_API_KEY"] = userdata.get("OPENAI_API_KEY")
os.environ["TAVILY_API_KEY"] = userdata.get("TAVILY_API_KEY")
os.environ["LANGCHAIN_API_KEY"] = userdata.get("LANGCHAIN_API_KEY")
os.environ["LANGCHAIN_TRACING_V2"] = "true"
Agentの定義
openai_functions_agentの生成
tools = [TavilySearchResults(max_results=1)]
prompt = hub.pull("hwchase17/openai-functions-agent")
llm = ChatOpenAI(model="gpt-4-1106-preview")
agent_runnable = create_openai_functions_agent(llm, tools, prompt)
agent_runnableをRunnablePassthroughにアサイン
from langchain_core.runnables import RunnablePassthrough
from langchain_core.agents import AgentFinish
agent = RunnablePassthrough.assign(
agent_outcome = agent_runnable
)
サービス関数
# ツールを実行する関数
def execute_tools(data):
agent_action = data.pop('agent_outcome')
tool_to_use = {t.name: t for t in tools}[agent_action.tool]
observation = tool_to_use.invoke(agent_action.tool_input)
data['intermediate_steps'].append((agent_action, observation))
return data
# 次に呼び出されるノードを決める関数
def should_continue(data):
if isinstance(data['agent_outcome'], AgentFinish):
return "exit"
else:
return "continue"
グラフの定義
from langgraph.graph import END, Graph
# Graphオブジェクトの作成
workflow = Graph()
# nodeの追加
workflow.add_node("agent", agent)
workflow.add_node("tools", execute_tools)
# エントリーポイントの設定`
workflow.set_entry_point("agent")
# 条件付きエッジの追加
# agent -continue-> tools
# |
# -exit-> END
workflow.add_conditional_edges(
"agent", # start node
should_continue,
# should_continueの内容による条件分岐
{
"continue": "tools",
"exit": END
}
)
# tools -> agent
workflow.add_edge('tools', 'agent')
chain = workflow.compile()
実行!
chain.invoke({"input": "初代パックマンが公開された年に公開された同じ会社のゲームを日本語で答えて", "intermediate_steps": []})
output
input: 初代パックマンが公開された年に公開された同じ会社のゲームを日本語で答えて
intermediate_steps:
- - tool: tavily_search_results_json
tool_input:
query: |-
1980
Namco games released
log: |+
Invoking: `tavily_search_results_json` with `{'query': '\n1980 \nNamco games released'}`
type: AgentActionMessageLog
message_log:
- content: ""
additional_kwargs:
function_call:
arguments: '{"query":"\n1980 \nNamco games released"}'
name: tavily_search_results_json
type: ai
example: false
- - url: https://en.wikipedia.org/wiki/Pac-Man
content: Namco games to be included as part of the series. When Namco presented Pac-Man and Rally-X to potential distributors at the 1980 AMOA tradeshow in November,[35] of Namco Classic Collection Vol. 2, alongside Dig Dug, Rally-X and special "Arrangement" remakes of all three Namco released a version for the Nintendo Famicom in 1984 as one of the console's first third-party titles,[45] as wellPac-Man, originally called Puck Man in Japan, is a 1980 maze action video game developed and released by Namco for arcades.In North America, the game was released by Midway Manufacturing as part of its licensing agreement with Namco America. The player controls Pac-Man, who must eat all the dots inside an enclosed maze while avoiding four colored ghosts.. Eating large flashing dots called ...
agent_outcome:
return_values:
output: 1980年に初代パックマンを公開した同じ会社(ナムコ)が公開した他のゲームには、「ラリーX」があります。
log: 1980年に初代パックマンを公開した同じ会社(ナムコ)が公開した他のゲームには、「ラリーX」があります。
type: AgentFinish
感想
グラフで処理の流れをすっきり整理できるので、複雑な状態遷移をするエージェントの実装も見通しよくできそうですね。😄
この記事が気に入ったらサポートをしてみませんか?