Created
Sep 1, 2024 09:53 AM
Favorite
Favorite
Priority
备注
推荐
🌟🌟🌟🌟🌟
类型
Prompt
正文介绍
Prompt Poet 通过低代码方式简化了开发者和非技术用户的提示设计。借助 YAML 和 Jinja2 的混合使用,Prompt Poet 能灵活、动态地创建提示,提高与 AI 模型交互的效率和质量。它节省了在字符串操作上的工程时间,允许每个人更多地专注于为用户打造最佳提示。
安装
基本用法
提示模板
Prompt Poet 模板使用 YAML 和 Jinja2 的混合语法。模板处理分为两个主要阶段:
- 渲染:首先由 Jinja2 处理输入数据。在此阶段,控制流逻辑被执行,数据被验证并适当地绑定到变量,模板内的函数被适当评估。
- 加载:渲染之后,输出是一个结构化的 YAML 文件。这个 YAML 结构包含重复的块或部分,每个部分封装成一个 Python 数据结构。这些部分具有以下几个属性:
- 名称:对部分的清晰、可阅读的标识符。
- 内容:形成提示的一部分的实际字符串负载。
- 角色(可选):指定参与者的角色,有助于区分不同的用户或系统组件。
- 截断优先级(可选):在必要时确定截断的顺序,具有相同优先级的部分按照其出现顺序进行截断。
示例:基本问答机器人
列表插值
如果你有列表中的元素(例如消息),可以像这样解析到你的模板中。
截断旧消息
上下文长度是有限的,不能总是适应整个聊天历史——所以我们可以在消息部分设置截断优先级,Prompt Poet 会按照出现顺序(从旧到新)截断这些部分。
适应用户模式
根据用户当前的模式(音频或文本)定制指令。
定向特定查询
在需要时包含如作业帮助等上下文相关的示例。
处理空白
Prompt Poet 默认情况下会去除空白以避免最终提示中的不必要换行。如果你想包含一个显式的空格,使用特殊内置的空格标记 “<|space|>” 以确保格式正确。
综合
组合性是 Prompt Poet 模板的核心优势,使得创建复杂、动态的提示成为可能。
分解为部分
为了在你的模板中保持 DRY 原则,将它们分解为可重用部分,可以跨不同模板使用,例如在 A/B 测试新提示时。
设计选择
提示诗人库
Prompt Poet Library 提供了各种功能和设置,包括提示属性。主要功能如标记化和截断有助于高效缓存和低延迟响应
模板语言
Jinja2 和 YAML 结合提供了一种非常可扩展和富有表现力的模板语言。Jinja2 促进了直接数据绑定、任意函数调用以及模板内的基本控制流。YAML 为我们的模板提供了结构(深度=1),使我们能够在达到标记限制时进行复杂的截断。这种 Jinja2 和 YAML 的结合并不独特——最显著的是 Ansible 使用了它。
原生模板函数调用
Jinja2 的一个突出特点是能够在运行时直接在模板内调用任意 Python 函数。这一功能对于即时数据检索、处理和验证至关重要,简化了提示的构建方式。这里
extract_user_query_topic
可以对用户查询进行任意处理,用于模板的控制流中——比如通过往返于主题分类器进行处理。自定义编码函数
默认情况下,Prompt Poet 将使用 TikToken 的 “o200k_base” 标记器,尽管也可以在顶层
tiktoken_encoding_name
提供备用编码名称。或者,用户可以提供自己的编码函数,通过顶层 encode_func: Callable[[str], list[int]]
。截断
如果您的 LLM 提供商支持 GPU 亲和性和前缀缓存,利用 Character.AI 的截断算法最大化前缀缓存率。前缀缓存率定义为从缓存中检索到的提示标记数占总提示标记数的比例。找到适合您的使用案例的最佳截断步骤和标记限制值。随着截断步骤的增加,前缀缓存率也会提高,但更多的标记会从提示中截断。
缓存感知截断解析
简而言之,缓存感知截断每次调用时都会截断到固定的截断点——平均每 k 次移动一次此截断点。这允许您的 LLM 提供商尽可能利用 优化推理 中描述的 GPU 前缀缓存。如果只是简单地截断直到达到标记限制(L),每次截断点都会移动,这将导致前缀缓存率显著降低。这种方法的权衡在于我们通常截断的比严格需要的要多。
模板注册表
模板注册表只是将模板作为文件存储在磁盘上的概念。使用模板注册表可以将模板文件从 Python 代码中隔离出来,直接从磁盘加载这些文件。在生产系统中,这些模板文件可以在后续使用中从内存缓存中加载,从而节省磁盘 I/O。未来,模板注册表可能会成为 Prompt Poet 的一流成员。
文件名: chat_template.yml.j2
运行此 Python 代码,确保与保存文件
chat_template.yml.j2
在同一目录。相关工作
- Priompt: Priompt (优先级 + prompt) 是一个基于 JSX 的提示库。它使用优先级来决定在上下文窗口中包含什么。该项目在将模板层与逻辑构建层分离的方面实现了类似的目标,并兼容基于 TypeScript 的使用。
- dspy: 提供了一种自动优化不同模型提示的绝佳方式,但缺乏对提示的确定性控制,这在缓存和高吞吐、低延迟的生产系统中尤为重要。
- Prompt Engine: 由于生产提示工程需要大量代码来操作和更新字符串,该 TypeScript 包应运而生,类似地为提示模板过程添加了结构,但显得有些主观,基于使用案例作出假设。由于最后一次提交是在两年前,这个包似乎不在积极开发中。
- llm: 允许在 YAML 中定义基本提示,并启用了 Jinja2 的功能,如动态控制流、函数调用和数据绑定。
- 原生 Python f-字符串:有几个项目通过包装 f-字符串,采用稍微不同的方法来提示模板:
- LangChain: LangChain 的 scope 比提示模板要大得多,尽管它提供了一些基本的模板抽象。适合简单的模板使用案例,但随着提示复杂性的增加,开始变得不堪重负。
- LlamaIndex: 像 LangChain 一样,LlamaIndex 的 scope 比提示模板要大得多,尽管它也提供了一些基本的模板抽象。
- Mirascope: 通过将所有内容封装在一个单独的 Python 类中,并使用类的文档字符串作为绑定数据的 f 字符串,实现了一种新颖的提示模板方法。