完整教程:prompt提示词工程---如何让大模型更听得懂人话

news/2025/10/12 15:02:56/文章来源:https://www.cnblogs.com/lxjshuju/p/19136650

目录

1. prompt典型构成

2. DST(通过对话逐渐获取核心信息)

2.1 定义

2.2 例子

2.3 与上下文的关系

2.4 用 Prompt 实现 DST 的极简核心代码

2.5 基于DST写prompt的方法

3. NLU(将人话转为大模型能看懂的话)

3.1 定义

3.2 例子

3.3 NLU(自然语言理解)的 Prompt 设计

4. 思维链(给模型给予推理过程)

4.1 定义

4.2 例子

4.3 思维链(CoT)的 Prompt 设计

5. 自洽性(根据生成多种答案的众数来确定末了答案)

5.1 定义

5.2 例子

5.3 如何写 prompt 利用自洽性

6. 思维树

6.1 定义

6.2 例子

6.3 如何写 prompt 利用思维树


1. prompt典型构成

  • 一位小学老师”。就是角色:为 AI 定义与任务最匹配的角色,让 AI 能更好地代入身份进行任务处理,例如 “你是一位软件工程师”“你
  • 指示:对需要 AI 搞定的任务进行具体描述。
  • 上下文:提供与任务相关的其他背景信息,在多轮交互场景下尤为重要,能让 AI 更精准理解任务脉络。
  • 例子:必要时给出示例,在学术中被称为 one - shot learning(单样本学习)、few - shot learning(少样本学习)或 in - context learning(上下文学习),实践表明这些示例对提升 AI 输出的正确性有很大帮助。
  • 输入:明确任务的输入信息,在提示词里要清晰标识。
  • 输出:对 AI 输出的格式进行描述,方便后续模块自动解析模型的输出结果,像 XML 格式就常被用于此。

注意:每个模型的提示词相同的项目都可能不一样,因为每个模型的训练数据不一样效果也不一样,具体怎么写才能更有效的提高准确率看官方提示词文档。

2. DST(凭借对话逐渐获取重要信息)

2.1 定义

DST(Dialog State Tracking,对话状态跟踪)是对话架构中的一项关键技术,用于记录和更新对话过程中用户的意图、需求以及对话的相关状态信息 。它能让对话系统在多轮交互中,清晰把握对话的进展情况,从而根据当前的对话状态,做出合适的回应和决策。

2.2 例子

在一个智能酒店预订对话体系中:

  • 第一轮对话,用户说:“我想订一家在市中心的酒店。” 对话系统通过自然语言理解(NLU)模块识别出用户意图是 “预订酒店”,地点要求是 “市中心”,DST 会将这些信息记录下来,此时对话状态能够表示为 {意图:预订酒店,地点:市中心}。
  • 第二轮对话,用户补充:“要能看到海景的。”DST 会更新对话状态,将用户对酒店景观的需求添加进去,此时对话状态变为 {意图:预订酒店,地点:市中心,景观要求:海景} 。
  • …… 请问您想预订哪一家呢?” 。就是接着平台依据更新后的对话状态,向用户回复:“为您找到几家位于市中心且能看到海景的酒店,分别

2.3 与上下文的关系

  • 通过联系:上下文是对话环境在交互过程中积累的所有历史信息,包含了对话的背景、用户之前说过的话等内容。DST 依赖上下文来获取关键信息,进而确定和更新对话状态。能够说,上下文是 DST 的信息来源,DST 是对上下文里关键信息的一种提取、整理和跟踪机制。
  • 区别:上下文的范围更广,它包含了对话中所有提及的内容,可能是与核心需求相关的,也可能是一些闲聊、铺垫性的内容。而 DST 只关注与对话目标相关的关键信息,比如用户在订餐对话里提到的菜品、用餐时间等,更具有针对性和结构化,主要用于拥护对话系统做出合理的决策和回复 。

2.4 用 Prompt 实现 DST 的极简核心代码

import openai
import json

openai.api_key = "YOUR_API_KEY"

state = {"intent": None, "food": None, "quantity": None, "time": None}
user_inputs = ["我想订餐", "要披萨", "两份", "下午六点送到"]

for text in user_inputs:
prompt = f"当前状态:{json.dumps(state)}。用户说:{text}。更新状态并仅返回JSON。"
resp = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": prompt}]
)
state = json.loads(resp.choices[0].message["content"].strip())
print(state)
'''
输出结果:
{'intent': 'order_food', 'food': None, 'quantity': None, 'time': None}
{'intent': 'order_food', 'food': 'pizza', 'quantity': None, 'time': None}
{'intent': 'order_food', 'food': 'pizza', 'quantity': 2, 'time': None}
{'intent': 'order_food', 'food': 'pizza', 'quantity': 2, 'time': '18:00'}
'''

2.5 基于DST写prompt的方式

核心思路:明确当前状态、用户输入,并要求模型「增量更新」关键信息,输出结构化结果。关键技巧:

  • 献出当前对话状态的结构化格式(如 JSON)
  • 强调「只更新变化的字段,保留已有正确信息」
  • 明确需要跟踪的核心实体(如订机票场景的时间、地点、人数等)

你需要跟踪用户的对话状态,格式为 JSON,含有字段:intent(意图)、departure(出发地)、destination(目的地)、date(日期)。
当前状态:{"intent": "book_flight", "departure": "北京", "destination": null, "date": null}
用户输入:"我要去上海,下周三出发"
请根据用户输入更新状态,只返回 JSON,不添加其他内容。

效果:模型会精准更新destinationdate字段,避免覆盖已有正确的departure 信息。

3. NLU(将人话转为大模型能看懂的话)

3.1 定义

NLU(Natural Language Understanding,自然语言理解)是人工智能的一个分支,负责将人类的自然语言(如中文、英文)转换成机器能够理解和执行的结构化信息,比如意图和实体。它是对话系统、智能客服、语音助手等的核心模块。

3.2 例子

假设用户说:

“帮我订一张从北京到上海的高铁票,明天下午三点出发。”

NLU 可能会解析成:

JSON
{
"intent": "订高铁票",
"entities": {
"出发地": "北京",
"目的地": "上海",
"日期": "明天",
"时间": "下午三点"
}
}

3.3 NLU(自然语言理解)的 Prompt 设计

核心思路:明确要求模型提取「意图」和「实体」,并给出结构化输出格式,必要时提供示例。关键技巧:

  • 定义清晰的意图类型(如「查询天气」「预订酒店」)
  • 列出需要提取的实体类别(如时间、地点、数量)
  • 用「少样本示例」引导模型理解格式(尤其对复杂场景)

任务:解析用户输入的意图和实体,输出 JSON。
意图包括:order_food(订餐)、inquire_price(询价)。
实体包括:food(食物)、num(数量)、time(时间)。

示例:
用户输入:"我要2份汉堡,晚上7点送到"
输出:{"intent": "order_food", "entities": {"food": "汉堡", "num": 2, "time": "晚上7点"}}

用户输入:"披萨多少钱一份?"
请输出 JSON:

效果:通过示例约束,模型能稳定识别意图和实体,减少格式错误。

4. 思维链(给模型提供推理过程)

4.1 定义

思维链是一种通过模拟人类逐步推理过程来提升模型困难问题解决能力的技术。它是一系列中间的推理步骤,通过让大模型逐步参与将一个麻烦问题分解为一步一步的子问题并依次进行求解的过程,其核心是让模型在输出最终答案前,显式生成中间的逻辑步骤,而非直接给出结论。

4.2 例子

  • 零样本思维链:无需提供示例,直接通过指令引导模型生成推理步骤。例如问题 “小明有 12 个苹果,给了小红 5 个,之后又买了 3 个,现在他有多少个苹果?”,模型输出为 “小明原有 12 个苹果。送给小红 5 个后,剩余 12 - 5 =7 个。又买了 3 个后,总数为 7 + 3 = 10 个。答案:10 个苹果。” 这种方式适用于便捷任务,对于复杂问题可能因步骤缺失导致错误,但在该简单数学问题中,通过逐步推理,大模型能准确得出答案。
  • 通过小样本思维链:通过给出少量带推理步骤的示例,引导模型模仿并生成答案。例如,先给出示例 1“问:小明有 5 个羽毛球,买了 2 管,每管 3 个,现在有多少个?答:5(原数量) + (2 × 3) = 11 个。” 和示例 2“问:自助餐厅有 23 个苹果,用掉 20 个后又买 6 个,现在有多少个?答:23 - 20 + 6 = 9 个。”,然后给出待解决问题 “问:商店上午卖出 8 杯咖啡,下午卖出的是上午的 2 倍,全天卖了多少杯?”,模型输出为 “上午卖出 8 杯。下午卖出 8 × 2 = 16 杯。全天共 8 + 16 = 24 杯。答案:24 杯。” 凭借这些示例,模型能够学习到推理的逻辑和步骤,从而在面对新困难时能更准确地进行推理和回答。
  • 自一致性(Self - Consistency):该方法会为问题生成多条不同的推理路径,并对生成的答案进行众数投票。例如对于难题 “小明有 12 个苹果,给了小红 5 个,又买了 3 个,现在有多少个?”,模型生成多条推理路径如 “12 - 5 + 3 = 10个 -> (12 - 5) + 3 = 10 -> 12 + 3 - 5 = 10 -> 12 - (5 + 3) = 4(错误路径)”,投票结果为 “10”(3 票),“4”(1 票),最终答案为 10 个苹果。此种方式可能减少单一路径偏差,提高大模型在复杂推理任务中的准确性和鲁棒性。

4.3 思维链(CoT)的 Prompt 设计

核心思路:强制模型输出「分步推理过程」,再给出最终答案,尤其适合逻辑题、数学题等复杂任务。关键技巧:

  • 用指令引导分步思考(如「请一步一步分析」「先理清楚条件」)
  • 提供带推理步骤的示例(小样本 CoT)
  • 明确区分「推理过程」和「最终答案」

请解决以下问题,先一步一步分析,最后用「答案:」开头给出结果。
问题:一个商店有3箱苹果,每箱20个。卖出45个后,还剩多少个?

分析:
1. 先算总共有多少个苹果:3箱 × 20个/箱 = 60个
2. 卖出45个后,剩余数量 = 总数 - 卖出数 = 60 - 45 = 15个

答案:15

用户问:"小明比小红大3岁,小红比小刚小5岁,谁最大?"
请先分析每个人的年龄关系,再给出结论。

效果:模型通过显式推理步骤减少跳跃性错误,尤其对多步骤难题准确率提升明显。

5. 自洽性(根据生成多种答案的众数来确定最后答案)

5.1 定义

自洽性是一种提升大模型推理准确性的手艺,通过对同一个问题生成多条不同的推理路径,然后对结果进行 "多数投票" 或综合分析,选择最一致的答案。

此种方法能有效减少单一路径可能产生的偏差或错误,特有适合数学推理、逻辑分析等复杂任务。

5.2 例子

难题:小明有 12 个苹果,送给小红 5 个,又买了 3 个,现在有多少个?

多条推理路径:

  • 路径 1:12 - 5 = 7,7 + 3 = 10 → 答案:10
  • 路径 2:12 + 3 = 15,15 - 5 = 10 → 答案:10
  • 路径 3:5 - 3 = 2,12 - 2 = 10 → 答案:10
  • 路径 4:12 - (5 + 3) = 4 → 答案:4(错误)

结果汇总:10(3 票),4(1 票)最终答案:10 个苹果

5.3 如何写 prompt 利用自洽性

import openai
import json
from collections import Counter

openai.api_key = "YOUR_API_KEY"

question = "小明有12个苹果,送给小红5个,又买了3个,现在有多少个?"

# 生成5条不同推理路径
n_samples = 5
prompt = f"请解决这个挑战,先分析推理步骤,最后用'答案:X'格式给出结果。\n问题:{question}"

answers = []
for i in range(n_samples):
resp = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": prompt}]
)
text = resp.choices[0].message["content"]
# 提取答案(假设最后一行是"答案:X")
last_line = text.strip().split("\n")[-1]
if "答案:" in last_line:
ans = last_line.split("答案:")[-1].strip()
answers.append(ans)

# 多数投票
final_answer = Counter(answers).most_common(1)[0][0]
print(f"所有答案: {answers}")
print(f"最终答案: {final_answer}")

自洽性 prompt 关键技巧

  • 多次采样:对同一问题生成多条独立推理路径
  • 明确格式:要求模型用固定格式标记最终答案
  • 结果汇总:借助投票或加权选择最一致的答案
  • 提升多样性:可利用不同的 temperature 值或提示变体

6. 思维树

6.1 定义

一种让大模型在解决复杂挑战时,像树状结构一样并行探索多条推理路径的技术。不同于思维链(Chain of Thought)的线性推理,思维树允许模型:就是思维树

  • 从一个问题出发,生成多个可能的思考方向
  • 对每个方向进行深入探索
  • 评估各路径的可行性,选择最优解

这种方法专门适合需要试错、回溯或多步规划的任务。

6.2 例子

问题:如何在 30 分钟内从公司回家,并准备一顿方便晚餐?

根节点:目标 - 30分钟内回家并准备晚餐

├─ 路径A:地铁回家
│ ├─ 检查地铁时刻表(2分钟)
│ ├─ 步行到地铁站(8分钟)
│ ├─ 地铁行程(12分钟)
│ ├─ 步行到家(5分钟)
│ └─ 烹饪方案:快速炒鸡蛋+米饭(15分钟)
│ └─ 总时间:42分钟(超时)→ 排除

├─ 路径B:打车回家
│ ├─ 叫车等待(5分钟)
│ ├─ 车程(15分钟)
│ ├─ 到家(0分钟)
│ └─ 烹饪方案:三明治(8分钟)
│ └─ 总时间:28分钟(可行)→ 保留

└─ 路径C:公交回家
├─ 步行到公交站(5分钟)
├─ 等待公交(5-10分钟)
├─ 公交行程(15分钟)
├─ 步行到家(5分钟)
└─ 烹饪方案:泡面+鸡蛋(5分钟)
└─ 总时间:35-40分钟(可能超时)→ 低优先级

结论:选择路径 B(打车 + 三明治)最可靠,能在 30 分钟内完成任务。

6.3 如何写 prompt 利用思维树

import openai

openai.api_key = "YOUR_API_KEY"

def think_tree(prompt, branches=3, depth=2):
# 1. 生成思维分支
branch_prompt = f"将难题拆分为{branches}个应对方向,简要描述每个方向:\n{prompt}"
resp = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": branch_prompt}]
)
branches_text = resp.choices[0].message["content"]

# 2. 对每个分支深入探索
results = []
for i, branch in enumerate(branches_text.split("\n")[:branches]):
explore_prompt = f"详细探索方案:{branch}\n"
explore_prompt += f"请提供最多{depth}步的具体实施计划,并评估可行性和总时间。"

resp = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": explore_prompt}]
)
results.append(resp.choices[0].message["content"])

# 3. 综合评估
evaluate_prompt = f"以下是解决问题的几个方案:\n" + "\n---\n".join(results)
evaluate_prompt += "\n请综合评估,选出最优方案并说明理由。"

resp = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": evaluate_prompt}]
)

return resp.choices[0].message["content"]

# 使用示例
question = "如何在30分钟内从公司回家,并准备一顿简单晚餐?"
print(think_tree(question))

思维树 prompt 设计技巧

  • 明确分支数量:控制探索的方向数量
  • 设定深度限制:避免单个路径过于冗长
  • 要求评估标准:让模型为每个路径提供可行性评分
  • 使用对比语言:如 "比较"" 权衡 ""最佳选择" 等词汇
  • 可视化输出:要求模型用列表或树状结构展示思考过程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/935451.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年10月广州 1688 代运营服务商推荐,阿里巴巴1688店铺代运营、全店托管代运营公司推荐!

在数字经济飞速发展的当下,1688 平台已成为众多企业拓展线上业务的重要阵地。然而,不少企业在运营 1688 店铺时面临诸多难题:缺乏专业的运营团队,对平台规则和算法逻辑不熟悉,难以精准把握市场趋势和消费者需求,…

2025拉伸器厂家最新权威推荐榜:技术实力与市场口碑深度解析

2025拉伸器厂家最新权威推荐榜:技术实力与市场口碑深度解析在工业制造领域,拉伸器作为关键工具设备,其性能优劣直接影响生产效率和产品质量。随着2025年制造业升级加速,拉伸器行业也迎来技术革新浪潮。为帮助用户精…

实用指南:Linux动静态库

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025年10月工作服厂家最新推荐排行榜,春夏秋冬季工作服,工人工作服,车间工作服,防静电工作服公司推荐!

在当前工作服市场中,企业采购时常常面临诸多难题。一方面,市场上工作服产品质量参差不齐,部分产品面料不符合行业标准,色牢度差、易磨损,难以满足不同行业的工作场景需求,比如化工行业需要的防酸碱工作服,若面料…

2023-网鼎杯web-thinkshop

这题应该在出题的时候就有提供docker环境,也就是说比赛的时候就有考ctfer搭建docker环境的能力,我看了网上大佬的wp,也侧面验证了,所以从搭建环境开始 docker load < thinkshop.tar docker导入环境 docker run -tid…

2025活性氧化镁厂家最新权威推荐榜:高纯度与稳定性能深度解

2025活性氧化镁厂家最新权威推荐榜:高纯度与稳定性能深度解在现代化工材料领域,活性氧化镁作为一种重要的无机化工原料,其应用范围已从传统的橡胶、塑料行业扩展到医药、环保等新兴领域。随着产业升级对材料性能要求…

Java的一些细节

1、Java的源文件以java格式命名,之后转为class格式(字节码文件)才可以运行; 2、Java程序开始执行的入口,是在main()方法,固定格式为 public static void main(String[] args){} 3、Java严格区分大小写; 4、Ja…

通用寄存器, 与RAM寄存器的内存关系

通用寄存器, 与RAM寄存器的内存关系通用寄存器和堆栈、data、bss段完全不在一个层级上。它们是两种截然不同的存储结构。​​ 您的理解中可能混淆了“内存地址空间”和“CPU硬件寄存器”这两个概念。让我们来详细分解…

C++20中线程类std::jthread的使用 - 详解

C++20中线程类std::jthread的使用 - 详解2025-10-12 14:39 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block…

2025年CNC高压清洗机厂家权威推荐:高效清洁与耐用性能深

2025年CNC高压清洗机厂家权威推荐:高效清洁与耐用性能深在制造业智能化转型的浪潮中,CNC高压清洗机作为工业清洁领域的关键设备,正发挥着日益重要的作用。这类设备不仅能有效清除CNC加工中心、数控机床等精密设备在…

ABC427

ABC427C. Bipartize 枚举每个点的颜色,然后统计有多少条边的端点颜色相同,这就是要删除的点,取最小值即可代码实现 #include <bits/stdc++.h> #define rep(i, n) for (int i = 0; i < (n); ++i)using name…

C# NUnit

Install-Package NUnit; Install-Package NUnit3TestAdapter; Install-Package Microsoft.Net.Test.Sdk; Install-Package Moq;using Moq; using NUnit.Framework; using NUnit.Framework.Legacy;namespace ConsoleApp…

从 EFI 到 GPT:深入理解现代计算机启动与磁盘分区技能

从 EFI 到 GPT:深入理解现代计算机启动与磁盘分区技能pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&q…

2025年扁钢厂家最新权威推荐榜:强度与精度双重保障的工业脊

2025年扁钢厂家最新权威推荐榜:强度与精度双重保障的工业脊梁在制造业转型升级的关键时期,扁钢作为工业领域的"骨架材料",其质量直接影响着装备制造、建筑工程、轨道交通等行业的健康发展。随着新材料技术…

GJB 438C学习

系列标准宣贯︱GJB 438C中规定软件文档的用途与编写时机长风破浪会有时,直挂云帆济沧海! 可通过下方链接找到博主 https://www.cnblogs.com/judes/p/10875138.html

typora markdown

markdown学习 标题: +空格+标题名字 二级标题 +名称 以此类推每级加一个# 字体 hello,world! 左右 ** hello,world! * hello,workd! *** hello,workd! …

2025防爆数粒机厂家权威推荐榜:高效精准与安全防爆口碑之选

2025防爆数粒机厂家权威推荐榜:高效精准与安全防爆口碑之选在制药、化工、食品等工业领域,颗粒物料的精准计数与分装是生产流程中的关键环节。防爆数粒机作为特种设备,不仅需要满足高效精准的计数要求,更要具备严格…

想在浏览器里跑 AI?TensorFlow.js 硬件帮助完全指南

想在浏览器里跑 AI?TensorFlow.js 硬件帮助完全指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&quo…

Linux系统设置与理解主机名(hostname)的重要性

在Linux系统中,主机名(hostname)是区分网络中一台主机或者是服务设备的一个唯一标识。操作系统在网络通讯时会使用到主机名,它允许用户和程序方便地识别和交互。除了作为识别符,主机名在系统安全性、维护管理方面也…

CSharp: image (JPG,PNG,etc) covert webp using Aspose.Imaging

protected void Page_Load(object sender, EventArgs e){if (!IsPostBack){// 激活Aspose//ActiveAspose(); ///无效HookManager.ShowHookDetails(true);HookManager.StartHook();// The path to the documents direct…