見出し画像

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"

グラフの定義


workflowグラフ(上図は以下コードからChatGPTで作成)
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

1980年に初代パックマンを公開した同じ会社(ナムコ)が公開した他のゲームには、「ラリーX」があります。

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

感想

グラフで処理の流れをすっきり整理できるので、複雑な状態遷移をするエージェントの実装も見通しよくできそうですね。😄

この記事が気に入ったらサポートをしてみませんか?