如何使用 DeepSeek V3 的函数调用?

如何使用 DeepSeek V3 的函数调用?

关键要点

它的作用:函数调用使 AI 模型能够与外部工具和 API 进行交互,执行特定任务,并访问实时数据,用于系统操作和自动化工作流。

支持的模型:DeepSeek V3 系列、GPT 系列、Gemma 2 和 Mistral Nemo。

如何实现? 你可以通过 Novita AI 安装 API 并从 ** 文档** 中学习。

函数调用通过支持与外部世界交互来增强大型语言模型(LLM)。除了生成文本,LLM 还可以执行任务、访问实时数据并执行复杂操作。作为 AI 知识与可执行任务之间的桥梁,函数调用使 AI 代理或聊天机器人能够与外部工具和服务交互。DeepSeek V3 是一款强大的开源模型,以其出色的性能和效率脱颖而出。

什么是函数调用

函数调用通过支持与外部世界交互来增强大型语言模型(LLM)。除了生成文本,LLM 还可以执行任务、访问实时数据并执行复杂操作。作为 AI 知识与可执行任务之间的桥梁,函数调用使 AI 代理或聊天机器人能够与外部工具和服务交互。DeepSeek V3 是一款强大的开源模型,以其出色的性能和效率脱颖而出。

函数调用如何工作

来自 Google Cloud

  1. 函数声明:定义可重用的代码块(函数),明确描述其功能、输入和输出。
  2. 提示提交:向 LLM 提供提示和一组函数声明,告知其可用的工具。
  3. 模型分析:LLM 评估提示,判断是否需要调用任何提供的函数来满足请求。
  4. 结构化输出:如果需要调用函数,LLM 会以 JSON 格式生成结构化输出,指定函数名称和参数值。
  5. 函数调用:应用程序或系统使用结构化输出调用指定函数,传入所需参数。
  6. 函数执行:外部服务或 API 根据提供的参数执行函数。
  7. 输出响应:外部服务将结果或确认信息返回给 AI。
  8. 模型响应:LLM 使用接收到的输出为用户生成自然语言响应,或用于进一步处理。

函数调用可以解决哪些问题

实时信息访问

  • 股票价格更新
  • 当前天气数据检索
  • 突发新闻获取

系统交互

  • 发送电子邮件
  • 发布社交媒体内容
  • 数据库查询与写入

工作流自动化

  • 数据抓取与处理
  • 多步骤任务执行
  • 复杂分析自动化

数据准确性

  • 确保信息时效性
  • 提供精确查询结果
  • 减少过时数据错误

增强 AI 能力

  • 动态 API 集成
  • 上下文任务执行
  • 真实世界操作执行

用户体验改进

  • 个性化响应
  • 无需离开对话即可完成任务
  • 外部服务的无缝集成

如何通过 Novita AI 使用 DeepSeek V3 函数调用

本指南演示如何使用函数调用获取用户指定位置的当前天气信息。我们将逐步讲解一个完整的 Python 代码示例。有关函数调用的具体 API 格式,请参阅 API 参考 创建聊天补全

referral

立即在 Novita AI 获取 20 美元积分!

  • 初始化客户端

首先,你需要使用你的 Novita API 密钥初始化客户端。

from openai import OpenAI
import json

client = OpenAI(
    base_url="https://api.novita.ai/v3/openai",
    # 从 https://novita.ai/settings/key-management 获取 Novita AI API 密钥。
    api_key="<YOUR Novita AI API Key>",
)

model = "deepseek/deepseek_v3"
  • 定义要调用的函数

接下来,定义模型可以调用的 Python 函数。本例中是一个获取天气信息的函数。

# 模拟获取天气数据的示例函数。
def get_weather(location):
    """获取指定位置的当前天气。"""
    print("Calling get_weather function with location: ", location)
    # 在实际应用中,这里会调用外部天气 API。
    # 这是一个简化的示例,返回硬编码的数据。
    return json.dumps({"location": location, "temperature": "60 degrees Fahrenheit"})
  • 构建包含工具和用户消息的 API 请求

现在,向 Novita 端点创建 API 请求。该请求包含 tools 参数(定义模型可以使用的函数)和用户消息。

tools = [
    {
        "type": "function",
        "function": {
            "name": "get_weather",
            "description": "获取某个位置的天气,用户应先提供位置",
            "parameters": {
                "type": "object",
                "properties": {
                    "location": {
                        "type": "string",
                        "description": "城市和州,例如 San Francisco, CA",
                    }
                },
                "required": ["location"]
            },
        }
    },
]

messages = [
    {
        "role": "user",
        "content": "What is the weather in San Francisco?"
    }
]

# 发送请求并打印响应。
response = client.chat.completions.create(
    model=model,
    messages=messages,
    tools=tools,
)

# 在生产环境中请检查响应中是否包含工具调用。
tool_call = response.choices[0].message.tool_calls[0]
print(tool_call.model_dump())
  • 输出
{'id': '0', 'function': {'arguments': '{"location": "San Francisco, CA"}', 'name': 'get_weather'}, 'type': 'function'}
  • 用函数调用结果响应并获取最终答案

下一步是处理函数调用,执行 get_weather 函数,并将结果发送回模型以生成对用户的最终响应。

# 确保上一节定义了 tool_call
if tool_call:
    # 将助手的工具调用消息追加到对话历史中
    messages.append(response.choices[0].message)

    function_name = tool_call.function.name
    if function_name == "get_weather":
        function_args = json.loads(tool_call.function.arguments)
        # 执行函数并获取响应
        function_response = get_weather(
            location=function_args.get("location"))
        # 将函数响应追加到消息中
        messages.append(
            {
                "tool_call_id": tool_call.id,
                "role": "tool",
                "content": function_response,
            }
        )

    # 从模型获取最终响应,现在包含了函数结果
    answer_response = client.chat.completions.create(
        model=model,
        messages=messages,
        # 注意:此处不要包含 tools 参数。
    )
    print(answer_response.choices[0].message)
  • 输出
{'id': '0', 'function': {'arguments': '{"location": "San Francisco, CA"}', 'name': 'get_weather'}, 'type': 'function'}

函数调用的常见问题与最佳实践

AI 模型中的函数调用既带来挑战也带来机遇。以下是常见问题与相应最佳实践的对比:

  • 不准确的理解与清晰的提示

问题:模型可能不准确地理解用户意图,导致不必要的或不正确的函数调用。

最佳实践:提供清晰简洁的系统提示,描述聊天机器人的目的和可用功能。使用多轮示例演示直接响应和适当的函数调用。

  • 复杂工作流管理

问题:难以管理具有多个相互依赖步骤的复杂工作流。

最佳实践:在转向更复杂的方法之前,先从提示工程开始。微调时注重质量而非数量,从少量高质量示例开始。

  • 细致的决策制定

问题:在解释函数输出和外部数据以进行细致决策时面临挑战。

最佳实践:必要时使用检索增强生成(RAG)注入上下文。结合微调和 RAG 等技术来平衡各自的优缺点。

  • 数据结构复杂性

问题:在处理不断演变的复杂数据结构(如图和嵌套对象)时存在限制。

最佳实践:选择合适的抽象层次,平衡简洁代码与性能。保持函数精简且专注,以提高效率和可读性。

  • 遗留系统集成

问题:在混乱、模糊的遗留系统中进行集成时遇到困难。

最佳实践:通过性能分析,优化最常调用的函数或热点。在处理遗留系统时,考虑批量操作以减少开销。

  • 安全问题

问题:在没有复杂判断的情况下执行特权函数时存在安全隐患。

最佳实践:实施健壮的错误处理机制以管理意外的 API 响应。确保强大的数据保护措施并遵守法规,以维护用户信任和敏感信息安全。

  • 可扩展性与性能

问题:在满足关键任务系统严格的可扩展性、可用性和性能需求方面,可靠性尚未得到验证。

最佳实践:利用编译器优化,并使用较低的温度设置以获得更集中和确定性的输出。通过性能分析优化热点,以获得最显著的性能提升。

  • 过度依赖函数调用

问题:模型可能不必要或不恰当地调用函数,即使不需要时也是如此。

最佳实践:仔细管理函数调用的实现方式。确保适当的错误处理和回退机制到位,即使外部服务不可用,也能维持系统可靠性。

  • 隐私与透明度问题

问题:当 LLM 代表用户做出决策或采取行动时,存在关于透明度和用户同意的伦理问题。

最佳实践:实施清晰的文档和用户同意机制。确保数据处理负责任,并遵守 GDPR 或 HIPAA 等隐私法规。

总之,函数调用标志着 LLM 的重大进步,使其能够无缝地与企业和数据系统交互,并赋能开发者构建更动态、更实用的应用程序。通过轻松集成外部应用程序、系统和 API,LLM 变得高度通用,能够高效处理各种任务。像 DeepSeek V3 这样的模型正引领潮流,为这一变革性技术提供简化的访问途径,为 AI 创新开启无限可能。

常见问题解答

在 LLM 背景下,什么是函数调用?

函数调用是一种技术,允许大型语言模型识别何时需要外部函数或工具来执行特定任务,并生成结构化数据以执行该函数。

使用函数调用的主要优势是什么?

主要优势包括提高任务处理效率、增强开发者轻松更新函数的灵活性、无需大量更改即可添加新功能的可扩展性,以及个性化的用户交互。

Novita AI 是一个全能的云平台,能够激发你的 AI 抱负。集成 API、无服务器、GPU 实例——你所需的经济高效工具。无需基础设施,免费开始,让你的 AI 愿景成为现实。

推荐阅读