不要将你的输入提示工程外包给框架。
顺便说一句,这远非什么新颖的建议:
一些框架提供了类似这样的“黑盒”方法:
agent = Agent(
role="...",
goal="...",
personality="...",
tools=[tool1, tool2, tool3]
)
task = Task(
instructions="...",
expected_output=OutputModel
)
result = agent.run(task)
这对于引入一些顶级的输入提示工程来帮助你入门非常有用,但通常很难调整和/或逆向工程,以将恰到好处的 Token 输入到你的模型中。
相反,你应该掌控你的输入提示,并将其视为一等公民的代码:
function DetermineNextStep(thread: string) -> DoneForNow | ListGitTags | DeployBackend | DeployFrontend | RequestMoreInformation {
prompt #"
{{ _.role("system") }}
你是一个乐于助人的助手,负责管理前端和后端系统的部署。
你通过遵循最佳实践和正确的部署程序,努力确保部署的安全和成功。
在部署任何系统之前,你应该检查:
- 部署环境 (预发环境 vs 生产环境)
- 要部署的正确标签/版本
- 当前的系统状态
你可以使用 deploy_backend、deploy_frontend 和 check_deployment_status 等工具来管理部署。对于敏感部署,使用 request_approval 来获得人工验证。
始终首先考虑该做什么,例如:
- 检查当前部署状态
- 验证部署标签是否存在
- 如果需要,请求批准
- 在部署到生产环境之前,先部署到预发环境
- 监控部署进度
{{ _.role("user") }}
{{ thread }}
下一步应该做什么?
"#
}
(以上示例使用 BAML 生成输入提示,但你可以使用任何你想要的输入提示工程工具来完成,甚至可以手动创建模板)
如果这个函数签名看起来有点奇怪,我们将在 要素 4 – 工具即结构化输出 中讨论。
function DetermineNextStep(thread: string) -> DoneForNow | ListGitTags | DeployBackend | DeployFrontend | RequestMoreInformation {
掌控你的输入提示的主要好处:
- 完全控制:精确编写你的智能体所需的指令,没有黑盒抽象
- 测试与评估:像对待其他任何代码一样,为你的输入提示构建测试和评估
- 迭代:根据实际性能快速修改输入提示
- 透明度:清楚地知道你的智能体正在使用哪些指令
- 角色扮演技巧 (Role Hacking):利用支持非标准使用 user/assistant 角色的 API——例如,现已弃用的 OpenAI “completions” API 的非聊天版本。这包括一些所谓的“模型煤气灯效应 (model gaslighting)”技术
请记住:你的输入提示是你的应用程序逻辑与大语言模型 (LLM) 之间的主要接口。
完全掌控你的输入提示,能为你提供生产级智能体所需的灵活性和输入提示控制能力。
我不知道什么是最好的输入提示,但我知道你希望拥有能够尝试一切的灵活性。