定义一个基本工具,例如计算器,对于提升LLM智能体的能力非常重要。一个工具可能是Python代码中精心编写的函数,但仅仅定义它并不能让智能体自动使用。智能体需要正式地与工具建立连接。将工具连接到智能体的运作机制是弥补这一空白的方法。连接工具是指将其注册到智能体的过程,让智能体知晓工具的存在、它的用途以及如何调用它。就像给你的智能手机添加一个新应用一样;手机需要知道应用已安装及其功能,然后你才能有效使用它。让工具可被找到:名称、描述和功能智能体要使用一个工具,通常需要关于它的三项重要信息:工具名称:这是一个唯一的、通常简短的字符串,用于标识工具。例如,calculator(计算器)、web_searcher(网页搜索器)或database_reader(数据库读取器)。智能体的内部逻辑,在LLM的引导下,在决定使用特定工具时会引用此名称。选择清晰易于引用的名称。工具描述:这可以说是LLM最重要的部分。描述是关于工具功能、所需输入类型以及所产生输出的清晰的自然语言说明。LLM使用此描述来判断工具是否适合特定任务或子任务。良好的描述对于智能体做出明智的工具使用决策非常重要。 例如,一个计算器工具的描述可能是:"用于计算数学表达式。输入应为有效的数学字符串,如'2*7'或'15/3'。返回数值结果作为字符串。"可执行部分(函数引用):这是工具被调用时实际运行的代码。在Python中,这通常是对你编写的函数的引用(比如我们上一节的my_calculator_function)。智能体系统需要知道如何调用此函数并传递必要的参数,这些参数通常由LLM根据当前任务和工具描述来确定。连接工具的通用机制大多数构建LLM智能体的框架或库都提供了一种结构化的方式来“连接”或“注册”工具。尽管具体语法会有所不同,但其基本过程都是向智能体系统提供工具的名称、详细描述以及执行其功能的方式。你通常会为你希望智能体使用的每个工具准备这些信息。然后,你可以在智能体初始化时将这组工具传递给它,或者使用智能体框架提供的特定方法逐个添加工具。让我们看一个简化的、类似Python的示例。想象一下,你已经准备好了my_calculator_function:# 假设此函数已在其他地方定义,如前所述: # def my_calculator_function(expression_string: str) -> str: # # ... (解析和计算表达式的逻辑) # # 重要提示:直接使用eval()可能存在风险。 # # 这是计算逻辑的占位符。 # calculated_result = "some_value" # 示例输出 # return calculated_result # 第 1 步:准备工具信息 # 这通常通过字典或智能体框架提供的专用“Tool”类完成。 calculator_tool_details = { "name": "ArithmeticCalculator", "description": "执行基本的算术运算,例如加法、减法、乘法和除法。输入必须是表示数学表达式的字符串(例如,'22 + 8','100 / 5')。返回数值结果作为字符串。", "function_to_call": my_calculator_function # 对你的 Python 函数的引用 } # 另一个例子:天气工具 # def get_current_weather(location: str) -> str: # # ... (获取地点天气的逻辑) # return "The weather in " + location + " is sunny." weather_tool_details = { "name": "WeatherReporter", "description": "提供指定城市或地点的当前天气。输入应为地点名称(例如,'London','Paris')。", "function_to_call": get_current_weather } # 第 2 步:将这些工具“连接”到你的智能体 # 具体方法取决于你正在使用的智能体库。 # 这里有两种常见模式: # 模式 A:在智能体初始化时传递工具详细信息列表 # all_my_tools = [calculator_tool_details, weather_tool_details] # my_agent = AgentFramework.initialize_agent( # llm_service=my_llm, # tools=all_my_tools # ) # 模式 B:向已初始化的智能体实例添加工具 # my_agent = AgentFramework.initialize_agent(llm_service=my_llm) # my_agent.add_tool(calculator_tool_details) # my_agent.add_tool(weather_tool_details) # 完成这些步骤后,你的“my_agent”现在就知晓了 # “ArithmeticCalculator”和“WeatherReporter”。智能体内的LLM # 现在可以考虑在接收到可能 # 从计算或天气信息中获益的任务时使用这些工具。在这个示例代码中,AgentFramework 代表一个用于构建智能体的库。主要的收获是你将工具的名称、描述和可调用函数打包,然后将此包提供给智能体系统。可视化工具连接以下图表说明了新工具如何连接到智能体系统,使其在智能体的“工具箱”中可供核心LLM使用。digraph G { rankdir=TB; node [shape=box, style="rounded,filled", fontname="Arial"]; edge [fontname="Arial"]; subgraph cluster_agent { label="LLM 智能体系统"; bgcolor="#f8f9fa"; color="#adb5bd"; style="rounded"; AgentCore [label="智能体核心 (LLM)\n推理引擎", fillcolor="#a5d8ff", shape=ellipse]; subgraph cluster_toolbox { label="智能体的工具箱"; bgcolor="#fff9db"; color="#fcc419"; style="rounded"; node [shape=note, fillcolor="#c3fae8", color="#12b886"]; ToolA [label="工具 A\n(例如,网页搜索)\n描述:..."]; ToolB [label="工具 B\n(例如,数据库访问)\n描述:..."]; Placeholder [label="...", shape=plaintext, fontcolor="#adb5bd"]; } AgentCore -> cluster_toolbox [label=" 根据描述\n访问可用工具", dir=both, color="#495057", fontsize=10]; } NewTool [label="你的新工具\n(例如,'计算器')\n名称:'my_calculator'\n描述:'解决数学问题...'\n函数:`calculate_this()`", shape=component, fillcolor="#ffc9c9", color="#f03e3e"]; ConnectionInterface [label="工具注册接口\n(例如,`agent.add_tool(your_new_tool)`)", shape=cds, fillcolor="#dee2e6", style="filled,rounded", color="#868e96"]; NewTool -> ConnectionInterface [label=" 你提供工具定义", color="#d6336c", fontsize=10]; ConnectionInterface -> cluster_toolbox [label=" 工具被列出并可用", color="#d6336c", lhead=cluster_toolbox, minlen=2, fontsize=10]; {rank=same; NewTool; ConnectionInterface;} }此图显示了你的新工具被定义,然后传递给一个“工具注册接口”。此接口是智能体框架的一部分,负责将你的工具详情(名称、描述、功能)添加到智能体的“工具箱”中。一旦注册,智能体核心(LLM)就可以访问并考虑与其他工具一起使用这个新工具。通过这种方式连接工具,你实际上是在扩充智能体的技能储备。LLM不再仅仅局限于生成文本;它现在可以将特定任务委托给这些专业工具,接收它们的输出,并将这些结果整合到其整体推理过程中,以达成更复杂的目标。工具连接完成后,下一个重要方面是智能体如何实际决定何时使用特定工具以及如何格式化对该工具的请求。这通常需要精心设计你提供给智能体的提示,我们将在接下来的章节中讨论。