必须走function calling流程:模型先生成结构化调用指令,开发者截获后执行函数并回传结果。需定义含type、name、description、parameters的标准工具字典,parameters中required须显式声明;调用api时base_url设为https://api.deepseek.com,model用deepseek-chat,并传入tools参数;响应中需检查tool_calls,拼接完整arguments后解析执行;最后以role="tool"消息回传结果并发起第二轮请求获取最终回答。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

要用DeepSeek实现让大模型自动调用外部工具(比如查天气、查股价、搜网页),必须走Function Calling流程——它不是直接发请求就能出结果,而是模型先生成结构化调用指令,你截获后执行函数,再把结果喂回去让它续写回答。
定义可调用的函数工具
第一步是把你要接入的业务逻辑包装成标准格式的字典,放进tools列表里。每个工具必须包含type、function.name、function.description和function.parameters三部分。
例如查询杭州天气,要写清楚参数location是字符串类型且必填:
【parameters中required字段必须显式声明,漏掉会导致模型不触发调用】
function.description不能写“获取天气”,得写“获取指定城市的实时天气状况,包括温度和天气现象”,越具体模型识别越准。
发送带tools的消息给DeepSeek API
初始化OpenAI客户端时,base_url必须设为https://api.deepseek.com,model固定用deepseek-chat。
调用client.chat.completions.create时,除了messages,必须传入tools参数,否则模型根本看不到你提供了哪些工具。
这一步操作起来很简单,直接把tools列表塞进参数就行。
捕获并解析模型返回的tool_calls
第一步:检查response.choices[0].message.tool_calls是否存在。如果为空,说明模型没决定调用函数,直接取.content即可。
第二步:若存在tool_calls,遍历每个调用项,提取id、function.name和function.arguments。
注意:arguments是字符串格式的JSON片段,不是完整JSON对象——流式响应中参数可能被分段返回,必须拼接完整后再json.loads(),否则会报JSONDecodeError。
第三步:根据name匹配你预先定义的函数,用json.loads(arguments)后的字典作为参数执行本地函数。
把函数执行结果回传给模型
方法一:构造role为tool的新消息,包含tool_call_id(必须与原调用id完全一致)和content(函数返回值字符串)。
方法二:把这条tool消息追加到原始messages末尾,再次调用API发起第二轮请求。
这轮请求不再传tools参数——因为任务已执行完毕,模型只需基于结果生成自然语言回复。
最终response.choices[0].message.content就是用户看到的答案。









