从零搭建 AI Agent 框架:原理、ReAct 与实现
1. Agent 核心概念
AI Agent(智能体)的核心思想是使用语言模型(LLM)来选择要采取的一系列操作。在 Agent 架构中,语言模型被用作推理引擎,以确定要采取哪些操作以及按什么顺序执行。
相比于传统软件被动地"给予输入——>做出输出"的模式,Agent 更加强调自主的发现问题、确定目标、构想方案、选择方案、执行方案、检查更新的特性。因此,它被视为一类拥有"自主智能的实体"。
一个典型的 Agent 框架通常包含以下三个核心组件(参考 LangChain 设计思路):
1.1 Planning(规划)
- 子目标和分解:将大型复杂任务分解为更小的、可管理的子目标,从而有效处理复杂逻辑。
- 反思和完善:Agent 可以对过去的行为进行自我批评和自我反思,从错误中吸取教训,并针对未来的步骤进行完善,从而提高最终结果的质量。
1.2 Memory(记忆)
- 短期记忆:利用上下文学习(Context Learning),即通过 Prompt 传递最近的对话历史或状态信息。
- 长期记忆:为 AI Agent 提供长期保留和调用无限信息的能力,通常通过利用外部向量存储(Vector Store)和快速检索(RAG)来实现。
1.3 Tool / Toolkit(工具集)
Agent 学习调用外部 API 来获取模型权重中缺失的额外信息。这些信息通常在预训练后很难更改,包括当前实时信息、代码执行能力、对专有数据源的访问等。 工具本质上是 Agent 可以调用的函数。使用工具是 AI Agent 最迷人且先进的特性之一。
2. 思考框架
2.1 Chain of Thought (CoT)
语言智能可以被理解为"使用基于自然语言的概念对经验事物进行理解以及在概念之间进行推理的能力"。
大模型具备概念理解能力,但仅仅像 Word2Vec 一样得到语义距离是不够的。真正让人惊讶的是大模型在推理上的能力涌现。推理一般指根据几个已知的前提推导得出新的结论的过程,区别于理解,推理是一个"多步骤"的过程。
2022 年,Google 发布的论文《Chain-of-Thought Prompting Elicits Reasoning in Large Language Models》首次提出,通过让大模型逐步参与将一个复杂问题分解为一步一步的子问题并依次进行求解的过程,可以显著提升大模型的性能。这一系列推理的中间步骤被称为思维链(Chain of Thought)。
使用方法:
- Zero-Shot:在 Prompt 结尾添加
Let's think step by step。 - One-Shot/Few-Shot:在 Prompt 中提供具体的示例(Example)。
2.2 ReAct Framework
无论是环境的反馈还是人类的指令,Agent 都需要完成对接收信息的"理解",并依据理解进行意图识别,转化为下一步任务。
ReAct 框架引入了 LLMs 以交错的方式生成 推理轨迹(Reasoning Trajectory)和 任务特定操作(Task-specific Actions)。
- 生成推理轨迹:使模型能够诱导、跟踪和更新操作计划,甚至处理异常情况。
- 操作步骤:允许与外部源(如知识库或环境)进行交互并且收集信息。
ReAct 框架允许 LLMs 与外部工具交互来获取额外信息,从而给出更可靠和实际的回应。结果表明,ReAct 在语言和决策任务上的表现优于多个基线模型,同时提高了人类可解释性和可信度。
运作机理: ReAct 的灵感来自于"行为"和"推理"之间的协同作用。链式思考(CoT)提示显示了 LLMs 执行推理轨迹的能力,但因缺乏和外部世界的接触而导致事实幻觉。ReAct 将推理和行为结合,提示 LLMs 为任务生成口头推理轨迹和操作,支持动态推理来创建、维护和调整操作计划。
常用模板:
Answer the following questions best you can. You have access the following tools:
{tools}
Use the following format:
the input question you must answer
you should always think about what
the action , should be one [{tool_names}]
Action Input: the input the action
the result the action
... (this Thought/Action/Action Input/Observation can repeat N times)
I now know the final answer
Final Answer: the final answer the original input question
Begin!
{input}
{agent_scratchpad}


