引言
在许多对话模型和大型语言模型(LLM)的使用场景中,调用外部工具可以显著扩展模型的功能。然而,并非所有模型都原生支持工具调用。本文将介绍如何为这类模型添加临时的工具调用功能,从而提升其在特定任务中的表现。
主要内容
安装和准备
为了实现工具调用,需要安装以下包:
%pip install --upgrade --quiet langchain langchain-community
如果需要使用LangSmith,请解除以下代码的注释:
import getpass
import os
# os.environ["LANGCHAIN_TRACING_V2"] = "true"
# os.environ["LANGCHAIN_API_KEY"] = getpass.getpass()
在选择模型时,我们将使用不具备工具调用功能的模型,如Ollama的phi3。对于其他已经支持工具调用的模型,建议使用专用API。
创建工具
我们将创建一个简单的add和multiply工具:
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]
编写提示
接下来,我们需要编写一个提示,指导模型如何使用工具:
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}")]
)
实现工具调用
接下来,编写函数来调用工具:
from typing import Any, Dict, TypedDict
class ToolCallRequest(TypedDict):
name: str
arguments: Dict[str, Any]
def invoke_tool(tool_call_request: ToolCallRequest):
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"])
# 测试工具调用
invoke_tool({"name": "multiply", "arguments": {"x": 3, "y": 5}})
常见问题和解决方案
尽管通过提示可以引导模型进行工具调用,但模型可能并不总是能够准确识别所有工具信息。以下是一些解决方法:
- 提供示例:通过示例指导模型更好地理解任务。
- 错误处理:捕获异常并反馈给模型,以帮助其校正输出。
总结和进一步学习资源
通过上述方法,开发者可以有效地拓展LLM的功能,使其能够调用外部工具以执行特定任务。鼓励读者深入研究LangChain文档,以获取更多关于工具调用和模型集成的知识。
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---