Agentic AI智能助手:提示工程架构师的6个核心技能(附实战案例)

副标题:从单轮Prompt到可“思考”的Agent系统,手把手教你搭建能解决复杂任务的AI助手

摘要/引言

你是否遇到过这样的场景?
想用AI规划三亚3天行程,它却只给出千篇一律的景点列表,完全没考虑你“喜欢海边”“不吃辣”的偏好;想让AI帮你订酒店,它要么漏了“每晚预算1000元”的要求,要么不会自动查实时房态;甚至问它“明天三亚下雨吗?”,它居然直接胡编一个答案——传统智能助手的问题,本质上是“不会思考”

Agentic AI(智能体AI)的出现,正是为了解决这个痛点。它能像人一样:明确目标→拆解任务→调用工具→记忆经验→反思优化,最终完成复杂任务。但要搭建这样的智能助手,绝不是写几个单轮Prompt那么简单——你需要成为一名**“提示工程架构师”**,掌握系统设计Agent的核心技能。

本文将拆解提示工程架构师的6个核心技能,结合旅行规划Agent实战案例,帮你从“写Prompt的人”升级为“设计AI思考逻辑的人”。读完本文,你将能:

  1. 理解Agentic AI的核心组件与设计逻辑;
  2. 掌握Agent系统的Prompt分层、任务规划、工具调用等关键技巧;
  3. 用LangChain搭建一个能处理复杂需求的旅行规划智能助手。

目标读者与前置知识

目标读者

  • 了解LLM基础(如GPT-4、Claude),会写基础Prompt(Few-shot、CoT)的工程师/产品经理;
  • 想开发智能助手、AI Agent的从业者;
  • 对“让AI自主思考”感兴趣的AI爱好者。

前置知识

  1. 熟悉LLM基本概念(如生成式模型、Prompt工程);
  2. 会用Python(能写简单脚本);
  3. 了解LangChain框架(或愿意跟着案例学习)。

文章目录

  1. 引言与基础
  2. Agentic AI的核心概念:从“Prompt”到“智能体”
  3. 环境准备:搭建Agent开发环境
  4. 核心技能1:Agent系统的Prompt分层设计
  5. 核心技能2:基于目标的任务拆解与规划提示
  6. 核心技能3:工具调用的Prompt约束与容错
  7. 核心技能4:记忆系统的Prompt交互设计
  8. 核心技能5:反思与迭代的Prompt引导
  9. 核心技能6:多Agent协作的Prompt协调
  10. 实战验证:搭建旅行规划Agent
  11. 性能优化与最佳实践
  12. 常见问题与解决方案
  13. 总结与未来展望

一、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 安装与配置

  1. 创建虚拟环境(避免依赖冲突):

    python -m venv agent-env
    source agent-env/bin/activate  #  macOS/Linux
    agent-env\Scripts\activate     #  Windows
    
  2. 安装依赖
    创建requirements.txt文件,内容如下:

    langchain==0.1.10
    openai==1.13.3
    python-dotenv==1.0.1
    streamlit==1.32.2
    

    执行安装:

    pip install -r requirements.txt
    
  3. 配置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的任务规划要遵循**“目标→子任务→步骤”**的逻辑:

  1. 明确目标:用户的核心需求(如“三亚3天行程,预算1000元/晚,喜欢海边”);
  2. 拆解子任务:将大目标拆成可执行的小任务(如“收集用户需求→查天气→设计每日行程→订酒店→查防疫政策”);
  3. 定义步骤:每个子任务的具体操作(如“查天气”→“调用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点:

  1. 工具名称:明确可用的工具列表(如“search_hotels”);
  2. 参数要求:每个工具的必填参数(如search_hotels需要destinationcheck_incheck_outbudget);
  3. 格式要求:必须使用指定的格式(如<|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的记忆分为两种:

  1. 短期记忆(Context Memory):当前对话的上下文(比如用户刚说的“喜欢海边”);
  2. 长期记忆(Long-Term Memory):用户的历史偏好、之前的任务结果(比如用户去年去过三亚,喜欢“拾味馆”餐厅)。

6.2 记忆交互的Prompt设计

要让Agent利用记忆,Prompt需要包含以下引导:

  1. 检索指令:“回答前先检索用户的历史对话记录”;
  2. 整合要求:“必须将记忆中的信息融入回答”;
  3. 更新要求:“如果用户提供了新信息,更新记忆”。

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的反思要遵循**“执行→评估→修正”**的循环:

  1. 执行:完成一个任务(如规划行程);
  2. 评估:检查结果是否符合用户需求(如“行程是否超预算?是否包含海边活动?”);
  3. 修正:如果不符合,调整结果(如“换更便宜的酒店,确保预算在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协作模式有两种:

  1. 主从模式:一个主Agent负责统筹,其他从Agent负责具体任务(如主Agent是“旅行规划师”,从Agent是“酒店预订员”“天气查询员”);
  2. 平等模式:多个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会:

  1. 询问用户旅行日期(比如“请问你计划什么时候去三亚?”);
  2. 调用天气工具查询对应日期的天气;
  3. 根据天气和用户偏好(喜欢海边、不吃辣)设计行程;
  4. 调用酒店工具查询符合预算的海边酒店;
  5. 调用防疫工具查询三亚的防疫政策;
  6. 整合所有信息,输出最终行程。

最终输出示例:

最终行程:
 你计划5月1日-4日去三亚,对吧?根据天气信息,这几天都是晴天,非常适合海边活动!我为你设计了以下行程:

Day 1:
- 上午:亚龙湾沙滩(海边散步、踩浪花);
- 下午:亚龙湾热带天堂森林公园(看海景玻璃栈道);
- 晚餐:拾味馆(你去年喜欢的餐厅,主打不辣的海鲜)。

Day 2:
- 全天:蜈支洲岛(潜水看珊瑚、坐直升机看海景);
- 晚上:海棠湾免税店(购物,离蜈支洲岛很近)。

Day 3:
- 上午:三亚湾椰梦长廊(看日出,海边骑行);
- 下午:南山文化旅游区(看108米观音像,祈福);
- 晚餐:三亚湾海边大排档(推荐“三亚湾一号”,海鲜新鲜,可做不辣的口味)。

酒店推荐:
- 亚龙湾万豪酒店(980元/晚,海边,含早餐);
- 海棠湾喜来登酒店(1020元/晚,海边,含下午茶)。

防疫政策:
- 无需核酸检测,健康码绿码即可通行。

需要我帮你预订酒店吗?

十、性能优化与最佳实践

10.1 性能优化技巧

  1. Prompt压缩:将冗长的Prompt简化(如用变量代替重复内容),减少LLM的输入长度;
  2. 记忆缓存:用向量数据库(如Pinecone)缓存长期记忆,提高检索速度;
  3. 工具缓存:缓存常用工具的返回结果(如“三亚天气”),减少API调用次数;
  4. 模型选择:用更轻量的模型(如gpt-3.5-turbo)处理简单任务,用gpt-4-turbo处理复杂任务。

10.2 最佳实践

  1. 从简单到复杂:先搭建单Agent系统,再扩展到多Agent;
  2. 持续迭代Prompt:根据Agent的表现,不断优化Prompt(如调整规则、补充示例);
  3. 用户测试:让真实用户使用Agent,收集反馈,优化Prompt;
  4. 监控与日志:记录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个核心技能:

  1. **Prompt分层设计
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐