让LLM和聊天模型具备临时工具调用能力:方法和示例

60 阅读3分钟
# 让LLM和聊天模型具备临时工具调用能力:方法和示例

## 引言

在大多数情况下,适合调用工具的语言模型(LLM)已经被专门调整以执行这一任务。然而,有时我们希望为那些不具备工具调用原生支持的模型增加这种能力。这篇文章将介绍如何通过提示工程来实现这一功能,以便模型能够调用所需的工具。

## 主要内容

### 1. 环境设置

为了开始,我们需要安装和配置必要的程序包:

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

如果需要使用LangSmith进行跟踪,请根据需要配置API密钥。为了演示,我们选择phi3 via Ollama模型,因为它不具备原生的工具调用支持。

2. 创建工具

我们将创建两个简单的工具:addmultiply

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]

3. 编写提示

我们将编写一个系统提示,其中包含工具的名称和描述,以便模型能够选择合适的工具。

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 | JsonOutputParser()
result = chain.invoke({"input": "what's 3 plus 1132"})

print(result)
# Output: {'name': 'add', 'arguments': {'x': 3, 'y': 1132}}

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)

# 测试工具调用
invoke_tool({"name": "multiply", "arguments": {"x": 3, "y": 5}})
# Output: 15.0

常见问题和解决方案

即便我们的实现可以功能性地支持工具调用,但在实践中,模型可能会输出不够精确或错误的请求。为此,可以考虑以下解决方案:

  • 示例提供:在提示中提供示例可以帮助提升模型的理解。
  • 错误处理:捕获模型输出的错误并反馈给模型以进行自我修正。

总结和进一步学习资源

通过本文,我们了解了如何通过简单的提示工程来为未具备工具调用支持的模型增加这项能力。建议研究LangChain和LangSmith的更多文档,以加深对如何优化和调试工具调用的理解。

参考资料

  1. LangChain官方文档
  2. LangSmith官方指南

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


---END---