美文网首页ChatGpt
学习ChatGpt(八)- Langchain之Agent

学习ChatGpt(八)- Langchain之Agent

作者: 梅林骑士 | 来源:发表于2023-10-29 10:46 被阅读0次

    什么是代理(Agent)?

    在编程中,代理的核心思想是使用一个大型语言模型(LLM)来选择执行的一系列动作。在传统的链式编程(chains)中,这些动作通常被硬编码在代码中。而在代理模式中,一个语言模型被用作推理引擎,来确定要采取哪些动作以及以何种顺序执行。

    代理的关键概念:

    • AgentAction(代理动作): 这是一个数据类,代表了代理应该执行的动作。它包含一个tool属性,表示应该调用的工具的名称,以及一个tool_input属性,表示该工具的输入。

    • AgentFinish(代理完成): 这是一个数据类,表示代理已经完成任务,应该将结果返回给用户。它具有一个return_values参数,是一个要返回的字典。通常,它只包含一个键 - output - 代表一个字符串,因此通常只返回这个键。

    • Intermediate Steps(中间步骤): 这些代表了先前代理动作和相应的输出,它们会被传递下去。这对于将来的迭代非常重要,因为代理需要知道它已经完成了哪些任务。这个类型被定义为List[Tuple[AgentAction, Any]]。需要注意,observation目前被定义为Any类型,以确保最大的灵活性。实际上,它通常是一个字符串。

    在Langchain中,代理可以根据需求进行自定义,也可以使用官方提供的代理。下面是一个示例代码,演示了如何使用Langchain的代理功能:

    # 导入必要的模块和工具
    from langchain.agents import initialize_agent, Tool
    from langchain.agents import load_tools
    from langchain.llms import OpenAI
    from langchain.agents import AgentType
    from langchain import hub
    from langchain.tools.render import render_text_description
    
    # 初始化配置
    import os
    import config
    config.init(os)
    
    # 定义查询
    query = "对比下InternLM-123B和gpt4"
    
    # 初始化LLM模型和工具
    llm = OpenAI(temperature=0, verbose=True)
    tools = load_tools(["serpapi", "llm-math"], llm=llm)
    llm_with_stop = llm.bind(stop=["\nObservation"])
    prompt = hub.pull("hwchase17/react")
    prompt = prompt.partial(
        tools=render_text_description(tools),
        tool_names=", ".join([t.name for t in tools]),
    )
    
    # 定义代理
    agent = {
        "input": lambda x: x["input"],
        "agent_scratchpad": lambda x: format_log_to_str(x['intermediate_steps'])
    } | prompt | llm_with_stop | ReActSingleInputOutputParser()
    
    # 初始化代理执行器
    agent_executor = initialize_agent(tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True)
    
    # 执行查询
    agent_executor.invoke({"input": query})
    

    以上代码演示了如何使用Langchain的代理功能,通过LLM的代理增加了数学运算和搜索两种能力。这个例子展示了Langchain代理的灵活性和强大功能。

    但是你如果稍微深入点研究会发现agent的Tool只能传入2个,超过了就会崩溃。
    而且还有其他问题,我尝试问了他100以内的素数,它居然报错了

    ValueError: unknown format from LLM: This cannot be solved using the numexpr library.

    我把同样的问题给了gpt3.5他就给出了结果,原因是因为llm-math这个Tool接管这个逻辑分支,名字叫llm-math怎么敢啊?

    然后我把这个Tool删除之后它就运行正常了。

    相关文章

      网友评论

        本文标题:学习ChatGpt(八)- Langchain之Agent

        本文链接:https://www.haomeiwen.com/subject/ozouidtx.html