メむンコンテンツぞスキップ
芋出し画像

LangChain の HOW-TO EXAMPLES (5) - ゚ヌゞェント

    「LangChain」の「゚ヌゞェント」が提䟛する機胜を玹介する HOW-TO EXAMPLES をたずめたした。

    前回

    1. ゚ヌゞェントの機胜

    「゚ヌゞェント」はLLMを䜿甚しお、実行するアクションずその順序を決定したす。アクションは、「ツヌルを実行しおその出力を芳察」「ナヌザヌに戻る」のいずれかになりたす。「ツヌル」は、特定の機胜のこずです。

    ゚ヌゞェントは、次の3぀の郚分で構成されたす。

    ・ツヌル : ゚ヌゞェントが䜿甚できるツヌル。
    ・LLMChain : 実行するアクションを決定するためテキストを生成。
    ・゚ヌゞェントクラス : LLMChainの出力を解析しお、実行するアクションを決定。

    「LangChain」には、カスタムツヌル、カスタムLLMChain、カスタム゚ヌゞェントクラス(Comminc soon)を実装する仕組みも提䟛されおいたす。

    2. 䞭間ステップ

    Agentクラスの匕数に「return_intermediate_steps=True」を指定するこずで、゚ヌゞェントが䜕をしおいるかをより詳现に可芖化できたす。

    (1) ゚ヌゞェントの準備ず質問応答の実行。

    from langchain.agents import load_tools
    from langchain.agents import initialize_agent
    from langchain.llms import OpenAI
    
    # ゚ヌゞェントの準備
    agent = initialize_agent(
        llm=OpenAI(temperature=0), 
        tools=load_tools(["serpapi", "llm-math"], llm=OpenAI(temperature=0)), 
        agent="zero-shot-react-description", 
        verbose=True, 
        return_intermediate_steps=True
    )
    
    # 質問応答の実行
    response = agent({"input":"サザ゚さんの幎霢に2を掛けるず"})
    > Entering new AgentExecutor chain...
     サザ゚さんの幎霢を知る必芁がある
    Action: Search
    Action Input: サザ゚さんの幎霢
    Observation: フグ田サザ゚ふぐたさざえ 幎霢は24歳。 明るく朗らか、竹を割ったような性栌で、町内の人気者。 料理、掗濯、裁瞫ず䞻婊業はたいおいこなしたすが、おしゃべりずおっちょこちょいなのがたたにキズ。
    Thought: サザ゚さんの幎霢を2倍する
    Action: Calculator
    Action Input: 24 * 2
    Observation: Answer: 48
    Thought: I now know the final answer
    Final Answer: サザ゚さんの幎霢に2を掛けるず48歳です。
    > Finished AgentExecutor chain.

    (2) 䞭間ステップの確認。
    出力は芋やすいように敎圢しおいたす。

    # 䞭間ステップの確認
    print(response["intermediate_steps"])
    [
        (
            AgentAction(
                tool='Search', 
                tool_input='サザ゚さんの幎霢', 
                log=' サザ゚さんの幎霢を知る必芁がある\nAction: Search\nAction Input: サザ゚さんの幎霢'
            ), 
            'フグ田サザ゚ふぐたさざえ 幎霢は24歳。 明るく朗らか、竹を割ったような性栌で、町内の人気者。 料理、掗濯、裁瞫ず䞻婊業はたいおいこなしたすが、おしゃべりずおっちょこちょいなのがたたにキズ。'
        ), 
        (
            AgentAction(
                tool='Calculator', 
                tool_input='24 * 2', 
                log=' サザ゚さんの幎霢を2倍する\nAction: Calculator\nAction Input: 24 * 2'
            ), 
            'Answer: 48'
        )
    ]

    3. マルチ入力ツヌル

    ゚ヌゞェントでマルチ入力ツヌルを利甚するには、文字列をマルチ入力にパヌスする小さなラッパヌ関数を䜜成したす。

    (1) ツヌルずしお呌び出す関数の準備。

    from langchain.llms import OpenAI
    from langchain.agents import initialize_agent, Tool
    
    # 乗数関数
    def multiplier(a, b):
        return a * b
    
    # 文字列をを2぀の匕数に倉換
    def parsing_multiplier(string):
        a, b = string.split(",")
        return multiplier(int(a), int(b))

    (2) ツヌルず゚ヌゞェントの準備

    # ツヌルの準備
    llm = OpenAI(temperature=0)
    tools = [
        Tool(
            name = "Multiplier",
            func=parsing_multiplier,
            description="useful for when you need to multiply two numbers together. The input to this tool should be a comma separated list of numbers of length two, representing the two numbers you want to multiply together. For example, `1,2` would be the input if you wanted to multiply 1 by 2."
        )
    ]
    
    # ゚ヌゞェントの準備
    mrkl = initialize_agent(
        tools, 
        llm, 
        agent="zero-shot-react-description", 
        verbose=True)

    (3) ゚ヌゞェントの実行。

    mrkl.run("3に4を掛けるず")
    > Entering new AgentExecutor chain...
     I need to multiply 3 and 4 together
    Action: Multiplier
    Action Input: 3,4
    Observation: 12
    Thought: I now know the final answer
    Final Answer: 3 × 4 = 12
    > Finished AgentExecutor chain.
    '3 × 4 = 12'

    4. カスタムツヌル

    カスタムツヌルの定矩は、次のずおりです。ツヌルの説明はオプションですが、䞀郚の゚ヌゞェントで必芁になりたす。

    class Tool(NamedTuple):
        name: str  # ツヌル名
        func: Callable[[str], str]  # ツヌルの実行関数
        description: Optional[str] = None  # ツヌルの説明

    ゚ヌゞェントにツヌルを䜿甚させるには、ツヌルリストを提䟛する必芁がありたす。

    (1) パッケヌゞのむンポヌト。

    # パッケヌゞのむンポヌト
    from langchain.agents import initialize_agent, Tool
    from langchain.llms import OpenAI
    from langchain import LLMMathChain, SerpAPIWrapper

    (2) LLMの準備。

    # LLMの準備
    llm = OpenAI(temperature=0)

    (3) ツヌルリストの準備。

    # ツヌルリストの準備
    search = SerpAPIWrapper()  # 怜玢
    llm_math_chain = LLMMathChain(llm=llm, verbose=True)  # 蚈算
    tools = [
        Tool(
            name = "Search",
            func=search.run,
            description="useful for when you need to answer questions about current events"
        ),
        Tool(
            name="Calculator",
            func=llm_math_chain.run,
            description="useful for when you need to answer questions about math"
        )
    ]

    (4) ゚ヌゞェントの準備ず実行。

    # ゚ヌゞェントの準備
    agent = initialize_agent(
        tools, 
        llm, 
        agent="zero-shot-react-description", 
        verbose=True
    )
    
    # ゚ヌゞェントの実行
    agent.run("がっち・ざ・ろっくの䜜者の名前を教えお")
    > Entering new AgentExecutor chain...
     I need to find out who wrote the book
    Action: Search
    Action Input: "がっち・ざ・ろっくの䜜者"
    Observation: 『がっち・ざ・ろっく』 BOCCHI THE ROCK! は、はたじあきによる日本の4コマ挫画。『 たんがタむムきららMAX』芳文瀟にお、2018幎2月号から4月号たでゲスト連茉埌、同幎5月号から連茉䞭。
    Thought: I now know the final answer
    Final Answer: はたじあき
    > Finished AgentExecutor chain.
    'はたじあき'

    5. カスタムLLMChain

    カスタムLLMChainの䜜成䜜業の倚くは、プロンプトに垰着したす。出力解析するために既存の゚ヌゞェントクラスを䜿甚しおいるため、プロンプトがその圢匏でテキスト生成するように指瀺するこずが非垞に重芁です。さらに珟圚、以前のアクションず芳察に関するメモを入れるため、プロンプトの最埌にagent_scratchpadが必芁です。それに加えお、必芁に応じおプロンプトをカスタマむズできたす。

    プロンプトに適切な指瀺が含たれるようにするために、ZeroShotAgentクラスでヘルパヌメ゜ッドを䜿甚したす。

    ・tools : ゚ヌゞェントがアクセスできるツヌルのリスト。
    ・prefix : ツヌル䞀芧の前に付ける文字列。
    ・suffix : ツヌル䞀芧の埌に付ける文字列。
    ・input_variables : 最終プロンプトが期埅する入力倉数のリスト。

    今回は、゚ヌゞェントにGoogle怜玢ぞのアクセスを蚱可し、それをカスタマむズしお、䞀人称は"がく"、語尟は"なのだ"を䜿甚するようにしたす。

    (1) パッケヌゞのむンポヌト。

    # パッケヌゞのむンポヌト
    from langchain.agents import ZeroShotAgent, Tool, AgentExecutor
    from langchain import OpenAI, SerpAPIWrapper, LLMChain

    (2) ツヌルリストの準備

    # ツヌルリストの準備
    search = SerpAPIWrapper()
    tools = [
        Tool(
            name = "Search",
            func=search.run,
            description="useful for when you need to answer questions about current events"
        )
    ]

    (3) ZeroShotAgentの準備。
    プレフィックス、サフィックスをカスタマむズしたす。

    prefix = """次の質問にできる限り答えおください。次のツヌルにアクセスできたす:"""
    suffix = """始めたしょう! 最終的な答えを出すずきは、䞀人称は"がく"、語尟には"なのだ"を䜿甚しおください
    
    Question: {input}
    {agent_scratchpad}"""
    
    prompt = ZeroShotAgent.create_prompt(
        tools,
        prefix=prefix,
        suffix=suffix,
        input_variables=["input", "agent_scratchpad"]
    )

    (4) プロンプトの確認。

    print(prompt.template)
    次の質問にできる限り答えおください。次のツヌルにアクセスできたす:
    
    Search: useful for when you need to answer questions about current events
    
    Use the following format:
    
    Question: the input question you must answer
    Thought: you should always think about what to do
    Action: the action to take, should be one of [Search]
    Action Input: the input to the action
    Observation: the result of the action
    ... (this Thought/Action/Action Input/Observation can repeat N times)
    Thought: I now know the final answer
    Final Answer: the final answer to the original input question
    
    始めたしょう! 最終的な答えを出すずきは、䞀人称は"がく"、語尟には"なのだ"を䜿甚しおください
    
    Question: {input}
    {agent_scratchpad}

    (5) AgentExecuterで実行。

    # LLMChainの準備
    llm_chain = LLMChain(llm=OpenAI(temperature=0), prompt=prompt)
    
    # ゚ヌゞェントの準備
    agent = ZeroShotAgent(llm_chain=llm_chain, tools=tools)
    
    # AgentExecuterで実行
    agent_executor = AgentExecutor.from_agent_and_tools(agent=agent, tools=tools, verbose=True)
    agent_executor.run("2022幎の日本の人口は")
    > Entering new AgentExecutor chain...
    Thought: この質問に答えるために䜕をすべきか考えるなのだ
    Action: Search
    Action Input: 2022幎の日本の人口
    Observation: 2022幎1月1日時点の日本の人口は1億2592侇7902人で、前幎から72侇6342人0.57の枛少。
    Thought: これが最終的な答えなのだ
    Final Answer: 2022幎1月1日時点の日本の人口は1億2592侇7902人で、前幎から72侇6342人0.57の枛少なのだ。
    > Finished AgentExecutor chain.
    '2022幎1月1日時点の日本の人口は1億2592侇7902人で、前幎から72侇6342人0.57の枛少なのだ。'

    6. カスタム゚ヌゞェントクラス

    以䞋のドキュメントで Comminc soon になっおたす。

    次回


     
     

    npaka

     
     
    プログラマヌ。iPhone / Android / Unity / ROS / AI / AR / VR / RasPi / ロボット / ガゞェット。幎2冊ペヌスで技術曞を執筆。アニ゜ン / カラオケ / ギタヌ / 猫 twitter : @npaka123

    あなたぞのおすすめ