Tools

Tools #

https://python.langchain.com/docs/concepts/#tools

工具(Tools)是为模型调用而设计的实用程序:其输入由模型生成,输出则传回模型。当你希望模型控制部分代码或调用外部 API 时,就需要使用工具。

一个工具包含以下部分:

  • 工具的名称name
  • 工具的功能描述description
  • 定义工具输入的JSON schema
  • 一个函数function(可选地,还可以有该函数的async版本)。

当一个工具绑定到模型时,其namedescriptionJSON schema会作为上下文提供给模型。给定一组工具和一组指令,模型可以请求调用一个或多个工具并传递特定输入。典型的用法可能如下所示:

1tools = [...] # Define a list of tools
2llm_with_tools = llm.bind_tools(tools)
3ai_msg = llm_with_tools.invoke("do xyz...")
4# -> AIMessage(tool_calls=[ToolCall(...), ...], ...)

模型返回的 AIMessage 可能 会包含与之关联的工具调用(tool_calls)。请阅读此指南以获取关于响应类型的更多信息。

一旦调用了选定的工具,结果可以传回模型,以便模型完成其执行的任务。通常有两种不同的方式来调用工具并将响应传回模型:

仅使用参数调用 #

当你仅使用参数调用一个工具时,你会得到工具的原始输出(通常是一个字符串)。通常表现如下:

1# You will want to previously check that the LLM returned tool calls
2tool_call = ai_msg.tool_calls[0]
3# ToolCall(args={...}, id=..., ...)
4tool_output = tool.invoke(tool_call["args"])
5tool_message = ToolMessage(
6    content=tool_output,
7    tool_call_id=tool_call["id"],
8    name=tool_call["name"]
9)

请注意,content 字段通常会传回模型。如果你不希望将工具的原始响应传递给模型,但仍希望保留它,你可以对工具输出进行转换,并将其作为一个artifact传递(更多关于 ToolMessage.artifact 的信息,请参阅此处)。

1... # Same code as above
2response_for_llm = transform(response)
3tool_message = ToolMessage(
4    content=response_for_llm,
5    tool_call_id=tool_call["id"],
6    name=tool_call["name"],
7    artifact=tool_output
8)

使用 ToolCall 调用 #

另一种调用工具的方法是使用模型生成的完整 ToolCall 进行调用。当你这样做时,工具将返回一个 ToolMessage。这样做的好处是,你不必自己编写逻辑将工具输出转换为 ToolMessage。通常表现如下:

1tool_call = ai_msg.tool_calls[0]
2# -> ToolCall(args={...}, id=..., ...)
3tool_message = tool.invoke(tool_call)
4# -> ToolMessage(
5#      content="tool result foobar...",
6#      tool_call_id=...,
7#      name="tool_name"
8#    )

如果你以这种方式调用工具,并且希望为 ToolMessage 包含一个artifact,你需要让工具返回两个内容。更多关于定义返回artifact的工具的信息,请参阅此处

最佳实践 #

设计供模型使用的工具时,需牢记以下几点:

  • 明确支持tool calling API的聊天模型在调用工具方面会比未经微调的模型表现更好。
  • 如果工具的名称、描述和 JSON Schema经过精心选择,模型的表现会更好。这也是提示工程的一种形式。
  • 简单、范围明确的工具比复杂的工具更容易被模型使用。

相关内容 #

有关如何使用工具的具体细节,请参阅工具使用指南

要使用预构建的工具,请查看工具集成文档

© 2024 青蛙小白
comments powered by Disqus