> ## Documentation Index
> Fetch the complete documentation index at: https://cndoc-langchain.site/llms.txt
> Use this file to discover all available pages before exploring further.

# 提示工程概念

虽然传统软件应用程序是通过编写代码构建的，但AI应用程序通常从提示中获取其逻辑。

本指南将介绍LangSmith中提示工程的关键概念。

## 为什么需要提示工程？

提示在不改变模型底层能力的情况下引导其行为。通过提供指令、示例和上下文，提示塑造了模型对输入的响应方式。

提示工程之所以重要，是因为它允许你修改模型行为。虽然存在其他方法（如微调），但提示工程通常提供最低的入门门槛，并且往往能带来最高的投资回报率。

提示工程通常是一项多学科协作的工作。最有效的提示工程师可能是产品经理、领域专家或其他非技术团队成员，而不是构建应用程序的软件工程师。适当的工具和基础设施对于支持这种跨职能协作至关重要。

## 提示类型

有两种不同的提示格式：`chat`（聊天）风格提示和`completion`（补全）风格提示。

**聊天提示**是一系列消息，每条消息都有一个角色（如`system`、`user`或`assistant`）。这是当前大多数模型API支持的提示风格，也是推荐的格式。

**补全提示**是一个单一字符串。这是一种较旧的提示风格，主要为了向后兼容而保留。

<Note>
  除非有特定原因需要使用补全提示，否则新项目请使用聊天提示。聊天提示为多轮对话提供了更好的结构，并且受到现代LLM更好的支持。
</Note>

## 提示与提示模板

虽然*提示*和*提示模板*经常互换使用，但理解它们的区别有助于澄清LangSmith如何管理和评估你的AI应用程序。

* **提示**指的是传递给语言模型的消息。
* **提示模板**允许你创建带有动态占位符的可重用提示，这些占位符在运行时被填充。你无需硬编码值，而是定义变量，LangSmith在每次运行提示时用不同的输入替换这些变量。这使得提示灵活、可测试且更易于迭代。

以下是模板在实践中的工作方式：

1. **定义模板**：创建一个带有变量（用花括号标记）的提示，这些变量将在运行时被替换：

   ```
   You are a customer support agent. This is the refund policy:

   {refund_policy}

   Please respond to the user's question:

   {question}
   ```

2. **提供输入值**：为每个变量提供实际值：

   ```json theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
   {
   "refund_policy": "no refunds under any circumstances",
   "question": "can I get a refund for this hat?"
   }
   ```

3. **获取最终提示**：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/create-a-prompt#template-format)指南中了解更多关于模板变量语法和格式选项的信息。
</Tip>

## LangSmith中的提示

你可以在LangSmith中存储和版本化提示模板。这些模板可以在工作台中测试，通过提交和标签进行版本控制，并拉取到你的应用程序代码中。

<Callout type="info" color="#4F46E5" icon="player-play" iconType="regular">
  打开[工作台](https://smith.langchain.com/playground)来创建和测试你的第一个提示模板。有关分步指南，请参阅[创建提示](/langsmith/create-a-prompt)。
</Callout>

以下部分描述了提示模板的关键方面。

### F-string 与 mustache

你可以使用[f-string](https://realpython.com/python-f-strings/)或[mustache](https://mustache.github.io/mustache.5.html)格式来格式化带有输入变量的提示模板。

有关如何在工作台中使用这些格式的详细信息，请参阅[模板格式](/langsmith/create-a-prompt#template-format)。

<Check>
  [工作台](https://smith.langchain.com/playground)使用`f-string`作为默认模板格式，但你可以在提示设置/模板格式部分切换到`mustache`格式。`mustache`在条件变量、循环和嵌套键方面提供了更多灵活性。对于条件变量，你需要在“inputs”部分手动添加json变量。阅读[文档](https://mustache.github.io/mustache.5.html)
</Check>

### 工具

[工具](/langsmith/use-tools)是LLM可用于与外部世界交互的接口。工具由名称、描述和用于调用该工具的参数的JSON模式组成。

### 结构化输出

结构化输出是大多数最先进LLM的一项功能，其中它们不产生原始文本作为输出，而是遵循指定的模式。这可能使用也可能不使用底层的[工具](#tools)。

<Check>
  结构化输出类似于工具，但在几个关键方面有所不同。使用工具时，LLM选择调用哪个工具（或可能选择不调用任何工具）；使用结构化输出时，LLM**总是**以这种格式响应。使用工具时，LLM可能选择**多个**工具；使用结构化输出时，只生成一个响应。
</Check>

### 模型

你可以选择将模型配置与提示模板一起存储。这包括模型的名称和任何其他参数（温度等）。

## 提示版本控制

版本控制是迭代和协作处理提示的关键组成部分。

### 提交

每次保存对提示的更新都会创建一个具有唯一提交哈希的新提交。这允许你：

* 查看提示的完整更改历史记录。
* 查看早期版本。
* 如有需要，恢复到先前的状态。
* 在代码中使用提交哈希引用特定版本（例如，`client.pull_prompt("prompt_name:commit_hash")`）。

在UI中，你可以通过切换[提示详情页面](/langsmith/manage-prompts#prompt-detail-page)右上角的**差异**来比较提交与其先前版本。

### 标签

提交标签是指向提示历史记录中特定提交的人类可读标签。与提交哈希不同，标签可以移动以指向不同的提交，允许你更新代码引用的版本而无需更改代码本身。

提交标签的用例可以包括：

* **环境**：`staging`和`production`标签保留给[环境](/langsmith/manage-prompts#environments)功能，该功能允许你在命名的部署目标之间提升提交，并在不更改代码的情况下切换版本。
* **版本控制**：标记提示的稳定版本，例如`v1`、`v2`，这允许你在代码中引用特定版本并随时间跟踪更改。
* **协作**：标记准备审查的版本，这使你可以与协作者共享特定版本并获取反馈。

<Note>
  **不要与资源标签混淆**：提交标签引用特定的提示版本。[资源标签](/langsmith/set-up-resource-tags)是用于组织工作区资源的键值对。
</Note>

有关创建和管理提交标签的详细信息，请参阅[管理提示](/langsmith/manage-prompts#commit-tags)。

## 工作台

工作台提供了一个用于迭代和测试提示的界面。你可以从侧边栏或直接从已保存的提示访问工作台。

在工作台中，你可以：

* 更改正在使用的模型
* 更改正在使用的提示模板
* 更改输出模式
* 更改可用的工具
* 输入要通过提示模板运行的输入变量
* 通过模型运行提示
* 观察输出

<Callout type="info" icon="feather">
  在工作台中使用 **[Polly](/langsmith/polly)** 来优化提示、生成工具并在AI辅助下创建输出模式。
</Callout>

## 测试多个提示

你可以将多个提示添加到工作台中，以比较输出并评估性能：

<img src="https://mintcdn.com/other-405835d4/6Toz5fHjgEZXpscE/langsmith/images/add-prompt-to-playground.gif?s=e3fc2e443a952c5347642ca8a23ce14a" alt="将提示添加到工作台" width="1000" height="539" data-path="langsmith/images/add-prompt-to-playground.gif" />

## 在数据集上测试

要在数据集上测试，请从右上角选择数据集，然后单击“开始”。你可以配置结果是否流式传输以及测试的重复次数。

<img src="https://mintcdn.com/other-405835d4/ozzEsp14Hd9jH9J-/langsmith/images/test-over-dataset-in-playground.gif?s=3a800ccd4bb59e8077352df5cf27bc5d" alt="在工作台的数据集上测试" width="1000" height="539" data-path="langsmith/images/test-over-dataset-in-playground.gif" />

单击“查看实验”按钮以查看详细的测试结果。

***

<div className="source-links">
  <Callout icon="terminal-2">
    [连接这些文档](/use-these-docs)到Claude、VSCode等，通过MCP获取实时答案。
  </Callout>

  <Callout icon="edit">
    [在GitHub上编辑此页面](https://github.com/langchain-ai/docs/edit/main/src/langsmith/prompt-engineering-concepts.mdx)或[提交问题](https://github.com/langchain-ai/docs/issues/new/choose)。
  </Callout>
</div>
