最佳实践

清晰的表达结构

  • 通过换行,空行表达来区分要执行的具体内容,类似文章编写流程
  • 明确的分隔符:使用ai能理解的分隔符,例如 [] , ``` ```,<> 来区分的内容:
    • 用户输入
    • 概念内容
    • 表达格式
  • 固定格式输出:告诉 AI 输出对应格式的内容:html, json
  • 拆解任务步骤:给出明确清晰的任务步骤:步骤1 - xxx ,步骤2 - xx
  • Few-shot:给出正确答案实例,再让AI回答

更长的思考窗口

给AI足够的思考时间,ai在输出的过程中会思考,更长的思考窗口期有利于后续生成结果

  • 让 AI 先分析问题,再给出答案,可以的话在和现有答案比较对错
  • 先解释问题内容/ 分析问题,再回答结果
  • 结合任务拆解来进行表达,先思考后解答

迭代

好的提示词是在不断迭代中去逐步完善的,就和功能迭代类似的概念

在日常开发中,我会经常迭代自己的提示词,不断完善和参考,假如我们要用 AI 去做一件没有多少经验的事情,提示词迭代是必不可少的步骤,通过完善提示词我们可以在后续得到更好的输出结果,并形成自己的一套工程实践和方法论。

  1. 给出清晰的提示词内容
  2. 分析哪些内容导致无法达到期望的输出
  • 长度是否限制:基于 token 分词,所以最终输出结果可能会存在偏差
  • 是否对输出结构和内容有要求
  • 最佳实践是否应用
  1. 重写表述内容和提示词

重复上述步骤,达到想要的结果

摘要

让大模型生成内容摘要,协助我们概括内容,减少阅读理解的时间

  • 指定生成的内容:更精炼的关键内容,关键词,长度限制
  • 指定生成的目标:查看该内容的人或对象是谁,方便 ai 提取合适的关键信息

内容推理

类似摘要功能,但是是对更深层东西的表达

例如情绪的处理和表达,对关键词的提取,便于对用户进行行为分析,产品改进和内容推理

  • 让模型统计关键词出现次数
  • 让模型判断用户评论的情绪表达,内容含义
  • 可以结合json输出,方便后续对用户内容进行处理

内容翻译/转换

大模型非常适合用于做内容翻译和内容转换操作,用于日常沟通翻译和代码内容转换

  • 语言识别:让模型识别输入的内容是什么语言/计算机语言
  • 语言翻译:让模型讲输入内容翻译为其他语言/计算机语言
    • 把英语翻译成法语/中文
    • 把 JS 代码用 Python 格式重写一次
  • 语法检查:让模型检查输入内容的语法是否正确/符合特定场景的要求

参数 - 温度(Temperature)

Ai 配置时有一个温度的选项

温度越高,ai的表达随机性就越大,但结果准确率也会有所下降(类似于语言表达会更热情)适合于邮件编写,日常沟通等场景

温度越低,ai的表达就越固定,输出答案的结果也会高度一致(类似于语言表达的死板,像背答案一样),适合于学术研究,编程等场景

参数 - 角色

在日常 Ai 聊天中,为了使ai存在记忆
通常会对话上下文一起发送给 ai
日常看到的对话消息格式在代码中的表示是:

const message = [
 {
   role:'assistant'
   content:''
 },
]

即调用 ai 时,会通过一连串的上下文消息来完成对话流程
Role 即是当前消息的角色,可以理解成餐厅里的服务员,顾客这种角色定位
Content 即是当前角色本次对话的内容,类似于在点餐时候每个人的对话

Role 角色分为 3 类

  • user:用户本身,即我们输入的信息,也可以理解为 喂给 ai 的 prompt
  • assistant:即 Ai 助手本身,代表当前内容是 Ai 输出的
  • system:系统角色,其对应的 content 也是常说的 system prompt,代表 ai 的角色定位,这部分内容对用户不可见,但是 ai 会根据对应的 prompt 提示词来规范自己的消息回复,在设计插件起到非常重要的作用,可以参考豆包插件,以及 vscode cline 插件的源码设计

如上所述,记忆上下文是当前完成 AI 大部分功能的前提,例如 RAG 的引用,Agent ,插件等

由于需要携带大量对话信息,会导致 token 被大量消耗,因此目前如何管理,精简提取上下文(例如 GPT5-Codex),减少 token(你的 dollar) 消耗也是 AI 对话优化的一个方向

工具调用Toolcall Toolresponse

提示词工程:怎么编写更好的提示词让ai输出想要的结果

上下文工程:怎么精简和优化管理的上下文,保证结果不会跑偏

这个概念存在于 Agent 机器人本身,Agent可以简单理解为带有工具函数的聊天机器人

Agent将消息以及自身有的工具整合给 LLM,LLM 会根据情况回复是否调用工具来完善结果(网络搜索)/执行操作(修改文件)

toolcall 就是对工具的调用,会包含调用工具函数名,调用的参数,agent 会根据函数名和参数,调用真正的函数执行对应的操作,然后得到结果返回

toolresponse 指的就是返回的结果

这个过程可能持续好几轮对话,直到 LLM 觉得可以了,就会把结果整合,返回给agent,最终给到用户本身

上下文工程

但是工具调用会产生过长上下文,这时就需要有些功能约束 Ai 行为,避免ai 生成不符合结果的输出,因此需要一些方案来规范,精炼上下文内容

  • 笔记工具:给 ai 提供记录工具函数,让ai 拆解任务并写下任务清单和关联信息,之后根据任务清单逐步完成和更新步骤,完成后,步骤内容会被插入开头和结尾(transformer 模型对开头和结尾内容较为关注)
  • 信息丢弃:丢弃不重要的信息,通常会丢弃中间,保留开头和结尾比较的提示词,因为这部分比较重要,但对于如何丢弃,怎么丢弃,这是需要思考的一个问题
  • 上下文精炼:提取老旧的上下文,让 llm 模型精简上下文,再将精简后的上下文覆盖原来的上下文
  • 内容精炼:对于大量内容,比如精简不重要的结构化标签,不重要的语言信息表达,再放入上下文中
  • RAG:基于 embedding 模型,agent把内容处理后放入向量数据库变成,形成向量上下文,提供工具让ai查找自己需要的内容,只把需要的内容放入上下文,避免了上下文膨胀,以此精简上下文信息,例如现在的个人知识库应用

RAG

Embedding模型会把输入内容,输出成固定长度的向量数组(类似于有损压缩但是能保留原语义),一个向量数组每一位值都代表向量坐标系一个维度中的向量值(即数组1000位,向量坐标系就有1000维,更高的维度能使结果更为精确)

整个向量数组构成该内容在向量坐标系中的位置,向量坐标系中,距离越近,其内容的语义近似值也会越接近,后续把用户输入的内容同样也转换为向量坐标系中,以此来进行匹配,最终讲近似语义的内容提取并整合一起发送给 LLM

Chucking:即决定如何对文章内容进行切块,将切取结果作为一段内容提供给模型生成向量数组,可以按句子切,按段落切

向量数据库:设计用于找到距离最近的向量结果,即近似值,更适用于 ai 的场景,而不是像数据库的精确匹配

  • Pinecone
  • Chroma
  • Postgresql+pgvector

RAG 现在存在的问题:

  • 如何 chuking 保持语义正确:算法优化,让llm模型参与到其中

总结

Ai 对话其实就是作为管理者/架构师,与通用领域技术专家合作的一个过程,是个人架构和思维能力的体现,如何用好 AI ,怎么让 AI 能力辅助自己日常提效,怎么把日常生活可重复效率低的流程自动化,这是未来技术岗位都需要思考的问题。

参考内容

ChatGPT Prompt Engineering for Developers - DeepLearning.AI

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐