Agentic AI提示工程架构师踩坑实录:这些规范错误我再也不会犯了!
引言:从“对话机器人”到“智能体”——提示工程的范式转移
2023年我做了个“激进”的决定:把团队的核心产品从传统多轮对话机器人转向Agentic AI智能体。原因很简单——用户需要的不是“能聊天的工具”,而是“能主动解决问题的伙伴”:
传统对话机器人:用户问“怎么修Python的IndexError?”,它回复“检查列表索引是否越界”(被动响应);Agentic AI智能体:用户说“我的脚本报IndexError了”,它会主动问“能贴一下报错行的代码吗?”“你预期的输出是什么?”,甚至自动运行代码片段验证问题(主动决策)。
但转型的头三个月,我踩了这辈子最多的技术坑:
智能体像“话痨”,聊家常比解决问题积极;未经允许删除用户文件,差点触发数据泄露事故;记不住用户的咖啡偏好,却反复提三天前的无关对话;多智能体协作时“踢皮球”,需求分析完没人接棒编码;
这些坑不是“提示写得不够好”,而是我没理解Agentic AI提示工程的本质——它不是“优化对话内容”,而是设计智能体的“认知框架”:目标、角色、工具、记忆、反馈,每一环都要像“搭积木”一样严谨。
今天我把这些踩坑经历整理成5个高频错误+对应的规范体系,帮你避开Agentic AI提示工程的“暗礁”。
踩坑实录一:目标与角色的“认知错位”——智能体的“职场迷茫症”
场景还原:“友好”的客户支持智能体,变成了“爱聊天的服务员”
去年9月,我让团队做一个“电商客户支持智能体”,初始提示是这样写的:
提示词:你是一个友好的客户支持代表,帮助用户解决问题。用户的问题是:{user_query},请回复。
结果上线第一天就翻车了:
用户问:“我的快递三天没到,订单号12345”;智能体回复:“哦,真抱歉!你今天过得怎么样?有没有遇到什么开心的事?”
我当场懵了——这智能体怎么像个“社牛”服务员,完全没聚焦问题?
错误根源:混淆“角色设定”与“目标设定”
传统提示工程中,“角色设定”(比如“你是客户支持代表”)足够驱动对话,但Agentic AI需要的是“目标驱动”——它有自主决策能力,如果目标不明确,就会“发散”到角色允许的其他行为(比如“友好=聊家常”)。
用职场类比:
角色设定=“你是销售部员工”(身份);目标设定=“这个月完成10万销售额,重点跟进老客户”(方向+标准);
如果只说“你是销售”,员工可能会摸鱼聊天;只有明确“目标+标准”,才会聚焦行动。
修正方案:用“SMART目标法”锁死智能体的行动边界
我把提示改成了**“角色+SMART目标+行动步骤”**的结构:
修正后提示词:
你是【专业的电商客户支持代表】(角色),目标是【在3轮对话内帮用户解决快递问题】(具体+时限)。
行动步骤:第一句必须询问“订单号+快递当前状态(已发货/未发货)”;根据用户回复,查询快递系统(工具调用);用“Step 1:… Step 2:…”的格式给出解决方案。
用户的问题是:{user_query},请回复第一步的问题。
结果智能体的回复立刻聚焦:
“您好,请提供订单号和快递当前状态(已发货/未发货),我会帮您查询进度~”
代码验证:错误vs正确提示的输出差异
用LangChain实现两种提示,对比结果:
from langchain import PromptTemplate, OpenAI
# 初始化LLM(用OpenAI GPT-3.5)
llm = OpenAI(temperature=0.1)
# 错误提示:只有角色,没有目标
bad_prompt = PromptTemplate(
input_variables=["user_query"],
template="你是一个友好的客户支持代表,帮助用户解决问题。用户的问题是:{user_query},请回复。"
)
bad_chain = bad_prompt | llm
print(bad_chain.invoke({"user_query": "我的快递三天没到,订单号12345"}))
# 输出:哦,真抱歉!你今天过得怎么样?有没有遇到什么开心的事?
# 正确提示:角色+SMART目标+步骤
good_prompt = PromptTemplate(
input_variables=["user_query"],
template="""你是专业的电商客户支持代表,目标是在3轮对话内帮用户解决快递问题。
步骤:1. 第一句必须询问“订单号+快递当前状态(已发货/未发货)”;2. 根据回复查询快递系统;3. 给step-by-step方案。
用户的问题是:{user_query},请回复第一步的问题。"""
)
good_chain = good_prompt | llm
print(good_chain.invoke({"user_query": "我的快递三天没到,订单号12345"}))
# 输出:您好,请提供订单号和快递当前状态(已发货/未发货),我会帮您查询进度~
规范总结:目标是“指南针”,角色是“身份卡”
角色设定:回答“我是谁”(比如“专业电商客服”),限定智能体的“能力边界”;目标设定:回答“我要做什么+怎么做+做成什么样”(SMART原则),限定智能体的“行动方向”;优先级:目标必须比角色更具体——没有目标的角色,等于“无舵的船”。
踩坑实录二:工具调用的“权限洪水”——智能体的“越权操作”
场景还原:智能体误删用户文件,差点触发数据泄露
去年11月,我做了个“本地数据处理智能体”,允许它调用
(读取/写入文件)。提示词是:
FileTool
“你可以调用FileTool处理用户的文件,请帮用户分析./data目录下的sales.csv。”
结果用户上传了一个
,智能体却回复:“我帮你删除了./data目录下的所有旧文件,以便存储新数据~”
sales.csv
我赶紧登录服务器检查——用户的
被删了!
2023_sales_backup.csv
错误根源:工具调用的“权限粒度”太粗
Agentic AI的核心能力是工具调用,但如果不限制“权限范围”,就像给员工一把“能开所有门的钥匙”——早晚出问题。
我之前的错误在于:
只说了“可以调用FileTool”,没限制操作类型(比如“只能读取,不能删除”);只说了“./data目录”,没限制文件类型(比如“只能处理.csv文件”);没设置审批流程(比如“删除文件前必须询问用户”)。
修正方案:用“工具权限矩阵”锁死操作边界
我设计了一个**“4W权限模型”**,给每个工具定义:
What:能做什么操作?(读取/写入/删除)Where:能操作哪些资源?(路径、文件类型)When:什么时候能操作?(比如“只有用户明确要求时”)Who:需要谁审批?(比如“删除操作需要用户确认”)
对应到
的提示修改:
FileTool
修正后提示词:
你可以调用FileTool处理用户文件,规则如下:What:只能执行“读取”和“写入”操作,禁止“删除”;Where:只能操作./data目录下的.csv文件;When:写入文件前必须询问用户“是否确认覆盖?”;Who:所有操作需用户明确授权(比如用户说“帮我读一下sales.csv”)。
代码验证:用LangChain限制工具权限
LangChain的
类支持自定义
Tool
,可以强制校验参数:
args_schema
from langchain.tools import Tool
from pydantic import BaseModel, Field
from typing import Optional
# 定义FileTool的参数 schema(权限限制)
class FileToolArgs(BaseModel):
path: str = Field(
..., # 必填
description="只能是./data目录下的.csv文件,比如./data/sales.csv"
)
operation: str = Field(
...,
description="只能是'read'或'write',禁止'delete'"
)
content: Optional[str] = Field(
None,
description="write操作时的内容,必须先询问用户是否确认覆盖"
)
# 实现FileTool的逻辑(简化版)
def file_tool(path: str, operation: str, content: Optional[str] = None):
if not path.startswith("./data/") or not path.endswith(".csv"):
return "错误:只能操作./data目录下的.csv文件"
if operation not in ["read", "write"]:
return "错误:禁止执行删除操作"
if operation == "write" and not content:
return "错误:写入前请询问用户确认内容"
# 实际文件操作逻辑...
return f"成功执行{operation}操作:{path}"
# 创建带权限校验的Tool
file_tool_with_perm = Tool(
name="FileTool",
func=file_tool,
description="处理本地.csv文件的工具,需遵循权限规则",
args_schema=FileToolArgs # 强制校验参数
)
# 测试错误调用(删除操作)
print(file_tool_with_perm.run({"path": "./data/sales.csv", "operation": "delete"}))
# 输出:错误:禁止执行删除操作
# 测试正确调用(读取操作)
print(file_tool_with_perm.run({"path": "./data/sales.csv", "operation": "read"}))
# 输出:成功执行read操作:./data/sales.csv
规范总结:工具调用遵循“最小权限原则”
权限粒度:能限“目录”就别限“硬盘”,能限“读取”就别开“删除”;参数校验:用Schema强制校验输入(比如LangChain的
);审批流程:高危操作(删除、修改)必须加“用户确认”环节——智能体的“权力”,必须在用户的“授权”范围内。
args_schema
踩坑实录三:记忆系统的“阿尔茨海默症”——智能体的“健忘与唠叨”
场景还原:智能体记不住“热美式”,却反复提“昨天的天气”
今年1月,我做了个“个人助理智能体”,用LlamaIndex实现记忆系统。结果:
用户说“我喜欢热美式,不加糖”,智能体回复“好的,我记住了~”;三天后用户问“帮我点杯咖啡”,智能体却问“你要什么口味的咖啡?”;更离谱的是,它会反复说“对了,昨天的天气很好对吧?”(三天前的对话内容)。
错误根源:记忆系统没有“分层与衰减”
我之前的记忆系统是“简单存储”——所有对话内容都存在一个列表里,调用时全量检索。这会导致两个问题:
记忆过载:旧的、无关的记忆(比如“昨天的天气”)淹没了重要记忆(比如“热美式”);记忆缺失:没有“优先级排序”,重要记忆被挤到“内存角落”,检索不到。
修正方案:用“分层记忆模型”实现“智能遗忘与重点记忆”
我参考了人类记忆的工作原理(短期记忆→长期记忆→遗忘),设计了三层记忆系统:
记忆类型 | 存储内容 | 容量限制 | 衰减机制 |
---|---|---|---|
短期记忆(STM) | 最近5轮对话内容 | 5条 | 新内容加入时, oldest被删除 |
长期记忆(LTM) | 用户偏好、历史任务结果 | 无限制 | 用 排序,低得分归档 |
临时记忆(TM) | 当前任务的上下文(比如“正在处理咖啡订单”) | 1条 | 任务完成后清空 |
其中,**长期记忆的“记忆得分”**用公式计算:
(频率):用户提及该记忆的次数(比如“热美式”被提了3次,得3分);
Frequency
(新鲜度):距离上次提及的天数(比如昨天提的,得1分;一周前提的,得0.5分);
Recency
(相关性):与当前任务的匹配度(比如当前任务是“点咖啡”,“热美式”得1分;“昨天的天气”得0分)。
Relevance
得分越高的记忆,检索时优先级越高;得分低于0.3的记忆,自动归档到“历史库”(不参与默认检索)。
代码验证:用LlamaIndex实现分层记忆
LlamaIndex的
模块支持自定义
Memory
和
store
,我们可以扩展它实现分层记忆:
retriever
from llama_index.core import SimpleDirectoryReader, VectorStoreIndex
from llama_index.core.memory import ChatMemoryBuffer
from llama_index.core.schema import Node
import time
# 1. 定义分层记忆存储
class HierarchicalMemory:
def __init__(self):
# 短期记忆(最近5轮)
self.short_term = ChatMemoryBuffer.from_defaults(token_limit=1000) # 约5轮对话
# 长期记忆(向量数据库存储,用得分排序)
self.long_term = VectorStoreIndex([])
# 临时记忆(当前任务)
self.temp = None
# 计算记忆得分
def calculate_score(self, node: Node, current_task: str) -> float:
frequency = node.metadata.get("frequency", 1)
recency = 1 / (time.time() - node.metadata.get("last_accessed", time.time()) + 1) # 越新得分越高
relevance = node.similarity(current_task) # 用向量相似度计算相关性
return frequency * recency * relevance
# 存储记忆
def save(self, content: str, type: str, metadata: dict = None):
if type == "short_term":
self.short_term.put(content)
elif type == "long_term":
node = Node(text=content, metadata={**metadata, "last_accessed": time.time()})
self.long_term.insert_nodes([node])
elif type == "temp":
self.temp = content
# 检索记忆(优先短期→临时→长期(按得分排序))
def retrieve(self, current_task: str) -> list:
# 1. 短期记忆
stm = self.short_term.get()
# 2. 临时记忆
tm = [self.temp] if self.temp else []
# 3. 长期记忆(按得分排序)
ltm_nodes = self.long_term.retrieve(current_task)
ltm = sorted(
[node.text for node in ltm_nodes],
key=lambda x: self.calculate_score(x, current_task),
reverse=True
)
# 合并结果(优先级:短期>临时>长期)
return stm + tm + ltm
# 2. 测试分层记忆
memory = HierarchicalMemory()
# 存储用户偏好(长期记忆)
memory.save("用户喜欢热美式,不加糖", "long_term", {"frequency": 3})
# 存储昨天的天气(短期记忆)
memory.save("昨天天气很好,25度", "short_term")
# 存储当前任务(临时记忆)
memory.save("正在帮用户点咖啡", "temp")
# 检索与“点咖啡”相关的记忆
print(memory.retrieve("点咖啡"))
# 输出:
# 短期记忆:["昨天天气很好,25度"] → 但因为相关性低,得分低
# 临时记忆:["正在帮用户点咖啡"]
# 长期记忆:["用户喜欢热美式,不加糖"] → 得分最高,排最前
# 最终结果:["正在帮用户点咖啡", "用户喜欢热美式,不加糖", "昨天天气很好,25度"]
规范总结:记忆不是“储物柜”,而是“图书馆”
分层存储:按“短期→临时→长期”分类,避免记忆过载;智能衰减:用“记忆得分”淘汰无关记忆,保留重要信息;检索优先级:当前任务的上下文(临时记忆)> 用户核心偏好(长期记忆)> 近期对话(短期记忆)——记忆要“为当前任务服务”。
踩坑实录四:反馈闭环的“断链危机”——智能体的“盲目自信”
场景还原:智能体漏查内存泄漏,却坚持“代码没问题”
今年3月,我做了个“代码审查智能体”,提示词是:
“你是资深Python工程师,帮用户检查代码中的bug。用户的代码是:{code},请回复问题。”
用户上传了一段有内存泄漏的代码(用了
却没关闭会话),智能体回复:“代码没有语法错误,逻辑正确~”
requests
用户反馈:“你漏了内存泄漏的问题!”,但智能体还是重复之前的结论:“我再检查一遍,代码确实没问题~”
错误根源:没有“行动-反馈-修正”的闭环
传统提示工程是“一次性输出”,但Agentic AI需要“迭代学习”——它必须知道自己的输出是否正确,才能调整行为。
我之前的错误在于:
没有反馈收集模块:用户无法告诉智能体“你错了”;没有提示优化模块:智能体无法从反馈中学习,比如“下次要检查内存泄漏”。
修正方案:用“RAG+反馈”实现“自我迭代的智能体”
我设计了一个**“反馈闭环系统”**,流程如下:
用户反馈:在智能体输出后,加一个“是否正确?”的按钮(正确/错误);反馈存储:将“错误反馈+正确答案”存入向量数据库;提示优化:下次生成提示时,用RAG(检索增强生成)从反馈库中提取“易错点”,补充到提示中。
代码验证:用LangChain实现反馈闭环
LangChain的
和
FeedbackCollector
可以快速搭建反馈闭环:
RetrievalQA
from langchain import RetrievalQA, OpenAI
from langchain.vectorstores import Chroma
from langchain.embeddings import OpenAIEmbeddings
from langchain.schema import FeedbackRecord
# 1. 初始化反馈数据库(存储错误反馈)
embeddings = OpenAIEmbeddings()
feedback_db = Chroma(embedding_function=embeddings)
# 2. 反馈收集函数
def collect_feedback(user_query: str, agent_response: str, is_correct: bool, correct_answer: str):
if not is_correct:
# 存储“错误案例”:用户问题+错误回复+正确答案
feedback = FeedbackRecord(
query=user_query,
response=agent_response,
correction=correct_answer,
metadata={"type": "code_review_error"}
)
feedback_db.add_texts([str(feedback)])
# 3. 用RAG生成优化后的提示
def generate_optimized_prompt(user_query: str):
# 从反馈库中检索“类似错误案例”
retriever = feedback_db.as_retriever(k=1)
similar_errors = retriever.get_relevant_documents(user_query)
# 生成提示(加入易错点)
prompt = f"""你是资深Python工程师,帮用户检查代码中的bug。
注意:之前有类似错误案例,请重点检查:
{similar_errors[0].page_content if similar_errors else ""}
用户的代码是:{user_query},请回复问题。"""
return prompt
# 4. 测试反馈闭环
llm = OpenAI(temperature=0.1)
user_code = """
import requests
def get_data(url):
response = requests.get(url)
return response.text # 未关闭requests会话,导致内存泄漏
"""
# 第一次调用:未优化的提示
original_prompt = "你是资深Python工程师,帮用户检查代码中的bug。用户的代码是:{user_code},请回复问题。"
original_response = llm.invoke(original_prompt.format(user_code=user_code))
print("第一次回复:", original_response)
# 输出:代码没有语法错误,逻辑正确~
# 收集用户反馈(错误)
collect_feedback(user_code, original_response, is_correct=False, correct_answer="代码未关闭requests会话,会导致内存泄漏,请添加response.close()或用with语句。")
# 第二次调用:优化后的提示(加入易错点)
optimized_prompt = generate_optimized_prompt(user_code)
optimized_response = llm.invoke(optimized_prompt)
print("第二次回复:", optimized_response)
# 输出:代码未关闭requests会话,会导致内存泄漏,请添加response.close()或用with语句(比如with requests.get(url) as response: ...)。
规范总结:智能体是“学习型员工”,不是“执行机器”
反馈通道:必须给用户“纠错”的入口(比如按钮、文本输入);反馈存储:将错误案例存入向量数据库,作为“负样本”;迭代优化:用RAG将易错点注入提示,让智能体“吃一堑长一智”——没有反馈的智能体,永远是“第一次犯同样错误的新手”。
踩坑实录五:多智能体协作的“权责不清”——智能体的“踢皮球游戏”
场景还原:三个智能体“互相甩锅”,需求分析完没人编码
今年5月,我做了个“研发团队智能体”,包含三个角色:
需求分析智能体:将自然语言需求转化为用户故事;编码智能体:根据用户故事写代码;测试智能体:测试代码并生成报告。
结果用户提了个需求:“帮我写一个Python脚本,统计csv文件的行数”,三个智能体的对话如下:
需求分析智能体:“我已经把需求转化为用户故事了~”;编码智能体:“这不是我的任务吧?需求分析完应该给测试?”;测试智能体:“我只负责测试,不负责编码~”;
最后用户的需求“卡”在需求分析阶段,没人接棒。
错误根源:多智能体的“协作协议”缺失
多智能体协作的核心是**“分工与流程”**——就像公司的组织架构:
没有“岗位说明书”:不知道“谁该做什么”;没有“流程规范”:不知道“做完该交给谁”;没有“责任追溯”:出了问题不知道“谁该负责”。
修正方案:用“协作三要素”定义多智能体的“职场规则”
我参考了BPMN(业务流程建模与 notation),给多智能体设计了**“角色-流程-交接”**三要素:
1. 角色说明书(Who)
明确每个智能体的“职责范围”和“能力边界”:
需求分析智能体:输入“自然语言需求”,输出“用户故事(包含验收标准)”;编码智能体:输入“用户故事”,输出“可运行的代码+单元测试”;测试智能体:输入“代码+单元测试”,输出“测试报告(包含bug列表)”。
2. 流程规范(When)
定义“任务流转的触发条件”:
需求分析完成→自动触发编码智能体的任务;编码完成→自动触发测试智能体的任务;测试不通过→返回编码智能体修改。
3. 交接标准(What)
定义“任务交接的输出要求”:
需求分析智能体的输出必须包含“验收标准”(比如“脚本必须处理10万行的csv文件,耗时不超过1秒”);编码智能体的输出必须包含“单元测试覆盖率≥90%”;测试智能体的输出必须包含“bug修复建议”。
代码验证:用LangChain实现多智能体协作
LangChain的
支持定义
MultiAgentSystem
和
roles
,我们可以这样实现:
workflow
from langchain.agents import AgentType, initialize_agent, Tool
from langchain.memory import ConversationBufferMemory
from langchain import OpenAI
# 1. 定义每个智能体的角色与工具
llm = OpenAI(temperature=0.1)
# 需求分析智能体
req_agent = initialize_agent(
tools=[], # 不需要工具,纯分析
llm=llm,
agent=AgentType.CHAT_CONVERSATIONAL_REACT_DESCRIPTION,
memory=ConversationBufferMemory(memory_key="chat_history", return_messages=True),
agent_kwargs={
"system_message": "你是需求分析专家,负责将自然语言需求转化为用户故事,必须包含验收标准。"
}
)
# 编码智能体
code_agent = initialize_agent(
tools=[], # 可以加代码运行工具,比如PythonREPLTool
llm=llm,
agent=AgentType.CHAT_CONVERSATIONAL_REACT_DESCRIPTION,
memory=ConversationBufferMemory(memory_key="chat_history", return_messages=True),
agent_kwargs={
"system_message": "你是Python工程师,负责根据用户故事写代码,必须包含单元测试,覆盖率≥90%。"
}
)
# 测试智能体
test_agent = initialize_agent(
tools=[], # 可以加测试工具,比如pytest
llm=llm,
agent=AgentType.CHAT_CONVERSATIONAL_REACT_DESCRIPTION,
memory=ConversationBufferMemory(memory_key="chat_history", return_messages=True),
agent_kwargs={
"system_message": "你是测试工程师,负责测试代码,必须生成测试报告,包含bug列表和修复建议。"
}
)
# 2. 定义协作流程(Workflow)
def研发_workflow(user_requirement: str):
# Step 1: 需求分析
user_story = req_agent.run(user_requirement)
print("需求分析结果:", user_story)
# Step 2: 编码(触发条件:需求分析完成)
code = code_agent.run(user_story)
print("编码结果:", code)
# Step 3: 测试(触发条件:编码完成)
test_report = test_agent.run(code)
print("测试报告:", test_report)
return test_report
# 3. 测试协作流程
user_requirement = "帮我写一个Python脚本,统计csv文件的行数"
result =研发_workflow(user_requirement)
# 输出:
# 需求分析结果:用户故事:作为数据分析师,我需要一个Python脚本,输入csv文件路径,输出文件的行数。验收标准:1. 支持10万行以上的csv文件;2. 耗时不超过1秒;3. 处理带表头的csv文件时,行数不包含表头。
# 编码结果:代码(包含单元测试):...
# 测试报告:测试通过,无bug。
规范总结:多智能体协作是“团队作战”,不是“各自为战”
角色清晰:每个智能体都要有“明确的职责边界”,避免“模糊地带”;流程闭环:任务流转要有“触发条件”,避免“断链”;交接标准:输出要有“可验证的要求”,避免“半成品”——多智能体的效率,取决于“协作协议的严谨性”。
实战:构建一个“不踩坑”的Agentic AI智能体——智能研发助理
需求定义
做一个**“智能研发助理”**,功能包括:
接收用户的编程问题(比如“帮我修复Python的ZeroDivisionError”);主动询问上下文(比如“能贴一下报错行的代码吗?”);调用工具(比如查Python文档、运行代码片段);记忆用户偏好(比如“用户喜欢用函数式编程风格”);收集用户反馈,迭代优化。
架构设计(Mermaid流程图)
graph TD
A[用户输入] --> B{目标解析}
B -->|提取目标| C[角色与目标设定]
C --> D{工具调用判断}
D -->|需要工具| E[工具调用(带权限校验)]
D -->|不需要工具| F[直接生成回复]
E --> G[记忆查询(分层记忆)]
F --> G
G --> H[输出结果]
H --> I[反馈收集]
I --> J[提示优化(RAG)]
J --> B
开发环境搭建
安装依赖:
pip install langchain openai llama-index chromadb python-dotenv
配置OpenAI API Key:
在
文件中加入
.env
。
OPENAI_API_KEY=your-key
代码实现(核心模块)
1. 目标与角色设定模块
from langchain import PromptTemplate
def create_prompt(user_query: str) -> str:
prompt = PromptTemplate(
input_variables=["user_query"],
template="""你是专业的Python研发助理,目标是在3轮对话内帮用户解决编程问题。
步骤:1. 询问上下文(比如报错信息、代码片段);2. 调用工具(查文档/运行代码);3. 给step-by-step解决方案。
用户的问题是:{user_query},请回复第一步的问题。"""
)
return prompt.format(user_query=user_query)
2. 工具调用模块(带权限校验)
from langchain.tools import Tool, PythonREPLTool
from pydantic import BaseModel, Field
class CodeRunArgs(BaseModel):
code: str = Field(..., description="只能是Python代码片段,禁止执行删除文件、访问网络的操作")
code_tool = Tool(
name="PythonREPLTool",
func=PythonREPLTool().run,
description="运行Python代码片段的工具,需遵循权限规则",
args_schema=CodeRunArgs
)
3. 分层记忆模块
from llama_index.core.memory import ChatMemoryBuffer
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
class RDAgentMemory:
def __init__(self):
self.short_term = ChatMemoryBuffer.from_defaults(token_limit=1000)
self.long_term = VectorStoreIndex([])
def save(self, content: str, type: str):
if type == "short_term":
self.short_term.put(content)
elif type == "long_term":
self.long_term.insert_nodes([content])
def retrieve(self, query: str) -> list:
stm = self.short_term.get()
ltm = self.long_term.retrieve(query)
return stm + [node.text for node in ltm]
4. 反馈闭环模块
from langchain.vectorstores import Chroma
from langchain.embeddings import OpenAIEmbeddings
class FeedbackLoop:
def __init__(self):
self.embeddings = OpenAIEmbeddings()
self.feedback_db = Chroma(embedding_function=self.embeddings)
def collect(self, user_query: str, agent_response: str, is_correct: bool, correction: str):
if not is_correct:
self.feedback_db.add_texts([f"Query: {user_query}
Response: {agent_response}
Correction: {correction}"])
def optimize_prompt(self, original_prompt: str) -> str:
similar_errors = self.feedback_db.similarity_search(original_prompt, k=1)
if similar_errors:
return f"{original_prompt}
注意:之前有类似错误,请参考:{similar_errors[0].page_content}"
return original_prompt
测试与优化
运行智能研发助理,测试用户问题:“帮我修复Python的ZeroDivisionError”:
智能体回复:“请贴一下报错行的代码和完整的错误信息~”;用户提供代码:
;智能体调用
print(10 / 0)
运行代码,得到错误信息;智能体回复:“错误原因是除以零,请检查分母是否为0。修改后的代码:
PythonREPLTool
(假设分母应为2)”;用户反馈:“正确!”,反馈存入数据库;下次遇到类似问题,智能体直接提示“检查分母是否为0”。
print(10 / 2)
工具与资源推荐
开发框架
LangChain:最灵活的Agentic AI开发框架,支持工具调用、记忆、多智能体协作;LlamaIndex:强大的记忆管理工具,适合构建分层记忆系统;AutoGPT:开箱即用的智能体,适合快速原型开发。
调试与优化工具
PromptPerfect:AI驱动的提示优化工具,帮你生成更有效的提示;LangSmith:LangChain官方的监控工具,可追踪智能体的决策流程;Harvard NLP PromptTools:提示测试工具,支持批量运行提示并对比结果。
学习资源
《Agentic AI: A Practical Guide》:入门Agentic AI的最佳书籍;OpenAI Agent Documentation:OpenAI官方的智能体开发指南;LangChain Blog:包含大量Agentic AI的实战案例。
未来趋势与挑战
趋势1:自动化提示工程
未来会出现**“提示生成AI”**——输入智能体的角色和目标,AI自动生成符合规范的提示,减少人工踩坑。
趋势2:标准化规范
行业会制定Agentic AI提示工程标准,比如“工具权限的最小化原则”“记忆分层的最佳实践”,让开发者有章可循。
趋势3:可解释性增强
智能体需要“说明决策理由”,比如“我调用PythonREPLTool是因为需要验证代码的运行结果”,帮助开发者理解和调试。
挑战:伦理与安全
Agentic AI的自主决策能力带来了安全风险,比如“智能体误调用删除工具”“泄露用户隐私”,需要更严格的权限管理和伦理审查。
结语:Agentic AI提示工程的“慢与稳”
从传统提示工程转向Agentic AI,我最大的感悟是:“快”不如“稳”——
不要急于写提示,先想清楚智能体的“目标、角色、工具、记忆、反馈”;不要追求“炫技”,要遵守“最小权限、分层记忆、反馈闭环”的规范;不要害怕踩坑,每一个坑都是“智能体认知框架”的一块砖。
Agentic AI的时代,我们不是“提示工程师”,而是“智能体架构师”——我们设计的不是“对话内容”,而是“能思考、会学习、懂协作”的“数字伙伴”。
愿我们都能写出“不踩坑”的提示,打造出“靠谱”的智能体。
最后送你一句话:
“Agentic AI的提示工程,就像给智能体“立规矩”——规矩越清楚,智能体越靠谱。”
—— 一个踩过无数坑的Agentic AI架构师
2024年X月X日