Agent代理
概述
Agent代理的核心思想是使用语言模型来选择要采取的一系列动作。在链中,动作序列是硬编码的。在代理中,语言模型用作推理引擎来确定要采取哪些动作以及按什么顺序进行。
因此,在LangChain中,Agent代理就是使用语言模型作为推理引擎,让模型自主判断、调用工具和决定下一步行动。
Agent代理像是一个多功能接口,能够使用多种工具,并根据用户输入决定调用哪些工具,同时能够将一个工具的输出数据作为另一个工具的输入数据。
分类
根据几个维度对所有可用的代理进行分类:
代理名称 | 模型类型 | 聊天历史 | 多输入工具 | 并行函数调用 | 所需模型参数 | 描述 | Agent |
---|---|---|---|---|---|---|---|
OpenAI tools | Chat | √ | √ | √ | tools | OpenAI将调用单个函数的能力称为 函数,将调用一个或多个函数的能力称为工具。 | create_openai_tools_agent |
OpenAI functions | Chat | √ | √ | x | functions | 使用Op0nAl函数集合的代理。已弃用转而使用OpenAI tools | create_openai_functions_agent |
XML Agent | LLM | √ | x | x | 某些语言模型(例如 Anthropic 的 Claude)特别擅长推理/编写 XML。 | create_xml_agent | |
Structured chat | Chat | √ | √ | x | 使用结构化工具集的代理 | create_structured_chat_agent | |
JSON Chat Agent | Chat | √ | x | x | 代理使用 JSON 来格式化其输出,旨在支持聊天模型。 | create_json_chat_agent | |
ReAct | LLM | √ | x | x | 推理和执行,推理后决定调用工具或者根据工具返回结果确定完成任务 | create_react_agent | |
Self-ask with search | LLM | x | x | x | 通过追问和中间答案,引导发现最终答案 | create_self_ask_with_search_agent |
Agent的基本使用
构建一个具有两种工具的代理:一种用于在线查找,另一种用于查找加载到索引中的特定数据。
准备操作
在LangChain中有一个内置的工具,可以方便地使用Tavily搜索引擎作为工具。
访问 Tavily(用于在线搜索)注册账号并登录,获取API 密钥
设置OpenAI和TAVILY的API密钥
定义工具
首先需要创建想要使用的工具。这里使用两个工具:
1.Tavily在线搜索
执行查询结果如下:
2.创建检索器
根据上述查询结果中的某个URL中,获取一些数据创建一个检索器。
这里使用一个简单的本地向量库FAISS,使用FAISS的CPU版本,需要安装FAISS库:
检索结果如下:
3.得到工具列表
初始化大模型
选择将驱动代理的LLM,为了模型回答更严谨,设置temperature=0
创建Agent
这里使用LangChain中一个叫OpenAI functions的代理,然后得到一个AgentExecutor代理执行器。
AgentExecutor是代理执行器,它实际上调用代理,执行其选择的操作,将操作输出传回代理,然后重复。
运行Agent
注意:目前这些都是无状态查询
执行部分日志记录如下:
添加记忆
目前代理是无状态的,这意味着它不记得以前的交互。为了给它记忆,需要传入chat_history
。
注意:
chat_history
是正在使用提示符中的一个变量,因此需要调用它。如果使用不同的提示,可能需要更改变量名称
具体Prompt提示模板内容如下:
记忆测试:
执行日志如下,代理明显有了记忆
自动跟踪这些消息,可以将其包装在RunnableWithMessageHistory中
执行日志如下: