# 让你的聊天模型变身超级助手:实现自定义工具调用
在使用大语言模型(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)
常见问题和解决方案
-
模型输出不符合预期格式: 使用示例引导提示(few-shot prompt)来提高输出准确性。
-
工具调用失败: 添加错误处理逻辑,捕捉异常并给出修正建议。
总结和进一步学习资源
通过以上步骤,我们实现了为不支持工具调用的模型添加自定义工具调用的能力。对于更复杂的工具,你可能需要探索增加更多的上下文信息和提示示例。
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---