# Prompt 实验与工作流

七篇正文围绕同一个工单案例，依次讲生成与上下文、示例与分解、提示写作、输出校验、注入边界、评测优化和源码导读。这里集中提供代码入口及工程补充。

本次七篇扩写没有运行代码、安装依赖、调用模型、执行测试或构建。标准库例子的输入与预测由作者构造；真实接口代码提供接入入口，但没有本轮在线效果记录。不要把历史版本通过的检查套用到当前修改。

## 阅读与示例对应

| 正文 | 主要内容 | 配套文件 |
| --- | --- | --- |
| [01 原理与上下文](/posts/agent_runtime/2.prompt/01-prompt-and-context/) | 条件概率、角色、历史和资料选择 | 原理与预算手算 |
| [02 示例与任务分解](/posts/agent_runtime/2.prompt/02-examples-and-reasoning/) | Few-shot、多金额、工具观察和步骤成本 | [evidence_steps.py](/examples/prompt-engineering/python/evidence_steps.py) |
| [03 如何写好 Prompt](/posts/agent_runtime/2.prompt/03-writing-prompts/) | 从需求到完整消息 | [prompt_demo.py](/examples/prompt-engineering/python/prompt_demo.py) |
| [04 结构化输出](/posts/agent_runtime/2.prompt/04-structured-output/) | 解码筛选、Schema、结构与事实、修复 | [constrained_decoding_demo.py](/examples/prompt-engineering/python/constrained_decoding_demo.py)、[schema_walkthrough.py](/examples/prompt-engineering/python/schema_walkthrough.py)、[validation_demo.py](/examples/prompt-engineering/python/validation_demo.py)、[repair_loop.py](/examples/prompt-engineering/python/repair_loop.py) |
| [05 注入边界](/posts/agent_runtime/2.prompt/05-injection-and-boundaries/) | 数据来源与服务端授权 | [tool_boundary.py](/examples/prompt-engineering/python/tool_boundary.py) |
| [06 评测与优化](/posts/agent_runtime/2.prompt/06-prompt-evaluation/) | 配对比较、指标和候选筛选 | [evaluation_demo.py](/examples/prompt-engineering/python/evaluation_demo.py)、[metrics_walkthrough.py](/examples/prompt-engineering/python/metrics_walkthrough.py)、[candidate_search.py](/examples/prompt-engineering/python/candidate_search.py) |
| [07 开源源码导读](/posts/agent_runtime/2.prompt/07-learning-from-dspy/) | DSPy 2.6.27 的声明、装配、解析和优化 | [dspy_adapter_walkthrough.py](/examples/prompt-engineering/python/dspy_adapter_walkthrough.py) |

## 一份工单契约，几种不同层次的演示

完整工单有 category（billing/security/general/unknown）、urgency（low/medium/high）、order_id、requested_amount、summary。五字段必填；未知订单和金额为 null。金额仅表示当前明确请求的人民币元金额，不是可退金额。security 对应 high，billing 对应 medium，其余 low；这条跨字段规则属于业务检查，不由两个枚举自动保证。

主线假设应用已经确认输入可按单个当前订单处理。多订单、币种不明或无法唯一确定处理对象时，需要外层澄清或拆单流程，不能让模型随便选一个。unknown 只表示类别信息不足。

第六、七篇为了讲清评价和框架，只展示 category 子任务；工具边界例子使用独立的工具提议对象。这些都不替代完整工单契约。schema_walkthrough.py 演示声明与导出，validation_demo.py 演示手工检查顺序，二者的局部检查范围不完全相同；接入应用时选定一个契约来源，并补来源、跨字段、事实和权限检查。

## 运行教学例子

以下命令以整个 elaine 仓库为当前目录，Python 建议使用 3.11 或更高版本。repair_loop.py 与 validation_demo.py 要放在同一目录；ticket_triage.py 现在复用 prompt_demo.py 中的规则，单独下载时也要一起下载。

```bash
# 标准库例子：打印请求、检查证据、观察解码筛选和有限修复。
python3 elaine-blog/public/examples/prompt-engineering/python/prompt_demo.py
python3 elaine-blog/public/examples/prompt-engineering/python/evidence_steps.py
python3 elaine-blog/public/examples/prompt-engineering/python/constrained_decoding_demo.py
python3 elaine-blog/public/examples/prompt-engineering/python/repair_loop.py
# 这些预测由作者预置，输出只是评价算法的演示。
python3 elaine-blog/public/examples/prompt-engineering/python/metrics_walkthrough.py
python3 elaine-blog/public/examples/prompt-engineering/python/candidate_search.py
# 工具示例只有内存只读查询，不执行真实退款。
python3 elaine-blog/public/examples/prompt-engineering/python/tool_boundary.py
```

约束解码例子使用微型字符词表，不实现通用 Schema 编译器。证据例子的角色由作者标注，不实现自然语言提取。候选比较例子使用预置预测，不是 DSPy 优化器实现。这些限制对应各程序真正解释的机制。

## 单独观察固定版本的 DSPy

第七篇固定阅读 2.6.27，使用独立环境，避免与原工程的 DSPy 3.3.1 混装。依赖文件为 [requirements-source-study.txt](/examples/prompt-engineering/python/requirements-source-study.txt)。标签固定了直接依赖，传递依赖未形成完整锁文件，本轮未验证安装兼容性。

```bash
# 此环境专供源码导读；不覆盖原工程环境。
python3 -m venv /tmp/elaine-dspy-source-env
/tmp/elaine-dspy-source-env/bin/python -m pip install -r elaine-blog/public/examples/prompt-engineering/python/requirements-source-study.txt
# 只调用 format 和 parse，不配置 LM，也不会调用付费模型。
/tmp/elaine-dspy-source-env/bin/python elaine-blog/public/examples/prompt-engineering/python/dspy_adapter_walkthrough.py
```

源码固定入口：[Signature](https://github.com/stanfordnlp/dspy/blob/2.6.27/dspy/signatures/signature.py)、[Predict](https://github.com/stanfordnlp/dspy/blob/2.6.27/dspy/predict/predict.py)、[Adapter](https://github.com/stanfordnlp/dspy/blob/2.6.27/dspy/adapters/base.py)、[ChatAdapter](https://github.com/stanfordnlp/dspy/blob/2.6.27/dspy/adapters/chat_adapter.py)、[BootstrapFewShot](https://github.com/stanfordnlp/dspy/blob/2.6.27/dspy/teleprompt/bootstrap.py)。

## 使用现有 Python 接入工程

框架工程使用 Python 3.11 或更高版本；下面的 python3 应指向满足这一条件的解释器，历史版本曾在 Python 3.13 上运行；本轮没有重新安装或执行。

[ticket_triage.py](/examples/prompt-engineering/python/ticket_triage.py)用 Pydantic 定义对象，以 LangChain 装配消息并提供在线入口。[requirements.txt](/examples/prompt-engineering/python/requirements.txt)保存原工程依赖；安装与模型效果是不同验证项目，不要从依赖可安装推断在线端点支持全部结构化功能。

```bash
# 在仓库根目录创建独立环境，避免修改其他项目的 Python 依赖。
python3 -m venv /tmp/elaine-prompt-env
# 按原工程声明安装依赖；安装失败时保留错误，不随意改版本后声称原版通过。
/tmp/elaine-prompt-env/bin/python -m pip install -r elaine-blog/public/examples/prompt-engineering/python/requirements.txt
# 默认只执行离线演示。在线入口需要配置源文件说明的环境变量并添加 --live。
/tmp/elaine-prompt-env/bin/python elaine-blog/public/examples/prompt-engineering/python/ticket_triage.py
```

结构化输出策略可能由模型能力决定，接入前确认服务支持的 Schema 子集和失败返回。[LangChain 结构化输出文档](https://docs.langchain.com/oss/python/langchain/structured-output)说明相关机制。即使输出通过模型端结构约束，业务侧仍需验证来源、订单归属与金额。

## 从建议进入退款工作流

[refund_workflow.py](/examples/prompt-engineering/python/refund_workflow.py)保留现有 LangGraph 暂停、审批和恢复演示。检查点保存图状态，恢复需要关联同一个任务；进程内保存器不等于重启后仍能恢复。持久化服务要另外处理任务身份、存储、并发恢复和审批时的订单再核验。参考 [LangGraph 持久化说明](https://docs.langchain.com/oss/python/langgraph/persistence)。

人工审批点之前可能因为恢复而重新执行部分逻辑，不应在可重入位置无保护地扣款或发送通知。真正写入需要独立幂等键。模型建议、人工确认和后台成功结果应分别记录，不能只保留最后一条自然语言总结。

## 自动优化前先确认评分有意义

[dspy_signature_demo.py](/examples/prompt-engineering/python/dspy_signature_demo.py)是现有 DSPy 入口。先让人工检查评分是否奖励正确类别与字段，再使用开发集搜索配置，最后在保留测试集评估。自动搜索消耗调用预算，不能把反复参与选择的数据仍称为独立测试。参考 [DSPy 优化说明](https://dspy.ai/getting-started/gepa-optimization/)。

固定样本、Prompt、Schema、模型参数和原始响应共同构成一次实验。回滚要恢复兼容的一组配置；如果只恢复文字、保留新版字段，下游可能继续失败。

## Java 发票审核作为配套实践

现有 [Java README](/examples/prompt-engineering/java/README.md)、[InvoiceAuditAgentDemo.java](/examples/prompt-engineering/java/src/main/java/dev/elaine/examples/InvoiceAuditAgentDemo.java)与 [PromptBoundaryDemo.java](/examples/prompt-engineering/java/src/main/java/dev/elaine/examples/PromptBoundaryDemo.java)保留独立工程与原依赖版本。它展示只读证据工具与审核指令分离，不是本系列工单分类器的另一份字段定义。

示例 workspace 中的 AGENTS.md 是给示例 Agent 读取的数据，不是维护博客的操作指令。路径检查要基于真实路径防止符号链接绕过；只读不等于所有文件都可读。工具提供哪些资料由后端确定，模型不能自行扩大目录范围。

本轮未运行示例、测试或构建。历史运行结果与当前未执行范围分开列在[统一验证记录](/examples/SERIES-VALIDATION.md)。
