在前文[LLM-Agents]万字长文深度解析Agent反思工作流框架Reflexion中篇:React中,我们详细解析了ReactAgent的工作流程,而本文则将在此基础上探讨反思技巧的应用。之前的文章中[LLM-Agents]反思Reflection 工作流我们已经对反思技巧进行了探讨,并展示了在一些数据集上性能表现。现在,我们将深入探讨在ReactAgent上构建反思工作流的具体实现。
话不多说,先上流程设计图。
1. 如何设计反思
依然是老规矩,先从Prompt设计着手,然后进行流程设计
1.1 Prompt设计
就像在ReAct的Prompt设计一样,首先进行任务说明(强烈的鼓励它),然后说明任务的输入和输出,给定样例。对于反思Agent来说,它的输入就是之前的尝试记录。
css
复制代码
你是一个能够通过自我反思来改进的高级推理代理。你将获得之前的推理测试流程,在之前的测试中你尝试访问Docstore API并回答了问题。由于你猜错了答案(使用了Finish[<answer>]),或者用完了设定的推理步骤数,你未能成功回答问题。诊断失败的可能原因,并制定一个新的、简明的高级计划,旨在减轻同样的失败。要求必须使用完整的语句来回复。
这里有一些例子:
{examples}
之前的尝试:
问题:{question}{scratchpad}
反思:
我认为一个好的示例也同等重要,LLM会按照你的设想进行回复。
bash
复制代码
之前的尝试:
Question: The Rome Protocols were signed by three Prime Ministers one of which was assassinated as part of what?
Thought 1: I need to search Rome Protocols, find the three Prime
....
Action 3: Finish[World War II]反思: I searched one of the prime ministers involved in the signing, then attemted to answer right away. I should have searched each of the prime ministers, then looked up 'death' on each of their pages in order to get more information before answering.
1.2 流程设计
你可能注意到了Reflect也有使用Scratchpad来记录反思过程,并且ReAct的Prompt我们加入了reflection,这有助于防止Thought在根据反思结果推理的时候陷入循环,反复推倒出同一结果,相当于给ReAct加了一层记忆。接下来,我们深入Reflexion的ReactReflectAgent
查看反思具体实现。
2. ReactReflectAgent.run
在ReactReflectAgent
的run
方法中调用了ReactAgent.run(self, reset)
进行迭代。上文我们有详细描述过ReactAgent.run
这一迭代TAO的过程。在ReactAgent多次迭代仍无法获取正确答案时候,进入反思流程。
我觉得这里在实际应用的时候有问题的,问答类的你是法知道结果到底正确与否,并不能知晓self.is_correct(),这像是泄露答案一样,除非让用户主动参与进行互动表示不正确,但如果用户都知道了,还问你干啥呢?但如果是编程任务,可以设定输入输出并通过编写测试用例来对程序进行测试,从而确认结果是否正确。不知道你们怎么看?
python
复制代码def run(self, reset=True, reflect_strategy: ReflexionStrategy = ReflexionStrategy.REFLEXION) -> None:if (self.is_finished() or self.is_halted()) and not self.is_correct():self.reflect(reflect_strategy)ReactAgent.run(self, reset)
在前文中我们最后有给出整个流程,设置5次尝试来调用ReactReflectAgent.run
。
python
复制代码
n = 5
for i in range(n):for agent in [a for a in agents if not a.is_correct()]:agent.run(reflect_strategy=strategy)print(f'Answer: {agent.key}')
所以当ReactAgent.run
执行完5次step结束之后,在外部的for 循环5次尝试,会再次进入ReactReflectAgent.run
方法。此次会判定出该agent的self.is_finished() or self.is_halted()
就是true了,至于self.is_correct()
我只能说提前知晓答案正确与否了。假设self.is_correct()
为false,执行reflect(reflect_strategy)
。
python
复制代码
def reflect(self, strategy: ReflexionStrategy) -> None:if ...elif strategy == ReflexionStrategy.REFLEXION:self.reflections += [self.prompt_reflection()]self.reflections_str = format_reflections(self.reflections)....def prompt_reflection(self) -> str:return format_step(self.reflect_llm(self._build_reflection_prompt()))
反思策略为REFLEXION, 构建反思Prompt。
注意这里将提取的reflection结果保存到list self.reflections, 并且将结果格式化为reflection_str,在ReAct中构建Prompt会填入该反思结果,从而避免陷入相同的推理中,可以认为self.reflections就是reflect的scratchpad。
其中reflect_prompt定义如下,然后给定一些examples,并将之前错误的问题和推理步骤附上来。
python
复制代码
REFLECT_INSTRUCTION = """You are an advanced reasoning agent that can improve based on self refection. You will be given a previous reasoning trial in which you were given access to an Docstore API environment and a question to answer. You were unsuccessful in answering the question either because you guessed the wrong answer with Finish[<answer>], or you used up your set number of reasoning steps. In a few sentences, Diagnose a possible reason for failure and devise a new, concise, high level plan that aims to mitigate the same failure. Use complete sentences.
Here are some examples:
{examples}
Previous trial:
Question: {question}{scratchpad}
Reflection:"""
其中reflect_examples就是REFLECTIONS定义的Prompt,该Prompt定义了两个案例。
Python
复制代码
REFLECTIONS = """
Previous Trial:
Question: Kam Heskin plays Paige Morgan in a 2004 film directed by who?
...
Observation 6: ....
Reflection: I got stuck in a loop where I kept trying to search 'The Prince & Me (2004 film)' but the page could not be found. Instead I should have tried to search the similar results that had a similar name to see and they were made in 2004.
"""
既然Prompt已经定义好,接下来就是调用self.reflect_llm(self._build_reflection_prompt())
,LLM就会按照给定的example来反思并给出新的思路,如下文所示反思的回复。
I got stuck on the first search and kept trying to find information about VIVA Media AG, when I should have checked the similar results instead. The similar results that came up were not useful either, as they did not talk about a name change. I should have tried another initial search term instead of persevering with a dead end.
其中reflect_llm
在初始化的时候,没有设定遇到换行停止,max token也增加到250,是因为反思不需要严格格式执行,并且应该让其尽可能的反思出具体的步骤。
python
复制代码
AnyOpenAILLM(temperature=0,max_tokens=250,model_name="gpt-3.5-turbo",openai_api_key="sk"),
)
之后,使用format_reflections将反思的结果格式化。 header + 'Reflections:\n- ' + '\n- '.join([r.strip() for r in reflections])
其中header为固定字符串,最终格式化后的输出就是
vbnet
复制代码
You have attempted to answer following question before and failed. The following reflection(s) give a plan to avoid failing to answer the question in the same way you did previously. Use them to improve your strategy of correctly answering the given question.
Reflections:
I got stuck on the first search and kept trying to find information about VIVA Media AG, when I should have checked the similar results instead. The similar results that came up were not useful either, as they did not talk about a name change. I should have tried another initial search term instead of persevering with a dead end.
所以ReactAgent.run
的Prompt会填充该段反思内容,重新迭代TAO的流程。由于反思尝试设置的是5次,我们看到最终输出的反思条例都装载到Prompt中,以便后面的推理能够吸取前面的教训。
sql
复制代码
Solve a question answering task with interleaving Thought, Action, Observation steps. Thought can reason about the current situation, and Action must be one of the three types:
...
(END OF EXAMPLES)
You have attempted to answer following question before and failed....
Reflections:
- The search results ...
- I should have read the question more carefully and noticed that it ...
Question: {question}{scratchpad}
3. 总结
Reflect是在React 5轮TAO迭代之后的总结和反思,给出下一步的思考方向。同时尝试多次反思,并将每次反思的内容给到LLM,使之避免再次走入已经反思过的方向。综合来看,反思Reflect是一种通过自动化迭代LLM,不断试错,从而得出更好的结果的思路。比如在编写代码的任务中,通过LLM编写代码,再编写测试代码,这样我们就能够通过TAO得到编写的代码是否正确,从而决定是否需要再次循环TAO或者进一步的反思来优化提升代码。
如何系统的去学习大模型LLM ?
作为一名热心肠的互联网老兵,我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。
但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的 AI大模型资料
包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
所有资料 ⚡️ ,朋友们如果有需要全套 《LLM大模型入门+进阶学习资源包》,扫码获取~
👉CSDN大礼包🎁:全网最全《LLM大模型入门+进阶学习资源包》免费分享(安全链接,放心点击)👈
一、全套AGI大模型学习路线
AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!
二、640套AI大模型报告合集
这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。
三、AI大模型经典PDF籍
随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。
四、AI大模型商业化落地方案
阶段1:AI大模型时代的基础理解
- 目标:了解AI大模型的基本概念、发展历程和核心原理。
- 内容:
- L1.1 人工智能简述与大模型起源
- L1.2 大模型与通用人工智能
- L1.3 GPT模型的发展历程
- L1.4 模型工程
- L1.4.1 知识大模型
- L1.4.2 生产大模型
- L1.4.3 模型工程方法论
- L1.4.4 模型工程实践 - L1.5 GPT应用案例
阶段2:AI大模型API应用开发工程
- 目标:掌握AI大模型API的使用和开发,以及相关的编程技能。
- 内容:
- L2.1 API接口
- L2.1.1 OpenAI API接口
- L2.1.2 Python接口接入
- L2.1.3 BOT工具类框架
- L2.1.4 代码示例 - L2.2 Prompt框架
- L2.2.1 什么是Prompt
- L2.2.2 Prompt框架应用现状
- L2.2.3 基于GPTAS的Prompt框架
- L2.2.4 Prompt框架与Thought
- L2.2.5 Prompt框架与提示词 - L2.3 流水线工程
- L2.3.1 流水线工程的概念
- L2.3.2 流水线工程的优点
- L2.3.3 流水线工程的应用 - L2.4 总结与展望
- L2.1 API接口
阶段3:AI大模型应用架构实践
- 目标:深入理解AI大模型的应用架构,并能够进行私有化部署。
- 内容:
- L3.1 Agent模型框架
- L3.1.1 Agent模型框架的设计理念
- L3.1.2 Agent模型框架的核心组件
- L3.1.3 Agent模型框架的实现细节 - L3.2 MetaGPT
- L3.2.1 MetaGPT的基本概念
- L3.2.2 MetaGPT的工作原理
- L3.2.3 MetaGPT的应用场景 - L3.3 ChatGLM
- L3.3.1 ChatGLM的特点
- L3.3.2 ChatGLM的开发环境
- L3.3.3 ChatGLM的使用示例 - L3.4 LLAMA
- L3.4.1 LLAMA的特点
- L3.4.2 LLAMA的开发环境
- L3.4.3 LLAMA的使用示例 - L3.5 其他大模型介绍
- L3.1 Agent模型框架
阶段4:AI大模型私有化部署
- 目标:掌握多种AI大模型的私有化部署,包括多模态和特定领域模型。
- 内容:
- L4.1 模型私有化部署概述
- L4.2 模型私有化部署的关键技术
- L4.3 模型私有化部署的实施步骤
- L4.4 模型私有化部署的应用场景
学习计划:
- 阶段1:1-2个月,建立AI大模型的基础知识体系。
- 阶段2:2-3个月,专注于API应用开发能力的提升。
- 阶段3:3-4个月,深入实践AI大模型的应用架构和私有化部署。
- 阶段4:4-5个月,专注于高级模型的应用和部署。
这份完整版的所有 ⚡️ 大模型 LLM 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费
】
全套 《LLM大模型入门+进阶学习资源包》↓↓↓ 获取~
👉CSDN大礼包🎁:全网最全《LLM大模型入门+进阶学习资源包》免费分享(安全链接,放心点击)👈