题目来源:Datawhale团队发布的Hello-Agent,这是一份快速入门学习Agent的优秀教程,强烈推荐。点击下方链接查看正文。本文为课后习题。
第四章 智能体经典范式构建
课后习题没有标准答案,如有错误,敬请指出。
习题
提示:部分题目没有固定答案,重在培养学习者对智能体范式设计的综合理解和实践能力。
- 本章介绍了三种经典的智能体范式:
、ReAct
和Plan-and-Solve
。请分析: 这三种范式在"思考"与"行动"的组织方式上有哪些根本差异?ReflectionReact 是边考虑边执行。实时性强,适应动态环境。规划能力较弱,依赖即时反馈。
先考虑后执行,整体规划。灵活性较低,适合复杂任务分解。Plan-and-Solve
是执行后再优化结果。Reflection如果要设计一个"智能家居控制助手"(需要控制灯光、空调、窗帘等多个设备,并根据用户习惯自动调节),你会选择哪种范式作为基础架构?为什么?
先考虑用户的行为习惯,做出整体规划后,再进行执行。因为这是一个逻辑路径非常清晰的任务。Plan-and-Solve是否可以将这三种范式结合使用?若可以,请尝试设计一个混合范式的智能体架构,并说明其适用场景。 可以,首先使用Plan-andSolve进行任务分解,获得多个子任务,然后每个子任务应用 ReAct 进行边考虑边执行,调用相应工具;每个子任务使用Reflection进行反思纠错,确保子任务的顺利完成。 非常适合于任务较为复杂,需要多步完成,但每一步都有一定不确定性的任务。 例如进行旅游规划,需收集用户喜好、确定城市、选择地点、安排整体游览顺序、购买交通工具票务、可行性评估等多个步骤,任务流程复杂,但也有一套固定的步骤顺序、同时存在出错需要反思的情况。
- 在4.2节的
实现中,我们使用了正则表达式来解析大语言模型的输出(如ReAct
和Thought
)。请思考: 当前的解析方法存在哪些潜在的脆弱性?在什么情况下可能会失效? 模型输出可能不符合预期,可能存在大小写、时态、中英文等错误。 即使模型提供了正确的答案,但由于无法正确解析,仍会导致任务失败。 除了正则表达式,还有哪些更稳健的输出解析方案? 提示词要求 llm 按照固定格式输出 json 微调大语言模型,使其能够稳定生成结构化的数据。 使用轻量级的大语言模型提取Action 尝试修改本章的代码,使用一种更可靠的数据格式,并对比两种方案的优点和缺点Action{ "thought": "需要查询天气", "action": "call_weather", "parameters": {"city": "北京"} } - 工具调用是现代智能体的核心功能之一。基于4.2.2节的
设计,请完成以下扩展实践: 提示:这是一道操作题,建议实际编写代码 为ToolExecutor
智能体添加一个"计算器"工具,使其能够处理复杂的数学计算问题(如"计算ReAct
的结果")(123 + 456) × 789/ 12 = ?在tools。py def CalculatorTool(query: str): try: # 安全计算(避免恶意表达式) result = eval(query, {"__builtins__": None}, {}) return f"计算结果:{result}" except Exception as e: return f"计算失败:{str(e)}" 在ReAct。py search_desc = "一个计算器工具,可以执行基本的数学运算。" tool_executor.registerTool("call_calculator",search_desc, CalculatorTool) agent = ReActAgent(llm_client=llm, tool_executor=tool_executor) question = "计算 (123 + 456) × 789/ 12 = ? 的结果" agent.run(question)
设计并实现一个"工具选择失败"的处理机制:当智能体多次调用错误的工具或提供错误的参数时,系统应如何引导它进行纠正? 记录失败状态、重试次数限制, 思考:如果可调用工具的数量增加到50个甚至100个,当前的工具描述方式是否还能有效工作?在可调用工具数量随着业务需求显著增多时,从工程角度如何优化工具的组织和检索机制? 数量过多,模型无法完全记忆并正确调用。可以对工具进行分类,或者加上RAG语义搜索,需要使用什么工具可以先搜索一下是否存在。或者RAG后列举几个可能需要用到的工具,(helloagent) ubuntu@5b475be35abf:/workspace/code/chapter4$ python ReAct.py 工具 'Search' 已注册。 工具 'call_calculator' 已注册。 --- 第 1 步 --- ???? 正在调用 deepseek-chat 模型... ? 大语言模型响应成功: Thought: 用户要求计算一个数学表达式:(123 + 456) × 789 / 12。我需要先计算括号内的加法,然后进行乘法和除法运算。由于这是一个纯数学计算问题,我应该使用计算器工具来确保准确性。 Action: call_calculator[(123 + 456) × 789 / 12] ???? 思考: 用户要求计算一个数学表达式:(123 + 456) × 789 / 12。我需要先计算括号内的加法,然后进行乘法和除法运算。由于这是一个纯数学计算问题,我应该使用计算器工具来确保准确性。 ???? 行动: call_calculator[(123 + 456) × 789 / 12] ???? 观察: 计算失败:invalid character '×' (U+00D7) (<string>, line 1) --- 第 2 步 --- ???? 正在调用 deepseek-chat 模型... ? 大语言模型响应成功: Thought: 用户需要计算 (123 + 456) × 789/12 的结果。之前尝试使用计算器时失败了,因为计算器不接受"×"符号。我需要使用标准的数学运算符"*"来表示乘法,重新调用计算器。 Action: call_calculator[(123 + 456) * 789 / 12] ???? 思考: 用户需要计算 (123 + 456) × 789/12 的结果。之前尝试使用计算器时失败了,因为计算器不接受"×"符号。我需要使用标准的数学运算符"*"来表示乘法,重新调用计算器。 ???? 行动: call_calculator[(123 + 456) * 789 / 12] ???? 观察: 计算结果:38069.25 --- 第 3 步 --- ???? 正在调用 deepseek-chat 模型... ? 大语言模型响应成功: Thought: 用户需要计算 (123 + 456) × 789/12 的结果。从历史记录中可以看到,第一次尝试使用"×"符号导致计算失败,第二次使用"*"符号成功计算出了结果 38069.25。既然已经得到了正确的计算结果,我就可以直接给出最终答案了。 Action: Finish[answer="38069.25"] ???? 思考: 用户需要计算 (123 + 456) × 789/12 的结果。从历史记录中可以看到,第一次尝试使用"×"符号导致计算失败,第二次使用"*"符号成功计算出了结果 38069.25。既然已经得到了正确的计算结果,我就可以直接给出最终答案了。 ???? 最终答案: answer="38069.25"4. Plan-and-Solve - 范式将任务分解为"规划"和"执行"两个阶段。请深入分析:
在4.3节的实现中,规划阶段生成的计划是"静态"的(一次性生成,不可更改)。如果在执行过程中发现某个步骤无法完成或结果不符合预期,应该如何设计一个"动态重规划"机制?
每次执行后,调用reflection 如果认为该步骤不符合规划,就输出“建议重新规划”。每次执行前检查上一步reflection结果,是否建议重新规划。 重新规划时,需要附上出现的问题和历史记录,避免重复犯错。
对比
与Plan-and-Solve
:在处理"预订一次从北京到上海的商务旅行(包括机票、酒店、租车)"这样的任务时,哪种范式更合适?为什么? Plan and Solve,因为这些步骤是紧密相连不可分割的,机票-酒店-租车 每一部分的状态都会影响最终的结果。 尝试设计一个"分层规划"系统:先生成高层次的抽象计划,然后针对每个高层步骤再生成详细的子计划。这种设计有什么优势? 自上而下进行规划,拥有全局视角,使最终结果不会偏离预期。结构清晰,任务完成稳定。ReAct5. Reflection
在4.4节的代码生成案例中,不同阶段采用的是同一模型。如果利用两个不同的模型(例如,使用一个更为强大的模型进行反思,用一个更迅速的模型执行),会带来什么效果?
可能会获得更好的成果,也许能减少反思次数。因为强效的反思模型能够提供更优的优化策略,直接得出优质的结果;而执行模型只需按照需求实现即可。
Reflection
机制的停止条件是“反馈中包含无需改进”或“达到最大迭代次数”。这种设计是否合理?能否设计一个更为智能的停止条件?
合理---‘反馈中包含无需改进’意味着模型自身无法提出更优方案,或者结果已经十分优秀,此时及时结束反思可以节省成本。
不合理---"达到最大迭代次数"后终止,是为了避免智能体陷入死循环,造成过大的浪费。但设置的次数难以掌握,有的任务复杂度高,需要更多的反思步骤;如果提前结束反思,则可能产生负面效果;对于简单任务而言,较少的反思步骤可能导致成本增加。
若能动态设定最大迭代次数,或让大模型自行判断是否陷入死循环而停止反思,或许更为智能。同时,建议设置较大的最大迭代次数以防止无限浪费。
或者融入用户反馈、多维度评估(准确性、效率、用户满意度)、收敛判断(优化部分较少)等机制。
假设你要构建一个“学术论文写作助手”,它能生成初稿并持续优化论文内容。请设计一个多维度的反思机制,从段落逻辑性、方法创新性、语言表达、引用规范等多个角度进行反思和改进。
初始执行提示词:
你是一位出色的硕博研究生,具备卓越的论文写作能力,发表了多篇顶级期刊论文。现在给你一个科研任务,请根据任务描述编写论文内容。
论文结构包括:题目、摘要、背景介绍XXX
要求:
1.语言严谨,
2.内容真实
XXX
任务描述:{{renwu}}
反思提示词:
你是一位经验丰富的研究者,作为多家顶级期刊的审稿人,多年来审阅过无数稿件。现在有一篇论文需要交由你审阅,请仔细审查,并提供详尽的修改建议。
要求:
1.内容详细
2.论据充分
检查内容:
段落逻辑性:检查论点是否连贯、论据是否支撑论点。
方法创新性:对比现有研究,评估方法的独特性和贡献度。
语言表达:检查语法错误、学术规范(如引用格式)。
引用规范:验证引用文献的准确性和相关性。
XXX
论文内容:{{}}
优化提示词:
你是一位杰出的研究人员,多年来撰写过无数稿件。现在你收到投稿期刊返回的修改意见,请根据原稿和修改建议进行改稿,并指出具体修改位置。
原稿:{{}}
修改建议:{{}}
6. 提示工程是影响智能体最终效果的关键技术。本章展示了多个精心设计的提示词模板。请分析:
对比4.2.3节的
ReAct提示词和4.3.2节的Plan-and-Solve提示词,它们显然存在结构设计上的显著差异,这些不同是如何服务于各自范式的核心逻辑?
都设置了角色扮演,主要区别在于输出信息及其格式的不同。这些区别的根源在于智能体的设计架构不同,所需的数据输出和格式也各异。
例如ReAct需要Thought、Action等固定格式的回答来决定下一步是调用工具还是进行规划或结束任务。
Plan-and-Solve
需要返回列表格式来划分每一步的任务,在执行时也需要区分当前状态与历史结果。
在4.4.3节的
Reflection提示词中,我们采用了“你是一位极其严格的代码评审专家”这样的角色设定。尝试修改这个角色设定(如改为“你是一位重视代码可读性的开源项目维护者”),观察输出结果的变化,并总结角色设定对智能体行为的影响。
增加了更多的代码注释。
def find_primes(n: int) -> list:
"""
使用埃拉托斯特尼筛法找出1到n之间所有的素数。
参数:
n (int): 查找素数的上限(包含)
返回:
list: 包含1到n之间所有素数的列表,按升序排列
异常:
ValueError: 当n小于1时抛出
示例:
>>> find_primes(10)
[2, 3, 5, 7]
>>> find_primes(1)
[]
"""
if n < 1:
raise ValueError("n必须大于等于1")
if n < 2:
return []
# 初始化标记数组,全部设为True
is_prime = [True] * (n + 1)
is_prime[0] = is_prime[1] = False # 0和1不是素数
# 埃拉托斯特尼筛法
for i in range(2, int(n ** 0.5) + 1):
if is_prime[i]:
# 标记i的所有倍数为非素数
for j in range(i * i, n + 1, i):
is_prime[j] = False
# 收集所有素数
primes = [i for i in range(2, n + 1) if is_prime[i]]
return primes
在提示词中加入
few-shot示例通常能显著提升模型遵循特定格式的能力。请为此章节的某个智能体尝试添加few-shot示例,并对比其效果。
输出格式按要求进行了调整。
7. 某电商初创公司现在希望使用“客服智能体”替代真人客服以实现成本节约和效率提升,它需要具备以下功能:
a. 理解用户的退款申请理由
b. 查询用户的订单信息及物流状态
c. 根据公司政策智能判断是否应批准退款
d. 生成并发送一封得体的回复邮件至用户邮箱
e. 如果决策存在争议(自我置信度低于阈值),能够进行自我反思并提出更为审慎的建议
此时作为该产品的负责人:
你会选择本章的哪种范式(或哪些范式的组合)作为系统的核心架构?
我会选择Plan and Solve + Reflection,1. 理解用户理由;2. 调用工具查询相关政策和用户信息;3. 分析后得出结论;4. 编写邮件;5. 调用邮件发送工具发送邮件。每个步骤都进行一次自我反思。
这个系统需要哪些工具?请列出至少三个工具及其功能描述。
- 退货知识库查询:用于查找公司关于退款的相关政策信息
- 订单信息查询:获取用户的订单详情,包括商品名称、数量等
- 物流信息查询:查看用户订单的当前物流状态及历史记录
- 邮件发送工具:生成并发送回复邮件给用户
如何设计提示词以确保智能体的决策既能符合公司利益,又能保持对用户的友好态度?
你是一个始终维持礼貌的客服人员,无论遇到任何情况,都保持积极的心态,以友善的态度对待顾客。然而,你是一位非常有原则和底线的客服,公司的权益不容损害,你需要在安抚顾客的同时,坚定地维护公司利益,绝不妥协。
在回答问题时,按照以下步骤思考:第一步,检查订单是否满足退款条件;第二步,确认物流状态;第三步,生成审核结果。
该产品上线后可能面临哪些风险和挑战?如何通过技术手段来减少这些风险?
- 用户不满意(优化对话策略)
- 成本消耗高(调整模型参数)
- 回复速度缓慢
- 决策失误(人工复核)
- 工具调用失败
- 隐私泄露(本地部署)
ReAct

雷达卡




京公网安备 11010802022788号







