主题
提示工程概念
传统软件应用是通过编写代码构建的,而 AI 应用的逻辑往往源于提示。
本指南将介绍 LangSmith 中提示工程的关键概念。
为什么要做提示工程?
提示在不改变模型底层能力的情况下引导其行为。通过提供指令、示例和上下文,提示塑造模型如何响应输入。
提示工程很重要,因为它允许你修改模型行为。虽然存在其他方法(例如微调),但提示工程通常提供最低的入门门槛,并常常带来最高的投资回报。
提示工程往往是一项多学科的工作。最有效的提示工程师可能是产品经理、领域专家或其他非技术团队成员,而不是构建应用的软件工程师。恰当的工具和基础设施对于支持这种跨职能协作至关重要。
提示类型
有两种不同的提示格式:chat 风格提示和 completion 风格提示。
Chat prompts(聊天提示) 是一个消息列表,每条都带一个角色(例如 system、user 或 assistant)。这是当前大多数模型 API 所支持的提示风格,也是推荐的格式。
Completion prompts(补全提示) 是单个字符串。这是一种较旧的提示风格,主要为了向后兼容而保留。
NOTE
除非你有使用补全提示的具体理由,否则新项目请使用聊天提示。聊天提示为多轮对话提供更好的结构,也得到现代 LLM 更好的支持。
提示与提示模板
虽然 prompt(提示)和 prompt template(提示模板)常可互换使用,但理解二者的区别有助于澄清 LangSmith 如何管理和评估你的 AI 应用。
- Prompts(提示) 指的是被传入语言模型的消息。
- Prompt templates(提示模板) 让你能够用动态占位符创建可复用的提示,这些占位符在运行时被填入。与其硬编码值,你定义一些变量,LangSmith 会在你每次运行提示时用不同的输入替换它们。这使得提示灵活、可测试,也更易于迭代。
以下是模板在实践中如何运作:
定义模板:创建一个带变量的提示(用花括号标记),它们将在运行时被替换:
You are a customer support agent. This is the refund policy: {refund_policy} Please respond to the user's question: {question}提供输入值:为每个变量提供实际值:
json{ "refund_policy": "no refunds under any circumstances", "question": "can I get a refund for this hat?" }得到最终提示:LangSmith 用你的输入替换变量,以创建发送给模型的提示:
You are a customer support agent. This is the refund policy: no refunds under any circumstances Please respond to the user's question: Can I get a refund for this hat?
TIP
关于模板变量语法和格式化选项的更多信息,参阅提示模板格式指南。
LangSmith 中的提示
你可以在 LangSmith 中存储并版本化提示模板。这些模板可以在 Playground 中测试,用提交和标签进行版本管理,并被拉入你的应用代码。
INFO
打开 Playground 以创建并测试你的第一个提示模板。有关分步说明,参阅创建提示。
接下来的章节描述提示模板的关键方面。
F-string 与 mustache
你可以使用 f-string 或 mustache 格式来用输入变量格式化你的提示模板。
有关如何在 Playground 中使用这些格式的详情,参阅模板格式。
TIP
Playground 使用 f-string 作为默认模板格式,但你可以在提示设置/模板格式部分切换到 mustache 格式。mustache 在条件变量、循环和嵌套键方面给你更多灵活性。对于条件变量,你需要在 'inputs' 部分手动添加 json 变量。阅读该文档
工具
工具是 LLM 可用来与外部世界交互的接口。工具由一个名称、一个描述,以及用于调用工具的参数 JSON schema 组成。
结构化输出
结构化输出是大多数最先进 LLM 的一项特性,即它们不产出原始文本作为输出,而是遵循一个指定的 schema。这可能在底层使用或不使用 工具。
TIP
结构化输出类似于工具,但在几个关键方面不同。对于工具,LLM 选择调用哪个工具(也可能选择不调用任何);对于结构化输出,LLM 总是以此格式响应。对于工具,LLM 可能选择多个工具;对于结构化输出,只生成一个响应。
模型
可选地,你可以将一个模型配置连同提示模板一起存储。这包括模型名称和任何其他参数(temperature 等)。
提示版本控制
版本控制是对提示进行迭代以及与提示协作的关键组成部分。
提交
每次对提示的保存更新都会创建一个带唯一提交哈希的新提交。这让你能够:
- 查看对某个提示更改的完整历史。
- 审阅较早的版本。
- 在需要时回退到先前的状态。
- 在你的代码中使用提交哈希引用特定版本(例如
client.pull_prompt("prompt_name:commit_hash"))。
在 UI 中,你可以通过在提示详情页右上角切换 Diff,将一个提交与其先前版本进行比较。
标签
提交标签是可读的标签,指向你提示历史中的特定提交。与提交哈希不同,标签可以被移动以指向不同的提交,让你能够更新你的代码引用哪个版本而无需更改代码本身。
提交标签的用例可以包括:
- 环境:
staging和production标签为 Environments 功能保留,它让你在命名的部署目标之间提升提交,并在不更改代码的情况下切换版本。 - 版本控制:标记你提示的稳定版本,例如
v1、v2,这让你能在代码中引用特定版本并随时间跟踪更改。 - 协作:标记准备好供审阅的版本,使你能够与协作者分享特定版本并获得反馈。
NOTE
不要与资源标签混淆:提交标签引用特定的提示版本。资源标签 是用于组织工作区资源的键值对。
有关创建和管理提交标签的详细步骤,参阅管理提示。
Playground
Playground 提供了一个用于迭代和测试提示的界面。你可以从侧边栏或直接从某个已保存的提示访问 Playground。
在 Playground 中你可以:
- 更改所使用的模型
- 更改所使用的提示模板
- 更改输出 schema
- 更改可用的工具
- 输入要通过提示模板运行的输入变量
- 通过模型运行提示
- 观察输出
INFO
使用 Playground 中的 Chat,借助 AI 辅助来优化提示、生成工具并创建输出 schema。
测试多个提示
你可以向 Playground 添加多个提示以比较输出并评估性能:
在数据集上测试
要在数据集上测试,从右上角选择数据集并点击 Start。你可以配置是否流式传输结果,以及测试的重复次数。
点击 "View Experiment" 按钮以查看详细的测试结果。