【DeepSeek开发入门】Function Calling 函数功能应用实战指南

系列篇章💥

No.文章
01【DeepSeek应用实践】DeepSeek接入Word、WPS方法详解:无需代码,轻松实现智能办公助手功能
02【DeepSeek应用实践】通义灵码 + DeepSeek:AI 编程助手的实战指南
03【DeepSeek应用实践】Cline集成DeepSeek:开源AI编程助手,终端与Web开发的超强助力
04【DeepSeek开发入门】DeepSeek API 开发初体验
05【DeepSeek开发入门】DeepSeek API高级开发指南(推理与多轮对话机器人实践)
06【DeepSeek开发入门】Function Calling 函数功能应用实战指南
07【DeepSeek部署实战】DeepSeek-R1-Distill-Qwen-7B:本地部署与API服务快速上手
08【DeepSeek部署实战】DeepSeek-R1-Distill-Qwen-7B:Web聊天机器人部署指南
09【DeepSeek部署实战】DeepSeek-R1-Distill-Qwen-7B:基于vLLM 搭建高性能推理服务器
10【DeepSeek部署实战】基于Ollama快速部署DeepSeek-R1系列模型实战指南(Linux)
11【DeepSeek部署实战】基于Ollama+Chatbox零成本部署DeepSeek-R1系列模型攻略(Windows)
12【DeepSeek开发实战】DeepSeek-R1-Distill-Qwen与LangChain的本地大模型应用开发指南


前言

在人工智能开发领域,DeepSeek 以其丰富的功能和强大的性能备受关注。其中,Function Calling(函数调用)功能为开发者提供了一种全新的交互方式,使得模型能够与外部工具和函数进行交互,极大地拓展了模型的应用能力。本文将深入探讨 DeepSeek Function Calling 的原理、使用方法、应用场景以及开发过程中的注意事项。

一、Function Calling 功能概述

(一)功能原理

Function Calling 允许模型根据用户的输入,判断是否需要调用外部函数来完成任务。模型通过对用户问题的理解,识别出需要借助特定函数解决的部分,然后生成调用函数的指令。这些函数可以是自定义的工具函数,也可以是调用第三方 API 的函数。例如,当用户询问 “明天北京的天气如何”,模型识别到这是一个获取天气信息的任务,就可以调用相应的天气查询函数来获取数据并回答用户。

(二)与传统对话的区别

与传统的对话模型不同,Function Calling 打破了模型只能基于自身知识进行回答的限制。传统对话模型主要依赖预训练的知识来生成回复,而 Function Calling 使得模型能够动态地调用外部工具,获取最新的信息和执行特定的任务,从而提供更准确、更实用的回答。

二、Function Calling使用方法详解

(一)定义业务函数

在使用 Function Calling 之前,开发者需要定义可供模型调用的函数。这些函数需要有清晰的定义,包括函数名、参数列表和功能描述。例如,定义一个获取城市天气的函数:

def get_weather(city):
    """
    获取指定城市的天气信息
    :param city: 城市名称
    :return: 包含天气状况和温度的字典
    """
    # 这里是实际获取天气数据的代码,例如调用天气API
    weather_data = {
        "condition": "sunny",
        "temperature": "25°C"
    }
    return weather_data

(二)初始化大模型客户端

导入相关的依赖包,并初始化大模型客户端

import json
from openai import OpenAI

client = OpenAI(api_key="sk-47a1288c898f43ecbb41864bf8f85a8a", base_url="https://api.deepseek.com")

(三)定义tools工具函数

# 定义tools工具函数
tools = [
    {
        "type": "function",
        "function": {
            "name": "get_weather",
            "description": "获取指定城市的天气信息",
            "parameters": {
                "type": "object",
                "properties": {
                    "city": {
                        "type": "string",
                        "description": "城市名称"
                    }
                },
                "required": ["city"]
            }
        }
    }
]

(四)第一次调用大模型API

在调用 DeepSeek API 时,需要在请求体中包含tools参数,用于指定模型可以调用的函数列表。同时,tool_choice参数可以控制模型调用工具的行为,取值包括none(不调用任何工具,直接生成消息)、auto(模型可选择生成消息或调用工具)、required(模型必须调用工具)。

# 定义消息
messages = [
    {"role": "user", "content": "明天北京的天气如何"}
]

# 第1次大模型调用(查看是否有匹配到工具函数)
response = client.chat.completions.create(
    model="deepseek-chat",
    messages=messages,
    tools=tools,
    tool_choice="auto"
)
# 查看第一次调用后返回的消息(检查大模型是否有找到函数信息)
reply = response.choices[0].message
messages.append(reply)
print(reply)

返回结果如下:

在这里插入图片描述

(五)调用真正的业务函数

function_args = json.loads(reply.tool_calls[0].function.arguments)  # 确保转换为字典
result = get_weather(**function_args) #真正调用,手动执行获取天气信息的方法
print(result)

打印如下:

{'condition': 'sunny', 'temperature': '25°C'}

(六)第二次调用大模型API

第2次大模型调用;将获取到的结果,丢给大模型帮忙整理后再输出给用户。
示例代码如下:

# messages.append({"role": "tool", "name": function_name, "content": str(result)})
tool_call_id = reply.tool_calls[0].id
#print("tool_call_id",tool_call_id)
messages.append({"role": "tool", "tool_call_id": tool_call_id, "content": str(result)})
second_response = client.chat.completions.create(
    model="deepseek-chat",
    messages=messages
)
print(second_response.choices[0].message.content)

模型整理后返回如下:

明天北京的天气预计是晴天,气温大约在25°C左右。记得做好防晒措施哦!

三、Function Calling实战(天气查询自能助手完整代码)

基于function calling自助查询天气,完整代码如下:

# 1、导入依赖&初始化大模型客户端
import json
from openai import OpenAI
client = OpenAI(api_key="sk-47a1288c898f43ecbb41864bf8f85a8a", base_url="https://api.deepseek.com")

# 2、定义消息
messages = [
    {"role": "user", "content": "明天北京的天气如何"}
]
# 3、定义tools工具函数
tools = [
    {
        "type": "function",
        "function": {
            "name": "get_weather",
            "description": "获取指定城市的天气信息",
            "parameters": {
                "type": "object",
                "properties": {
                    "city": {
                        "type": "string",
                        "description": "城市名称"
                    }
                },
                "required": ["city"]
            }
        }
    }
]


# 第1次大模型调用(查看是否有匹配到工具函数)
response = client.chat.completions.create(
    model="deepseek-chat",
    messages=messages,
    tools=tools,
    tool_choice="auto"
)
# 查看第一次调用后返回的消息(检查大模型是否有找到函数信息)
reply = response.choices[0].message
print(reply)
messages.append(reply)

if reply.tool_calls:
    #function_name = reply.tool_calls[0].function.name
    #function_args = reply.tool_calls[0].function.arguments
    function_args = json.loads(reply.tool_calls[0].function.arguments)  # 确保转换为字典
    result = get_weather(**function_args) #真正调用,手动执行获取天气信息的方法
    print(result)
    # 第2次大模型调用(将获取到的结果,丢给大模型帮忙整理后再输出给用户)
    # messages.append({"role": "tool", "name": function_name, "content": str(result)})
    tool_call_id = reply.tool_calls[0].id
    #print("tool_call_id",tool_call_id)
    messages.append({"role": "tool", "tool_call_id": tool_call_id, "content": str(result)})
    second_response = client.chat.completions.create(
        model="deepseek-chat",
        messages=messages
    )
    print(second_response.choices[0].message.content)
else:
    print(reply.message.content)

四、Function Calling应用场景

(一)智能助手

在智能助手应用中,Function Calling 可以使助手调用各种工具函数,如查询日历、发送邮件、设置提醒等。例如,用户说 “帮我明天下午三点设置一个会议提醒”,智能助手可以调用设置提醒的函数来完成任务。

(二)数据分析

在数据分析场景下,模型可以调用数据分析函数,如数据清洗、统计分析、数据可视化等。当用户询问 “对这个销售数据进行一下统计分析”,模型可以调用相应的数据分析函数,并将分析结果以可视化的方式呈现给用户。

(三)电商购物

在电商购物平台中,Function Calling 可以帮助用户查询商品信息、下单购买、跟踪物流等。用户说 “我想购买一部苹果手机”,模型可以调用商品查询和下单函数,完成购物流程。

五、Function Calling开发注意事项

(一)函数定义规范

定义函数时,要确保函数的描述清晰准确,参数定义明确。不规范的函数定义可能导致模型错误地调用函数,或者无法正确解析函数的返回结果。

(二)安全问题

在调用外部函数和 API 时,要注意安全问题,防止数据泄露和恶意攻击。例如,对用户输入进行严格的验证和过滤,避免 SQL 注入和其他安全漏洞。

(三)性能优化

过多的函数调用可能会影响性能,特别是在调用第三方 API 时,可能会面临网络延迟等问题。开发者需要合理设计函数调用策略,优化性能,例如缓存常用的函数调用结果。

总结

通过本文的介绍,我们深入了解了 DeepSeek Function Calling 的原理、使用方法、应用场景以及开发注意事项。Function Calling 为开发者提供了强大的工具,使得模型能够与外部世界进行更紧密的交互。在未来的开发中,我们可以进一步探索 Function Calling 与其他技术的结合,如与知识图谱、物联网设备的集成,拓展其应用边界。同时,随着模型和工具的不断发展,Function Calling 的性能和安全性也将得到进一步提升,为我们带来更多的创新和惊喜。让我们期待在 DeepSeek Function Calling 的助力下,创造出更加智能、高效的应用。

在这里插入图片描述

🎯🔖更多专栏系列文章:AI大模型提示工程完全指南AI大模型探索之路(零基础入门)AI大模型预训练微调进阶AI大模型开源精选实践AI大模型RAG应用探索实践🔥🔥🔥 其他专栏可以查看博客主页📑

😎 作者介绍:资深程序老猿,从业10年+、互联网系统架构师,目前专注于AIGC的探索(CSDN博客之星|AIGC领域优质创作者)
📖专属社群:欢迎关注【小兵的AI视界】公众号或扫描下方👇二维码,回复‘入群’ 即刻上车,获取邀请链接。
💘领取三大专属福利:1️⃣免费赠送AI+编程📚500本,2️⃣AI技术教程副业资料1套,3️⃣DeepSeek资料教程1套🔥(限前500人)
如果文章内容对您有所触动,别忘了点赞、⭐关注,收藏!加入我们,一起携手同行AI的探索之旅,开启智能时代的大门!

### 如何在 DeepSeek 中调用外部函数 为了理解如何在 DeepSeek 中调用外部函数,可以借鉴其他平台和工具链中的实现方式。通常情况下,在集成不同编程环境的功能时,主要依赖于特定的语言绑定或接口机制。 #### 利用语言互操作性特性 对于像 C 和 C++ 这样的低级语言,可以通过 `extern "C"` 来确保名称不会被修饰,从而允许从其他模块访问这些函数[^1]。这同样适用于任何支持此特性的高级框架或库,包括可能用于构建 DeepSeek 的组件。 当涉及到更复杂的场景,比如将 Python 或 JavaScript 函数封装到另一个环境中执行时,则需考虑使用相应的桥接技术或是 API 接口来完成跨语言调用。例如,在 Flutter 应用程序中利用 Firebase Cloud Functions 调用 OpenAI API 就是一个很好的例子[^3]。 #### 创建适配层 如果目标是在 DeepSeek 内部调用来自另一种语言编写的外部功能,那么创建一个中间件可能是必要的解决方案之一。这个中间件负责处理两种运行时之间的通信协议转换工作,并提供简单易用的方法给开发者去间接地调用那些原本不属于当前系统的资源和服务。 具体来说: - 对于静态链接库形式存在的 C/C++ 代码片段,可以直接引入并声明其原型定义; - 如果是动态加载类型的共享对象文件 (.so),则可通过 dlopen() 系列函数获取句柄进而定位所需符号地址; - 面向 WebAssembly (Wasm) 输出的目标产物,可借助 WASI 标准或其他类似的沙盒化方案来进行交互操作。 ```cpp // 假设有一个名为 'my_function' 的 C 函数存在于某个 .so 文件里 void* handle = dlopen("./libexample.so", RTLD_LAZY); if (!handle) { fprintf(stderr, "%s\n", dlerror()); exit(EXIT_FAILURE); } typedef void (*func_ptr)(); *(func_ptr*)(&my_function) = dlsym(handle, "my_function"); if ((error = dlerror()) != NULL) { fprintf(stderr, "%s\n", error); exit(EXIT_FAILURE); } (*my_function)(); dlclose(handle); ``` 上述代码展示了如何在一个 POSIX 兼容的操作系统上打开一个已编译好的动态链接库,并从中提取指定名字的过程入口点以便后续调用[^4]。
评论 38
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寻道AI小兵

🐳 感谢你的巨浪支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值