# 基于大模型的Agent 体系框架

## 引言

在上一节中，我们知道了大模型对于Agent的重要性，可以说大模型就是 Agent 的"大脑"。大模型为AI Agent提供了强大的自然语言理解和生成能力，使其能够在复杂环境中进行决策和行动，并展现出高度的自主性和灵活性。

<figure><img src="https://2786695661-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FH0dfrPceIxRM7m60tfVC%2Fuploads%2FamXEoEihA5JQiX7BnPDq%2FPasted%20image%2020240718224010.png?alt=media&#x26;token=3c326153-a15c-400e-80f3-0819891190e3" alt=""><figcaption><p><strong>Liina Weng博客中的Agent架构图</strong></p></figcaption></figure>

为了更好地理解AI Agent的组成和功能，我们参考了**Liina Weng**博客中的Agent架构图。该架构图详细展示了AI Agent的各个组件及其相互关系，包括规划（Planning）、记忆（Memory）、工具（Tools）和执行（Execution）等核心能力​​​​。通过这些组件的协同工作，AI Agent能够实现从信息感知到决策执行的全流程自动化。

在接下来的内容中，我们将详细介绍AI Agent的各组件能力、记忆机制，以及几种主要的推理实现引擎，如ReAct、Function Calling、Plan and Execute和Self Ask，并重点探讨ReAct的实现原理及其应用。

## Agent的四大组成要素

### **规划（Planning）**

规划是AI Agent最核心的能力之一，其中就包括了**任务分解**和**决策分析**。 任务分解：就像一个精明的项目经理，负责把复杂的任务分解成一系列可执行的步骤。通过规划功能，Agent能够自主决定采取哪些步骤，以完成更大的任务。例如，如果要求Agent进行在线研究，它可能会将任务分解为研究特定子主题、综合发现并编写报告​。

{% hint style="info" %}

```
为了实现这一点，AI Agent通常使用一种称为PDDL（Planning Domain Definition Language）的语言。
PDDL就像是AI Agent的任务脚本语言，帮助它定义和解决各种复杂任务。PDDL主要由两个部分组成：

- 域模型（Domain Model）**：描述任务中可能的所有动作和状态。
- 问题实例（Problem Instance）**：描述当前任务的初始状态和目标状态。

例如，在一个晚会筹备任务中，域模型会包括“安排音乐”、“布置场地”、“准备食物”等动作，
而问题实例则描述了晚会的初始状态和目标状态​。
[https://en.wikipedia.org/wiki/Planning_Domain_Definition_Language]
```

{% endhint %}

决策分析：在任务分解后，Agent需要进行决策分析，以确定最优的执行路径。决策分析包括评估当前状态、选择行动、优化策略和预测结果。例如，Agent会评估现有资源，选择使用哪些工具，并根据任务进展不断优化策略。

### **记忆（Memory）**

记忆功能使AI Agent能够存储和检索信息，从而在交互过程中保持上下文一致性。Agent主要有以下几种类型的记忆：

* **背景知识（Background Knowledge）**：

  * 大模型提供的通用泛化能力为Agent提供了强大的背景知识。你可以理解为大模型对这个世界的认知，这是Agent的长期记忆。例如，GPT-4等大模型通过预训练大量的文本数据，积累了广泛的知识和常识，能够在多种任务中应用这些背景知识​​​​。

* **上下文记忆（Contextual Memory）**：

  * 上下文记忆是指Agent在与用户交互过程中得到的信息。通过将这些上下文信息与长期记忆结合，Agent可以提供更加相关和一致的回答。例如，在多轮对话中，Agent会记住用户之前的问题和偏好，以确保对话的连贯性和个性化​​​​。

* **外挂记忆（External Memory）**：

  * 外挂记忆通过集成外部知识库或数据库来增强Agent的记忆能力。这种方式通常用于增强生成式回答（Retrieval-Augmented Generation, RAG）中。例如，Agent可以通过访问外部数据源，实时获取最新的信息和数据，以补充其自身的知识库​​​​。

* **特定领域的微调（Domain-Specific Fine-Tuning）**：
  * 特定领域的微调是指对Agent进行特定任务或领域的优化训练。通过在特定领域的数据上进行微调，Agent可以更准确地处理该领域的任务。例如，医疗健康领域的Agent可以通过微调来掌握医学知识和诊断技巧，提供专业的医疗建议​​​​。

### **工具（Tools）**

工具功能指Agent使用外部工具或服务来完成任务的能力。这些工具可以包括API调用、数据库访问、代码执行等。通过集成各种工具，AI Agent能够扩展其能力范围。例如，一个智能家居Agent可以通过调用天气API来决定是否关闭窗户，以防止雨水进入​​​​。

### **执行（Execution）**

执行是AI Agent将规划转化为具体行动的过程。这包括指令的生成、执行和反馈的处理。优化执行功能可以确保AI Agent高效、准确地完成任务。例如，一个自动驾驶Agent通过执行预定的驾驶计划来安全到达目的地，同时在遇到障碍时实时调整路线​​​​。

通过以上组件的协同工作，AI Agent能够实现从信息感知到决策执行的全流程自动化，大大提升了任务完成的效率和智能化水平。

## Agent推理流程

<figure><img src="https://2786695661-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FH0dfrPceIxRM7m60tfVC%2Fuploads%2Foslrk4cLmWMI5NA1HiC7%2FPasted%20image%2020240718234240.png?alt=media&#x26;token=da8858e2-f237-48a1-86f5-061cdceb81e7" alt=""><figcaption></figcaption></figure>

上面是简化的Agent推理流程图，大致的推理流程如下：

**1. 接收输入（Receive Input）**

* **描述**：大模型到接收用户或环境提供的任务或问题。这些输入通常是自然语言形式，例如“请分析市场趋势并生成报告”。

**2. 任务理解（Task Understanding）**

* **描述**：AI Agent利用大语言模型（如GPT-4）解析输入，理解任务的意图和要求。这个过程类似于人类阅读并理解任务说明。Agent通过解析指令，识别任务的核心目标和关键步骤​​。

**3. 任务分解（Task Decomposition）**

* **描述**：将复杂任务分解为多个子任务。例如，市场分析任务可以分解为：数据收集、数据分析和报告撰写等步骤。每个子任务都有明确的目标和执行标准​​​​。

**4. 规划（Planning）**

* **描述**：使用规划语言（如PDDL），AI Agent为每个子任务制定详细的执行计划，包括执行顺序和所需资源。例如，首先需要哪些信息源（如数据库、API），然后分配每个子任务的时间和工具​​。

**5. 推理和行动（Reasoning and Acting - ReAct）**

* **描述**：在推理和行动（ReAct）过程中，AI Agent交替进行推理和执行：
  * **推理（Reasoning）**：生成下一步行动计划。例如，Agent可能会推理出需要获取某类数据，然后决定使用特定的API进行调用​​。
  * **行动（Acting）**：执行推理出的行动计划，如调用API获取数据。
  * **反馈（Feedback）**：根据执行结果更新内部状态。例如，数据获取成功，则记录结果并继续下一步；如果失败，则重新调整策略​​。

**6. 工具调用（Tool Invocation）**

* **描述**：根据任务规划，Agent调用外部工具或服务。例如，使用API调用获取数据，调用机器学习模型进行预测，或使用搜索引擎查找信息​​​​。

**7. 状态更新（State Update）**

* **描述**：执行每个子任务后，Agent根据结果更新其内部状态。这包括记录任务进展、处理错误和调整计划。例如，如果某个步骤失败，Agent会记录错误并调整后续步骤​​。

**8. 记忆（Memory）**

* **描述**：记忆是指AI Agent在任务过程中存储和检索信息的能力，包括以下两个部分：
  * **短期记忆**：用于当前任务的上下文管理，确保在多轮对话或复杂任务中保持一致。例如，记住当前对话中的用户问题和偏好​​。
  * **长期记忆**：用于存储过去的经验和数据，帮助在未来的任务中利用这些信息。例如，记住历史对话记录和用户行为模式​​。

**9. 反馈环（Feedback Loop）**

* **描述**：在每个步骤完成后，AI Agent进行自我评估和反馈。例如，检查数据分析是否正确，报告内容是否完整。如果发现问题，Agent会重新调整和执行计划。例如，重新获取数据或调整分析方法​​。

**10. 任务完成（Task Completion）**

* **描述**：所有子任务完成后，AI Agent将最终结果交付给用户或环境。例如，提交完整的分析报告或完成指定的操作。用户可以对结果进行评价，Agent根据反馈进一步优化其执行流程​​​​。

如上所示，Agent的推理流程就是一个循环，只有当执行完成才结束，可用伪代码表示如下：

```python
# 接收用户输入
input = receive_input()

# 循环处理任务
while not task_complete:
    # 规划阶段
    plan = plan_task(input)
    
    # 执行阶段
    result = execute_task(plan)
    
    # 检查任务完成情况
    task_complete = check_completion(result)

# 返回最终结果
return final_result()

# 函数定义
def receive_input():
    # 接收用户输入
    pass

def plan_task(input):
    # 规划任务
    return plan

def execute_task(plan):
    # 执行任务
    return result

def check_completion(result):
    # 检查任务完成情况
    return True or False

def final_result():
    # 返回最终结果
    pass

```

##

## Agent的推理引擎

什么是Agent的推理引擎呢？之前我们介绍了Agent的推理流程，Agent的推理引擎就是如何规划任务和决策制定过程以及调用工具执行行动，推理引擎决定了Agent如何从环境中感知信息，如何去规划好接下来的任务，如何利用之前的经验去调用工具等等

AI Agent的实现引擎包括多种方法，如ReAct、Function Calling、Plan and Execute和Self Ask等。在这一部分，我们将重点介绍ReAct方法，并简要介绍其他几种方法。

### **ReAct框架：推理、行动与观察**

**ReAct**（Reasoning and Acting）是一种将推理、行动和观察相结合的框架，旨在提升大语言模型（LLM）在任务解决中的表现。该方法通过交替生成推理路径和任务特定的行动，使模型能够动态地创建、维护和调整高层次的行动计划，同时与外部环境交互以获取更多信息。 这是ReAct的论文链接，感兴趣的看一下 \[<https://arxiv.org/abs/2210.03629>] <https://react-lm.github.io/>

### **工作原理**

1. **推理（Reasoning）**：
   * 模型生成推理路径，以解释其行动计划和决策过程。例如，在回答一个问题时，模型会通过推理确定需要获取哪些信息。
   * 这些推理路径帮助模型制定、跟踪和更新行动计划，并处理例外情况。
2. **行动（Acting）**：
   * 模型执行具体的行动，如调用API或访问数据库以获取数据。行动的结果反馈回模型，用于更新内部状态和下一步的推理。
3. **观察（Observing）**：
   * 每次行动后，模型观察行动的结果。这些观察结果被用于调整和更新接下来的推理和行动计划。
   * 例如，通过调用API获取数据后，模型会根据返回的数据更新其推理路径，并决定下一步的行动。

<figure><img src="https://2786695661-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FH0dfrPceIxRM7m60tfVC%2Fuploads%2FKrpEj4rTGezg3sWpPP7i%2FPasted%20image%2020240719173834.png?alt=media&#x26;token=09d90d30-a2f0-4f55-9561-93437b5c4efd" alt=""><figcaption></figcaption></figure>

#### 代码示例

在Langchain中可以很方便的创建ReAct代理，以下是对应的代码：

```python
from langchain import hub
from langchain.agents import AgentExecutor, create_react_agent
from langchain_community.tools.tavily_search import TavilySearchResults
from langchain_openai import ChatOpenAI

# 配置工具，最大搜索结果为1
tools = [TavilySearchResults(max_results=1)]
# 获取使用的提示文本
prompt = hub.pull("hwchase17/react")
# 选择使用的语言模型
llm = ChatOpenAI(model='gpt-4-turbo')

# 构建ReAct代理
agent = create_react_agent(llm, tools, prompt)

# 通过传入代理和工具创建代理执行器
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
# 调用执行器，输入问题
agent_executor.invoke({"input": "请根据今年的生肖写一首诗, 用中文输出"})

```

这是一段创建ReAct Agent 的 python代码，你可以先不理会langhcain是什么，怎么运行的，只要知道代码是干什么的就行了，后面章节会具体介绍。 这里简单讲解下代码意思，这里给了Agent 搜索工具，通过gpt4作为agent的决策大脑，具体的决策内容由 prompt提供，也就是下面这行代码

```python
prompt = hub.pull("hwchase17/react")
```

这里的LangChain Hub是Langchain提供的公共的prompt集合，里面有封装的langchain的各种prompt，开发者可以在里面进行调试，这就是"hwchase17/react"的 prompt

```
Answer the following questions as best you can. You have access to the following tools:

{tools}

Use the following format:

Question: the input question you must answer
Thought: you should always think about what to do
Action: the action to take, should be one of [{tool_names}]
Action Input: the input to the action
Observation: the result of the action
... (this Thought/Action/Action Input/Observation can repeat N times)
Thought: I now know the final answer
Final Answer: the final answer to the original input question

Begin!

Question: {input}
Thought:{agent_scratchpad}
```

可以看到这里{tools}和{input}就是传入的工具集和用户问题，中间的描述是ReAct框架的内容，这个提示词让大模型在规定的框架内运行，指引着大模型如何去有规划的完成任务， 而不是胡言乱语。这是翻译过后的内容：

```
问题:您必须回答的输入问题
思想:你应该时刻想着要做什么
动作:要采取的动作，应该是[{tool_names}]之一。
动作输入:动作的输入
观察:行动的结果
…(这个想法/行动/行动输入/观察可以重复N次)
心想:我现在知道最后的答案了
最终答案:原始输入问题的最终答案
```

接下来运行代码，可以看到它先是思考了下给出来需要执行的步骤，然后执行每一步的动作后得到结果

<figure><img src="https://2786695661-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FH0dfrPceIxRM7m60tfVC%2Fuploads%2Fl7QAuv9gCnNKaKG6z4tK%2FPasted%20image%2020240719230210.png?alt=media&#x26;token=2d49f549-8806-4b3d-8f04-0ae75dd96589" alt=""><figcaption></figcaption></figure>

从上面可以看到，ReAct 和我们大脑的思考有许多相似之处，不是吗？这里罗列出它的几个优势：

* **直观设计**：ReAct的提示设计简单直观，注重思维和行动的交替发生，不需要额外的格式选择或示例选择。
* **灵活性**：ReAct方法适用于多种任务，包括问答、事实验证、文本游戏和网页导航等。
* **性能**：在多任务中，ReAct方法表现优于单纯推理或行动的方法，并且具有较强的泛化能力。
* **人类对齐**：ReAct提供了可解释的任务解决路径，使得人类可以轻松检查推理过程和事实正确性，并在必要时进行纠正。

### 其他实现方法

#### **Function Calling**

\*\* [Function Calling](https://platform.openai.com/docs/guides/function-calling) \*\* 是由 OpenAI 开发的一项功能，允许 GPT 模型在处理任务时调用预定义的函数。通过这些函数，模型可以与外部工具或服务进行交互，以实现更复杂和精准的任务处理。

#### **Plan and Execute**

**Plan and Execute** 是一种经典的 AI Agent 实现方法，强调在执行前进行详细的计划。这种方法确保 Agent 在执行任务时有清晰的步骤和目标。具体来说，首先由语言模型生成一个多步骤的计划，然后由执行器逐步执行这些计划中的每一步。在每一步完成后，系统会根据需要重新规划后续步骤，以确保任务的准确完成​

#### **Self Ask**

**Self Ask** 方法让 Agent 在遇到问题时自主提问并寻找答案。这种方法增强了 Agent 的自主学习能力，使其能够不断优化自己的知识库和能力。在复杂任务中，Self Ask 可以帮助 Agent 更好地应对不确定性和动态变化。例如，一个数据分析助手在分析数据时，可以自主提问以确认数据的准确性和完整性

## 小结

本节中，我们介绍了AI Agent的四大组成要素，包括规划、记忆、工具和执行。 同时，我们探讨了Agent的推理流程，并结合ReAct框架，解释了推理、行动与观察的具体实现。ReAct框架通过交替生成推理路径和任务特定的行动，使模型能够动态调整计划并与外部环境交互。此外，我们还介绍了其他几种主要的推理引擎，如Function Calling、Plan and Execute和Self Ask，展示了AI Agent在处理复杂任务时的多样性和灵活性。通过这些实现方法，AI Agent能够在复杂环境中高效自主地完成任务。

但是，说到但是了，目前的Agent其实还存在许多问题，比如需要强大的大模型才能支撑起来，幻觉和错误信息、缺乏解释性、安全和隐私问题等， 以上问题不断优化prompt、改进模型训练与优化、增强解释性和透明度等手段可以有效缓解，在开发时如果遇到的话可以从以上几方面入手尝试。
