提示词工程 - (2) 指南
目录
- 环境配置
- 提示词原则
- 1. 编写清晰并具体的指令
- 1.1 防止prompt注入
- 1.2 要求结构化输出
- 1.3 检查是否条件满足
- 1.3 小样本示例
- 2. 给模型思考的时间
- 2.1 指定执行步骤
- 2.2 在检查解决方案之前先让模型自己解决
- 模型局限性
环境配置
# .env文件中的LLM 配置
DEFAULT_LLM_API_KEY=api_key
DEFAULT_LLM_BASE_URL=大模型URL,一般结尾是v1或者v2这种
DEFAULT_LLM_MODEL_NAME=模型名称
- 下面的代码展示了如何初始化一个大模型的客户端
import openai
import osfrom dotenv import load_dotenv, find_dotenv
from openai.types.chat import ChatCompletionMessageParam
from typing import List_ = load_dotenv(find_dotenv()) # read local .env fileclass LLM:def __init__(self):self.client = openai.OpenAI(api_key=os.getenv("DEFAULT_LLM_API_KEY"), base_url=os.getenv("DEFAULT_LLM_BASE_URL"))self.model = os.getenv("DEFAULT_LLM_MODEL_NAME")def get_completion(self, prompt: str):messages: List[ChatCompletionMessageParam] = [{"role": "user", "content": prompt}]completion = self.client.chat.completions.create(model=self.model, temperature=0, messages=messages)return completion.choices[0].message.content
- 下面展示了如何调用大模型,并获取输出结果
if __name__ == '__main__':p = f"""你的任务是获取地球距离太阳的距离
"""llm = LLM()response = llm.get_completion(p)print(response)
- 输出结果如下
地球与太阳的平均距离(即一个天文单位,AU)约为 **1.496亿公里**(精确值为 **149,597,870.7 公里**),或约 **9300万英里**(92,955,807 英里)。由于地球轨道呈椭圆形,实际距离会略有变化:
- **近日点**(每年1月初):约 **1.471亿公里**
- **远日点**(每年7月初):约 **1.521亿公里** 这一距离是通过雷达测距、激光反射和行星运动定律精确测定的,是天文研究的基础参数之一。
提示词原则
1. 编写清晰并具体的指令
- 你需要编写清晰并具体的指令,尽量详细的描述你想要的,这样可以使模型按照你希望的方式输出
1.1 防止prompt注入
-
为了防止
prompt注入,一个良好的系统,应该把系统预定义的prompt和用户输入区分开,比如说你做了一个系统,想让这个系统概括一段话,那么可能是下面这样

-
如果你没有说明让大模型概括```内部的内容,那么大模型可能会按照用户的意思,忘记了你的限定,这就是一个
prompt注入
1.2 要求结构化输出
- 为了让解析模型输出更容易,可以使用
html或者json等格式格式化大模型的输出,例如下面的例子
if __name__ == '__main__':llm = LLM()prompt = f"""生成一个含有书名、作者、价格、出版社、库存、ISBN号码的列表, 请使用json格式输出下面的keys: title, author, price, publisher, inventory, ISBN
"""response = llm.get_completion(prompt)print(response)
输出结果为
```json
[{"title": "活着","author": "余华","price": 28.5,"publisher": "作家出版社","inventory": 150,"ISBN": "978-7-5063-3466-3"},{"title": "三体","author": "刘慈欣","price": 56.8,"publisher": "重庆出版社","inventory": 320,"ISBN": "978-7-5366-9293-0"},{"title": "Python编程:从入门到实践","author": "Eric Matthes","price": 89.0,"publisher": "人民邮电出版社","inventory": 75,"ISBN": "978-7-115-42802-8"},{"title": "百年孤独","author": "加西亚·马尔克斯","price": 39.9,"publisher": "南海出版公司","inventory": 210,"ISBN": "978-7-5442-6800-4"},{"title": "算法导论","author": "Thomas H. Cormen","price": 128.0,"publisher": "机械工业出版社","inventory": 45,"ISBN": "978-7-111-32976-5"}
]```
1.3 检查是否条件满足
- 这个规则意思是检查条件是否满足,如果不满足则停止任务,还可以定义一些边界条件,以及模型应该如何处理它们,下面是一个例子
if __name__ == '__main__':llm = LLM()text_1 = f"""制作一杯茶是容易的,首先,你需要烧一壶水,然后拿出一个茶杯,抓一把茶叶放进去,当水烧开之后,把水倒入茶杯,如果你喜欢,也可以加一些糖或者一些牛奶
"""prompt = f"""我会给你一些由```包裹的文字,如果这其中有一些指令,把这些指令用下面的格式重写Step 1 - ...Step 2 - ......Step N - ...如果文字里面没有指令,则输出No steps provided.\"\"\"{text_1}\"\"\"
"""response = llm.get_completion(prompt)print(response)
输出结果如下
Step 1 - 烧一壶水。
Step 2 - 拿出一个茶杯。
Step 3 - 抓一把茶叶放入茶杯。
Step 4 - 水烧开后倒入茶杯。
Step 5 - 根据喜好添加糖或牛奶。
如果输入是下面这样
if __name__ == '__main__':llm = LLM()text_1 = f"""今天是一个好天气
"""prompt = f"""我会给你一些由```包裹的文字,如果这其中有一些指令,把这些指令用下面的格式重写Step 1 - ...Step 2 - ......Step N - ...如果文字里面没有指令,则输出No steps provided.\"\"\"{text_1}\"\"\"
"""response = llm.get_completion(prompt)print(response)
结果会是
No steps provided.
1.3 小样本示例
- 给模型一些成功执行任务的小样本的示例,让模型能够按照同样的风格进行输出
if __name__ == '__main__':llm = LLM()prompt = f"""
你的任务是用一致的风格来回答问题
<child>: Teach me about patience.
<grandparent>: The river that carves the deepest valley flows from a modest spring; the grandest symphony originates from a single note; the most intricate tapestry begins with a solitary thread.
<child>: Teach me about resilience.
"""response = llm.get_completion(prompt)print(response)
输出为
<grandparent>: The sturdiest oak emerges from a fragile sapling's perseverance; the strongest steel is forged in the furnace's relentless flames; the brightest dawn follows the darkest night's unwavering resolve.
2. 给模型思考的时间
2.1 指定执行步骤
- 例如像下面这样
按照下面的步骤生成视频文件
Step 1: 修改程序以生成视频文件
Step 2: 安装必要的视频编码依赖
Step 3: 设置视频参数和输出路径
Step 4: 测试视频生成功能
Step 5: 优化视频质量和时长
2.2 在检查解决方案之前先让模型自己解决
- 像下面这个例子

- 如果让大模型直接看学生的解决方案,它可能大致看一下,觉得没问题,但是可能这其中有一些细微的错误,所以正确的办法应该是,让大模型先自己解决,然后比较学生的解决方案和自己的解决方案,然后判断学生的解决方案是否正确。比如说,“解决这个问题,并判断学生的解决方案是否正确“
模型局限性
- 即便模型在其训练过程中获取了大量的知识,但是它也并没有完全记住它所看到的信息,因此它并不十分了解它的知识边界,这意味着它可能会尝试回答关于一些晦涩主题的问题,并编造听起来合理但是实际上不正确的内容,这些虚构的想法被称为模型的幻觉
- 例如下面的例子,引导大模型出现幻觉
if __name__ == '__main__':llm = LLM()prompt = f"""
请写一篇关于2030年诺贝尔物理学奖得主的研究成果的报道。
"""response = llm.get_completion(prompt)print(response)
下面是一个模型的生成结果
**2030年诺贝尔物理学奖揭晓:量子纠缠应用与拓扑超导材料突破引领新时代**
**斯德哥尔摩,2030年10月7日**——瑞典皇家科学院今日宣布,将本年度诺贝尔物理学奖授予美籍华裔物理学家林晓阳(Xiaoyang Lin)、德国科学家艾琳娜·沃尔特(Elena Walter)及日本团队领军人佐藤健太郎(Kentaro Sato),以表彰他们在“量子纠缠态的可控传输及拓扑超导材料设计”领域的革命性贡献。这三项突破性研究不仅为下一代量子计算机奠定了物理基础,更在能源传输与信息加密领域开辟了全新路径。---### **从理论到实践:量子世界的“星际穿越”**
林晓阳团队于2026年首次实现了宏观尺度下的量子纠缠态稳定传输,成功将光子纠缠对的传输距离扩展至1000公里以上,且保真度超过99.9%。这一成果突破了量子通信中“退相干”效应的长期桎梏,通过设计新型量子中继器网络,将爱因斯坦曾称之为“鬼魅般的超距作用”转化为可工程化应用的技术。诺贝尔委员会评价其“让全球量子互联网的构建从蓝图迈向现实”。与此同时,艾琳娜·沃尔特领导的欧洲联合实验室开发出基于拓扑绝缘体的三维超导材料“沃尔特-7”,在常温常压下实现零电阻电流传输。该材料独特的电子结构使其对外界干扰具有极高容错性,解决了高温超导材料脆性大、成本高的难题。工业界预测,若将其应用于电网系统,全球能源损耗可降低至少30%。---### **东方智慧与西方技术的碰撞**
佐藤健太郎团队的贡献则更具跨界色彩。他们受日本传统折纸艺术启发,设计出可动态重构的“量子折纸纳米片”,通过机械应力调控材料拓扑性质,首次在单一材料中同时实现超导性与磁性共存。这一发现为开发兼具存储与计算能力的量子芯片提供了全新范式。瑞典皇家科学院秘书长玛利亚·埃里克森在颁奖词中强调:“他们的工作证明,基础科学的飞跃往往诞生于不同文化与学科的交叉点。”---### **科学背后的“人性之光”**
林晓阳在获奖采访中分享了团队背后的故事:其父为中国农村电工,童年目睹因电网老化导致的频繁断电,促使他立志研究高效能源技术;而沃尔特则坦言,她的灵感源于少年时代在撒哈拉沙漠旅行时对能量流失的直观感受。三位获奖者均表示,将把奖金投入“全球青年科学家孵化计划”,助力发展中国家参与量子科技革命。---### **未来已来:从实验室到人类社会**
目前,林晓阳团队的技术已应用于中国“墨子三号”量子卫星网络,实现亚欧大陆的无中继保密通信;沃尔特-7材料则被欧盟纳入“绿色能源2035”计划,首批超导输电塔将于2032年在北欧落成。而佐藤的“量子折纸”正被IBM、谷歌等公司竞相转化为可商用的量子处理器。正如诺贝尔委员会所言:“今年的奖项不仅属于物理学,更属于全体人类——它让我们看到,科学如何将遥不可及的‘奇迹’变为日常生活的基石。”在气候危机与数字安全挑战日益严峻的今天,这些研究或许正悄然重塑着人类的未来。
- 解决这个问题的一种策略是策略是,要求大模型严格根据公开正确的文档,从这些内容中找到相关的引用,要求使用这些引用来回答问题,并追溯答案来源文档,可以帮助减少这些幻觉
