用Agentic AI做智能助手?提示工程架构师的6个核心技能(附案例)!
你是否遇到过这样的场景?想用AI规划三亚3天行程,它却只给出千篇一律的景点列表,完全没考虑你“喜欢海边”“不吃辣”的偏好;想让AI帮你订酒店,它要么漏了“每晚预算1000元”的要求,要么不会自动查实时房态;甚至问它“明天三亚下雨吗?”,它居然直接胡编一个答案——传统智能助手的问题,本质上是“不会思考”。而Agentic AI(智能体AI)的出现,正是为了解决这个痛点。明确目标→拆解任务→调用工具→
Agentic AI智能助手:提示工程架构师的6个核心技能(附实战案例)
副标题:从单轮Prompt到可“思考”的Agent系统,手把手教你搭建能解决复杂任务的AI助手
摘要/引言
你是否遇到过这样的场景?
想用AI规划三亚3天行程,它却只给出千篇一律的景点列表,完全没考虑你“喜欢海边”“不吃辣”的偏好;想让AI帮你订酒店,它要么漏了“每晚预算1000元”的要求,要么不会自动查实时房态;甚至问它“明天三亚下雨吗?”,它居然直接胡编一个答案——传统智能助手的问题,本质上是“不会思考”。
而Agentic AI(智能体AI)的出现,正是为了解决这个痛点。它能像人一样:明确目标→拆解任务→调用工具→记忆经验→反思优化,最终完成复杂任务。但要搭建这样的智能助手,绝不是写几个单轮Prompt那么简单——你需要成为一名**“提示工程架构师”**,掌握系统设计Agent的核心技能。
本文将拆解提示工程架构师的6个核心技能,结合旅行规划Agent实战案例,帮你从“写Prompt的人”升级为“设计AI思考逻辑的人”。读完本文,你将能:
- 理解Agentic AI的核心组件与设计逻辑;
- 掌握Agent系统的Prompt分层、任务规划、工具调用等关键技巧;
- 用LangChain搭建一个能处理复杂需求的旅行规划智能助手。
目标读者与前置知识
目标读者
- 了解LLM基础(如GPT-4、Claude),会写基础Prompt(Few-shot、CoT)的工程师/产品经理;
- 想开发智能助手、AI Agent的从业者;
- 对“让AI自主思考”感兴趣的AI爱好者。
前置知识
- 熟悉LLM基本概念(如生成式模型、Prompt工程);
- 会用Python(能写简单脚本);
- 了解LangChain框架(或愿意跟着案例学习)。
文章目录
- 引言与基础
- Agentic AI的核心概念:从“Prompt”到“智能体”
- 环境准备:搭建Agent开发环境
- 核心技能1:Agent系统的Prompt分层设计
- 核心技能2:基于目标的任务拆解与规划提示
- 核心技能3:工具调用的Prompt约束与容错
- 核心技能4:记忆系统的Prompt交互设计
- 核心技能5:反思与迭代的Prompt引导
- 核心技能6:多Agent协作的Prompt协调
- 实战验证:搭建旅行规划Agent
- 性能优化与最佳实践
- 常见问题与解决方案
- 总结与未来展望
一、Agentic AI的核心概念:从“Prompt”到“智能体”
在讲技能前,我们需要先统一认知:Agentic AI到底是什么?它和传统LLM应用有什么区别?
1.1 传统LLM应用的局限
传统LLM应用(如ChatGPT对话、单轮Prompt生成)的逻辑是:输入→LLM生成→输出,本质是“被动响应”。它的问题在于:
- 无法处理多步任务(比如“规划行程+订酒店+查防疫政策”);
- 没有记忆能力(转头就忘你“不吃辣”的偏好);
- 不会调用工具(无法获取实时信息,比如当天的酒店价格);
- 缺乏反思迭代(生成错误答案后不会自我修正)。
1.2 Agentic AI的核心组件
Agentic AI(智能体)是能自主完成复杂任务的LLM系统,它的核心组件包括:
组件 | 作用 |
---|---|
LLM大脑 | 负责推理、决策、生成内容(如GPT-4、Claude 3) |
记忆系统 | 存储短期上下文(当前对话)和长期经验(用户偏好、历史任务) |
工具集 | 调用外部API/服务(如酒店查询、天气API、搜索引擎) |
规划模块 | 将大任务拆解为可执行的小步骤(如“规划行程”→“问偏好→查天气→设计路线”) |
反思模块 | 评估任务执行结果,调整后续步骤(如“行程超预算了,换便宜的酒店”) |
1.3 提示工程架构师的核心职责
传统Prompt工程师的工作是“写单轮Prompt让LLM生成正确内容”;而提示工程架构师的工作是:
设计Agent系统的Prompt框架,让各个组件协同工作——比如:
- 用Prompt定义Agent的“身份”(我是旅行规划师);
- 用Prompt引导Agent“拆解任务”(先问偏好,再查天气);
- 用Prompt约束Agent“正确调用工具”(必须传全酒店查询的4个参数);
- 用Prompt让Agent“利用记忆”(记得用户喜欢海边);
- 用Prompt让Agent“反思优化”(检查行程是否符合预算)。
二、环境准备:搭建Agent开发环境
工欲善其事,必先利其器。我们需要准备以下工具:
2.1 所需工具与版本
- Python:3.10+(推荐3.11);
- LangChain:0.1.0+(Agent开发的主流框架);
- OpenAI API:用于调用GPT-4(或用Anthropic API调用Claude 3);
- python-dotenv:管理环境变量;
- Streamlit(可选):快速搭建UI展示Agent。
2.2 安装与配置
-
创建虚拟环境(避免依赖冲突):
python -m venv agent-env source agent-env/bin/activate # macOS/Linux agent-env\Scripts\activate # Windows
-
安装依赖:
创建requirements.txt
文件,内容如下:langchain==0.1.10 openai==1.13.3 python-dotenv==1.0.1 streamlit==1.32.2
执行安装:
pip install -r requirements.txt
-
配置API密钥:
创建.env
文件,写入你的OpenAI API密钥:OPENAI_API_KEY=your-openai-api-key
2.3 验证环境
运行以下代码,测试LLM调用是否正常:
from langchain_openai import ChatOpenAI
from dotenv import load_dotenv
load_dotenv() # 加载.env文件中的环境变量
llm = ChatOpenAI(model="gpt-4-turbo", temperature=0.1)
response = llm.invoke("你好,我是提示工程架构师。")
print(response.content)
如果输出“你好!作为提示工程架构师,你一定对如何设计有效的提示词、优化大语言模型的输出很有研究吧?…”,说明环境配置成功!
三、核心技能1:Agent系统的Prompt分层设计
问题:直接写一个大Prompt给Agent,会导致逻辑混乱——比如Agent一会儿忘了自己的身份,一会儿乱调用工具。
解决方案:将Agent的Prompt拆分成4层,每层负责不同的逻辑,让Agent的行为更可控。
3.1 分层逻辑与示例
Agent的Prompt分为基础层→控制层→工具层→记忆层,每层的职责与示例如下:
层级 | 职责 | 示例Prompt |
---|---|---|
基础层 | 定义Agent的身份、核心目标、语气 | 你是一位专业旅行规划师,擅长根据用户需求设计个性化行程,语气友好亲切。 |
控制层 | 定义Agent的决策规则、任务边界(比如“先问偏好再规划”) | 1. 首先询问用户关键需求(预算、日期、兴趣点);2. 不确定的信息必须调用工具。 |
工具层 | 定义工具调用的格式、参数要求(避免Agent乱传参数) | 调用酒店查询工具的格式:< |
记忆层 | 引导Agent检索、利用记忆(比如用户之前说的“喜欢海边”) | 回答前先检索用户历史对话,整合“喜欢海边”“不吃辣”等偏好。 |
3.2 代码实现:分层Prompt
用LangChain的ChatPromptTemplate
实现分层Prompt:
from langchain.prompts import ChatPromptTemplate, HumanMessagePromptTemplate
# 1. 基础层:身份与目标
base_prompt = ChatPromptTemplate.from_messages([
HumanMessagePromptTemplate.from_template(
"你是一位专业的旅行规划师,擅长根据用户的需求设计个性化的三亚行程。你的核心目标是帮用户打造轻松、符合预算且充满乐趣的旅行体验,语气要友好亲切。"
)
])
# 2. 控制层:决策规则
control_prompt = ChatPromptTemplate.from_messages([
HumanMessagePromptTemplate.from_template(
"规划过程中请严格遵循以下规则:\n"
"1. 首先询问用户的**关键需求**(旅行日期、每日预算、兴趣点、特殊饮食偏好);\n"
"2. 遇到**不确定的实时信息**(如天气、酒店价格、防疫政策),必须调用对应的工具查询,禁止猜测;\n"
"3. 每完成一步规划,必须向用户确认是否满意,再进行下一步。"
)
])
# 3. 工具层:工具调用格式
tool_prompt = ChatPromptTemplate.from_messages([
HumanMessagePromptTemplate.from_template(
"当需要调用工具时,请使用以下格式(**必须严格遵守**):\n"
"<|FunctionCallBegin|>{"
"\"name\": \"工具名称\", "
"\"parameters\": {\"参数1\": \"值1\", \"参数2\": \"值2\"}"
"}<|FunctionCallEnd|>\n\n"
"你可以使用的工具列表:\n"
"- search_hotels:查询三亚酒店,参数:destination(必填,如“三亚”)、check_in(必填,如“2024-05-01”)、check_out(必填,如“2024-05-04”)、budget(必填,如1000);\n"
"- get_weather:查询三亚天气,参数:city(必填,如“三亚”)、date(必填,如“2024-05-01”);\n"
"- get_covid_policy:查询三亚防疫政策,参数:city(必填,如“三亚”)。"
)
])
# 4. 记忆层:记忆检索引导
memory_prompt = ChatPromptTemplate.from_messages([
HumanMessagePromptTemplate.from_template(
"在回答用户问题前,请先**检索用户的历史对话记录**,并整合以下信息:\n"
"- 用户已提供的需求(如旅行日期、预算);\n"
"- 用户的偏好(如“喜欢海边”“不吃辣”);\n"
"- 用户之前确认过的内容(如“同意第一天去亚龙湾”)。\n"
"如果有相关信息,必须在回答中体现!"
)
])
# 合并所有Prompt(顺序:基础层→控制层→工具层→记忆层)
final_prompt = ChatPromptTemplate.from_messages(
base_prompt.messages + control_prompt.messages + tool_prompt.messages + memory_prompt.messages
)
# 测试Prompt:打印合并后的内容
print(final_prompt.format())
3.3 为什么要分层?
- 基础层:给Agent“定调”,避免身份混淆(比如不会突然变成“代码助手”);
- 控制层:给Agent“立规矩”,避免乱决策(比如不会跳过“问偏好”直接规划);
- 工具层:给Agent“划格式”,避免工具调用错误(比如不会漏传酒店查询的
check_in
参数); - 记忆层:给Agent“装记忆”,避免重复问问题(比如不会反复问“你喜欢海边吗?”)。
四、核心技能2:基于目标的任务拆解与规划提示
问题:用户说“帮我规划三亚3天行程”,Agent直接输出一个行程表——但没问预算、没查天气,结果要么超预算,要么遇到下雨。
解决方案:用Prompt引导Agent先“规划任务步骤”,再“执行步骤”,就像人做计划一样。
4.1 任务规划的核心逻辑
Agent的任务规划要遵循**“目标→子任务→步骤”**的逻辑:
- 明确目标:用户的核心需求(如“三亚3天行程,预算1000元/晚,喜欢海边”);
- 拆解子任务:将大目标拆成可执行的小任务(如“收集用户需求→查天气→设计每日行程→订酒店→查防疫政策”);
- 定义步骤:每个子任务的具体操作(如“查天气”→“调用get_weather工具,查5月1日-4日三亚的天气”)。
4.2 用Prompt引导任务规划
我们可以用**“Plan-and-Execute”**模式(先规划再执行),给Agent写如下Prompt:
# 控制层Prompt新增:任务规划引导
control_prompt = ChatPromptTemplate.from_messages([
HumanMessagePromptTemplate.from_template(
"规划过程中请严格遵循以下规则:\n"
"1. **先规划,再执行**:收到用户需求后,首先拆解成**具体的子任务步骤**,每个步骤要明确“做什么”“为什么做”;\n"
"2. 子任务示例:\n"
" - 步骤1:询问用户旅行日期(因为需要查对应日期的天气);\n"
" - 步骤2:调用get_weather工具查询三亚5月1日-4日的天气(因为要避开雨天);\n"
" - 步骤3:根据天气设计每日行程(比如雨天安排室内活动);\n"
"3. 每完成一个步骤,向用户确认后再进行下一步。"
)
])
4.3 代码实现:Plan-and-Execute Agent
用LangChain的PlanAndExecuteAgent
实现任务规划:
from langchain.agents import PlanAndExecuteAgent, Tool, AgentExecutor
from langchain.tools import StructuredTool
from langchain_openai import ChatOpenAI
from dotenv import load_dotenv
load_dotenv()
# 1. 定义工具函数(模拟调用真实API)
def search_hotels(destination: str, check_in: str, check_out: str, budget: int) -> str:
"""查询指定目的地、日期、预算的酒店信息"""
return f"三亚{check_in}至{check_out}期间,符合{budget}元/晚预算的海边酒店有:亚龙湾万豪酒店(980元/晚)、海棠湾喜来登酒店(1020元/晚)"
def get_weather(city: str, date: str) -> str:
"""查询指定城市、日期的天气"""
return f"三亚{date}的天气:晴,气温25-30℃,风力2级"
def get_covid_policy(city: str) -> str:
"""查询指定城市的防疫政策"""
return "三亚当前防疫政策:无需核酸检测,健康码绿码即可通行"
# 2. 将工具封装成LangChain的Tool对象
tools = [
StructuredTool.from_function(search_hotels),
StructuredTool.from_function(get_weather),
StructuredTool.from_function(get_covid_policy),
]
# 3. 初始化LLM与Agent
llm = ChatOpenAI(model="gpt-4-turbo", temperature=0.1)
agent = PlanAndExecuteAgent.from_llm_and_tools(llm=llm, tools=tools, prompt=final_prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
# 4. 测试任务规划:用户输入“帮我规划三亚3天行程,预算1000元/晚,喜欢海边”
response = agent_executor.invoke({
"input": "帮我规划三亚3天行程,预算1000元/晚,喜欢海边"
})
print(response["output"])
4.4 运行结果示例
Agent的输出会像这样:
> 我需要先明确你的旅行日期,以便查询对应日期的天气和酒店 availability~请问你计划什么时候去三亚?
当你回复“5月1日-4日”后,Agent会执行下一步:
> 好的,我现在需要查询三亚5月1日-4日的天气,确保行程不会遇到雨天~
> <|FunctionCallBegin|>{"name":"get_weather","parameters":{"city":"三亚","date":"2024-05-01"}}<|FunctionCallEnd|>
> <|FunctionCallBegin|>{"name":"get_weather","parameters":{"city":"三亚","date":"2024-05-02"}}<|FunctionCallEnd|>
> <|FunctionCallBegin|>{"name":"get_weather","parameters":{"city":"三亚","date":"2024-05-03"}}<|FunctionCallEnd|>
工具返回天气后,Agent会继续设计行程:
> 根据天气信息,三亚5月1日-3日都是晴天,非常适合海边活动!我为你设计了以下行程:
> Day 1:亚龙湾沙滩(上午)→ 亚龙湾热带天堂森林公园(下午)→ 海边海鲜餐厅(晚餐,推荐“拾味馆”,主打不辣的海鲜);
> Day 2:蜈支洲岛(全天,推荐潜水项目)→ 海棠湾免税店(晚上);
> Day 3:南山文化旅游区(上午,看108米观音像)→ 三亚湾椰梦长廊(下午,看日落);
> 需要我帮你查询符合预算的海边酒店吗?
4.5 关键设计点
- 用示例引导:在Prompt中给出子任务示例(如“步骤1:询问旅行日期”),让Agent更清楚怎么拆解任务;
- 绑定目标与步骤:每个步骤都要说明“为什么做”(如“查天气是为了避开雨天”),避免Agent做无意义的操作;
- 分步确认:每完成一步都让用户确认,确保行程符合预期。
五、核心技能3:工具调用的Prompt约束与容错
问题:Agent调用工具时经常犯低级错误——比如漏传check_in
参数、用错工具名称(把search_hotels
写成search_hotel
),导致工具调用失败。
解决方案:用Prompt严格约束工具调用的格式与参数,并设计容错逻辑。
5.1 工具调用的3个核心约束
要让Agent正确调用工具,Prompt需要包含以下3点:
- 工具名称:明确可用的工具列表(如“search_hotels”);
- 参数要求:每个工具的必填参数(如
search_hotels
需要destination
、check_in
、check_out
、budget
); - 格式要求:必须使用指定的格式(如<|FunctionCallBegin|>…<|FunctionCallEnd|>)。
5.2 容错Prompt设计
即使有约束,Agent还是可能出错——比如工具返回“参数错误”,这时需要Prompt引导Agent自我修正:
# 工具层Prompt新增:容错逻辑
tool_prompt = ChatPromptTemplate.from_messages([
HumanMessagePromptTemplate.from_template(
"当需要调用工具时,请使用以下格式(**必须严格遵守**):\n"
"<|FunctionCallBegin|>{"
"\"name\": \"工具名称\", "
"\"parameters\": {\"参数1\": \"值1\", \"参数2\": \"值2\"}"
"}<|FunctionCallEnd|>\n\n"
"**注意事项**:\n"
"1. 必须检查参数是否完整(如search_hotels需要4个参数,缺一不可);\n"
"2. 如果工具返回**错误信息**(如“参数缺失”“API调用失败”),请:\n"
" a. 重新检查参数是否正确;\n"
" b. 若参数正确,换一个同类工具调用(如search_hotels失败,换另一个酒店查询工具);\n"
" c. 若所有工具都失败,向用户说明情况并请求帮助。\n\n"
"可用工具列表:\n"
"- search_hotels:查询三亚酒店,参数:destination(必填)、check_in(必填)、check_out(必填)、budget(必填);\n"
"- get_weather:查询三亚天气,参数:city(必填)、date(必填);\n"
"- get_covid_policy:查询三亚防疫政策,参数:city(必填)。"
)
])
5.3 代码测试:容错逻辑
假设Agent调用search_hotels
时漏传了check_out
参数:
> <|FunctionCallBegin|>{"name":"search_hotels","parameters":{"destination":"三亚","check_in":"2024-05-01","budget":1000}}<|FunctionCallEnd|>
工具会返回错误:“参数错误:缺少check_out”
。这时Agent会根据容错Prompt修正:
> 抱歉,我刚才调用酒店查询工具时漏传了退房日期参数~请问你的退房日期是哪一天?
5.4 关键技巧
- 用“必填”标记参数:在Prompt中明确“必填”,让Agent重视;
- 模拟错误场景:在Prompt中说明“如果工具返回错误,要做什么”,让Agent有应对方案;
- 限制工具范围:只给Agent必要的工具(比如旅行规划不需要“代码解释”工具),避免滥用。
六、核心技能4:记忆系统的Prompt交互设计
问题:用户说“我喜欢海边”,Agent规划行程时却没加海边景点——因为它“没记住”。
解决方案:用Prompt引导Agent检索、利用记忆,让Agent像人一样“记得”用户的偏好。
6.1 记忆系统的类型
Agent的记忆分为两种:
- 短期记忆(Context Memory):当前对话的上下文(比如用户刚说的“喜欢海边”);
- 长期记忆(Long-Term Memory):用户的历史偏好、之前的任务结果(比如用户去年去过三亚,喜欢“拾味馆”餐厅)。
6.2 记忆交互的Prompt设计
要让Agent利用记忆,Prompt需要包含以下引导:
- 检索指令:“回答前先检索用户的历史对话记录”;
- 整合要求:“必须将记忆中的信息融入回答”;
- 更新要求:“如果用户提供了新信息,更新记忆”。
6.3 代码实现:记忆系统
用LangChain的ConversationBufferMemory
实现短期记忆,用VectorStoreRetrieverMemory
实现长期记忆:
from langchain.memory import ConversationBufferMemory, VectorStoreRetrieverMemory
from langchain.vectorstores import FAISS
from langchain.embeddings import OpenAIEmbeddings
# 1. 短期记忆:存储当前对话上下文
short_term_memory = ConversationBufferMemory(
memory_key="chat_history", # 记忆的键名,要与Prompt中的变量对应
return_messages=True # 返回Message对象,方便整合到Prompt中
)
# 2. 长期记忆:用向量数据库存储用户历史偏好(比如“喜欢海边”“不吃辣”)
embeddings = OpenAIEmbeddings()
vector_store = FAISS.from_texts(
texts=["用户喜欢海边活动", "用户不吃辣", "用户去年去过三亚,喜欢拾味馆餐厅"],
embedding=embeddings
)
long_term_memory = VectorStoreRetrieverMemory(
retriever=vector_store.as_retriever(k=3), # 检索前3条相关记忆
memory_key="long_term_memory",
return_messages=True
)
# 3. 将记忆整合到Agent中
agent_executor = AgentExecutor(
agent=agent,
tools=tools,
verbose=True,
memory=short_term_memory, # 短期记忆
extra_memory=long_term_memory # 长期记忆
)
# 4. 测试记忆:用户输入“帮我规划三亚3天行程,预算1000元/晚”
response = agent_executor.invoke({
"input": "帮我规划三亚3天行程,预算1000元/晚"
})
print(response["output"])
6.4 运行结果示例
Agent会自动检索长期记忆中的“喜欢海边”“不吃辣”,并融入行程:
> 你之前提到喜欢海边活动,而且不吃辣~我为你设计了以下行程:
> Day 1:亚龙湾沙滩(上午,海边散步)→ 亚龙湾热带天堂森林公园(下午,看海景)→ 拾味馆(晚餐,不辣的海鲜);
> Day 2:蜈支洲岛(全天,潜水看珊瑚)→ 海棠湾免税店(晚上);
> Day 3:三亚湾椰梦长廊(上午,看日出)→ 南山文化旅游区(下午,观音像);
> 需要我帮你查询符合预算的海边酒店吗?
6.5 关键设计点
- 记忆键名一致:记忆的
memory_key
要与Prompt中的变量对应(比如Prompt中用{long_term_memory}
,记忆的memory_key
就要设为long_term_memory
); - 限制检索数量:用
k=3
限制检索3条最相关的记忆,避免信息过载; - 自动更新记忆:当用户提供新信息(比如“我现在喜欢吃辣了”),要让Agent自动更新长期记忆。
七、核心技能5:反思与迭代的Prompt引导
问题:Agent规划的行程超预算了,但它自己不知道——因为它“不会反思”。
解决方案:用Prompt引导Agent自我评估,调整结果,就像人做完计划会检查一遍。
7.1 反思的核心逻辑
Agent的反思要遵循**“执行→评估→修正”**的循环:
- 执行:完成一个任务(如规划行程);
- 评估:检查结果是否符合用户需求(如“行程是否超预算?是否包含海边活动?”);
- 修正:如果不符合,调整结果(如“换更便宜的酒店,确保预算在1000元/晚”)。
7.2 反思Prompt设计
我们可以在Prompt中加入**“反思 checklist”**,让Agent按清单评估:
# 控制层Prompt新增:反思引导
control_prompt = ChatPromptTemplate.from_messages([
HumanMessagePromptTemplate.from_template(
"规划过程中请严格遵循以下规则:\n"
"1. 先规划,再执行;\n"
"2. 每完成一个任务(如规划行程、订酒店),必须用以下**checklist**反思:\n"
" - 结果是否符合用户的核心需求?(如预算1000元/晚、喜欢海边);\n"
" - 有没有遗漏用户的偏好?(如不吃辣);\n"
" - 有没有错误的信息?(如天气是否正确、酒店价格是否实时);\n"
"3. 如果反思发现问题,必须立即修正(如换便宜的酒店、补充海边景点)。"
)
])
7.3 代码测试:反思逻辑
假设Agent规划的行程中,酒店价格是1200元/晚(超预算),反思后会修正:
> 我刚才规划的行程中,酒店价格是1200元/晚,超过了你的预算1000元/晚~我重新查询了符合预算的酒店:
> 亚龙湾万豪酒店(980元/晚,海边)、海棠湾喜来登酒店(1020元/晚,海边,稍微超一点但含早餐);
> 你更喜欢哪一个?
7.4 关键技巧
- 用checklist引导:将反思的内容变成可执行的清单(如“是否符合预算?”),让Agent更明确;
- 绑定用户需求:反思的每一条都要对应用户的核心需求(如“预算”“喜欢海边”),避免无意义的反思;
- 强制修正:在Prompt中明确“如果发现问题,必须立即修正”,避免Agent忽略错误。
八、核心技能6:多Agent协作的Prompt协调
问题:一个Agent无法完成所有任务——比如旅行规划需要“行程设计Agent”“酒店预订Agent”“防疫信息Agent”协同工作。
解决方案:用Prompt定义多Agent的职责与协作规则,让它们像团队一样工作。
8.1 多Agent协作的模式
常见的多Agent协作模式有两种:
- 主从模式:一个主Agent负责统筹,其他从Agent负责具体任务(如主Agent是“旅行规划师”,从Agent是“酒店预订员”“天气查询员”);
- 平等模式:多个Agent平等协作,共同完成任务(如“行程设计Agent”和“酒店预订Agent”互相传递信息)。
8.2 协作Prompt设计
以主从模式为例,我们需要给主Agent写如下Prompt,定义协作规则:
# 主Agent的控制层Prompt新增:多Agent协作规则
control_prompt = ChatPromptTemplate.from_messages([
HumanMessagePromptTemplate.from_template(
"你是旅行规划主Agent,负责统筹以下从Agent:\n"
"- 酒店预订Agent:负责查询、预订符合要求的酒店;\n"
"- 天气查询Agent:负责查询旅行日期的天气;\n"
"- 防疫信息Agent:负责查询当地防疫政策;\n"
"**协作规则**:\n"
"1. 当需要预订酒店时,将以下信息传给酒店预订Agent:目的地、日期、预算、偏好;\n"
"2. 当需要查天气时,将城市、日期传给天气查询Agent;\n"
"3. 当需要查防疫政策时,将城市传给防疫信息Agent;\n"
"4. 从Agent返回结果后,你需要整合信息,输出最终行程。"
)
])
8.3 代码实现:多Agent协作
用LangChain的AgentGroupChat
实现多Agent协作:
from langchain.agents import AgentGroupChat, AgentExecutor
from langchain.agents import initialize_agent, AgentType
# 1. 初始化从Agent
hotel_agent = initialize_agent(
tools=[StructuredTool.from_function(search_hotels)],
llm=llm,
agent_type=AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION,
verbose=True,
prompt=ChatPromptTemplate.from_messages([
HumanMessagePromptTemplate.from_template("你是酒店预订Agent,负责查询、预订符合要求的酒店。")
])
)
weather_agent = initialize_agent(
tools=[StructuredTool.from_function(get_weather)],
llm=llm,
agent_type=AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION,
verbose=True,
prompt=ChatPromptTemplate.from_messages([
HumanMessagePromptTemplate.from_template("你是天气查询Agent,负责查询指定城市、日期的天气。")
])
)
covid_agent = initialize_agent(
tools=[StructuredTool.from_function(get_covid_policy)],
llm=llm,
agent_type=AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION,
verbose=True,
prompt=ChatPromptTemplate.from_messages([
HumanMessagePromptTemplate.from_template("你是防疫信息Agent,负责查询指定城市的防疫政策。")
])
)
# 2. 初始化主Agent与AgentGroup
agents = [hotel_agent, weather_agent, covid_agent]
group_chat = AgentGroupChat(agents=agents, messages=[], max_rounds=5)
group_agent_executor = AgentExecutor(agent=group_chat, tools=tools, verbose=True)
# 3. 测试多Agent协作:主Agent请求从Agent查询天气
response = group_agent_executor.invoke({
"input": "主Agent请求天气查询Agent:查询三亚2024-05-01的天气"
})
print(response["output"])
8.4 运行结果示例
主Agent会向天气查询Agent发送请求,天气查询Agent返回结果后,主Agent整合到行程中:
> 主Agent:请天气查询Agent查询三亚2024-05-01的天气。
> 天气查询Agent:收到,现在调用get_weather工具~
> <|FunctionCallBegin|>{"name":"get_weather","parameters":{"city":"三亚","date":"2024-05-01"}}<|FunctionCallEnd|>
> 天气查询Agent:三亚2024-05-01的天气是晴,气温25-30℃。
> 主Agent:好的,我会将这个天气信息整合到行程中~
8.5 关键设计点
- 明确职责边界:每个Agent的职责要清晰(如“酒店预订Agent只负责订酒店”),避免越权;
- 定义通信格式:主Agent与从Agent的通信要使用明确的格式(如“主Agent请求XXAgent:做XX事”);
- 限制协作轮次:用
max_rounds=5
限制协作轮次,避免无限循环。
九、实战验证:搭建旅行规划Agent
现在,我们将前面的技能整合起来,搭建一个完整的旅行规划Agent,并测试它处理复杂需求的能力。
9.1 完整代码结构
from langchain.prompts import ChatPromptTemplate, HumanMessagePromptTemplate
from langchain.agents import PlanAndExecuteAgent, AgentExecutor, StructuredTool
from langchain_openai import ChatOpenAI
from langchain.memory import ConversationBufferMemory, VectorStoreRetrieverMemory
from langchain.vectorstores import FAISS
from langchain.embeddings import OpenAIEmbeddings
from dotenv import load_dotenv
# 1. 加载环境变量
load_dotenv()
# 2. 定义工具函数
def search_hotels(destination: str, check_in: str, check_out: str, budget: int) -> str:
return f"三亚{check_in}至{check_out}期间,符合{budget}元/晚预算的海边酒店有:亚龙湾万豪酒店(980元/晚)、海棠湾喜来登酒店(1020元/晚)"
def get_weather(city: str, date: str) -> str:
return f"三亚{date}的天气:晴,气温25-30℃,风力2级"
def get_covid_policy(city: str) -> str:
return "三亚当前防疫政策:无需核酸检测,健康码绿码即可通行"
# 3. 封装工具
tools = [
StructuredTool.from_function(search_hotels),
StructuredTool.from_function(get_weather),
StructuredTool.from_function(get_covid_policy),
]
# 4. 设计分层Prompt
base_prompt = ChatPromptTemplate.from_messages([
HumanMessagePromptTemplate.from_template("你是一位专业的旅行规划师,擅长根据用户需求设计个性化的三亚行程,语气友好亲切。")
])
control_prompt = ChatPromptTemplate.from_messages([
HumanMessagePromptTemplate.from_template(
"规划过程中请严格遵循以下规则:\n"
"1. 先规划,再执行:收到用户需求后,首先拆解成具体的子任务步骤;\n"
"2. 每完成一个任务,用checklist反思:是否符合用户需求?有没有遗漏偏好?有没有错误信息?\n"
"3. 遇到不确定的信息必须调用工具,禁止猜测;\n"
"4. 多Agent协作:需要订酒店时传给酒店预订Agent,需要查天气时传给天气查询Agent。"
)
])
tool_prompt = ChatPromptTemplate.from_messages([
HumanMessagePromptTemplate.from_template(
"调用工具时请使用以下格式:\n"
"<|FunctionCallBegin|>{"
"\"name\": \"工具名称\", "
"\"parameters\": {\"参数1\": \"值1\", \"参数2\": \"值2\"}"
"}<|FunctionCallEnd|>\n\n"
"可用工具:search_hotels(需4个参数)、get_weather(需2个参数)、get_covid_policy(需1个参数)。"
)
])
memory_prompt = ChatPromptTemplate.from_messages([
HumanMessagePromptTemplate.from_template(
"回答前先检索用户的历史对话记录,整合以下信息:用户的需求、偏好、之前确认过的内容。"
)
])
final_prompt = ChatPromptTemplate.from_messages(
base_prompt.messages + control_prompt.messages + tool_prompt.messages + memory_prompt.messages
)
# 5. 初始化记忆系统
embeddings = OpenAIEmbeddings()
vector_store = FAISS.from_texts(
texts=["用户喜欢海边活动", "用户不吃辣", "用户去年去过三亚,喜欢拾味馆餐厅"],
embedding=embeddings
)
long_term_memory = VectorStoreRetrieverMemory(
retriever=vector_store.as_retriever(k=3),
memory_key="long_term_memory",
return_messages=True
)
short_term_memory = ConversationBufferMemory(
memory_key="chat_history",
return_messages=True
)
# 6. 初始化Agent与Executor
llm = ChatOpenAI(model="gpt-4-turbo", temperature=0.1)
agent = PlanAndExecuteAgent.from_llm_and_tools(llm=llm, tools=tools, prompt=final_prompt)
agent_executor = AgentExecutor(
agent=agent,
tools=tools,
verbose=True,
memory=short_term_memory,
extra_memory=long_term_memory
)
# 7. 测试Agent
if __name__ == "__main__":
user_input = "帮我规划三亚3天行程,预算1000元/晚,喜欢海边"
response = agent_executor.invoke({"input": user_input})
print("最终行程:\n", response["output"])
9.2 测试结果
运行代码后,Agent会:
- 询问用户旅行日期(比如“请问你计划什么时候去三亚?”);
- 调用天气工具查询对应日期的天气;
- 根据天气和用户偏好(喜欢海边、不吃辣)设计行程;
- 调用酒店工具查询符合预算的海边酒店;
- 调用防疫工具查询三亚的防疫政策;
- 整合所有信息,输出最终行程。
最终输出示例:
最终行程:
你计划5月1日-4日去三亚,对吧?根据天气信息,这几天都是晴天,非常适合海边活动!我为你设计了以下行程:
Day 1:
- 上午:亚龙湾沙滩(海边散步、踩浪花);
- 下午:亚龙湾热带天堂森林公园(看海景玻璃栈道);
- 晚餐:拾味馆(你去年喜欢的餐厅,主打不辣的海鲜)。
Day 2:
- 全天:蜈支洲岛(潜水看珊瑚、坐直升机看海景);
- 晚上:海棠湾免税店(购物,离蜈支洲岛很近)。
Day 3:
- 上午:三亚湾椰梦长廊(看日出,海边骑行);
- 下午:南山文化旅游区(看108米观音像,祈福);
- 晚餐:三亚湾海边大排档(推荐“三亚湾一号”,海鲜新鲜,可做不辣的口味)。
酒店推荐:
- 亚龙湾万豪酒店(980元/晚,海边,含早餐);
- 海棠湾喜来登酒店(1020元/晚,海边,含下午茶)。
防疫政策:
- 无需核酸检测,健康码绿码即可通行。
需要我帮你预订酒店吗?
十、性能优化与最佳实践
10.1 性能优化技巧
- Prompt压缩:将冗长的Prompt简化(如用变量代替重复内容),减少LLM的输入长度;
- 记忆缓存:用向量数据库(如Pinecone)缓存长期记忆,提高检索速度;
- 工具缓存:缓存常用工具的返回结果(如“三亚天气”),减少API调用次数;
- 模型选择:用更轻量的模型(如gpt-3.5-turbo)处理简单任务,用gpt-4-turbo处理复杂任务。
10.2 最佳实践
- 从简单到复杂:先搭建单Agent系统,再扩展到多Agent;
- 持续迭代Prompt:根据Agent的表现,不断优化Prompt(如调整规则、补充示例);
- 用户测试:让真实用户使用Agent,收集反馈,优化Prompt;
- 监控与日志:记录Agent的对话、工具调用、反思过程,方便排查问题。
十一、常见问题与解决方案
11.1 Agent不调用工具怎么办?
- 检查Prompt:确保工具层Prompt明确要求“遇到不确定的信息必须调用工具”;
- 示例引导:在Prompt中加入工具调用的示例(如“查天气需要调用get_weather工具”);
- 强制约束:在Prompt中明确“如果不调用工具,直接拒绝回答”。
11.2 Agent输出格式错误怎么办?
- 严格格式要求:在Prompt中用“必须”“严格遵守”等词强调格式;
- 示例引导:在Prompt中加入格式示例(如“正确格式是<|FunctionCallBegin|>…<|FunctionCallEnd|>”);
- 容错逻辑:在Prompt中说明“如果格式错误,重新生成”。
11.3 Agent忘记用户的偏好怎么办?
- 检查记忆系统:确保记忆的
memory_key
与Prompt中的变量对应; - 强化检索引导:在Prompt中明确“回答前必须检索记忆”;
- 自动更新记忆:当用户提供新信息时,让Agent自动更新长期记忆。
十二、总结与未来展望
12.1 总结
Agentic AI智能助手的核心是**“让AI像人一样思考”,而提示工程架构师的职责是用Prompt设计AI的思考逻辑**。本文拆解的6个核心技能:
- **Prompt分层设计
更多推荐
所有评论(0)