智能化DeepSeek工具调用详解

Python3.9

Python3.9

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

《DeepSeek大模型高性能核心技术与多模态融合开发(人工智能技术丛书)》(王晓华)【摘要 书评 试读】- 京东图书

相对于只能完成普通文本任务的大模型,DeepSeek一个激动人心的功能是可以自主调用外部工具函数,以自主意识的形式借用工具,完成使用者发布的命令。这意味着DeepSeek不再仅仅是一个被动的执行者,而是成为了一个具有主动性的智能助手。

DeepSeek的Function calling功能是一项具有划时代意义的进步。这一功能的实现,使得DeepSeek不仅仅局限于自身数据库知识的回答,而是跃进到了一个全新的层次—调用外部函数,其调用流程如图7-7所示。

图7-7  DeepSeek的Function calling功能

这意味着DeepSeek大语言模型在与用户交互时,可以实时检索外部函数库。当用户提问时,模型不再仅仅是从自身知识库中寻找答案,而是会根据实际需求,在外部函数库中进行检索,找出合适的函数并调用它。这种调用外部函数的能力,使得DeepSeek可以获取到函数的运行结果,并基于这些结果进行回答。

7.2.1  Python使用工具的基本原理

工具的使用是一项非常简单的事情,从我们的祖先钻木取火,到现在人类飞上月球在太空建立永久基地,这些都离不开工具的使用。甚至在现实生活中,你决定今天出门要不要带上雨伞,都需要借助网络信息或者广播工具了解到今天的天气情况。

而Python同样也可以使用工具来完成对外部API的调用,其所需要的仅仅是一个函数名称而已。示例代码如下所示。

#创建了一个简单的查询天气的API
def get_weather(location = ""):
    "读者可以编写对应的天气查询API,这里我们仅仅作演示"
    if location == "ShangHai":
        return 23.0
    elif location == "TianJin":
        return 25.0
    else:
        return "未查询相关内容"
location = "ShangHai"
#注意写法格式,里面额度单引号不能少
result = eval(f"get_weather(location='{location}')")#使用eval调用字符串名称对应的函数
print("查询到的结果是:", result)

最终打印结果如下:

查询到的结果是: 23.0

可以看到,Python中提供的eval函数可以根据传入的字符串自动运行对应的函数。在这个示例中,我们将location变量的值嵌入到字符串中,然后将该字符串作为代码传给eval()函数执行。注意,在嵌入变量值时,我们使用了单引号将变量值括起来,以确保代码的正确解析。

eval()函数是Python的一个内置函数,它的功能是将字符串作为Python代码执行。其工作原理可以简单概括为“字符串解析和执行”。

当我们调用eval()函数并传入一个字符串时,函数会尝试解析这个字符串,将它转换成Python的表达式或语句,然后在当前的命名空间中执行这些表达式或语句。

例如,如果我们传入字符串"1+2",print(eval("1+2"))。eval()函数会将这个字符串解析为Python的加法表达式,然后计算这个表达式的值,返回结果3。

7.2.2  在DeepSeek中智能的使用工具

在上一小节中,我们展示了如何在Python中调用函数,但是,我们面临一个更复杂的问题:如何在大模型DeepSeek中调用工具?这个问题看似简单,实则涉及许多深层次的技术与思考。就如同多年前人们询问计算机“今天是晴天还是雨天”一样,我们如今要探讨的是如何让大模型调用工具来解决问题。

先回到日常生活中的一个例子。在决定今天的穿着之前,我们通常会有一个明确的前置任务:了解今天的天气。那么,如何获取天气信息呢?以下是一些可能的方法:

  1. A:对着衣橱问自己应该穿什么衣服。这显然不是获取天气信息的正确途径。
  2. B:使用互联网登录天气网站,输入本地名称查询。这是一个有效且常用的方法。
  3. C:打开一本书阅读任意一页。这与获取天气信息无关。
  4. D:打开空调。这同样不能告诉我们今天的天气情况。

对于大多数读者来说,选择B是显而易见的,这是基于我们的常识和日常经验。然而,这种基于目标寻找最合适解决方案的能力并非天生,而是需要我们后天的学习和积累。我们需要知道哪些工具或方法可以帮助我们实现目标,这通常需要一个知识库或他人的指导。如图7-8所示。

图7-8  有知识库辅助研判的任务流程

上图所示是一个基于常识的决策过程,同时也是我们在日常生活中做出明智决策并取得良好结果的通用步骤。在每次决策之前,我们依赖的是深厚的知识储备或知识库,它们如同明灯,照亮我们前行的道路,引导我们做出最优决策。

当我们回到DeepSeek调用工具的问题时,面临的挑战是如何让这个大模型也具备这样的决策能力,即根据给定的任务,它能知道应当调用哪些工具。作为深度学习程序设计人员,我们的责任不仅是开发模型,更要引导模型如何使用工具。我们可以提供格式化的API信息,这种方式就像是给大模型提供一本详细的程序文档。在这份文档中,我们详细描述每个工具API的功能、参数以及返回值,告诉大语言模型在何时、何地可以调用这些API,并且当API被调用后,返回相应的API的JSON对象。

这样的方式能够让大模型更加智能化地运用工具,进而提升其解决问题的效率和准确性。想象一下,当大模型遇到问题时,它可以像人类一样查阅“工具书”,找到最合适的工具,然后利用这个工具解决问题。

一个可供DeepSeek进行调用的简单函数如下所示:

# 定义工具函数
def get_weather(function_params):
    """模拟获取天气的工具函数"""
    location = function_params[0]
    # 这里可以调用真实的天气 API
    return f"{location}的天气晴朗"

上述函数对象描述了一个名为get_weather的工具API。通过这个API,大模型可以根据输入的城市名称获取当前的天气情况。这样的描述方式清晰明了,使得大模型能够准确理解并调用这个API。因此,通过对工具API中的描述进行甄别,从而判定使用哪一个最合适的工具,加上合理的引导和训练,可以使大模型更加智能化,从而完成对工具的使用。

作者完成了一个在DeepSeek中使用工具的完整示例,代码如下所示:

from openai import OpenAI
import json

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

def get_weather(function_params):
    return "天气晴朗"

def send_messages(messages):
    response = client.chat.completions.create(
        model="deepseek-chat",
        messages=messages
    )
    return response.choices[0].message

system_prompt = """
	你在运行一个“思考”,“工具调用”,“响应”循环。每次只运行一个阶段

	1.“思考”阶段:你要仔细思考用户的问题
	2.“工具调用阶段”:选择可以调用的工具,并且输出对应工具需要的参数
	3.“响应”阶段:根据工具调用返回的影响,回复用户问题。

	已有的工具如下:
	get_weather:
	e.g. get_weather:天津
	返回天津的天气情况

	Example:
	question:天津的天气怎么样?
	thought:我应该调用工具查询天津的天气情况
	Action:
	{
		"function_name":"get_weather",
		"function_params":["天津"]
	}
	调用Action的结果:“天气晴朗”
	Answer:天津的天气晴朗
"""

question = "Shanghai的天气怎么样"

messages = [{"role": "system", "content": system_prompt},
            {"role": "user", "content": question}]

message = send_messages(messages)
response = message.content
action = response.split("Action:")[1]
action = json.loads(action)
print(f"ModelResponse:\n {action}")

# 生成调用代码
function_name = action["function_name"]
function_params = action["function_params"]
code = f"{function_name}({function_params})"
print(code)

# 使用eval对生成的代码进行计算,这里假设get_weather函数已经被定义过
result = eval(code)
print(result)

这段代码实现了一个简单的对话系统,能够根据用户的问题调用相应的工具并生成回答。首先,代码通过OpenAI库初始化了一个客户端,并设置了API密钥和基础URL。接着,定义了一个get_weather函数,用于模拟获取天气的功能,返回固定的“天气晴朗”结果。send_messages函数则负责向模型发送消息并获取模型的响应。系统提示(system_prompt)中详细描述了对话系统的三个阶段:思考、工具调用和响应,并提供了一个示例说明如何调用get_weather工具,以回答天气相关的问题。

生成结果如下所示:

ModelResponse:

 {'function_name': 'get_weather', 'function_params': ['上海']}

get_weather(['上海'])

天气晴朗

具体来看,在代码的执行部分,用户提出了一个关于上海天气的问题。系统通过send_messages函数将问题发送给模型,模型根据系统提示生成一个包含工具调用信息的响应。代码通过解析响应中的Action 部分,提取出需要调用的工具名称和参数,并生成相应的调用代码。最后,使用eval函数执行生成的代码,模拟工具调用的过程,并输出结果。整个过程展示了如何通过模型生成工具调用指令,并动态执行这些指令来完成用户请求。

您可能感兴趣的与本文相关的镜像

Python3.9

Python3.9

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值