目录
模块 III:Agent(1)——工具
LangChain 引入了一个强大的概念,称为 Agent,当前的很多媒体将其翻译为“智能体”,从汉语的译名来看,它会让人觉得很“智能”。不过,为了避免因“望文生义”而产生误解,本文不对这个单词进行翻译,读者可以按照某种专有名词来对待。
从纯粹技术角度描述,Agent 即是对链式(chains)概念的提升,利用语言模型动态地决定要执行的动作序列,使它们变得极其灵活和适应性强。与传统链条中动作是硬编码在代码中的不同,Agent 使用语言模型作为推理引擎,来决定采取哪些动作以及以什么顺序执行。
Agent 是负责决策的核心组件,它利用语言模型和提示词(prompt)的力量来确定实现特定目标的下一步行动。Agent 的输入通常包括以下内容:
- 工具:可用工具的描述(稍后会详细介绍)。
- 用户输入:用户的高层次目标或查询。
- 中间步骤:为达到当前用户输入而执行的(动作,工具输出)对的历史记录。
Agent 的输出可以是下一步要执行的动作(AgentActions),也可以是发送给用户的最终响应(AgentFinish)。一个动作指定了一种工具以及该工具的输入。
工具
工具是 Agent 用来与外界交互的接口,使 Agent 能够执行各种任务,例如搜索网络、运行 shell 命令或访问外部 API。在 LangChain 中,工具对于扩展 Agent 的能力并使其能够完成多样化任务至关重要。
要在 LangChain 中使用工具,可以通过以下代码片段加载它们:
from langchain.agents import load_tools
tool_names = [...]
tools = load_tools(tool_names)
某些工具可能需要一个基础的语言模型(LLM)来初始化。在这种情况下,也可以传一个 LLM:
from langchain.agents import load_tools
tool_names = [...]
llm = ...
tools = load_tools(tool_names, llm=llm)
这种设置允许访问各种工具并将它们集成到你的 Agent 工作流中。LangChain 所提供的完整工具列表及其使用文档已经列在了官方文档中,点击这里查看。
让我们来看一些工具的使用举例。
DuckDuckGo
利用 DuckDuckGo 工具可以实现网络搜索(使用 DuckDuckGo 的搜索引擎),使用方法如下:
from langchain.tools import DuckDuckGoSearchRun
search = DuckDuckGoSearchRun()
search.run("manchester united vs luton town match summary")
输出:
DataForSeo
DataForSeo 工具包允许通过 DataForSeo API 获取搜索引擎结果。要使用此工具包,需要设置你自己的 API 凭证(关于 API 的注册,可以参考 DataForSeo 官方文档)。以下是配置凭证的方法:
import os
os.environ["DATAFORSEO_LOGIN"] = "<your_api_access_username>"
os.environ["DATAFORSEO_PASSWORD"] = "<your_api_access_password>"
一旦配置好上述内容,即可通过 API 创建 DataForSeoAPIWrapper
工具:
from langchain.utilities.dataforseo_api_search import DataForSeoAPIWrapper
wrapper = DataForSeoAPIWrapper()
result = wrapper.run("Weather in Los Angeles")
DataForSeoAPIWrapper
工具从各种来源检索搜索引擎结果。
如果返回内容要求是 JSON 格式,可以自定义返回结果类型和字段。例如,可以指定结果类型、字段,并设置返回最上层的最大数量:
json_wrapper = DataForSeoAPIWrapper(
json_result_types=["organic", "knowledge_graph", "answer_box"],
json_result_fields=["type", "title", "description", "text"],
top_count=3,
)
json_result = json_wrapper.results("Bill Gates")
此示例通过指定结果类型、字段并限制结果数量来定制 JSON 响应。
还可以通过向 API 包装器传递额外的参数,来指定搜索结果的位置和语言:
customized_wrapper = DataForSeoAPIWrapper(
top_count=10,
json_result_types=["organic", "local_pack"],
json_result_fields=["title", "description", "type"],
params={"location_name": "Germany", "language_code": "en"},
)
customized_result = customized_wrapper.results("coffee near me")
通过提供位置和语言参数,可以将搜索结果定制为特定的地区和语言。
还可以灵活选择想要使用的搜索引擎。只需指定目标搜索引擎即可:
customized_wrapper = DataForSeoAPIWrapper(
top_count=10,
json_result_types=["organic", "local_pack"],
json_result_fields=["title", "description", "type"],
params={"location_name": "Germany", "language_code": "en", "se_name": "bing"},
)
customized_result = customized_wrapper.results("coffee near me")
在此示例中,搜索被定制为使用 Bing 作为搜索引擎。
API 包装器还允许指定要执行的搜索类型。例如,可以执行地图搜索:
maps_search = DataForSeoAPIWrapper(
top_count=10,
json_result_fields=["title", "value", "address", "rating", "type"],
params={
"location_coordinate": "52.512,13.36,12z",
"language_code": "en",
"se_type": "maps",
},
)
maps_search_result = maps_search.results("coffee near me")
这将搜索定制为获取与地图相关的信息。
Shell (bash)
Shell 工具包为 agents 提供了对 shell 环境的访问权限,使它们能够执行 shell 命令。此功能非常强大,但应谨慎使用,尤其是在沙盒环境中。以下是使用 Shell 工具的方法:
from langchain.tools import ShellTool
shell_tool = ShellTool()
result = shell_tool.run({"commands": ["echo 'Hello World!'", "time"]})
在这个例子中,shell 工具要求执行两条指令,效果如下:
你可以将 Shell 工具提供给 agent,以执行更复杂的任务。以下是一个 agent 使用 Shell 工具从网页中获取链接的示例:
from langchain.agents import AgentType, initialize_agent
from langchain.chat_models import ChatOpenAI
llm = ChatOpenAI(temperature=0.1)
shell_tool.description = shell_tool.description + f"args {shell_tool.args}".replace(
"{", "{{"
).replace("}", "}}")
self_ask_with_search = initialize_agent(
[shell_tool], llm, agent=AgentType.CHAT_ZERO_SHOT_REACT_DESCRIPTION, verbose=True
)
self_ask_with_search.run(
"Download the langchain.com webpage and grep for all urls. Return only a sorted list of them. Be sure to use double quotes."
)
输出效果:
在此场景中,agent 使用 Shell 工具执行一系列命令,以获取、过滤并排序网页中的 URL。
上述示例展示了一些 LangChain 中可用的工具。这些工具最终扩展了 agent 的能力(将在下一小节探讨),并使它们能够高效地执行各种任务。根据需求,你可以选择最适合项目需求的工具和工具包,并将它们集成到 agent 的工作流中。