AI Agent 的 4 个工程关键词:Prompt、Context、Loop、Harness 到底是什么?
AI Agent 的 4 个工程关键词:Prompt、Context、Loop、Harness 到底是什么?
在 AI 工程化浪潮中,大语言模型(LLM)已成为构建智能系统的核心组件。然而,真正让模型从“对话玩具”进化为“自主 Agent”的,是背后四个工程关键词:Prompt、Context、Loop 和 Harness。它们对应着 Agent 的指令生成、记忆管理、执行循环与系统封装。本文将从原理到实践,逐一剖析。—## 1. Prompt:Agent 的“思维骨架”Prompt 不仅是给模型的自然语言指令,更是 Agent 行为的元代码。在工程视角下,Prompt 需要包含:角色定义、任务描述、输出格式约束、边界条件。### 原理- 角色注入:通过系统 prompt 设定 Agent 的身份(如“你是一个数据分析助手”),激活模型在特定领域的知识分布。- 结构化输出:使用 JSON Schema 或指令模板,强制模型输出可解析的格式,以便后续逻辑处理。- 安全护栏:在 prompt 中嵌入“不要执行危险操作”等约束,减少幻觉风险。### 可运行代码示例:结构化 Prompt 工程pythonimport jsonfrom openai import OpenAIclient = OpenAI(api_key="your-api-key")def build_agent_prompt(user_query: str) -> str: """构建结构化 Agent Prompt""" system_prompt = """ 你是一个任务分解 Agent。请将用户请求拆解为一系列原子步骤。 输出格式必须为 JSON 列表,每个元素包含: - step_id: 整数 - action: 字符串(如 "search", "compute", "summarize") - params: 字典(参数) 示例:[{"step_id": 1, "action": "search", "params": {"query": "latest AI news"}}] """ user_prompt = f"用户需求:{user_query}\n请输出 JSON 格式的任务列表。" return system_prompt + "\n" + user_prompt# 测试response = client.chat.completions.create( model="gpt-4", messages=[{"role": "user", "content": build_agent_prompt("帮我分析特斯拉2024年财报")}], temperature=0.2 # 低温度提高格式稳定性)parsed = json.loads(response.choices[0].message.content)print(parsed)# 输出:[{"step_id": 1, "action": "search", "params": {"query": "Tesla 2024 financial report"}}, ...]关键点:通过 prompt 将模型输出限制为机器可解析的结构,这是 Agent 与外部工具交互的基础。—## 2. Context:Agent 的“工作记忆”Context 是 Agent 在单次交互中能感知的所有信息,包括对话历史、环境状态、工具返回结果。工程上,Context 管理面临两大挑战:Token 窗口限制和信息衰减。### 原理- 滑动窗口:只保留最近 N 轮对话,丢弃早期内容。- 向量化记忆:将历史记录嵌入向量数据库,通过语义检索召回相关片段。- 上下文压缩:使用摘要或关键信息提取,减少 token 占用。### 可运行代码示例:上下文压缩与检索pythonimport openaiimport numpy as npclass ContextManager: def __init__(self, max_history=5): self.history = [] self.max_history = max_history def add_interaction(self, user_input: str, assistant_response: str): """添加对话并维护滑动窗口""" self.history.append({"user": user_input, "assistant": assistant_response}) if len(self.history) > self.max_history: # 压缩最早记录为摘要 summary = self._summarize(self.history[0]) self.history = [{"summary": summary}] + self.history[1:] def _summarize(self, entry: dict) -> str: """使用 LLM 生成摘要""" text = f"用户说:{entry['user']}\n助手回答:{entry['assistant']}" response = openai.chat.completions.create( model="gpt-3.5-turbo", messages=[{"role": "user", "content": f"用一句话总结:{text}"}] ) return response.choices[0].message.content def get_context(self) -> str: """获取当前上下文文本""" return "\n".join([ f"历史{i+1}: {entry.get('summary', entry['user'])}" for i, entry in enumerate(self.history) ])# 使用cm = ContextManager(max_history=3)cm.add_interaction("今天天气如何?", "晴天")cm.add_interaction("明天呢?", "多云")cm.add_interaction("帮我查巴黎天气", "15°C")print(cm.get_context())# 输出:历史1: 用户询问天气,助手回答晴天# 历史2: 用户问明天天气,助手答多云# 历史3: 用户查巴黎天气,助手答15°C工程价值:Context 管理决定了 Agent 能否在长对话中保持连贯性。压缩策略比简单截断更有效,但需权衡计算成本。—## 3. Loop:Agent 的“行动-反馈循环”Agent 的核心不是单次推理,而是感知-规划-行动-观察的迭代循环。Loop 实现了从“一次响应”到“持续目标达成”的跃迁。### 原理- 执行循环:Agent 请求 LLM 生成下一个动作 → 执行工具调用 → 将结果反馈给 LLM → 继续推理。- 终止条件:当 LLM 输出“task_complete”信号或达到最大迭代次数时停止。- 错误处理:在循环中捕获工具异常,重新规划路径。### 可运行代码示例:简单的 ReAct 循环实现pythonimport jsonimport requestsclass SimpleAgent: def __init__(self, max_loops=5): self.max_loops = max_loops def run(self, task: str): prompt = f"""你的任务是:{task} 可用工具:search(query) - 搜索网络信息 输出格式:要么输出 {{"action": "search", "params": {{"query": "..."}}}} 要么输出 {{"action": "final", "result": "..."}}""" for i in range(self.max_loops): # 步骤1:LLM 生成动作 response = openai.chat.completions.create( model="gpt-4", messages=[{"role": "user", "content": prompt}] ) decision = json.loads(response.choices[0].message.content) # 步骤2:执行动作 if decision["action"] == "search": result = self._search(decision["params"]["query"]) prompt += f"\n搜索结果:{result[:200]}...\n请继续。" elif decision["action"] == "final": return decision["result"] return "达到最大循环次数,未完成" def _search(self, query: str): # 模拟搜索 return f"关于'{query}'的模拟搜索结果"# 测试agent = SimpleAgent(max_loops=3)print(agent.run("告诉我2024年诺贝尔物理学奖得主"))设计要点:每次循环都更新 prompt,将工具结果作为新的上下文输入模型。这形成了“推理→行动→观察→再推理”的闭环。—## 4. Harness:Agent 的“运行容器”Harness 是 Agent 系统的工程基础设施,负责资源管理、并发控制、安全沙箱、日志追踪。没有 Harness,Agent 只是实验室里的玩具。### 原理- 沙箱执行:工具调用在隔离环境运行(如 Docker 容器),防止恶意代码。- 速率限制:控制 LLM API 调用频率,避免超预算。- 状态持久化:将 Agent 的上下文保存到数据库,支持中断恢复。- 监控告警:记录每次循环的耗时、token 消耗、错误类型。### 抽象架构示例(伪代码)pythonclass AgentHarness: def __init__(self, agent, storage, rate_limiter): self.agent = agent self.storage = storage # 持久化存储 self.rate_limiter = rate_limiter # 速率限制器 async def execute(self, task_id: str, initial_prompt: str): # 1. 恢复状态(如果任务中断过) state = await self.storage.load(task_id) or {} # 2. 执行循环(受速率限制) while not state.get("completed"): await self.rate_limiter.wait() # 控制 API 调用频率 action = await self.agent.step(state) # 3. 记录日志 self._log(f"Task {task_id}: {action}") # 4. 保存中间状态 await self.storage.save(task_id, state) return state["result"]工程意义:Harness 将 Agent 从“单次执行脚本”升级为“可运维的生产系统”。它解决了可靠性、扩展性和安全性问题。—## 总结| 关键词 | 核心作用 | 工程挑战 ||--------|----------|----------|| Prompt | 定义 Agent 行为边界与输出结构 | 格式稳定性、安全约束 || Context | 管理短期与长期记忆 | Token 窗口、信息压缩 || Loop | 实现目标驱动的迭代执行 | 错误恢复、终止条件 || Harness | 提供运行时的基础设施 | 资源隔离、持久化、监控 |这四个概念并非孤立存在:Prompt 决定了 Loop 中每一步的推理质量;Context 在 Loop 中持续更新;Harness 则为整个系统提供稳定运行的环境。理解它们,你就能从“调用 API”的初级阶段,跃迁到设计自主、可靠、可扩展的 AI Agent 系统。未来,随着多模态和长上下文模型的发展,这些工程关键词的实现细节会变化,但核心思想将长期有效。
更多推荐
所有评论(0)