使用 Python 实现 Claude 函数调用

开放式AI
开放式AI
发布于 2024-08-29 / 16 阅读
0
0

使用 Python 实现 Claude 函数调用

Anthropic 在 2024 年 4 月 4 日发布了 Claude API 的官方工具使用支持,允许开发者定义一个或多个工具,包括参数、描述和模式定义,供 Claude 处理。本文将深入探讨如何利用 Python Anthropic SDK 来使用这些工具。

准备工作:安装 SDK 和设置 API Key

在开始之前,请确保已将 Anthropic API 密钥设置为 shell 中的环境变量:

export ANTHROPIC_API_KEY="sk-......"

接下来,使用 pip 安装最新版本的 Anthropic SDK:

pip install anthropic

定义工具:以获取股票价格为例

参考 Anthropic 文档中提供的 JSON 模式示例,我们来定义一个名为 get_current_stock_price 的工具,用于获取股票的当前价格:

tools = [
    {
        "name": "get_current_stock_price",
        "description": "获取指定股票代码的当前股价。股票代码必须是纽约证券交易所或纳斯达克等美国主要证券交易所上市公司的有效代码。该工具将以美元返回最新的交易价格。当用户询问特定股票的当前或最新价格时,应使用该工具。它不会提供有关该股票或公司的任何其他信息。",
        "input_schema": {
            "type": "object",
            "properties": {
                "symbol": {
                    "type": "string",
                    "description": "股票代码,例如苹果公司的 AAPL"
                }
            },
            "required": ["symbol"]
        }
    }
]

该代码定义了一个工具,包含以下信息:

  • name:工具名称,供 Claude 识别和调用。
  • description:工具描述,用于向 Claude 解释工具的功能和使用场景。
  • input_schema:工具输入参数的 JSON 模式定义,确保 Claude 传递正确的参数类型和格式。

实例化客户端并调用 Claude

要调用 Claude,我们需要实例化一个客户端。SDK 默认使用 ANTHROPIC_API_KEY 环境变量进行身份验证:

import anthropic

client = anthropic.Anthropic()

现在,让我们使用 Claude 和定义的工具创建一个新的消息:

response = client.beta.tools.messages.create(
    model="claude-3-haiku-20240307",
    max_tokens=1024,
    tools=tools,
    messages=[
        {
            "role": "user",
            "content": "苹果的股价是多少?"
        }
    ]
)

print(response)

输出结果将包含一个 ToolUseBlock,其中包含工具的输入参数。

ToolsBetaMessage(id='msg_01Bedxru94A4Pe1sHgWtymSJ', content=[ToolUseBlock(id='toolu_01CbGgyko9mdkKSDPw6LsTvV', input={'symbol': 'AAPL'}, name='get_current_stock_price', type='tool_use')], model='claude-3-haiku-20240307', role='assistant', stop_reason='tool_use', stop_sequence=None, type='message', usage=Usage(input_tokens=433, output_tokens=60))

处理工具调用和构建工具路由器

接下来,我们需要处理工具调用并返回结果给 Claude。这里我们模拟一个返回股票价格为 150.0 的函数:

def get_current_stock_price(symbol):
    # 模拟实现,仅供演示
    return 150.0

然后,创建一个“路由器”函数,根据工具名称调用相应的函数:

def process_tool(tool_name, input):
    match tool_name:
        case "get_current_stock_price":
            return get_current_stock_price(input["symbol"])
        case _:
            raise ValueError(f"未知工具: {tool_name}")

返回工具结果

我们需要将工具执行的结果返回给 Claude,以便其生成最终的回复。以下代码演示了如何实现:

while response.stop_reason == "tool_use":
    tool_use = next(block for block in response.content if block.type == "tool_use")
    tool_name = tool_use.name
    tool_input = tool_use.input
    tool_result = process_tool(tool_name, tool_input)

    messages = [
        {"role": "user", "content": user_message},
        {"role": "assistant", "content": response.content},
        {
            "role": "user",
            "content": [
                {
                    "type": "tool_result",
                    "tool_use_id": tool_use.id,
                    "content": str(tool_result),
                }
            ],
        },
    ]

    response = client.beta.tools.messages.create(
        model=model,
        max_tokens=4096,
        tools=tools,
        messages=messages
    )

final_response = next(
    (block.text for block in response.content if isinstance(block, TextBlock)),
    None,
)

这段代码实现了以下功能:

  1. 循环判断 response.stop_reason 是否为 tool_use,如果是则继续处理工具调用。
  2. response.content 中提取 tool_use 对象,获取工具名称和输入参数。
  3. 调用 process_tool 函数执行工具,并将结果保存到 tool_result 变量中。
  4. 构建新的消息列表,包含用户初始消息、Claude 的回复以及工具执行结果。
  5. 使用更新后的消息列表再次调用 Claude API,并将结果保存到 response 变量中。
  6. 最后,从 response.content 中提取文本类型的回复,即 Claude 最终的回复。

完整代码示例

import anthropic
from anthropic.types import TextBlock

client = anthropic.Anthropic()


def talk(client, tools, model, user_message):
    # ... (代码与上一节相同)


def get_current_stock_price(symbol: str):
    # ... (代码与上一节相同)


def process_tool(tool_name: str, input):
    # ... (代码与上一节相同)


if __name__ == "__main__":
    client = anthropic.Anthropic()
    tools = [
        # ... (代码与之前定义工具部分相同)
    ]
    response = talk(
        client, tools, "claude-3-haiku-20240307", "苹果的价格是多少?"
    )
    print(response)

运行这段代码,你将得到以下输出:

苹果(股票代码 AAPL)的当前股价为 150.00 美元。

总结

本文详细介绍了如何使用 Python Anthropic SDK 调用 Claude API 并使用工具。我们学习了如何定义工具、处理工具调用以及将结果返回给 Claude,最终让 Claude 能够利用外部工具提供更强大、更实用的功能.

希望这篇文章能够帮助你更好地理解和使用 Anthropic Claude 的工具功能,构建更智能的应用程序。


评论