Prompt工程实战:从结构化输出到函数调用的落地方法

Prompt工程的目的是让大模型输出稳定、可解析、可校验的结果,而不是碰运气。输出质量由任务定义、角色约束、工具调用与上下文管理共同决定。本文以OpenAI兼容接口为例,给出可以直接落到代码里的做法。

结构化提示词:角色、约束与输出格式三要素

一份可维护的提示词至少包含角色设定、硬性约束、输出格式三个部分。约束写得越具体,模型越不容易跑偏。

你是一个工单分类助手。任务:对用户工单文本分类。
约束:
- 只输出JSON,不输出解释文字
- 类别限定为:故障、咨询、投诉、其他
- 依据不足时归入其他
输出格式:
{"category": "故障", "confidence": 0.9, "reason": "一句话依据"}

输出格式约束是提示词里性价比最高的一项。多接口共用的系统里,字段命名要全站统一,避免同一字段在A接口叫category、在B接口叫cat_type,否则下游解析逻辑会跟着分裂。

少样本示例与思维链的取舍

少样本示例(few-shot)给3到5个即可,覆盖边界情况比只给标准答案更有价值。思维链(Chain-of-Thought)在数学、逻辑类任务上提升明显,但会拉长输出与延迟。只在确实需要多步推理的任务上启用,并要求模型先列出推理过程;简单的抽取和分类任务直接输出结果。

函数调用:让模型输出可执行的参数

把大模型接入业务系统,函数调用(Function Call)是最稳的机制。模型本身不执行代码,只输出结构化参数,由业务侧校验后执行。

tools = [{
  "type": "function",
  "function": {
    "name": "search_docs",
    "description": "检索内部知识库文档",
    "parameters": {
      "type": "object",
      "properties": {
        "query": {"type": "string", "description": "搜索关键词"},
        "limit": {"type": "integer", "minimum": 1, "maximum": 20}
      },
      "required": ["query"]
    }
  }
}]

resp = client.chat.completions.create(
    model="gpt-4o",
    messages=messages,
    tools=tools,
    tool_choice="auto",
)

函数描述里要写清参数语义与取值范围,模型才能正确选参。工具执行完成后,把结果追加进对话历史,再请求模型生成最终回答,链路才算闭环。

输出解析与自动重试

模型输出出现格式错误的概率不为零,工程上需要两层防护:解析失败时把错误信息回传给模型修正一次,二次失败返回固定降级文案,不进业务流。

import json

def extract_json(text: str) -> dict:
    start, end = text.find("{"), text.rfind("}")
    if start == -1 or end == -1:
        raise ValueError("no json in output")
    return json.loads(text[start:end + 1])

关键字段再叠加JSON Schema校验,防止格式合法但内容非法(比如类别不在白名单里)的结果流入下游。

上下文压缩与提示词缓存

多轮对话越长输入token越多。把历史对话压缩成摘要上下文,控制单次请求长度;系统提示词不变时启用prompt caching,重复前缀命中后延迟和成本一起下降。这两个手段在长会话业务里收益最明显。

Prompt工程不是文案技巧,而是把约束、示例、校验三段逻辑放进代码流程。按这套节奏管理,业务场景的输出稳定性可以量化统计。

原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/prompt-gong-cheng-shi-zhan-cong-jie-gou-hua-shu-chu-dao-han/

(0)
小编小编
上一篇 13小时前
下一篇 12小时前

相关推荐