---
title: Agent应用框架
published: 2025-01-11
pinned: false
description: Agent应用框架
tags: [Agent]
category: 学习日志
draft: false
---
# 一、Agent应用架构深度解析
下面有两个Agent的方案，请对比一下，哪个方案更好？

方案一：

```mermaid
graph LR
  规划--> 行动1 --> 行动2 --> 结束
```

方案二：

```mermaid
	graph LR
  思考1--> 行动1 --> 思考2 --> 行动2 --> 结束
```
方案二比方案一好，因为思考2可以判断行动1的执行效果是否达成目的，达成目的时继续下一个行动，否则需要修改行动1并重新执行。
## Agent应用架构

```mermaid
graph LR
  规划--> 思考;
  行动 --> 思考;
  思考-->行动;
  思考-->结束;
```

运行机制：

```mermaid
graph LR
  Thought--> Observation;
  Observation-->Action;
  Action-->Thought;
```

Though：决定下一步要做的动作并给出理由

Action：执行下一步动作

Observation：观察执行动作结果的观察，用于反馈思考

> React：智能体感知环境变化做出相应调整的机制

```mermaid
graph LR
		subgraph Tools
			Calendar
			Calculator
			CodeInterpreter
			Search
			...more
		end
    A[Tools] -->Calendar;
    A -->Calculator;
    A -->CodeInterpreter;
    A -->Search;
    A -->...more;

    subgraph Memory
        C[Short-term memory]
        D[Long-term memory]
    end
    E[大模型]-->A
    E --> B[Memory]
    E --> F[Action];
		
    B-->C
    B-->D

    E --> G[Planning];
    G --> H[Reflection];
    G --> I[Self-critics];
    G --> J[Chain of thoughts];
    G --> K[Subgoal decomposition];

		A-.->F
		B-.->G
		B-.->H
```

### Tools:工具库

Memory:记忆

Action:行动

### Planning：规划

- 理解任务，给出完成任务的具体步骤
- 反思和优化，下一步行动的一个推理

规划阶段的关键技术：

- Chain-of-Thought Prompting(COT)
    
    通过Prompt激发大模型的潜能，引导LLM做出更好的规划。
    
    例子：
    
    Q:我有5个羽毛球。我买了2罐羽毛球，一罐3个。我现在有多少个羽毛球？
    
    GPT-4o:你原本有 5 个羽毛球，买了 2 瓶，每瓶 3 个。所以，你现在总共有：
    
    5 + 2 × 3 = 5 + 6 = 11 个羽毛球。
    
- 反思和细化
- 记忆增强
    
    记忆增强通常有两种方法，RAG和微调。目的是注入背景知识，让模型能更好地完成任务。
    
    <aside>
    💡
    
    什么时候用RAG，什么时候用微调？
    
    当数据更新快、数据量较少时，使用RAG更好。
    
    </aside>
    
    1. RAG的核心技术有：
    - 数据工程：收集数据，需要确保数据高质量
    - 数据切分：切分数据，切分的每个chunk尽量高质量
    - 一阶段检索：语义检索，尽可能多的找知识
    - 二阶段精排：重排序，返回高质量的数据
    - 用户意图识别：理解用户意图
    - 效果评估

### Action：行动

- 语言模型通过推理触发
- 执行器调用工具执行

```mermaid
graph LR
  工具库-->|注册| LLM --> |触发|执行器
```
函数调用执行全过程：
[![agent.png](https://tuchuang.bluishhao.top/i/2024/12/24/676ac9cfbe407.png)](https://tuchuang.bluishhao.top/i/2024/12/24/676ac9cfbe407.png)
#### 1.定义函数

编写函数，在注释说明该函数的功能、需要的参数、返回的数据。

```python
def add(num1,num2):
	"""
	该函数计算两个数字的和
	:param num1: 必要参数，表示需要计算的第一个数字
	:param num2: 必要参数，表示需要计算的第二个数字
	:return: add函数计算后的结果，返回结果为float对象
	"""
	return float(num1+num2)
```

注册函数

```python
add_tool={
"type":"function",
"function":{
		"name":"add",
		"description":"用于执行add算法函数，定义了一种将两个数字加起来的计算过程",
		"parameters":{"type":"object","parameters":{"num1":{"type":"float","description":"需要计算的第一个数字"},"num2":{"type":"float","description":"需要计算的第二个数字"}},"required":["num1","num2"]}
	}
}
tools=[add_tool]
```

#### 2.函数描述和模型调用（第一次）
模型去匹配对应的函数并调用。
```python
response = client.chat.completions.create(
        model="gpt-3.5-turbo",
        messages=messages,
        tools=tools,
        tool_choice="auto",  
    )

response.choices[0].message
```
回复的内容如下：
```python
ChatCompletionMessage(content=None, role='assistant', function_call=None, tool_calls=[ChatCompletionMessageToolCall(id='call_OqKaG4mk8Z5oEVKCYsd5rSCO', function=Function(arguments='{"num1":"1","num2":"2"}', name='add_tool'), type='function')])
```
这里的id是唯一的，用于匹配询问与回复。
#### 3.解析模型返回数据并完成函数调用
```python
tool_calls = response.choices[0].message.tool_calls
 
for tool_call in tool_calls:
    function_name = tool_call.function.name
    function_to_call = available_tools[function_name]
    function_args = json.loads(tool_call.function.arguments)
    function_response = function_to_call(**function_args)
 

print(function_name)
print(function_args)
print(function_response)
```
输出为：
```python
add_tool
{'num1':'1','num2':'2'}
"3"
```
#### 4.结果增强模型生成（第二次）
将函数调用的结果添加到消息中，增强模型生成。
```python
messages.append(
        {
            "tool_call_id": tool_call.id,
            "role": "tool",
            "name": function_name,
            "content": function_response,
        }
)
```
### Observation