基于大模型的智能体(Agent)基本组成通常包含规划(Planning)、工具(Tools)、执行(Action)和记忆(Memory)四个方面。其中,规划能力被视为关键的组件之一,用于将复杂任务拆解为更小、可管理的子任务,这对有效可控地处理复杂任务效果显著。
人类做事的类比:PDCA 循环
在日常工作中,我们通常将一项任务拆解成几个步骤:制定计划、执行计划、检查结果,然后将成功的作为标准,未成功的则留待下一次循环解决。这种方法已经被证明是高效完成任务的经验总结,即 PDCA 循环。
PDCA 是美国质量管理专家休哈特博士提出的,由戴明采纳、宣传,获得普及,所以又称戴明环。基于 PDCA 模型可以将一般项目分为四个阶段,即 Plan(计划)——Do(执行)——Check(检查)——Act(处理)。把一件事情做出计划、然后实施计划、检查计划分析哪些出现了问题并提出解决方案、然后成功的纳入标准,不成功的进入下一个循环去解决,循环往复,从而形成一套标准化的流程。
Agent 的工作机制:ReAct 框架
Agent 的执行过程与人做事的方式类似,其中最有名的就是 ReAct 框架的思路。它来自论文《ReAct:在语言模型中协同推理与行动》,作者发现让 Agent 执行下一步行动的时候,加上大模型自己的思考过程,并将思考过程、执行的工具及参数、执行的结果放到提示词中,就能使得模型对当前和先前的任务完成度有更好的反思能力,从而提升模型的问题解决能力。
比如斯坦福 AI 小镇项目、AutoGPT 等去年大火的 Agent 的项目,都可看到 ReAct 的思路。LangChain 框架中直接以 ReAct 为基础定义了几种代表性 Agent(CONVERSATIONAL_REACT_DESCRIPTION、ZERO_SHOT_REACT_DESCRIPTION 等)。
Thought: … Action: … Observation: … …(重复以上过程,即表示 ReAct 的工作过程)
构建 Agent 的代码实践
下面通过代码构建一个最基本的 Agent。这里有必要提前了解几个关键概念,有助于更好地理解 Agent 的工作过程。
AgentAction:它主要包含两部分信息,tool 表示 Agent 将要调用的工具的名称,tool_input 表示传递给这个工具的具体输入。
AgentFinish:它有一个 return_values 参数,是一个字典,该字典的 output 值表示要返回给用户的字符串信息。
intermediate_steps:表示 Agent 先前的操作及其相应的结果。它是一个列表,列表中的每个元素是一个包含 AgentAction 和其执行结果的元组,这些信息对于未来的决策非常重要,因为它让 Agent 了解到目前为止已经完成了哪些工作。
定义工具
定义 Agent 要调用的工具,一个用于获取句子中不同汉字的数量的函数,同时将工具函数绑定到模型上。
def count_unique_chinese_characters(sentence):
"""用于计算句子中不同汉字的数量"""
unique_characters = set()
for char in sentence:
if '\u4e00' <= char <= '\u9fff':
unique_characters.add(char)
return len(unique_characters)
# 将工具函数绑定到模型上
llm_with_tools = llm.bind(functions=[format_tool_to_openai_function(count_unique_chinese_characters)])
定义 Agent
定义一个 Agent,用于处理用户输入、大模型输出及对输出内容解析:
prompt = ChatPromptTemplate.from_messages(
[
(, ),
MessagesPlaceholder(variable_name=),
]
)
llm = ChatOpenAI(model=, temperature=)
agent = (
{
: x: x[],
: x: format_to_openai_function_messages(
x[]
),
}
| prompt
| llm_with_tools
| OpenAIFunctionsAgentOutputParser()
)


