个人简介
作者简介:全栈研发,具备端到端系统落地能力,专注大模型的压缩部署、多模态理解与 Agent 架构设计。 热爱“结构”与“秩序”,相信复杂系统背后总有简洁可控的可能。
我叫观熵。不是在控熵,就是在观测熵的流动
个人主页:观熵
个人邮箱:privatexxxx@163.com
座右铭:愿科技之光,不止照亮智能,也照亮人心!
专栏导航
观熵系列专栏导航:
AI前沿探索:从大模型进化、多模态交互、AIGC内容生成,到AI在行业中的落地应用,我们将深入剖析最前沿的AI技术,分享实用的开发经验,并探讨AI未来的发展趋势
AI开源框架实战:面向 AI 工程师的大模型框架实战指南,覆盖训练、推理、部署与评估的全链路最佳实践
计算机视觉:聚焦计算机视觉前沿技术,涵盖图像识别、目标检测、自动驾驶、医疗影像等领域的最新进展和应用案例
国产大模型部署实战:持续更新的国产开源大模型部署实战教程,覆盖从 模型选型 → 环境配置 → 本地推理 → API封装 → 高性能部署 → 多模型管理 的完整全流程
TensorFlow 全栈实战:从建模到部署:覆盖模型构建、训练优化、跨平台部署与工程交付,帮助开发者掌握从原型到上线的完整 AI 开发流程
PyTorch 全栈实战专栏: PyTorch 框架的全栈实战应用,涵盖从模型训练、优化、部署到维护的完整流程
深入理解 TensorRT:深入解析 TensorRT 的核心机制与部署实践,助力构建高性能 AI 推理系统
Megatron-LM 实战笔记:聚焦于 Megatron-LM 框架的实战应用,涵盖从预训练、微调到部署的全流程
AI Agent:系统学习并亲手构建一个完整的 AI Agent 系统,从基础理论、算法实战、框架应用,到私有部署、多端集成
DeepSeek 实战与解析:聚焦 DeepSeek 系列模型原理解析与实战应用,涵盖部署、推理、微调与多场景集成,助你高效上手国产大模型
端侧大模型:聚焦大模型在移动设备上的部署与优化,探索端侧智能的实现路径
行业大模型 · 数据全流程指南:大模型预训练数据的设计、采集、清洗与合规治理,聚焦行业场景,从需求定义到数据闭环,帮助您构建专属的智能数据基座
机器人研发全栈进阶指南:从ROS到AI智能控制:机器人系统架构、感知建图、路径规划、控制系统、AI智能决策、系统集成等核心能力模块
人工智能下的网络安全:通过实战案例和系统化方法,帮助开发者和安全工程师识别风险、构建防御机制,确保 AI 系统的稳定与安全
智能 DevOps 工厂:AI 驱动的持续交付实践:构建以 AI 为核心的智能 DevOps 平台,涵盖从 CI/CD 流水线、AIOps、MLOps 到 DevSecOps 的全流程实践。
C++学习笔记?:聚焦于现代 C++ 编程的核心概念与实践,涵盖 STL 源码剖析、内存管理、模板元编程等关键技术
AI × Quant 系统化落地实战:从数据、策略到实盘,打造全栈智能量化交易系统
✨摘要
在多工具协同的大模型系统中,函数调用(Function Calling / Tool Use)成为连接模型与业务逻辑的关键机制。然而,结构不一致、字段漂移、类型不对等问题频发,让许多开发者“调不出行为一致的 JSON”。本篇文章将围绕 OpenAI 与 DeepSeek 两大主流支持 Function 调用的大模型,系统讲解函数调用 Prompt 的编排方法:如何描述意图、约束格式、控制字段生成;如何处理多函数、多参数、多返回结构;如何利用 system+user 层提示词精细控制模型行为。同时对比两类模型在调用策略、结构容错、字段对齐等方面的异同,帮助你真正构建可用、可控、可系统集成的“函数 Prompt 调用规范”。
📚目录
第一章:Tool 调用已成为大模型系统“落地工程”的关键接口
- 为什么 Function Prompt 比普通 Prompt 更容易崩?
- 函数调用中的三大问题:结构错 / 行为漂 / 类型不对
- Prompt 不再是问句,而是行为控制器 + 接口协商协议
第二章:OpenAI Function Calling 的调用机制与 Prompt 结构
- function schema / 参数结构 / auto tool use 机制
- system prompt 的位置与作用
- user prompt 如何引导字段选择与内容控制
- JSON 输出控制技巧:格式嵌入、字段限定、空值约束
第三章:DeepSeek Tools 的调用机制与 Prompt 协议设计
- DeepSeek 的 tool 调用协议(调用触发逻辑 / 工具清单)
- 角色提示结构解析:system / tool_desc / user
- 多轮交互中的函数选择行为策略
- 常见问题点:结构混出 / tool_response 不合法 / 参数漏填
第四章:多参数函数的 Prompt 控形技巧
- 如何控制模型按字段顺序逐项生成
- Enum、日期、bool、嵌套结构的 Prompt 设计技巧
- 多字段字段解释 vs 不解释行为控制方式
- fallback prompt + 无效参数处理建议
第五章:OpenAI × DeepSeek 双模型函数调用行为对比
- 调用行为触发点:是否自动?是否按顺序?
- JSON 格式差异:空字段是否保留、字段顺序是否稳定
- 容错策略差异:字段缺失 / 非枚举值处理 / 类型偏移响应
- 多轮函数调用下的上下文处理能力(包含tool返回)
第六章:最佳实践与结构模板整理(可直接复用)
- 标准函数描述结构模板(OpenAI / DeepSeek)
- Prompt 分层结构设计:系统层、字段引导层、行为约束层
- 工具调用统一提示模板(含结构示例)
- 多模型兼容场景下的 Prompt Selector 与输出标准化建议
第七章:结语|函数 Prompt 是“系统协议设计”,不是一句提示词
- 工程落地时最怕的不是模型不懂,而是模型“不按规范”输出
- Prompt 要学会写成“结构生产协议”,而非“自然语言期望”
- 控字段、控行为、控结构,是函数调用下 Prompt 的三要素
第一章:Tool 调用已成为大模型系统“落地工程”的关键接口
✅ 1.1 为什么要用函数调用?不是让模型自由回答就行吗?
函数调用(Function Calling / Tool Use)解决的是一个工程本质问题:
怎么让模型“别说话”,而是“直接做事”。
举例:
用户问:“请帮我订明天下午两点从北京到上海的高铁票。”
普通对话模型输出:
好的,您需要一张明天下午两点从北京到上海的高铁票,我来帮您处理。
函数调用模型输出:
{
"name": "book_ticket",
"arguments": {
"departure_city": "北京",
"arrival_city": "上海",
"departure_time": "2024-04-17T14:00:00"
}
}
✅ 这才是系统能用、能接、能执行的行为结构。
✅ 1.2 为什么函数调用中的 Prompt 更容易“出错”?
常见结构性问题:
问题 | 现象 |
---|---|
字段错位 | 模型输出中将 city 写成 location |
枚举值不符 | 模型返回 "gender": "男生" ,而不是 "male" |
输出解释内容混入 JSON | JSON 中出现 "请参考以下参数:" 这样的自然语言片段 |
顺序错乱 / 空字段缺失 | JSON 字段不全、顺序随意、无法被系统正确解析 |
这些问题不是模型理解能力弱,而是Prompt 编排不严谨、结构控制不精确导致的。
✅ 1.3 Prompt 在函数调用中的作用是什么?
在 Function 模型中,Prompt 的角色已经从“语言引导”升级为系统协议层:
- 指定字段结构
- 控制行为顺序
- 限定枚举值范围
- 描述参数意图与使用方式
- 触发函数调用行为(明确提示该调用 / 暗示调用意图)
📌 写得不准,不是语义不通,而是整个系统调不通。
第二章:OpenAI Function Calling 的调用机制与 Prompt 结构
✅ 2.1 Function Calling 是怎么运作的?
OpenAI 在 function-calling 模型(如 GPT-4-0613 / gpt-3.5-turbo-0613)中支持以下模式:
- 提前注册函数 schema(含函数名、参数、字段说明)
- 模型基于用户输入判断是否应调用某函数
- 模型根据 schema 结构,生成 arguments(严格 JSON)
- 返回结果 → 模型继续生成 response(如果启用)
📌 Prompt 在其中承担:行为引导、参数定位、结构控制三大任务。
✅ 2.2 Function schema 示例
{
"name": "book_flight",
"description": "预订一张国内航班机票",
"parameters": {
"type": "object",
"properties": {
"departure_city": {
"type": "string",
"description": "出发城市,如 北京"
},
"arrival_city": {
"type": "string",
"description": "到达城市,如 上海"
},
"departure_date": {
"type": "string",
"format": "date"
}
},
"required": ["departure_city", "arrival_city", "departure_date"]
}
}
✅ Prompt 的任务是:让模型明确“你现在要填的字段有哪些,它们是什么意思”。
✅ 2.3 Prompt 编排方式(推荐结构分层)
OpenAI 的 Function Prompt 推荐采用如下结构设计:
层级 | 内容 |
---|---|
system | 说明角色 / 功能目标,如“你是航班助手,请使用函数回答用户请求” |
user | 纯自然语言问题,如“我想订明天下午从北京飞上海的机票” |
schema | 注册函数结构(由调用 API 时提供,不在 Prompt 中显式出现) |
温控参数 | 设置 temperature = 0,减少生成漂移 |
✅ 2.4 Prompt 控形技巧:让模型只生成结构、不生成解释
控制点 | Prompt 编写建议 |
---|---|
禁止语言解释 | 在 system 中加入:“请勿输出自然语言,仅返回结构化参数” |
控制格式正确 | 明确指示:“所有字段必须输出,顺序与定义保持一致,不得缺失” |
枚举值限定 | 使用“仅允许填写:[‘国内’, ‘国际’],不能使用其他词汇”进行限定说明 |
多字段示例 | Few-shot 示例可以极大提升字段位置与结构稳定性(参考 Toolformer 技术) |
第三章:DeepSeek Tools 的调用机制与 Prompt 协议设计
✅ 3.1 DeepSeek 支持 Tool 调用的基本流程
DeepSeek Chat 与 DeepSeek-V2 系列(如 DeepSeek-Coder、DeepSeek-MoE)支持“Tool Call”能力,其典型机制如下:
步骤 | 内容描述 |
---|---|
注册工具 | 以 JSON 格式注册 tool schema,字段与 OpenAI 相似 |
注入 tool 描述段 | 明确每个 tool 的 name、description、参数 schema(称为 tool_desc ) |
编写 Prompt | 通过 system + user 指引模型选择合适工具、填写参数结构 |
模型判断是否调用 | 根据上下文判断是否 tool 调用,生成 tool_call 类型响应 |
📌 DeepSeek 模型偏好明确结构引导型 Prompt,对于“自由提示”响应率较低,需加 tool 名称强提示词。
✅ 3.2 DeepSeek tool_desc 描述结构
示例工具注册格式(Python 中注册方式):
{
"name": "get_weather",
"description": "获取城市的天气信息",
"parameters": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "城市名称,如 北京"
},
"date": {
"type": "string",
"description": "查询的日期,例如 2024-04-20"
}
},
"required": ["city", "date"]
}
}
建议使用工具提示格式:
你可以使用名为 get_weather 的工具,其功能是:获取城市天气信息。该工具需要两个字段:city(城市),date(日期)。
✅ DeepSeek 对于 tool 名称有一定匹配灵敏度,强提示“使用工具 get_weather”效果更稳定。
✅ 3.3 Prompt 编排结构推荐(DeepSeek 版)
Prompt 层 | 内容 |
---|---|
system prompt | “你是一个智能助手,可以使用以下工具:get_weather,用于获取天气信息” |
tool_desc(工具列表) | 工具的 JSON schema,模型可感知参数结构与字段含义 |
user input | “请帮我查一下北京明天的天气” |
📌 与 OpenAI 相比,DeepSeek 的 Tool 用法更偏向传统自然语言引导,需要更显式结构 + 名称提示。
✅ 3.4 多轮对话下 Tool 调用行为的注意点
DeepSeek 在多轮上下文中存在一定的“历史粘性”,即:
- 若首轮未明确提示 tool 名称,后续轮次倾向延续自然语言回复
- 若前轮调用结构正确,模型将默认进入结构输出模式,可省略 tool 名称
推荐策略:
- 首轮加 tool 名强引导 + 示例结构输出
- 后续轮控制“行为状态切换”:是否继续调用 or 回复自然语言 or 回问缺参
第四章:多参数函数的 Prompt 控形技巧
✅ 4.1 多字段结构最常见的失败场景
问题类型 | 原因 |
---|---|
字段顺序错乱 | 模型不清楚顺序或字段提示不足 |
部分字段缺失 | 模型未识别为 required,或未明确指令“不允许省略” |
枚举值不合规 | 模型生成非 schema 中限定的值,如 "gender": "男生" 而非 "male" |
解释内容混入 JSON 输出 | 模型在结构中生成 "备注": "请您注意填写城市名" 这类“多余字段”或自然语言内容 |
📌 多参数结构最怕的不是理解不了,而是控不住行为偏移,尤其在中文环境 + 多模型切换下。
✅ 4.2 Prompt 控字段的三大技巧
控制点 | 编排建议 |
---|---|
字段顺序 | 在 prompt 中标明“字段顺序不可变,必须依次生成” |
必填约束 | 加强提示:“所有字段都必须填写,缺失将导致任务失败” |
枚举解释 | 显示列出允许值:“gender 字段只能是 ‘male’ 或 ‘female’,不可填其他值” |
✅ 对模型而言:越清晰的限制性语言,越容易约束行为结构输出
✅ 4.3 特殊字段的 Prompt 编写方法
字段类型 | 控形建议 |
---|---|
日期 | 格式明确指定:YYYY-MM-DD,例:2024-04-21 |
布尔值 | 明确“true 或 false,不能写成‘是’或‘否’” |
嵌套结构 | 拆解说明层级,使用嵌套 JSON 示例帮助模型理解 |
多选 enum | 指定是否允许多个枚举值组合,推荐输出为数组结构 |
✅ 4.4 fallback prompt 与容错策略建议
在模型输出不符合结构时,建议:
- 定义 fallback_prompt,输出结构更强限制版本
- 将 JSON parse 异常接入日志系统(如 PromptLayer)
- 支持 retry 机制(最多两次重试 + 回退自然语言说明)
第五章:OpenAI × DeepSeek 双模型函数调用行为对比
✅ 5.1 是否自动触发函数调用?
模型 | 自动 Tool Use 能力 | 控制机制 |
---|---|---|
OpenAI | ✅ 支持自动触发 | model 参数设置 tool_choice="auto" |
DeepSeek | ✅ 支持判断调用,但依赖提示强度 | 无参数可控,需显式在 prompt 中引导“使用某工具” |
📌 DeepSeek 更依赖自然语言和 system prompt 的行为引导,OpenAI 更偏结构匹配。
✅ 5.2 JSON 输出行为对比:格式稳定性 & 结构一致性
对比项 | OpenAI GPT-4 | DeepSeek Chat |
---|---|---|
字段顺序是否稳定 | ✅ 与 schema 一致 | ❌ 偶有打乱,如 "city" 与 "date" 位置对调 |
是否自动填满字段 | ✅ 若语义足够,倾向填全 | ❌ 若字段不在语义焦点中可能省略 |
是否保留空字段 | ❌ 常省略空字段 | ✅ 某些版本保留 "key": null 结构 |
是否容易混入解释语言 | 很少(低温度时) | 易出现,如 "请参考以下字段" |
📌 Prompt 中加入 “禁止生成除结构外的任何文字” 是避免漂移的通用策略。
✅ 5.3 容错与输出偏移时的恢复策略
问题类型 | OpenAI 响应特点 | DeepSeek 响应特点 |
---|---|---|
枚举值错位 | 常提示 fallback,自行不改写 | 可能默认生成近似值(如 “男生” 代替 “male”) |
类型错误 | 字符串代替整数会报错,输出失败 | 某些情况下强转为字符串 |
结构错误 | 多字段 JSON 崩溃,API 会直接 reject | 某些模型可自动纠正,如输出完整结构但多字段 |
多轮 fallback | 支持精细控制函数调用失败后“用自然语言回复” | 支持 tool_response → user 继续提问方式 |
📌 多轮机制中建议加入工具调用状态标记,如:
{
"tool_call": "get_weather",
"status": "failed",
"reason": "参数格式错误"
}
✅ 5.4 行为一致性建议(跨模型对齐输出)
- 建议为每种函数生成 2 套 Prompt 模板:
prompt_gpt
与prompt_ds
- 将字段解释与枚举限定写入 system prompt,保持格式提示明确
- 将所有参数结构写入 centralized schema 文件,并用代码生成注册 JSON
第六章:最佳实践与结构模板整理(可直接复用)
✅ 6.1 标准模板结构(OpenAI / DeepSeek 通用)
🧩 Prompt 模板推荐格式(system + tool 引导):
你是一个助手,负责处理用户的请求。你可以使用如下工具:
工具:book_hotel
功能:预订酒店房间
参数:城市、入住日期、离开日期、房型(标准间/大床房)
请严格输出结构如下,不要加入任何说明性语言。
✅ 6.2 参数模板结构(JSONSchema + 控字段)
{
"city": "string, 城市名称",
"checkin_date": "YYYY-MM-DD",
"checkout_date": "YYYY-MM-DD",
"room_type": "标准间 / 大床房"
}
📌 推荐在 prompt 结尾加入结构控制句:
“输出必须为 JSON,字段顺序与上述保持一致,所有字段均为必填,不能添加其他内容。”
✅ 6.3 多模型兼容建议:PromptSelector 模块
实现方式(Python):
def select_prompt(model_name):
if "gpt" in model_name:
return PROMPT_TEMPLATE_GPT
elif "deepseek" in model_name:
return PROMPT_TEMPLATE_DS
else:
return PROMPT_TEMPLATE_DEFAULT
📌 结合 FastAPI / LangChain,可实现多模型统一接口 + Prompt 多版本切换。
✅ 6.4 日志观测与回放建议
工具 | 推荐用途 |
---|---|
LangSmith | tool_call trace、字段命中率分析、行为回放 |
PromptLayer | prompt_id + 输出结构日志追踪 |
DeepEval | 结构完整率、字段类型评分、JSON 合法性打分(用于自动评估) |
✅ 最后一句话:
函数调用场景下的 Prompt,是系统协议,不是文字引导。
控得住字段、稳得住结构、调得起调用,才是真正的函数调用提示词工程化。
第七章:结语|函数 Prompt 是“系统协议设计”,不是一句提示词
✅ 函数调用 Prompt 的核心任务,是“结构控制”,不是“语义引导”
普通 Prompt 是在引导模型说出正确的话,
函数调用 Prompt 是在控制模型产出正确的结构。
它的输出必须满足:
- JSON 合法;
- 字段齐全、值合法、类型正确;
- 无自然语言干扰、无多余字段;
- 可直接被系统调用(如 API / 控制逻辑 / 工具函数)消费;
这不是“自然语言的艺术”,而是“结构协议的设计”。
✅ 从 Prompt 到 Protocol:提示词的系统角色转变
函数调用时代的 Prompt,实际承担了系统中的“协议层”作用,职责包括:
系统环节 | Prompt 控制要点 |
---|---|
输入 → 模型 | 控制意图明晰、字段清晰、行为确定 |
模型 → 输出结构 | 控制字段顺序、枚举限定、类型准确、JSON合法 |
输出结构 → 系统调用 | 控制系统接口可解析、参数命中率高、可容错/可回退 |
多轮上下文管理 | 控制上一轮调用结果的理解与承接、上下文行为一致性 |
📌 一句话总结:Prompt 不再是“语言”,它是系统级“行为规则”的接口定义方式。
✅ 工程化 Prompt 能力,是大模型落地的底层保障
你构建的系统,是否稳定,很大程度上不是看模型,而是:
你是否能写出一套 结构化、约束清晰、行为一致、跨模型兼容的函数调用 Prompt。
这就要求开发者具备:
- JSON schema × Prompt 控形能力;
- 多模型提示词兼容策略(PromptSelector);
- 多轮调用状态管理 × fallback 机制设计;
- 结构输出追踪与日志观测工具接入(LangSmith / PromptLayer 等);
✅ 最后一句话:
函数调用场景中的 Prompt,不是“提示模型做事”,而是“为系统搭一座可靠的语言桥梁”。
控字段、控行为、控结构 —— 是函数调用提示词的三项基本功,也是 Prompt 工程师必须掌握的硬通货。
🌟 如果本文对你有帮助,欢迎三连支持!
👍 点个赞,给我一些反馈动力
⭐ 收藏起来,方便之后复习查阅
🔔 关注我,后续还有更多实战内容持续更新
写系统,也写秩序;写代码,也写世界。
观熵出品,皆为实战沉淀。