Nakatatsu Tech Notes

生成AI × AWS × IaC でインフラ構築を自動化するクラウドエンジニアのブログ

LangChainエージェントで流れを考えながら複数関数を柔軟に呼んでみる

AIエージェントを使うとAIに判定させつつFunction Callingよりも柔軟に動作させることができます。

LangChainエージェントを使ったサンプルがこちら。

Sample

import os
from typing import Literal, TypedDict

from langchain_openai import OpenAI
from langgraph.graph import END, StateGraph

openai_api_key = os.environ.get("OPENAI_API_KEY")
llm = OpenAI(openai_api_key=openai_api_key)


class GreetState(TypedDict, total=False):
    clothing_description: str
    status: Literal["高い", "普通"]
    greeting: str


def judge_status(state: GreetState) -> GreetState:
    description = state["clothing_description"]
    if "スーツ" in description or "礼服" in description:
        status = "高い"
    else:
        status = "普通"
    return {"status": status}


def greet_by_status(state: GreetState) -> GreetState:
    status = state["status"]
    if status == "高い":
        greeting = "お世話になっております。どうぞよろしくお願いいたします。"
    else:
        greeting = "やあ、元気?"
    return {"greeting": greeting}


# グラフ(状態機械)作成
graph = StateGraph(GreetState)

# ノード登録
graph.add_node("judge_status", judge_status)
graph.add_node("greet_by_status", greet_by_status)

# 遷移定義
graph.set_entry_point("judge_status")
graph.add_edge("judge_status", "greet_by_status")
graph.add_edge("greet_by_status", END)

# グラフ完成
executable_graph = graph.compile()

# --- 実行部分 ---

user_input = "Tシャツを着た相手に挨拶して"
final_state = executable_graph.invoke({"clothing_description": user_input})
print("\n最終出力:", final_state["greeting"])

user_input = "豪華絢爛な礼服に身を包んだ相手に挨拶して"
final_state = executable_graph.invoke({"clothing_description": user_input})
print("\n最終出力:", final_state["greeting"])


実行結果

> python .\test.py    

最終出力: やあ、元気?

最終出力: お世話になっております。どうぞよろしくお願いいたします。

AIエージェントは通常のスクリプトと比べてなにがよい(or よくない)のか?

AIエージェントは状況に応じてフローを変えたり、追加の情報取得を自律的に行う柔軟性が強みです。一方でAPIのコストが高い(何度も実施するので)ほか、結果が安定しない悩みも抱えます。

スクリプトはこの逆です。

AIエージェントはスクリプトの上位互換ではありません。入力があいまいであったり柔軟性が必要である場合はAIエージェントが強いのですが、入力が定型でプロセスもきっちり決まっている用途だとスクリプトのほうが向きます。