1 概述
1.1 案例介绍
Prompt 工程技术即提示工程技术(Prompt Engineering), 是一种通过精心设计输入文本即提示(Prompt)来引导大语言模型(LLM)生成高质量输出的技术。它属于自然语言处理(NLP)领域,Prompt 是用户向模型提供的输入指令,通常以自然语言文本的形式出现,核心目标是优化人机交互效率,使模型更精准地理解任务需求并生成符合预期的结果,而无需重新训练或微调模型。Prompt 工程是当前 AI 工程化落地的核心技能,广泛应用于客服、编程助手、数据分析等场景。
本案例通过开发者空间部署客户端调用 DeepSeek V3 模型 API,并使用 Prompt 工程调优技巧以实现控制模型的输出。
通过本案例可以掌握 Prompt 工程的样本提示、思维链提示和链式提示技巧去控制大模型输出,熟悉提示工程技术的运用。
1.2 案例流程
说明:
① 在 ModelArts Studio 大模型即服务平台中领取 DeepSeek V3 模型;
② 登录开发者空间,启动 Notebook;
③ Notebook 运行 DeepSeek V3 API 调用程序;
④ 调用模型进行 Prompt 工程实践。
1.3 资源总览
本案例预计花费总计 0 元。
2 Prompt 工程实践
2.1 前置操作
参考“DeepSeek模型API调用及参数调试(开发者空间Notebook版)”案例的第 2 章节完成 DeepSeek V3 模型领取和启动 Notebook。
参考“DeepSeek模型API调用及参数调试(开发者空间Notebook版)”案例的 3.1 小节完成参数声明。
2.2 构建目标文章
我们需要一个文章样本作为调优的目标,可以通过调用 DeepSeek 模型 API 生成一篇文章,内容要求是 3 个人物,2 个情节 500 字以内的短篇小说,在新的执行框中输入如下代码并运行。
import requests
import json
class TextGenerationClient:
def __init__(self, api_url, api_key):
self.api_url = api_url
self.api_key = api_key
def generate_text(self, payload):
headers = {
"Content-Type": "application/json",
'Authorization': f'Bearer {self.api_key}'
}
response = requests.post(self.api_url, headers=headers, data=json.dumps(payload))
if response.status_code == 200:
return response.json()['choices'][0]['message']['content']
else:
raise Exception(f"Error: {response.status_code} - {response.text}")
client = TextGenerationClient(api_url,api_key)
payload = {
"model": "DeepSeek-V3",
"messages": [
{"role": "system", "content": "你是一个短片小说创作者,写一篇短篇小说,500字以内"},
{"role": "user", "content": "3个人物,2个情节"}
],
"max_tokens": 800,
"top_p": 1,
"temperature":1,
}
generated_text = client.generate_text(payload)
print(generated_text)
content = generated_text
复制代码
运行后结果如下,每个人运行结果不尽相同,内容仅作参考:
2.3 构建基础问答 Prompt
下面通过构建一些基础问答的提示词来进行输出内容的控制。比如这里我们提问“根据文章回答段誉干了什么”测试模型输出,在新的执行框中输入如下代码并运行。
payload = {
"model": "DeepSeek-V3",
"messages": [
{"role": "system", "content": f"你是一个文本阅读器,读取文章的内容并按照用户的要求输出对于文章的回答,以下是文章{content}"},
{"role": "user", "content": "根据文章回答段誉干了什么"}
],
"max_tokens": 200,
"top_p": 1,
"temperature": 0.3,
}
generated_text = client.generate_text(payload)
print(generated_text)
复制代码
继续提问“根据文章回答:文章中有几个人物”测试模型输出,在新的执行框中输入如下代码并运行。
payload = {
"model": "DeepSeek-V3",
"messages": [
{"role": "system", "content": f"你是一个文本阅读器,读取文章的内容并按照用户的要求输出对于文章的回答,以下是文章{content}"},
{"role": "user", "content": "根据文章回答:文章中有几个人物"}
],
"max_tokens": 200,
"top_p": 1,
"temperature": 1,
}
generated_text = client.generate_text(payload)
print(generated_text)
复制代码
接下来我们使用一个小陷阱来测试模型输出的准确性,比如文章中是三个人物,但是我们提问“根据文章回答:文中的四个主角是什么关系” 测试模型输出,在新的执行框中输入如下代码并运行。
payload = {
"model": "DeepSeek-V3",
"messages": [
{"role": "system", "content": f"你是一个文本阅读器,读取文章的内容并按照用户的要求输出对于文章的回答,以下是文章{content}"},
{"role": "user", "content": "根据文章回答:文中的四个主角是什么关系"}
],
"max_tokens": 200,
"top_p": 1,
"temperature": 1,
}
generated_text = client.generate_text(payload)
print(generated_text)
复制代码
参考运行结果如下,可以看见模型对提问的错误并没有指出,然而在我们实际使用的场景中,例如客服问答,是需要识别提问并回答的,因此,我们需要通过 Prompt 工程技巧规范模型的回答。
2.4 Prompt 工程技术控制模型输出
下面我们将介绍如何使用样本提示(Example Prompting)、思维链提示(CoT)和链式提示(Chain Prompting)3 种不同的技术来控制模型的输出。
2.4.1 样本提示
样本提示(Example Prompting)是通过提供少量输入-输出示例(即样本),引导模型模仿示例的格式或逻辑生成回答。核心特点是依赖具体的输入-输出对(如“问题→答案”),不强调推理过程。模型从示例中学习任务规则(如翻译格式、分类标准、文本风格),适用于格式固定的任务,需要快速对齐输出风格或者结构的场景。
例如先给出样本提示问题:
输入:“悲伤的 →反义词是什么?”
输出:“悲伤的反义词是快乐。”
输入:“大 → 小的反义词是什么?”
输出:“小的反义词是大。”
然后再输入:“高 →” 就会输出:“高的反义词是矮。”
在本案例中我们设定样本使用样本提示上下文“文章:a,b,c,d,e 是五个人物,他们之间是亲属关系;提问:文章的 6 个人物,他们是什么关系;回答:文章中只有五个人物,他们是亲属关系”来进行输出内容的控制。在新的执行框中输入如下代码并运行。
payload = {
"model": "DeepSeek-V3",
"messages": [
{"role": "system", "content": f"\
指令:你是一个文本阅读器,读取文章的内容并按照用户的要求输出对于文章的回答,\
上下文:“文章:a,b,c,d,e是五个人物,他们之间是亲属关系;提问:文章的6个人物,他们是什么关系;回答:文章中只有五个人物,他们是亲属关系” \
以下是文章{content}"},
{"role": "user", "content": "根据文章回答:文中的四个主角是什么关系"}
],
"max_tokens": 200,
"top_p": 1,
"temperature": 1,
}
generated_text = client.generate_text(payload)
print(generated_text)
复制代码
结果如下,模型根据上下文提示回答了人物之间的关系,但是没有识别到问题的陷阱,进行主角人数纠正。
2.4.2 思维链提示
思维链提示(Chain of Thought,CoT)是一种引导语言模型通过分步推理解决问题的方法。它的核心思想是让模型像人类一样展示思考过程,将复杂问题拆解为多个逻辑步骤,输出一系列中间步骤,从而得出所需的答案。这种方法显著提升了模型在数学、逻辑和复杂文本任务中的表现。
在使用过程中可以通过添加引导词“请逐步思考”、“让我们一步步分析”来引导模型去思考,模拟人类认知形式,让推理过程更接近真实思维,提升答案的可靠性。
传统提问和思维链提示对比示例如下:
在本案例中我们可以通过让大模型“逐步思考用户提出问题并逐一回答”来进行输出内容的控制,在新的执行框中输入如下代码并运行。
payload = {
"model": "DeepSeek-V3",
"messages": [
{"role": "system", "content": f"\
指令:你是一个文本阅读器,读取文章的内容并按照用户的要求输出对于文章的回答,\
你需要逐步思考用户提出问题并逐一回答 \
以下是文章{content}"},
{"role": "user", "content": "根据文章回答:文中的四个主角是什么关系"}
],
"max_tokens": 200,
"top_p": 1,
"temperature": 1,
}
generated_text = client.generate_text(payload)
print(generated_text)
复制代码
参考运行结果如下,可以看见模型在进行人物关系推理时,进行了更多的思考。但是仍旧没有识别出实际文章中只有三个人物而提问中是“四个主角”这个陷阱,需要再进行提示词的引导。
2.4.3 链式提示
链式提示(Chain Prompting)的本质是任务分解,所以在进行链式提示之前,我们需要思考我们的任务应该怎么拆分。我们的目标是让模型能够先思考用户的提问和模型所理解的事实或者读取的文件之间的匹配程度。然后再就用户的提问进行回答,所以我们可以拆分成 4 个子任务。
子任务 1:模型提取信息。
在新的执行框中输入如下代码并运行。
payload = {
"model": "DeepSeek-V3",
"messages": [
{"role": "system", "content": f"\
指令:你是一个文本阅读器,读取文章的内容并按照用户的要求输出对于文章的回答,\
以下是文章{content}"},
{"role": "user", "content": "根据文章回答:文中有几个人物,他们是什么关系"}
],
"max_tokens": 200,
"top_p": 1,
"temperature": 1,
}
generated_text = client.generate_text(payload)
print(generated_text)
info = generated_text #提取的信息
复制代码
子任务 2:根据模型获取的信息匹配用户的问题,找出用户问题中的错误。
在新的执行框中输入如下代码并运行。
payload = {
"model": "DeepSeek-V3",
"messages": [
{"role": "system", "content": f"\
指令:根据提问对比已知的信息,找出提问的错误,并输出错误的点”\
以下是已知的信息{info}"},
{"role": "user", "content": "提问的问题是:“文中的四个主角是什么关系”"}
],
"max_tokens": 200,
"top_p": 1,
"temperature": 0.3,
}
generated_text = client.generate_text(payload)
print(generated_text)
error = generated_text #提问的错误
复制代码
子任务 3:就用户的题问进行回答。
在新的执行框中输入如下代码并运行。
payload = {
"model": "DeepSeek-V3",
"messages": [
{"role": "system", "content": f"\
指令:你是一个文本阅读器,读取文章的内容并按照用户的要求输出对于文章的回答,\
以下是文章{content}"},
{"role": "user", "content": "根据文章回答:文中的四个主角是什么关系"}
],
"max_tokens": 200,
"top_p": 1,
"temperature": 1,
}
generated_text = client.generate_text(payload)
print(generated_text)
answer = generated_text
复制代码
子任务 4:根据错误信息,以及模型的回答整合最终回答。
在新的执行框中输入如下代码并运行。
payload = {
"model": "DeepSeek-V3",
"messages": [
{"role": "system", "content": f"\
指令:根据错误信息,并修改错误的回答,并按照输出格式化输出正确的回复 \
上下文:以下是错误信息{error}, \
以下是需要修改的错误的回答{answer} \
输出格式化:问题:\
正确的答案应该是:\
"},
{"role": "user", "content": ""}
],
"max_tokens": 200,
"top_p": 1,
"temperature": 1,
}
generated_text = client.generate_text(payload)
print(generated_text)
复制代码
接来下我们串起这个流程,在新的执行框中输入如下代码并运行。
Q = "根据文章回答:文中的四个主角是什么关系"
payload = {
"model": "DeepSeek-V3",
"messages": [
{"role": "system", "content": f"\
指令:你是一个文本阅读器,读取文章的内容并按照用户的要求输出对于文章的回答,\
以下是文章{content}"},
{"role": "user", "content": f"{Q}"}
],
"max_tokens": 200,
"top_p": 1,
"temperature": 1,
}
generated_text = client.generate_text(payload)
info = generated_text #提取的信息
payload = {
"model": "DeepSeek-V3",
"messages": [
{"role": "system", "content": f"\
指令:根据提问对比已知的信息,找出提问的错误,并输出错误的点”\
以下是已知的信息{info}"},
{"role": "user", "content": f"提问的问题是:“{Q}”"}
],
"max_tokens": 200,
"top_p": 1,
"temperature": 0.3,
}
generated_text = client.generate_text(payload)
error = generated_text #提问的错误
payload = {
"model": "DeepSeek-V3",
"messages": [
{"role": "system", "content": f"\
指令:你是一个文本阅读器,读取文章的内容并按照用户的要求输出对于文章的回答,\
以下是文章{content}"},
{"role": "user", "content": f"{Q}"}
],
"max_tokens": 200,
"top_p": 1,
"temperature": 1,
}
generated_text = client.generate_text(payload)
answer = generated_text
payload = {
"model": "DeepSeek-V3",
"messages": [
{"role": "system", "content": f"\
指令:根据错误信息,并修改错误的回答,并按照输出格式化输出正确的回复 \
上下文:以下是错误信息{error}, \
以下是需要修改的错误的回答{answer} \
输出格式化:问题:\
正确的答案应该是:\
"},
{"role": "user", "content": ""}
],
"max_tokens": 200,
"top_p": 1,
"temperature": 1,
}
generated_text = client.generate_text(payload)
print(generated_text)
复制代码
从结果上看,链式提示方法跳出了问题陷阱,正确识别了文中只有 3 个主要人物,参考如下:
2.4.4 总结
样本提示、思维链提示和链式提示是 3 种不同的提示技术,在自然语言处理任务中各有侧重。样本提示是“照猫画虎”,思维链提示是“展示思考过程”,而链式提示是“分阶段解决问题”。以下是它们的对比总结:
在实际任务中,三者结合可以显著提升复杂任务的完成质量。链式提示作为整体框架是骨架,将任务拆解为多个子步骤。在每个子步骤中,样本提示提供具体格式或示例是血液,提供具体规范和风格,确保输出规范化。思维链提示要求模型展示推理过程是肌肉,提升中间步骤的准确性,确保逻辑严密性。三者结合后,模型能像“专家团队”一样协作:分阶段推进(链式)、透明化推理(思维链)、标准化输出(样本)。
至此,DeepSeek 模型 Prompt 工程深度实践结束。点击链接参考完整案例代码。
点击关注,第一时间了解华为云新鲜技术~
评论