TL;DR 版本
PromptScript 是一个轻量级的 Prompt 调试用的 DSL (Yaml)脚本,以用于快速使用、构建 Prompt。
PromptScript 文档:https://framework.unitmesh.cc/prompt-script
Why PromptScript ?
几个月前,在研究 LLM 进行研究效能提升时,我们构建了 UnitMesh (https://github.com/unit-mesh) 下的 DevTi 项目,以用于进行批量化的数据处理和 Prompt 验证 —— 诸如于,校验生成的是否是 UML,以及 UML 是否能被成功的编译。
对应的数据处理步骤为:
- LLM 连接与参数设置。
- Prompt 生成。
- LLM 进行交互。
- 对生成结果处理。
除了这种批量化的数据生成场景,在编写一个 AIGC 优先的应用时,我们还需要考虑不同参数下的效果。
基于此,我们在 Chocolate Factory 上构建了 PromptScript,以加速 LLM 的测试和效果验证。
PromptScript
PromptScript 是一个用于 LLM(Language Model)测试与验证的轻量级 DSL(Domain-Specific Language)脚本工具。它具有以下主要特点:
- 模板生成:支持基于不同格式的模板动态生成 Prompt,并将模板与数据源分离,以便复用。
- 多数据源支持:允许使用多种数据源,如文件、数据库、HTTP 等,以提供更灵活的数据输入。
- 任务策略:可配置不同参数,包括LLM的temperature参数和重复次数,以适应不同的测试需求。
- 结果验证:支持多种验证方式,包括 JSONPath 和字符串验证,以确保生成的 Prompt 符合预期。
- 多 LLM 连接配置:便于同时配置和管理多个LLM连接,以满足不同的LLM调试需求。
PromptScript 旨在简化 LLM 测试过程,提高效率,并为用户提供更大的灵活性和可维护性。
PromptScript 示例
下图是一个 PromptScript 的示例:
在这里一个 Script 会为四部分:
- 模型接入。使用额外的 connection.yml 来进行不同的 LLM 配置,再根据 Connection 中的配置,选择对应的 LLM 连接方式。
- Prompt 生成。一个 prompt 会结束模板引擎与数据源来生成,以获取更多的上下文信息。由于复用的是 Chocolate Factory 的基础设施,所以同样可以配置成向量数据库等不同来源。
- 任务(重复)策略。即用于配置任务的策略,生成不同的温度参数,或者批量生成某个结果。
- 结果校验。对生成的结果进行校验,诸如于是否是一个 JSON,是否满足 JsonPath 的表达式,以及其它的字符串校验。
随后,我们只需要通过 PromptScriptCli 就可以进行对应的 yaml 配置,并存储到对应的结果文件中。
PromptScript 是如何工作的?
现在,让我们再来看一下精简的 PromptScript 的 Job 示例:
代码语言:javascript复制connection: connection.yml
template: code-complete.open-ai.vm
template-datasource:
- type: file
value: datasource.json
strategy:
- type: connection
value:
- type: range
key: temperature
range: 0.7~1.0
step: 0.1
validate:
- type: json-path
value: $.id
1. 模型接入
第一个项配置是 connection,一个 connection 会根据不同的 type 来决定选用哪个 LLM Provider。诸如于如下的是一个用于本地测试用的 Mock 的配置,只会返回一个默认的值(api-response):
代码语言:javascript复制name: mock_response
type: MockLlm
configs:
api-response: "{"text": "this is a mock resource"}"
如下则是一个 OpenAI 的配置项:
代码语言:javascript复制name: open_ai_connection
type: OpenAI
configs:
api-host: xx
secrets:
api-key: xxx
通过这种 YAML 配置的方式来支持不同的 LLM 接入。(PS:未来还应该支持多 LLM 的对比)
2. Prompt 生成
Prompt 生成主要依赖于模型引擎与对应的数据源。如我们优先考虑的模板引擎是可以在 Intellij IDE、VS Code 等有高亮(highlight)支持的模板文件,诸如于 Apache Velocity 等。
随后,根据 datasource 来加载对应的数据,以渲染模板。
代码语言:javascript复制template-datasource:
- type: file
value: datasource.json
诸如于这里的 file,是从 json 文件中读取数据,并结合模板渲染成一个 prompt。
3. 任务(重复)策略
当前的任务策略,只支持比较简单的两种方式,即重复和 LLM 的参数化配置。这两种方式都是用于验证 Prompt 结果是否能满足我们的需求:
代码语言:javascript复制- type: connection
value:
- type: range
key: temperature
range: 0.7~1.0
step: 0.1
- type: repeat
value: 20
未来,根据需要,也会加入更多的任务策略。
4. 结果校验
最后一部分是 LLM 生成的结果校验,当前支持 JsonPath、String、Regex、MarkdownCodeBlock、Json 和 ExtTool 等验证方法。
- JsonPath:用于提取任务结果中的值的 JSON 路径表达式。依赖于 JsonPath 库,支持通过 JSON 路径表达式来验证结果。
- StringRule:字符串验证表达式,用于确定是否执行后续语句。支持字符串验证,例如检查结果中是否包含特定内容。
- Regex(正则表达式):验证规则,用于使用正则表达式验证任务结果。支持正则表达式验证,可以检查结果是否匹配指定的模式。
- MarkdownCodeBlock(Markdown 代码块):验证规则,用于检查任务结果是否是有效的 Markdown 代码块。可以用于确保结果以有效的 Markdown 代码块格式呈现。
- Json(JSON):验证规则,用于验证任务结果是否为有效的 JSON。可确保结果符合 JSON 格式。
- ExtTool(外部工具):验证规则,用于使用外部工具验证任务结果,如 PlantUML 或 Graphviz。允许使用外部工具来进一步验证结果。
示例:
代码语言:javascript复制- type: json-path
value: $.store.book[0].title
- type: string
value: output contains "hello"
- type: regex
value: d{4}
- type: markdown-code
根据不同的 prompt 结果,来选择合适的 validate。
总结
GitHub:https://github.com/unit-mesh/chocolate-factory
PromptScript 通过 YAML 配置文件的方式支持不同的 LLM 接入,允许用户定义模板和数据源来生成 Prompt。用户还可以配置任务策略和结果验证方法,以验证生成的结果是否符合需求。
PromptScript旨在为研究LLM、批量数据处理和Prompt验证提供一个便捷的工具,以提高效能和测试的效果。