agent功能介绍

agent和chains模块的一样,都是使用大预言模型(LLM)选择一系列的动作来执行,达到完整特定任务的目的在chains模块中,其系列要执行的动作是写死在代码中的饿,灵活性不够。在agents模块中,使用大预言模型来推理要执决定要执行的动作及以何种顺序执行。 agents先引入一批的tools,这些tools是langchain自带的,比如谷歌搜索、python排序等。agents流程会通过大预言模型决定调用哪个工具执行。调用工具的方式不同,可以将agents分为不同到类型。 agents的模块包含了多个类型的agent, 在整个创建流程中是通过AgentType进行实例化的,主要的类型包括:

  • AgentType.ZERO_SHOT_REACT_DESCRIPTION: ZeroShotAgent。 此代理使用ReAct框架仅根据工具的描述来确定要使用的工具。可以提供任意数量的工具。
  • AgentType.REACT_DOCSTORE: ReActDocstoreAgent。此代理使用ReAct框架与文档存储进行交互。必须提供两个工具:搜索工具和查找工具(它们的名称必须完全相同)。“搜索”工具应搜索文档,而“查找”工具应在最近找到的文档中查找术语。
  • AgentType.SELF_ASK_WITH_SEARCH: SelfAskWithSearchAgent。此代理使用一个应命名为“中间应答”的工具。这个工具应该能够查找问题的真实答案,其中提供了一个谷歌搜索API作为工具。
  • AgentType.CONVERSATIONAL_REACT_DESCRIPTION: ConversationalAgent。此代理程序设计用于会话设置。该提示旨在使代理提供帮助并进行对话。它使用ReAct框架来决定使用哪个工具,并使用内存来记住以前的对话交互。
  • AgentType.CHAT_ZERO_SHOT_REACT_DESCRIPTION: ChatAgent。针对聊天场景的agent。
  • AgentType.CHAT_CONVERSATIONAL_REACT_DESCRIPTION: ConversationalChatAgent。会话式+聊天的agent。
  • AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION: StructuredChatAgent。结构化工具聊天代理能够使用多输入工具。较旧的代理被配置为将操作输入指定为单个字符串,但此代理可以使用工具的参数架构来创建结构化的操作输入。这对于更复杂的工具使用非常有用,比如在浏览器中精确导航。
  • AgentType.OPENAI_FUNCTIONS: OpenAIFunctionsAgent。 某些OpenAI模型增加了函数调用的功能,通过openai模型可以预测何时应该调用函数,并用应该传递给函数的输入进行响应。OpenAI函数代理是为处理这些模型而设计的。

agent执行流程

分析agent模块的源码,从需要从实际的例子出发,捋清楚其流程和每一步执行的功能,尤其是agent模块独有的tools工具的使用逻辑等。

agent的例子

from langchain.agents.agent_toolkits import create_python_agent
from langchain.agents import load_tools, initialize_agent
from langchain.agents import AgentType
from langchain.tools.python.tool import PythonREPLTool
from langchain.python import PythonREPL
from langchain.chat_models import ChatOpenAI

# 1.实例化LLM
llm_model = "gpt-3.5-turbo-0301"
llm = ChatOpenAI(temperature=0, model=llm_model)

# 2.通过工具名称加载tools
tools = load_tools(["llm-math","wikipedia"], llm=llm)

# 3. 初始化agent, 具体agent类型通过AgentType.CHAT_ZERO_SHOT_REACT_DESCRIPTION指定
agent= initialize_agent(
    tools, 
    llm, 
    agent=AgentType.CHAT_ZERO_SHOT_REACT_DESCRIPTION,
    handle_parsing_errors=True,
    verbose = True)

# 4. agent调用
agent("What is the 25% of 300?")

agent执行流程

通过上面的例子,以chatAgent为例,设计到主要的两个类是chatAgent和AgentExecutor。两个类的关系中如下:

chatAgent类关系图

chatAgent类中,继承了Agent和SingleActionAgent,其中最重要的函数为plan(异步为aplan)。

agentExecutor类关系图

AgentExecutor类中,继承了Chain类,该类是所有chains模块中的父类。其执行入口均是Chain的call(),不同的点在于子类实现的_call()方法的逻辑。

重点关注:promot_config文件。已经内置了一些agent逻辑。

针对不同的场景,可以设计不同的agent。然后从非结构化数据提取结构化数据,然后可以查询mysql相关业务逻辑,输出最终答案。

Logo

鸿蒙生态一站式服务平台。

更多推荐