AI对话魔法|Prompt Engineering 探索指南

01 什么是 Prompt Engineering 理解,首先 MCube 会依据模板缓存状态判断是否需要网络获取最新模板,当获取到模板后进行模板加载,加载阶段会将产物转换为视图树的结构,转换完成后将通过表达式引擎解析表达式并取得正确的值,通过事件解析引擎解析用户自定义事件并完成事件的绑定,完成解析赋值以及事件绑定后进行视图的渲染,最终将 想象一下,你在和一个智能助手聊天,你需要说出非常清晰和具体的要求,才能得到你想要的答案。Prompt Engineering 就是设计和优化与AI对话的“提示词”或“指令”,让AI能准确理解并提供有用的回应。

Prompt Engineering 主要包括以下几个方面:
1.明确目标:希望AI完成什么任务。例如:写一篇文章,回答一个问题,进行一次对话?
2.设计提示词:设计出具体的提示词,提示词应该尽量简洁明了,包含所有必要的信息。比如:“写一篇关于环境保护重要性的文章。”
3.优化和测试:一开始的提示词可能并不完美,所以需要不断调整和优化,测试不同的表达方式,尝试找到最好的结果。
4.处理意外情况:有时候,AI可能会给出意外的回答,还需要预测这些意外情况,并设计出应对策略。
02 Prompt Engineering 如何兴起
理解,首先 MCube 会依据模板缓存状态判断是否需要网络获取最新模板,当获取到模板后进行模板加载,加载阶段会将产物转换为视图树的结构,转换完成后将通过表达式引擎解析表达式并取得正确的值,通过事件解析引擎解析用户自定义事件并完成事件的绑定,完成解析赋值以及事件绑定后进行视图的渲染,最终将
想象一下,你在和一个智能助手聊天,你需要说出非常清晰和具体的要求,才能得到你想要的答案。Prompt Engineering 就是设计和优化与AI对话的“提示词”或“指令”,让AI能准确理解并提供有用的回应。
Prompt Engineering 主要包括以下几个方面:
1.明确目标:希望AI完成什么任务。例如:写一篇文章,回答一个问题,进行一次对话?
2.设计提示词:设计出具体的提示词,提示词应该尽量简洁明了,包含所有必要的信息。比如:“写一篇关于环境保护重要性的文章。”
3.优化和测试:一开始的提示词可能并不完美,所以需要不断调整和优化,测试不同的表达方式,尝试找到最好的结果。
4.处理意外情况:有时候,AI可能会给出意外的回答,还需要预测这些意外情况,并设计出应对策略。
Prompt Engineering 如何兴起
1)早期阶段(2017年前)
基本指令:早期的NLP模型中,用户与AI的互动主要是基于简单的指令和关键词匹配。此时的AI系统主要依赖预定义的规则和有限的上下文理解能力。
模板化问答:一些早期的聊天机器人和问答系统采用模板化的问答模式,用户问题必须严格匹配预设的模板才能得到有效回应。
2)初步探索(2017-2018)
Seq2Seq 模型:Sequence-to-Sequence 模型的引入,使得AI能够更好地处理输入和输出之间的关系,但仍然需要明确的指令和大量训练数据。
预训练模型:2018年,OpenAI发布的GPT标志着预训练语言模型的兴起。尽管早期的GPT模型在理解和生成文本方面有了显著进步,但仍需要明确提示词。
3)快速发展(2019-2020)
GPT-2 发布(2019):GPT-2的发布使得语言模型在生成自然语言文本方面取得了重大突破。Prompt Engineering开始受到关注,研究人员开始探索如何通过设计提示词来引导模型生成更相关的内容。
BERT和其他模型:Google发布BERT,进一步提升了NLP模型的理解能力。Prompt Engineering开始利用这些模型的双向理解能力来优化提示词。
4)成熟阶段(2020-2021)
GPT-3 发布(2020):GPT-3的发布带来了更大规模的预训练模型,具备更强的生成和理解能力。Prompt Engineering变得更加重要,研究人员和开发者开始系统性地研究和优化提示词。
Few-shot 和 Zero-shot 学习:GPT-3支持Few-shot和Zero-shot学习,这意味着模型可以通过少量甚至没有示例的情况下完成任务。Prompt Engineering技术迅速发展,设计出有效的提示词来最大化模型的性能。
5)技术手段演变(2021-2023)
Prompt Tuning:研究人员开发了Prompt Tuning技术,通过调整提示词的参数来优化模型的输出。这种方法在提高模型性能方面表现出色,成为Prompt Engineering的重要手段之一。
自动化工具:为了简化Prompt Engineering的过程,出现了许多自动化工具和框架,帮助开发者快速生成和测试提示词。
领域特定优化:Prompt Engineering开始针对特定领域(如医疗、法律、教育等)进行优化,设计出更专业和精准的提示词。
6)现代阶段(2024及以后)
自适应提示词生成:随着AI技术的进一步发展,出现了自适应提示词生成技术,模型可以根据上下文和用户需求动态调整提示词。
多模态提示词:结合文本、图像、音频等多模态数据的提示词设计,使得Prompt Engineering在处理复杂任务时更加高效和灵活。
人机协同优化:通过人机协同的方式,结合用户反馈和模型自我改进,进一步提升Prompt Engineering的效率和效果。
Prompt Engineering 技术介绍
1)无扩展训练技术(New Task Without Extensive Training)
① Zero-shot Prompting:直接给出任务和目标,注意prompt格式和参数调整。
小工具:可以提供prompt模版,根据选择不同的模版,帮你设计基础的prompt内容。
temperature:控制生成文本的随机性,范围0到1;较低值使输出更确定,较高值增加随机性和多样性max_tokens:限制生成的最大标记数,一个标记大是一个单词或标点符号top_p:控制基于累积概率的采样,较低值会使生成的文本更加确定(例如:top_p=0.1 意味着只会从概率最高的前10%的标记中进行采样)n=1:生成回复个数,默认1个stop=None:不设置停止条件presence_penalty:设置为0不惩罚重复内容,较高值会鼓励模型生成与上下文中已有内容不同新内容frequency_penalty:设置为0不惩罚频繁出现的内容,较高值会减少模型生成重复词语的可能性
2)推理与逻辑技术(Reasoning and Logic)
① Chain-of-Thought (CoT)
原理:为了克服LLM在处理复杂推理任务方面的限制,Wei et al. (2022) (https://arxiv.org/abs/2201.11903)提出了CoT,通过引入一种特殊的提示策略,促进模型进行连续和逐步的思考过程,连贯思考技术的主要贡献在于能够更有效地激发LLM产出结构化且深入思考的回答。
② Automatic Chain-of-Thought (Auto-CoT) Prompting
原理:CoT是一种手动的方式,过程耗时且效率低下,因此 Zhang et al. (2022) (https://arxiv.org/abs/2210.03493)提出了 Auto-CoT 技術。通过自动生成“逐步思考”式的提示,帮助大模型实现推理链。通过多样化的样本生成来提升整体的稳定性,能够对多种问题产生多个独特的推理链,并将它们组合成一个终极范例集合。这种自动化和多样化的样本生成方式有效地降低了出错率,提升了少样本学习的效率,并避免了手工构建CoT的繁琐工作。
③ Self-Consistency
原理:Wang et al. (2022)(https://arxiv.org/abs/2203.11171)提出了一种新型解码策略,目标在于取代链式思考提示中使用的天真贪婪解码。从语言模型的decoder中提取多条不同的推理路径,从而生成多种可能的推理链,增加找到正确答案的可能性。
④ Logical Chain-of-Thought (LogiCoT) Prompting
原理:Zhao et al. (2023)(https://arxiv.org/abs/2309.13339)提出的 LogiCoT,与之前的逐步推理方法 (例如CoT) 相比,引入了一个全新的框架。该框架吸取了symbolic logic的精髓,以一种更加结构化和条理清晰的方式来增强推理过程。采用了反证法这一策略,通过证明某一推理步骤若导致矛盾则该推理步骤错误,从而来核查和纠正模型产生的推理步骤。
图例说明:上方是CoT,推理过程是线性的,每一步都依赖于前一步,下方是LoT,推理过程是树状的,可以在某些步骤上进行分支,每个节点仍代表一个推理步骤,但节点之间有更多的连接方式,形成了一个分支结构。这种方法允许探索多个可能的推理路径。图中虚线框标出了某些分支节点,表示这些节点可以在不同的路径上进行组合和选择。因此LoT方法能更灵活地处理复杂问题,允许同时考虑多个推理路径,从而可能得到更全面和准确的结果。
⑤ Chain-of-Symbol (CoS) Prompting
原理:为了克服LLM依赖容易模糊且可能带有偏见的自然语言的限制,Hu et al. (2023)(https://arxiv.org/abs/2305.10276)提出了 CoS。这种方法不适用自然语言,而是采用简化的符号作为提示,优势在于使提示更加清晰简洁,提高模型处理空间关系问题能力,同时运作原理更易使人理解。
1.B/A/D/E/C
2.C/E
3.E/D
4.D
模型输出:C, E, D
3)减少幻觉技术(Reduce Hallucination)
流程:完整的RAG应用流程主要包含两个阶段。
数据准备阶段:一般是离线过程,主要是将私域数据向量化后构建索引并存入数据库的过程。主要包括:数据提取、文本分割、向量化、数据入库等。
数据提取——>文本分割——>向量化(embedding)——>数据入库
应用阶段:根据用户提问,通过高效的检索方法,召回与提问最相关的知识,并融入Prompt;大模型参考当前提问和相关知识,生成答案。关键环节包括:数据检索(相似性检索、全文检索-关键词)、注入Prompt(Prompt设计依赖个人经验,实际应用中往往需要根据输出进行针对性调优)。
用户提问——>数据检索(召回)——>注入Prompt——>LLM生成答案
示例说明:下图表展示了一个查询和验证过程,目的是找出一些在纽约市出生的政治家。整个过程分为四个步骤,通过验证初步信息来确保最终响应的准确性。
1.初步响应:系统提供了一个初步的响应,列出了一些可能在纽约市出生的政治家:Hillary Clinton、Donald Trump、Michael Bloomberg。
2.计划验证:系统决定验证初步响应中的信息,提出了问题:Hillary Clinton 出生在哪里?Donald Trump 出生在哪里?Michael Bloomberg 出生在哪里?
3.执行验证:系统查找并验证了这些政治家的出生地,Hillary Clinton 出生在伊利诺伊州芝加哥、Donald Trump 出生在纽约州纽约市皇后区、Michael Bloomberg 出生在马萨诸塞州波士顿。
4.最终验证响应:根据验证结果,系统提供了一个修正后的列表,只包含在纽约市出生的政治家。Donald Trump - 前美国总统、Alexandria Ocasio-Cortez - 美国众议院议员。
4)微调和优化(Fine-Tuning and Optimization)
示例说明:下图展示了APE技术的几个步骤。
1.Proposal(提议):使用LLM生成初始提示 “write the antonym of the word”。
2.Scoring(评分):对生成的提示进行评分,评分的依据是提示的对数概率(不同提示分数不一致,有0.26、0.28等)
3.High Score Candidates(高分候选项):保留得分较高的候选提示,丢弃得分较低的提示。例如,得分为-0.86和-1.08的提示被丢弃,得分为-0.26和-0.28的提示被保留。
5)其他手段(Others Techniques)
示例说明:下图展示了利用三种不同的方法来回答一个问题:“我去过多少个国家?我去过孟买、伦敦、华盛顿、大峡谷、巴尔的摩,等等。”
1.直接回答:直接给出了几个可能的答案,32和29是错误的,54是正确的。
2.思路链 (CoT):首先,将城市按国家分组,然后计算不同国家的数量。61和60是错误的,54是正确的。
3.代码链(CoC):首先,初始化一个包含城市名称的列表和一个空的集合来存储国家。然后遍历每个城市,通过函数 get_country(place) 获取对应的国家,并将其添加到集合中。最后计算集合的长度,结果显示,54是正确的。
总结:直接回答法没有解释过程,容易出错。思路链法逐步解释,但仍可能出错。代码链法通过编程逻辑,确保了答案的准确性,在三种方法中表现最好。
示例说明:下图展示了三种提示方法在回答数学问题时的表现。
Prompt问题:James每周给两个不同的朋友各写一封3页的信,每周写两次。他一年写多少页?
待回答问题:James有30颗牙齿。他的牙医钻了其中的4颗,并且修复了比钻的牙齿多7颗的牙齿。牙医修复了James牙齿的百分比是多少?
1.标准提示:Prompt中回答直接给出答案,但没有解释过程,导致第二个问题答案:37.5%,回答错误。
2.思维链(CoT):Prompt中加入了详细的解释过程,使得模型在输出修复牙齿比例问题中能更准确地思考,但是答案为36.67%,还是错误。
3.对比思维链(Contrastive CoT):Prompt中加入了正确答案和错误答案的详细解释说明。最终输出答案50%正确。Contrastive CoT 不仅提供正确的解释,还展示了错误的解释,帮助理解和验证答案的正确性。
示例说明:下图展示了不同类型的情感表达及其在不同理论框架下的分类和交叉关系。主要包含了三个理论框架:自我监控、社会认知理论和认知情绪调节,并列出了每个框架下的具体情感表达句子(EP01-EP11)。通过这种分类方式,可以看出不同情感表达在不同理论框架和维度下的交叉关系和应用场景。这种分类有助于更好地理解和应用情感表达在不同情境中的作用。右侧展示了这些情感表达在不同社会效应和自尊维度下的分类:
1.社会效应(Social effect)包含:EP01, EP02, EP03, EP04, EP05, EP06(EP06是EP01, EP02, EP03的复合体)
2.自尊(Self-esteem)包含:EP07, EP08, EP09, EP10, EP11
3.备注:EP06 是EP01, EP02, 和EP03的复合体。
示例说明:RaR 主要分为两个步骤,通过对 prompt 理解和重述,语言模型可以更好地理解和回答问题。
1.重述问题:首先给定一个原始问题,“取 Edgar Bob 中每个单词的最后一个字母并将它们连接起来”。然后重述使其更清晰、更详细。重述后的问题变成“你能识别并提取 Edgar Bob 中每个单词的最后一个字母,然后按它们出现的顺序将它们连接起来吗?”
2.回答重述后的问题:重述后的问题是“你能识别并提取 Edgar Bob 中每个单词的最后一个字母,然后按它们出现的顺序将它们连接起来吗?”回答为“Edgar Bob 中每个单词的最后一个字母是 r 和 b,按出现顺序连接起来是 rb”。
1)项目背景
2)应用举例
样本说明:数据总共包含7个字段(goods_code:商品编码,goods_name:商品名称, item_third_cate_name:修正后品类,weight:重量(kg), big_goods:件型编码,big_goods_desc:件型中文,label:业务打标的正确件型(检验模型结果的label)。
def classify_product(row, rules_text):try:client = OpenAI(api_key=os.environ["OPENAI_API_KEY"],base_url=os.environ["OPENAI_API_BASE"])# 输入描述description = f"商品编码:{row['goods_code']},描述:{row['goods_name']},重量:{row['weigth']}。"# 设定模型的角色和任务system_message = "你是物流行业的一位专家,请基于规则和商品描述,仅输出该商品的件型,不要输出其他任何信息。"# 用户具体输入user_message = (f"规则:\n{rules_text}\n"f"商品描述:{description}\n")# 请求模型response = client.chat.completions.create(model="gpt-4-1106-preview",messages=[{"role": "system", "content": system_message},{"role": "user", "content": user_message}],temperature=0, # temperature 控制生成文本的随机性,范围为0到1。较低的值使输出更确定和一致,而较高的值增加随机性和多样性。max_tokens=6, # 限制生成的最大标记数,一个标记大约是一个单词或标点符号。top_p=0.1, # 数控制基于累积概率的采样,较低的 top_p 值会使生成的文本更加确定,只会考虑累积概率达到较低阈值的标记。n=1 # 生成一个回复)# 解析并返回结果return response.choices[0].message.content.strip()except Exception as e:return str(e)
prompt1 = """件型的判断和商品的细分品类、商品来源和商品参数有关。细分分类为:1. 挂机空调:描述或型号中含“挂机空调”或“G”或“GW”。2. 柜机空调:描述或型号中含“柜机空调”或“L”或“LW”。3. 家用空调:描述中含“家用空调”或型号中含“KFR”。4. 中央空调/天花机/风管机/多联机/移动空调一体机:描述或名称中含“中央空调”、“天花机”、“风管机”、“多联机”或“移动空调一体机”。5. 其他类别空调:不符合上述任何一个特定类型的空调。商品来源分为自营和外单两种,商品编码以“EMG”开头为外单,否则为自营。件型包括:超小件、小件、中件-半件、中件、大件-半件、大件、超大件-半件、超大件。件型规则如下:1. 自营挂机空调:- 匹数≤3p或型号≤72为中件-半件- 匹数>3p或型号>72为大件-半件2. 自营柜机空调:- 匹数≤2p或型号≤51为中件-半件- 2p<匹数≤3p或51<型号≤72为大件-半件- 匹数>3p或型号>72为超大件-半件3. 自营家用空调:- 描述含“大2p”或型号≤51为中件-半件- 描述含“大3p”或51<型号≤72为大件-半件- 型号>72为超大件-半件4. 自营及外单的家用中央空调、天花机、风管机、多联机及移动空调一体机:- 重量<15kg为超小件- 15kg≤重量<25kg为小件- 25kg≤重量<40kg为中件- 40kg≤重量<60kg为大件- 60kg≤重量<100kg为超大件5. 外单家用空调、挂机空调、柜机空调:- 匹数≤2p或型号≤51为中件-半件- 2p<匹数≤3p或51<型号≤72或描述中提到“大2p”为大件-半件- 匹数>3p或型号>72或描述中提到“大3p”为超大件-半件"""
prompt2 = """...同prompt1举例:1. 编码:100015885342,描述:酷风(Coolfree)中央空调一拖多多联机 MJZ-36T2/BP3DN1-CF4,重量:21,件型是:小件。2. 编码:100014630039,描述:COLMO AirNEXT空气主机 3匹 AI智能空调新一级全直流变频空调立式柜机 KFR-72LW/CE2 线下同款,重量:21,件型是:超大件-半件。"""
prompt3 = """...同prompt1举例:1. 编码:100015885342,描述:酷风(Coolfree)中央空调一拖多多联机 MJZ-36T2/BP3DN1-CF4,重量:21。- 第一步:判断商品来源。商品编码不以“EMG”开头,因此商品来源为自营。- 第二步:判断细分品类。描述中含有“中央空调”以及“多联机”,因此细分品类为中央空调。- 第三步:判断件型。重量为21kg,满足15≤重量<25,因此件型为小件。2. 编码:100014630039,描述:COLMO AirNEXT空气主机 3匹 AI智能空调新一级全直流变频空调立式柜机 KFR-72LW/CE2 线下同款,重量:21。- 第一步:判断商品来源。商品编码不以“EMG”开头,因此商品来源为自营。- 第二步:判断细分品类。描述中含有“KFR”和“LW”,优先判断细分品类为柜机空调。- 第三步:判断件型。由于描述中含有“3匹”且型号为72,满足2p<匹数≤3p或51<型号≤72,因此件型为大件-半件。"""
system_message = "你是物流行业的一位专家,请基于规则和商品描述,建议先判断商品的细分品类,再判断商品来源,再判断商品件型,请简要说明关键步骤,并在100个字内判断商品件型。"Self-Consistency:依旧使用prompt2,但调整调用参数和解析逻辑,让模型进行多次输出,取出现频率最高的结果为最终结果,精确率为66.67%。
import randomdef classify_product_self_consistency(row, rules_text):try:client = OpenAI(api_key=os.environ["OPENAI_API_KEY"],base_url=os.environ["OPENAI_API_BASE"])description = f"商品编码:{row['goods_code']},描述:{row['goods_name']},重量:{row['weigth']}。"system_message = "你是物流行业的一位专家,请基于规则和商品描述,仅输出该商品的件型,不要输出其他任何信息。"user_message = (f"规则:\n{rules_text}\n"f"商品描述:{description}\n")# 多次请求模型,获取多个输出responses = client.chat.completions.create(model="gpt-4-1106-preview",messages=[{"role": "system", "content": system_message},{"role": "user", "content": user_message}],temperature=0.1,max_tokens=20,top_p=0.1,n=5 # 生成5个不同的输出)# print(responses)# 提取件型piece_type_options = []for response in responses.choices:piece_type_match = re.search(r"件型:(.+)", response.message.content)if piece_type_match:piece_type = piece_type_match.group(1)if piece_type not in piece_type_options:piece_type_options.append(piece_type)else:piece_type = response.message.contentif piece_type not in piece_type_options:piece_type_options.append(piece_type)# 如果有多个不同的件型结论,返回一个随机的件型结论if len(piece_type_options) > 1:return random.choice(piece_type_options)elif piece_type_options:return piece_type_options[0]else:return "无法确定件型,请检查规则或商品描述。"except Exception as e:return str(e)
揭秘JDQ限流架构:实时数据链路的多维动态带宽管控|京东零售技术实践
🤝关注【京东技术】后台回复【加入京东】获取专属社招和校招内推码,回复【技术交流】加群与更多技术技术伙伴畅聊!
▪功能支撑:会员成长体系、等级计算策略、权益体系、营销底层能力支持
▪用户活跃:会员关怀、用户触达、活跃活动、业务线交叉获客、拉新促活