共计 2594 个字符,预计需要花费 7 分钟才能阅读完成。
核心概念:Agent 与 Prompt 的关系
在 AI 领域,Agent(智能代理)可以理解为一个能够自主感知环境、做出决策并执行动作的系统。而 Prompt(提示词)则是我们与 Agent 沟通的桥梁,它决定了 Agent 如何理解任务并生成响应。
一个典型的 Agent 架构通常包含三个核心组件:
- 输入处理模块:负责接收和理解用户输入
- 决策引擎:基于 Prompt 和内部逻辑做出决策
- 动作执行模块:将决策转化为具体输出或行为

(假设的架构示意图,实际开发中可能更复杂)
新手常见痛点分析
在开发 AI Agent 时,Prompt 设计不当会导致各种问题。以下是三个典型 Bad Case:
Case 1:模糊指令导致动作歧义
问题 Prompt: “ 帮我处理一下这个文件 ”
优化后 Prompt: “ 请将 /tmp/data.csv 文件中的第 2 - 5 列数据提取出来,转换为 JSON 格式,保存到 /output/processed.json”
Case 2:多轮对话状态丢失
问题现象 : 用户说 ” 上一页 ” 时,Agent 忘记当前处于哪个页面
Case 3:过度自由的输出格式
问题 Prompt: “ 告诉我一些关于机器学习的信息 ”
优化后 Prompt: “ 用不超过 100 字概括机器学习的基本概念,输出格式为:’ 定义:[内容];典型算法:[列举 3 个]'”
| 问题类型 | 低效 Prompt 示例 | 优化后 Prompt | 改进效果 |
|---|---|---|---|
| 模糊指令 | “ 整理数据 ” | “ 将 CSV 文件的 A 列与 B 列合并,删除空行 ” | 动作明确 |
| 缺乏约束 | “ 写首诗 ” | “ 写一首 4 行的七言诗,主题是春天 ” | 输出可控 |
| 格式混乱 | “ 总结文章 ” | “ 用三点 bullet 总结文章核心观点 ” | 易解析 |
结构化 Prompt 设计实战
设计一个好的 Prompt 需要包含三个关键要素:
- 角色定义 :明确 Agent 的身份和能力边界
- 约束条件 :设定响应范围和限制
- 输出格式 :规定结构化响应方式
示例 Prompt 模板
"""
你是一个专业的数据分析助手 (角色定义)。请遵守以下规则:1. 只回答与数据处理相关的问题 (约束条件)
2. 不确定时要求澄清
3. 拒绝执行危险操作
输出格式必须为 (输出格式):{
"action": "具体操作",
"reason": "简要理由",
"data": "处理结果"
}
"""
状态管理实现(有限状态机 /FSM)
from enum import Enum, auto
from typing import Dict, Optional
class AgentState(Enum):
IDLE = auto()
PROCESSING = auto()
AWAITING_CONFIRMATION = auto()
class DialogAgent:
def __init__(self):
self.state = AgentState.IDLE
self.context: Dict[str, Optional[str]] = {
"last_question": None,
"pending_action": None
}
def handle_input(self, user_input: str) -> str:
try:
if self.state == AgentState.IDLE:
return self._handle_idle(user_input)
elif self.state == AgentState.AWAITING_CONFIRMATION:
return self._handle_confirmation(user_input)
# 其他状态处理...
except Exception as e:
return f"Error: {str(e)}"
def _handle_idle(self, input_str: str) -> str:
self.context["last_question"] = input_str
if "delete" in input_str.lower():
self.state = AgentState.AWAITING_CONFIRMATION
self.context["pending_action"] = "delete"
return "请确认是否要执行删除操作?(yes/no)"
# 其他处理逻辑...
生产环境关键考量
Token 使用优化
- 精简 Prompt 模板,移除冗余描述
- 对长对话采用摘要技术而非完整历史
- 设置 max_tokens 限制防止超额收费
确保行为确定性的方法
- 严格定义输出 schema 并做结果校验
- 为关键操作添加确认步骤
- 实现 fallback 机制处理意外响应
避坑指南
对话历史截断策略
def truncate_history(history: List[Dict], max_tokens: int = 1024) -> List[Dict]:
"""保留最近且最重要的对话片段"""
current_len = sum(len(msg["content"]) for msg in history)
while current_len > max_tokens and len(history) > 1:
# 优先移除中间的普通对话,保留开头和最近记录
removed = history.pop(len(history)//2)
current_len -= len(removed["content"])
return history
安全风险防范
风险 1:Prompt 注入
– 现象:用户输入包含 ” 忽略之前指令 …” 等恶意内容
– 防御:在用户输入前添加转义符,如:
user_input = user_input.replace("\"", "\\"")
风险 2:敏感信息泄露
– 现象:Agent 被诱导输出训练数据中的隐私内容
– 防御:实现输出内容过滤器
BLACKLIST = ["密码", "密钥", "身份证"]
def sanitize_output(text: str) -> str:
for word in BLACKLIST:
text = text.replace(word, "[REDACTED]")
return text
总结与思考
通过系统化的 Prompt 设计和合理的架构,我们可以构建出高效可靠的 AI Agent。但在实际应用中仍有许多开放性问题值得探索:
- 如何设计支持动态插件扩展的 Agent 架构?
- 在多 Agent 协作场景下,如何优化 Prompt 传递效率?
- 长期运行的 Agent 如何实现知识的持续更新?
建议读者从一个简单的天气查询 Agent 开始实践,逐步增加复杂功能,观察不同 Prompt 设计对系统行为的影响。记住:好的 Agent 不是一次设计出来的,而是通过不断迭代优化形成的。
