[让你的聊天模型变身超级助手:实现自定义工具调用]

84 阅读3分钟
# 让你的聊天模型变身超级助手:实现自定义工具调用

在使用大语言模型(LLMs)和聊天模型时,我们可能需要它们调用某些工具来完成特定任务。然而,并不是所有的模型都天然支持工具调用。本文将指导你如何给一个不支持工具调用的聊天模型添加这种能力。

## 引言

在许多应用场景中,我们需要模型通过调用外部工具来生成答案或执行任务。虽然有些模型已经为了工具调用进行了微调,但如果你所使用的模型尚未支持该功能,我们可以通过编写适当的提示(prompt)来达成目的。本文将详细讲解如何实现这一过程。

## 主要内容

### 环境准备

首先,安装所需的库:

```bash
%pip install --upgrade --quiet langchain langchain-community

如果需要使用其他模型如OpenAI、Anthropic等,请确保已安装对应的库,并获取必要的API密钥。

创建工具

我们需要定义一些可以被调用的工具。以下示例展示了如何创建简单的加法和乘法工具:

from langchain_core.tools import tool

@tool
def multiply(x: float, y: float) -> float:
    """Multiply two numbers together."""
    return x * y

@tool
def add(x: int, y: int) -> int:
    "Add two numbers."
    return x + y

tools = [multiply, add]

编写提示和解析输出

接下来,我们编写一个提示,指导模型返回用于调用工具的JSON格式输出:

from langchain_core.output_parsers import JsonOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.tools import render_text_description

rendered_tools = render_text_description(tools)

system_prompt = f"""\
You are an assistant that has access to the following set of tools. 
Here are the names and descriptions for each tool:

{rendered_tools}

Given the user input, return the name and input of the tool to use. 
Return your response as a JSON blob with 'name' and 'arguments' keys.
"""

prompt = ChatPromptTemplate.from_messages(
    [("system", system_prompt), ("user", "{input}")]
)

chain = prompt | model

调用工具

最后,我们定义函数来实际执行工具调用:

from typing import Any, Dict, Optional, TypedDict
from langchain_core.runnables import RunnableConfig

class ToolCallRequest(TypedDict):
    name: str
    arguments: Dict[str, Any]

def invoke_tool(tool_call_request: ToolCallRequest, config: Optional[RunnableConfig] = None):
    tool_name_to_tool = {tool.name: tool for tool in tools}
    name = tool_call_request["name"]
    requested_tool = tool_name_to_tool[name]
    return requested_tool.invoke(tool_call_request["arguments"], config=config)

代码示例

以下是一个完整的示例,展示了如何求解"3加1132":

chain = prompt | model | JsonOutputParser() | invoke_tool
result = chain.invoke({"input": "what's 3 plus 1132"})
print(result)

常见问题和解决方案

  1. 模型输出不符合预期格式: 使用示例引导提示(few-shot prompt)来提高输出准确性。

  2. 工具调用失败: 添加错误处理逻辑,捕捉异常并给出修正建议。

总结和进一步学习资源

通过以上步骤,我们实现了为不支持工具调用的模型添加自定义工具调用的能力。对于更复杂的工具,你可能需要探索增加更多的上下文信息和提示示例。

参考资料

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---