📝

【Agent開発入門】Langchainって?

に公開

LangChainとは

LangChainは、大規模言語モデル(LLM)を使用したアプリケーション開発を効率化するためのライブラリです。
機械学習でよく使われるPythonで使用することが可能です。

Langchainの主な特徴

  • LLMの選択
  • ツールの実行
  • プロンプトの管理

個人的に特にツールの実行(Tool calling)は非常に強力で、Agent開発で役に立つ機能だと思いました。

実装例

シンプルなエージェント

以下は、シンプルなタスク管理エージェントの実装例です
Tool callingを使用し、プロンプトの内容に応じて、タスクリストの取得か、タスクの追加を行うような機能を想定しています。

import logging

from langchain_core.tools import tool
from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain.agents import AgentExecutor, create_tool_calling_agent, Tool
from langchain_openai import ChatOpenAI

@tool
def add_task(task_name: str):
    """新しいタスクを追加する"""
    # タスクを追加するコード(省略)
    return

@tool
def task_list():
    """現在のタスク一覧を表示する"""
    # タスク一覧を取得するコード(省略)
    return result


class TaskManagerAgent:

    def __init__(self):
        # LLM設定
        llm = ChatOpenAI(
          model="gpt-4o",
          temperature=0,
        )

        # Toolの登録
        tools = [
            Tool(
                name="add_task",
                func=add_task,
                description="新しいタスクを追加する",
            ),
            Tool(
                name="task_list",
                func=task_list,
                description="現在のタスク一覧を表示する",
            ),
        ]
        
        # Promptの設定
        template = ChatPromptTemplate.from_messages([
            ("system", PROMPT_TEMPLATE),
            ("user", "{user_input}"),
            MessagesPlaceholder(variable_name="agent_scratchpad")
        ])

        # Agentの作成
        tool_calling_agent = create_tool_calling_agent(llm, tools, template)
        self.agent = AgentExecutor(agent=tool_calling_agent, tools=tools, verbose=True)

    def invoke(self, user_input: str):
        try:
            response = self.agent.invoke(
                { 'user_input': user_input },
            )
    
            return response.get('output', None)
        except Exception as e:
            logging.error(f"エラーが発生しました: {e}")

DataFrameの読み込み

データを読み込ませ、何かしらの分析タスクをLLMにさせたい場合は、create_pandas_dataframe_agentを使用することで、LLMがDataFrameの内容を理解し、適切な分析を実行できます。
以下は、DataFrameを分析するためのエージェントの実装例です。

import pandas as pd
from langchain_openai import ChatOpenAI
from langchain_experimental.agents import create_pandas_dataframe_agent

def analyze_dataframe(df: pd.DataFrame, query: str) -> str:
    """DataFrameの分析を実行する"""
    
    # LLMの設定
    llm = ChatOpenAI(
        model="gpt-4o",
        temperature=0
    )
    
    # エージェントの作成
    agent = create_pandas_dataframe_agent(
        llm=llm,
        df=df,
        agent_type="tool-calling",
        verbose=True
    )
    
    try:
        # 分析の実行
        response = agent.invoke({
            'input': query
        })
        return response.get('output', '分析中にエラーが発生しました')
    except Exception as e:
        return f"エラーが発生しました: {str(e)}"

Dataframeの読み込みや、分析タスクの処理ではPandasAIもおすすめです。
個人的には、グラフなどを描画させたいのであれば、現状はPandasAIを使用するかなといった所感です。
ただ、LangchainはLLMの選択などが比較的簡単なので、分析系のタスクの際は、Langchainのcreate_pandas_dataframe_agentを使用してます。(他のエージェントでLangchainを使用している場合はライブラリを統一するといった意味でも楽です。)

まとめ

LangChainを使用することで、LLMを活用したカスタムエージェントを簡単に作成できます。また、ツールの追加やプロンプトの調整により、様々なユースケースに対応したエージェントを構築することが可能です。

PoCで何かしらのエージェントをWEBアプリで開発したい場合は、StreamlitでUIを構築することで、比較的工数少なく開発することができるのでおすすめです!

参考リンク

UPGRADE tech blog

Discussion