上次讲了deekseep的本地部署和deekseek如何帮助我们选择调用哪个方法,

传送门:https://blog.csdn.net/xixixi_1160/article/details/145881063?fromshare=blogdetail&sharetype=blogdetail&sharerId=145881063&sharerefer=PC&sharesource=xixixi_1160&sharefrom=from_link

本次讲解deekseep帮助我们选择好函数以后,函数该如何执行。

首先我们先明白一点,AI没有执行代码的能力,所以他只能告诉我们该执行哪个函数,但是函数的执行还是由我们来控制。所以我们要有一套控制函数执行的逻辑。

接下来就开始吧。

 这里我用的是我上次提到的装饰器,将函数信息都放到一个字典里:

name:函数名称(作为字典的key),des:功能介绍,args_schema:参数列表

# 工具字典{ 函数名 :函数对象 }
tools = {}

def tool(name: str, des: str, args_schema: dict):
    def decorator(func):
        tools[name] = {
            "func": func,
            "des": des,
            "args_schema": args_schema
        }
        return func
    return decorator

函数:这里有两个简单的函数:

@tool(
    name="get_weather",
    des="获取指定城市天气",
    args_schema={
        "location": {"type": "string", "des": "城市"}
    }

)
def get_weather(location: str) -> str:
    return f"{location}天气:晴,10℃,这是本地方法,不是瞎胡闹的"


@tool(
    name="calculator",
    des="计算器",
    args_schema={
        "exp": {"type": "string", "des": "数学表达式"}
    }
)
def claculator(exp: str) -> float:
    return eval(exp)

先简单输出一下tools的信息:

可以看到函数信息已经被写到字典里面了。

接下来我们给AI一点提示词:告诉AI只能在我们提供的字典中选择函数,不要自己乱写,没有就告诉我们没有对应的方法。(这点很重要,因为deepseek有推导能力,不这么说他会自己写一个莫须有的函数返回给你)。并给出返回格式(一般都用json)。

限定AI以json格式返回:配置一下即可

completion = client.chat.completions.create(
    model="deepseek-r1:1.5b",
    messages=messages,
    max_tokens=1024,
    temperature=0.7,
    response_format={
        'type': 'json_object' #以json格式返回
    }
)
ai_res = completion.choices[0].message.content
print(ai_res)

看看AI给我们返回了什么:

很好,AI已经给我们返回了需要调用的函数名,以及参数列表。

接下来就是执行了。

我们要对AI返回的json解析并执行对应的函数

def exe_tool(ai_res: str) -> str:
    try:
        action = json.loads(ai_res)
        tool_name = action["func"]#拿到函数名
        args = action["args"]#用户要传给函数的参数,这是AI推理出来的
        if isinstance(args, str): #这里是因为我在执行的时候发现AI返回的json中,有时候会返回字符串,有时会返回字典
            args = eval(action["args"])
        if tool_name not in tools:
            return f"错误:工具{tool_name}不存在"
        tool = tools[tool_name]
        return tool["func"](**args)

    except Exception as e:
        return str(e)

接下来我们在执行一下,看看结果如何

很明显这是我的本地方法,这样就实现了我提需求,AI执行的全部过程。

以上就是利用AI执行对应的本地方法的过程。需要注意的是,根据官方文档所说,以json返回有时候会返回空字符串,暂时还没解决。另一点,AI返回值是有一定随机性的,这时候要么严格规定AI(提示词),要么就微调AI参数(需要一定的数据和资源)。建议通过加提示词的方式来规定AI(或者多试几次),至于微调AI,如果各位有需求的话,可以私信我,出一期AI微调教程。

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐