好好学习提示工程?我选择作弊!

67 阅读9分钟

从chatgpt到deepseek,AI通用智能体的发展真的很快,但是我在用的时候经常会出现一些驴唇不对马嘴和胡编乱造的情况,然后我觉得他真是个人工智障。。。后来我接触到了提示工程Prompt engineering,OK,原来是我的打开方式不对,在B站上看了很多的视频,后来发现其实实操早在官方文档中就已经给出了

首先,我们先好好学习,想直接看作弊方法的可以直接拉目录,官方文档在这里:platform.openai.com/docs/guides… 懒得点进去看的可以往下看,精华我都摘出来了

取得更好结果的六大策略

You can improve output by giving the model precise instructions, examples, and necessary context information—like private or specialized information not included in the model's training data.这句原文的意思其实就是要给AI更精确的描述、案例和上下文信息,甚至一些专门的信息,文章中也给出了六大策略

Write clear instructions【写出清晰的说明】
Provide reference text【提供参考文本】
Split complex tasks into simpler subtasks【将复杂的任务拆解成简单的任务】
Give the model time to "think"【给模型一些思考的时间】
Use external tools【使用外部工具】
Test changes systematically【系统性的测试变化】

Write clear instructions【写出清晰的说明】

这一条是为了减少模型的猜测次数,模型猜测你想要什么的次数越少,你得到准确答案的可能性越大。

Include details in your query to get more relevant answers【更详细的信息】
Ask the model to adopt a persona【要求模型作为一个角色】
Use delimiters to clearly indicate distinct parts of the input【使用分隔符清晰的知识输入的不同部分】
Specify the steps required to complete a task【告诉模型完成任务所需的步骤】
Provide examples【提供案例】
Specify the desired length of the output【指定输出所需长度】

Provide reference text【提供参考文本】

模型在回答问题的时候“偶尔”会胡编乱造,所以我们可以限定他的思考范围,提供思考来源,比如提供给他文章和必须得依据,不要让他天马行空

Use the provided articles delimited by triple quotes to answer questions. If the answer cannot be found in the articles, write "I could not find an answer."

或者强制模型进行原文引用

You will be provided with a document delimited by triple quotes and a question. Your task is to answer the question using only the provided document and to cite the passage(s) of the document used to answer the question. If the document does not contain the information needed to answer this question then simply write: "Insufficient information." If an answer to the question is provided, it must be annotated with a citation. Use the following format for to cite relevant passages ({"citation": …}).

找不到答案就找不到嘛,承认自己菜就好了,我们作为用户会包容的

f8902cfa-e06d-4ef6-b992-51a5d1bb5690.jpeg

Split complex tasks into simpler subtasks【将复杂的任务拆解成简单的任务】

第一个小策略:Use intent classification to identify the most relevant instructions for a user query

关于这部分内容,原文其实很难读懂,我当时甚至感觉读出来都不像人话,其实是因为缺少一些前置知识关于思维链CoT,有兴趣的同学可以深入研究一下

这部分其实我也没有特别理解透彻,我的理解是大模型尝试去理解用户的问题,对用户的意图进行识别和分类,然后匹配到一些设定好的类别上去处理,如果我理解有误或者大家有更好的理解欢迎指正

第二:For dialogue applications that require very long conversations, summarize or filter previous dialogue

也就是说,因为模型不会记忆所有的对话,他是有固定的上下文长度的,所以对于长时间的会话,我们需要隔一段时间对对话进行总结,还有一种方案就是动态的选择与当前的问题最相关的对话的先前部分

第三:Summarize long documents piecewise and construct a full summary recursively

分段总结长文档,递归构建完整摘要。其实就是他回答问题是有长度限制的,我们可以主动拆解问题,达到拆解答案的目的,最后再进行汇总,比如你想要模型总结一本书,就可以让他分开总结各个章节,最后在汇总就可以了

Give the model time to "think"【给模型一些思考的时间】

原文中给的例子真的很想笑,就是一道数学题,你给他一个错误的解答过程和答案,然后问他对不对,他说对,然后你让他自己做,他做出来的答案跟你给的不一致,我觉得这个例子说明模型是有“惰性”的,所以我们在提问的时候要尽可能引导模型多进行思考,就像教小孩子,尽量让他多思考多回答,尽量不要让他回答是或否

第二点就是如果你想隐藏模型的推理过程,可以分步提问,像deepseek,在回答问题的时候,会展示CoT的过程,但是有些场景下,这个推理过程会泄露一些我们不想泄露的信息,比如说要给学生批改作业,思考过程可能会泄露问题的正确答案,这时我们可以通过分步来隐藏思考过程,只对用户展示最后一次的结果

第三点,我们可以让模型自己进行查缺补漏,询问模型在之前的传递中是否遗漏了什么。假设我们使用模型列出与特定问题相关的来源摘录。列出每个摘录后,模型需要确定是否应该开始编写另一个摘录或是否应该停止。如果源文档很大,模型通常会过早停止并无法列出所有相关摘录。在这种情况下,通常可以通过使用后续查询提示模型来查找之前传递时遗漏的任何摘录来获得更好的性能

截屏2025-04-08 17.31.03.png

Use external tools【使用外部工具】

第一条策略:Use embeddings-based search to implement efficient knowledge retrieval(使用基于嵌入的搜索实现高效的知识检索),要理解这一条策略,我们首先要有一个认识:大模型并不是全知全能的,他总有一些不了解的实时信息和一些细节。那这个时候,就需要我们主动地把一些信息塞给他,这个过程就叫做“外部知识补充”。

那怎么进行外部知识补充呢,就是靠文本嵌入和向量搜索

可以把“文本嵌入”想象成给每段文字分配一个多维坐标(通常是 1536 维、或其他大维度的向量),代表它的“意思”。

比如:

• “泰坦尼克号是一部经典爱情电影” → 嵌入向量 A

• “Jack 和 Rose 的爱情故事感人至深” → 嵌入向量 B

因为 A 和 B 含义相似,它们的向量在“嵌入空间”里就会比较靠近。

有了这些嵌入向量,我们可以:

  1. 把一堆资料(文档、网页、书籍)切成一块一块的小段落。

  2. 给每段做嵌入并存起来。

  3. 当用户问一个问题时:

    • 把问题也变成一个嵌入向量
    • 在嵌入空间中找“和问题最相近”的那几段资料
  4. 把这些相关内容一起喂给模型,作为上下文,让它更聪明地回答问题。

这种方法就叫做 向量检索 + 提示补全(RAG),这种方法在做企业知识库、专业领域问答之类的场景中都是必须的

第二点:Use code execution to perform more accurate calculations or call external APIs(使用代码执行进行更精确的计算或调用外部 API)。语言模型不能依靠自身准确地执行算术或长时间计算。在需要的情况下,可以指示模型编写和运行代码,而不是自己进行计算。这就比较好理解了,对于一些计算复杂的问题,就是选择让模型输出代码而不是答案。

官方警告:Executing code produced by a model is not inherently safe and precautions should be taken in any application that seeks to do this. In particular, a sandboxed code execution environment is needed to limit the harm that untrusted code could cause

代码有风险,执行需谨慎!

Test changes systematically【系统性的测试变化】

有时很难判断某个变化(例如,新的指令或新的设计)是让你的系统变得更好还是更糟。查看几个示例可能会提示哪个更好,但由于样本量较小,很难区分真正的改进还是随机运气。也许这种变化有助于提高某些输入的性能,但会损害其他输入的性能。

评估程序(或“评估”)对于优化系统设计非常有用。好的评估包括:

  • 代表现实世界的使用情况(或至少是多样化的)
  • 包含许多测试用例以获得更强的统计能力(请参阅下表了解指南)
  • 易于自动化或重复

OpenAI Evals是一个开源软件框架,提供用于创建自动评估的工具

策略1:参考黄金标准答案评估模型输出。

假设已知一个问题的正确答案应该参考一组特定的已知事实。那么我们可以使用模型查询来计算答案中包含了多少所需的事实

优化模型输出

模型的输出大致有三个评判标准:准确性、成本和延迟,随着提示的不断迭代,这三个指标也有不同的针对性优化措施

准确性:platform.openai.com/docs/guides…

成本:platform.openai.com/docs/guides…

优化延迟:platform.openai.com/docs/guides…

作弊策略

其实很简单,说起来就两点

  1. 利用大模型,让大模型作为提示工程师,将官方文档喂给他,让他学习而不是我们自己,然后将我们的问题翻译成更好的问题
  2. 在大模型思考的过程中,会提及一些思考和搜索的关键词,将这些关键词补充给提示工程师,完善我们的问题,也使得问题更加精准

以上两种方法可以结合使用,亲测使用时间越长,这位提示工程师效率越高,而且经常给他反馈的话,他还会了解到我容易遗忘的点,从而主动进行补充和提示。

温馨提示:当你让他作为提示工程师的时候,尽量不要跟他聊其他的问题,掺杂的背景信息太多,有的时候他会迷茫

最后,希望大家和这些小助手合作愉快。

当然,如果大家点赞关注的话,我也会很快乐!

b29c0267-c6ce-4fe2-a191-03011b6ddfa0.jpeg