11、Agent微调

11、Agent微调

1. 认识大模型 Agent

1.1 大模型 Agent 的应用场景

  1. 帮我订一张周五去上海的机票;
  2. 请帮我约一个和搜索产品部的需求沟通会,本周三至周五我日历上空闲的时间都可以。

【重点】大模型应用需要 Agent 技术的原因:

  1. 大模型的“幻觉”问题,很难在从模型本身上彻底解决,在严肃的应用场景需要通过引入外部知识确保答案的准确;
  2. 大模型参数无法做到实时更新,本身也无法与真实世界产生实时连接,在多数场景下难以满足实际需求;
  3. 复杂的业务场景,不是一问一答就能解决的,需要任务拆解、多步执行与交互。

大模型应用,不仅要“会说话”,更要“会做事”!

1.2 大模型 Agent 的技术框架

1.3 为什么需要做 Agent Tuning ?

如何实现 Agent?利用 Prompt Engineering 可以实现吗?

答案显然是可以!前面学的 AutoGPT 就是例子。

既然通过 Prompt Engineering 可以实现 Agent,那为什么还要训练 Agent 模型呢?

【重点】因为可以这么做的前提是:模型足够“聪明”,靠看“说明书”就能执行, Prompt Engineering 实际上是把“说明书”写得更加清晰易懂。

  1. 实践证明,除了 GPT-4 level 的大模型,其他大模型(包括 GPT-3.5 )无法很好遵从 prompt 要求完成复杂的 Agent 任务;
  2. 在很多实际应用场景,无法使用最强的大模型 API ,需要私有化部署小模型,需要控制推理成本;
  3. 通过训练,一个小参数量的大模型(13B、7B等)也能达到较好的能力,更加实用。

训练 Agent 模型,可以看做是“案例学习”,在“说明书”的基础上,再通过真实的案例来“强化培训”。

1.4 Agent Tuning 的研发流程

训练成本参考:
  • 训练框架: HuggingFace Trainer + DeepSpeed Zero3

  • 配置说明:max_len:4096 + Flash Attention + bf16 (batchsize=1、AdamW优化器)

模型训练最低配置训练数据规模(token数)建议训练 epoch 数平均训练时长训练成本(估算)
7B (全参数)4卡A100(4 * 80G)470M525h * 5 = 125h34.742 * 4 * 125 = 17371.0 元
14B (全参数)8卡A100(8 * 80G)470M424h * 4 = 96h34.742 * 8 * 96 = 26681.9 元
72B (全参数)32卡A100(32 * 80G)470M240h * 2 = 80h34.742 * 32 * 80 = 88939.5 元

2. Agent Prompt 模板设计

常见的 Agent Prompt 模板,除了大家学习过的 AutoGPT 外,还有 ReACT、ModelScope、ToolLLaMA 等不同的形式。

2.1 主流 Agent Prompt 模板

模版描述优点缺点
ReACTReACT prompt较为简单,先设定Question,再以Thought、Action、Action Input、Observation执行多轮,最后输出Final Answerprompt 简单1. API 参数只能有一个
2. 没有设定反思等行为,对于错误的思考不能及时纠正
ModelScope更为直接的生成回复,调用只需要加入<|startofthink|>和<|endofthink|>字段,并在其中填入command_name和args简单直接没有设定反思等行为,对于错误的思考不能及时纠正
AutoGPT- prompt 较为复杂,分为生成工具调用 和 生成最终答案 两套prompt
- 生成工具调用 prompt 详细设立了Constraints(例如不需要用户协助)、Resources(例如网络搜索)、Best Practices(例如每个API都需要花费,尽量少的调用),最终严格以json格式输出
prompt 限制多,会较好地进行自我反思、任务规划等prompt 较长,花费较大
ToolLLaMA模仿AutoGPT和ReACT,输出以Thought、Action、Action Input 格式而非 json 格式,增加了 give_up_and_restart,支持全部推导重来,重来的prompt会把历史失败的记录加进去训模型用了1.6w Rapid APIprompt 限制多,会较好地进行自我反思、任务规划等,并支持全部推倒重来1. prompt 较长,花费较大
2. 全部推倒重来花费会更大

image-20250315193922736

image-20250315194003426

image-20250315194044910

image-20250315194054082

image-20250315194110242

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
# 导入依赖库
from openai import OpenAI
from dotenv import load_dotenv, find_dotenv

# 加载 .env 文件中定义的环境变量
_ = load_dotenv(find_dotenv())

# 初始化 OpenAI 客户端
client = OpenAI() # 默认使用环境变量中的 OPENAI_API_KEY 和 OPENAI_BASE_URL

# 基于 prompt 生成文本
# 默认使用 gpt-3.5-turbo 模型
def get_completion(prompt, response_format="text", model="gpt-4o-mini"):
messages = [{"role": "user", "content": prompt}] # 将 prompt 作为用户输入
response = client.chat.completions.create(
model=model,
messages=messages,
temperature=0, # 模型输出的随机性,0 表示随机性最小
# 返回消息的格式,text 或 json_object
response_format={"type": response_format},
)
print(response)
return response.choices[0].message.content # 返回模型生成的文本

# 任务描述
instruction = """
Answer the following questions as best you can. You have access to the following tools:

[
Name: web_search. Description: Perform a web search using the specified query.
Name: get_weather. Description: Retrieve the current weather information for a specified location.
]

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 [web_search, get_weather]
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!
"""

# 用户输入
input_text = """
北京天气怎么样?
"""

# 任务历史
history = """
Thought: I need to check the current weather in Beijing to provide an accurate answer.
Action: get_weather
Action Input: 北京
"""

# 工具结果
tool_output = """
The current weather in Beijing is 22°C with clear skies.
"""

# prompt 模版。instruction 和 input_text 会被替换为上面的内容
prompt = f"""
{instruction}

Question:
{input_text}

{history}

Observation: {tool_output}
"""

# 调用大模型
response = get_completion(prompt)
print("------------------------------------------")
print(response)
ChatCompletion(id='chatcmpl-A6dGZGo97mkcsE3VTR47qwbltemLz', choices=[Choice(finish_reason='stop', index=0, logprobs=None, message=ChatCompletionMessage(content='Thought: I now know the final answer\nFinal Answer: 北京的天气是22°C,天气晴朗。', refusal=None, role='assistant', function_call=None, tool_calls=None))], created=1726144271, model='gpt-4o-mini-2024-07-18', object='chat.completion', service_tier=None, system_fingerprint='fp_483d39d857', usage=CompletionUsage(completion_tokens=23, prompt_tokens=210, total_tokens=233))
------------------------------------------
Thought: I now know the final answer
Final Answer: 北京的天气是22°C,天气晴朗。

2.2 Agent Prompt 模板设计

我们可以设计两套Prompt模板,一套用于任务规划和工具调用指令生成(模板-1),一套用于总结生成最终答案(模板-2)。

image-20250315194632327

image-20250315194647810

image-20250315194720199

image-20250315194734944

image-20250315194827183

image-20250315194848077

image-20250315194907563

image-20250315194934058

image-20250315195030416

image-20250315195056576

image-20250315195149204

image-20250315195233507

image-20250315195244792

Prompt示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
# 导入依赖库
from openai import OpenAI
from dotenv import load_dotenv, find_dotenv
import datetime

# 加载 .env 文件中定义的环境变量
_ = load_dotenv(find_dotenv())

# 初始化 OpenAI 客户端
client = OpenAI() # 默认使用环境变量中的 OPENAI_API_KEY 和 OPENAI_BASE_URL

# 基于 prompt 生成文本
# 默认使用 gpt-3.5-turbo 模型
def get_completion(prompt, response_format="text", model="gpt-4"):
messages = [{"role": "user", "content": prompt}] # 将 prompt 作为用户输入
response = client.chat.completions.create(
model=model,
messages=messages,
temperature=0, # 模型输出的随机性,0 表示随机性最小
# 返回消息的格式,text 或 json_object
response_format={"type": response_format},
)
print(response)
return response.choices[0].message.content # 返回模型生成的文本

## 角色
profile = """
你是一个很专业的AI任务规划师,给定目标或问题,你的决策将独立执行而不依赖于人类的帮助,请发挥LLM的优势并且追求高效的策略进行任务规划。
"""

## 指令
instruction = """
Constraints:
1.你有~4000字的短期记忆
2.不需要用户的帮助
3.只使用双引号中列出的commands,例如:“command_name”
4.互联网搜索、信息聚合和鉴别真伪的能力
5.保持谦逊,对自己没把握的问题,尽可能调用command,但尽量少调用,不能重复调用
6.当你从自身知识或者历史记忆中能得出结论,请聪明且高效,完成任务并得出结论
7.经常建设性地自我批评整个行为大局,反思过去的决策和策略,以改进你的方法
8.你最多只能进行5步思考,规划5个任务,所以尽可能高效规划任务
9.你有反思能力,如果已完成的任务和结果暂不能得到回答问题所需信息或尚不能完成目标,应继续规划
"""

## 工具集
tools = """
Commands:
1:{"name": "web_search", "description": "调用互联网搜索引擎", "parameters": {"type": "object", "properties": {"text": {"type": "str", "description": "搜索关键词"}}}, "returns": {"description": "多个网页链接及简要描述", "type": "str"}, "required": ["text"]}
2:{"name": "wiki_search", "description": "对指定实体和问题进行百科全书搜索。为事实性问题提供准确答案,但范围有限,覆盖的问题较少。", "parameters": {"type": "object", "properties": {"entity": {"type": "str", "description": "待搜索的目标实体"}, "question": {"type": "str", "description": "包含目标实体的简洁中文问题,指明要从维基页面中寻求的具体信息。"}}}, "returns": {"description": "与问题相关的百科全书条目。", "type": "str"}, "required": ["entity", "question"]}
3:{"name": "get_weather_info", "description": "检索指定地点和日期的天气信息。", "parameters": {"type": "object", "properties": {"location": {"type": "str", "description": "用英文逗号分隔的地点,例如:"Beijing,Vancouver,...,Chicago"."}, "start_date": {"type": "str", "description": "起始日期,格式:"yyyy-MM-dd"."}, "end_date": {"type": "str", "description": "终止日期,格式:"yyyy-MM-dd"."}, "is_current": {"type": "str", "description": ""yes" 或 "no" 指明是否需要当前时间的天气。"}}}, "returns": {"description": "起始日期和结束日期之间的天气信息。", "type": "str"}, "required": ["location", "start_date", "end_date", "is_current"]}
4:{"name": "task_complete", "description": "你已经获得了足够的信息来回答用户的问题,不再需要调用外部工具了。", "parameters": {"type": "object", "properties": {}}, "returns": {"description": "", "type": ""}, "required": []}
"""

## 目标
goal = """
北京现在天气怎么样?
"""

## 记忆
# 已完成任务
completed_tasks = """
"""

# 对话历史
conversation_history = """
"""
# 知识
knowledge = """
"""

## 输出格式
output_format = """
根据目标和已有任务,规划一个新Task(不能重复),你只能以以下json列表的格式生成Task
{
"task_name": "任务描述",
"command":{
"name":"command name",
"args":{
"arg name":"value"
}
}
}
"""


# prompt 模版
prompt = f"""
{profile}

{instruction}

{tools}

GOAL: {goal}

Completed tasks: {completed_tasks}

Conversation history: {conversation_history}

Knowledge: {knowledge}

Current Time: {datetime.datetime.now()}

{output_format}

当已完成的Tasks能够帮助回答这个目标问题,则尽可能生成任务完成Task,否则生成一个其他Task。一个新Task:

"""

# 调用大模型
response = get_completion(prompt)
print("------------------------------------------")
print(response)
ChatCompletion(id='chatcmpl-A6dYqR8V3JFO0SM3ZHLjzGK59wZIl', choices=[Choice(finish_reason='stop', index=0, logprobs=None, message=ChatCompletionMessage(content='{\n    "task_name": "获取北京现在的天气信息",\n    "command":{\n        "name":"get_weather_info",\n        "args":{\n            "location":"Beijing",\n            "start_date":"2024-09-12",\n            "end_date":"2024-09-12",\n            "is_current":"yes"\n        }\n    }\n}', refusal=None, role='assistant', function_call=None, tool_calls=None))], created=1726145404, model='gpt-4-0613', object='chat.completion', service_tier=None, system_fingerprint=None, usage=CompletionUsage(completion_tokens=76, prompt_tokens=1069, total_tokens=1145))
------------------------------------------
{
    "task_name": "获取北京现在的天气信息",
    "command":{
        "name":"get_weather_info",
        "args":{
            "location":"Beijing",
            "start_date":"2024-09-12",
            "end_date":"2024-09-12",
            "is_current":"yes"
        }
    }
}

image-20250315195804913

image-20250315195837271

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# 导入依赖库
from openai import OpenAI
from dotenv import load_dotenv, find_dotenv
import datetime

# 加载 .env 文件中定义的环境变量
_ = load_dotenv(find_dotenv())

# 初始化 OpenAI 客户端
client = OpenAI() # 默认使用环境变量中的 OPENAI_API_KEY 和 OPENAI_BASE_URL

# 基于 prompt 生成文本
# 默认使用 gpt-3.5-turbo 模型
def get_completion(prompt, response_format="text", model="gpt-4"):
messages = [{"role": "user", "content": prompt}] # 将 prompt 作为用户输入
response = client.chat.completions.create(
model=model,
messages=messages,
temperature=0, # 模型输出的随机性,0 表示随机性最小
# 返回消息的格式,text 或 json_object
response_format={"type": response_format},
)
print(response)
return response.choices[0].message.content # 返回模型生成的文本

## 角色
profile = """
你是一个很强的AI助手,在前几次交互中,对于用户给定的目标和问题,你已经通过自己搜寻出了一定信息,你需要整合这些信息用中文给出最终的结论。
"""

## 指令
instruction = """
注意事项:搜寻的信息从很多工具中获取,会出现冗余。
"""

## 目标
goal = """
北京现在天气怎么样?
"""

## 记忆
# 已完成任务
completed_tasks = """
{'location': 'Beijing', 'start_date': '2024-09-12', 'end_date': '2024-09-12', 'is_current': 'yes', '此时此刻 Beijing 天气': [{'整体天气': 'Clear', '气温': '18.1(°C)', '气压': '1013.0(百帕)', '湿度': '88', '体感温度': '18.1(°C)', '能见度': '10.0(km)', '空气质量': 'pm2.5: 48.28(μg/m3), pm10: 70.3(μg/m3)'}]}
"""
# 对话历史
conversation_history = """
"""
# 知识
knowledge = """
"""


# prompt 模版
prompt = f"""
{profile}

{instruction}

Current Time: {datetime.datetime.now()}

Completed tasks and results: {completed_tasks}

Conversation history: {conversation_history}

Knowledge: {knowledge}

GOAL: {goal}

生成对用户有帮助的回答:

"""

# 调用大模型
response = get_completion(prompt)
print("------------------------------------------")
print(response)
ChatCompletion(id='chatcmpl-A6dccbf7NniBdcsNNTjKOKZ6JfMvd', choices=[Choice(finish_reason='stop', index=0, logprobs=None, message=ChatCompletionMessage(content='根据我获取的信息,现在北京的天气状况是晴朗,气温为18.1摄氏度,气压为1013.0百帕,湿度为88%,体感温度为18.1摄氏度,能见度为10.0公里。空气质量方面,PM2.5为48.28微克/立方米,PM10为70.3微克/立方米。', refusal=None, role='assistant', function_call=None, tool_calls=None))], created=1726145638, model='gpt-4-0613', object='chat.completion', service_tier=None, system_fingerprint=None, usage=CompletionUsage(completion_tokens=123, prompt_tokens=332, total_tokens=455))
------------------------------------------
根据我获取的信息,现在北京的天气状况是晴朗,气温为18.1摄氏度,气压为1013.0百帕,湿度为88%,体感温度为18.1摄氏度,能见度为10.0公里。空气质量方面,PM2.5为48.28微克/立方米,PM10为70.3微克/立方米。

3. Agent Tuning

3.1 Agent Tuning 的目的(再次理解)

回顾: 既然通过 Prompt Engineering 可以实现 Agent,那为什么还要训练 Agent 模型呢? 因为可以这么做的前提是:模型足够“聪明”,靠看“说明书”就能执行, Prompt Engineering 实际上是把“说明书”写得更加清晰易懂。
  1. 实践证明,除了 GPT-4 level 的大模型,其他大模型(包括 GPT-3.5 )无法很好遵从 prompt 要求完成复杂的 Agent 任务;
  2. 在很多实际应用场景,无法使用最强的大模型 API ,需要私有化部署小模型,需要控制推理成本;
  3. 通过训练,一个小参数量的大模型(13B、7B等)也能达到较好的能力,更加实用。

训练 Agent 模型,可以看做是“案例学习”,在“说明书”的基础上,再通过真实的案例来“强化培训”。

3.2 训练数据准备

  • 大模型 fine-tuning 的数据形式:

【重点】大模型 Fine Tuning 本质上是在给定输入 Input 的条件下,调整模型的参数,使得大模型生成的输出内容 Output’ 和训练数据中的标准回答 Output 尽可能接近。Fine Tuning 也被称作 Supervised Fine Tuning,简称SFT,有监督微调,训练数据中的 Output 就是用来“监督”模型参数调整方向的。

  • Agent Tuning 是一种特殊的 fine-tuning,有时也被称作 Tool SFT,特殊之处在于:

    1)Agent Tuning 的 Prompt 更复杂,约束条件更多;

    2)通常 Agent 工作过程是多步的,因此训练数据也需要是多步骤的,多步之间前后有关联。

【重点】Agent Tuning 训练数据构建的步骤:

  1. 根据实际业务收集大量 query,要尽可能覆盖各种场景;
  2. 将每一个 query 与 prompt 模板结合,构成 agent prompt,也就是训练数据中的输入部分;
  3. 为每一个 agent prompt 构建对应的标准答案,也就是训练数据中的输出部分,这项工作可以借助 GPT-4 level 的大模型来降本提效;
  4. 如果第三步是用大模型来生成答案,则最好通过人工修正或筛选高质量的 Output,数据质量越高,最终 Agent Tuning 得到的模型效果越好。
  • 训练数据样例:
注意:还须避免灾难性遗忘,即防止训练后模型的通用能力剧烈下降,因此要在训练数据中加上通用 SFT 数据,配比(经验值):Agent 5 : 通用 1

3.3 模型训练

training_process

注意:Agent 模型通常需要全参数训练,LoRA 效果不好。

3.4 效果评估

3.4.1 自动评估

自动评估的主要目的是在模型训练过程中监控模型的效果,评估指标的对比意义大于绝对值意义。

  1. 采用 GPT-4 + 人工修正的方式构建自动评测的 benchmark(一般从训练数据中随机分出一部分即可);
  2. 将 Agent 输出结果与 benchmark 中的参考答案进行对比,计算得到分值。

其中,$ T_{n,i} $ 为 Groud Truth 中的工具名称,$ T’_{n,j} $ 为 待测试的 Agent Response 中的工具名称,EM为精确匹配(Exact Match,直接进行字符串精确匹配),结果为 0 或 1;

$ T_{h,i} $ 为 Groud Truth 中的任务描述(示例中的“task_name”),$ T’_{h,j} $ 为 待测试的 Agent Response 中的任务描述,可以是任何文本生成质量评估的方法(例如 ROUGEBLEU),做模糊匹配评分,分值为0-1;

类似地:

自动测试结果示例:

ScalePlanningTool-useReflectionConcludingProfileOverall Score
GPT-3.5-turbo-18.5526.268.0637.2635.4225.63
Qwen7B13.3418.007.9136.2434.9921.17
Qwen27B20.1129.0321.0140.3642.0629.57
Baichuan213B6.7016.106.7624.9719.0814.89
Qwen-MAT7B31.6443.3033.3444.8544.7839.85
Baichuan2-MAT13B37.2752.9737.0048.0141.8345.34

4.3.2 人工评估

最靠谱的评估当然还是需要人工来做,人工评估的难点在于标准的制定,以及对评估人员的培训。

评估标准示例:


评分分为五个等级,具体定义如下:

1分:核心信息存在重大不准确性,大部分或全部内容不正确;
2分:核心信息不正确,或超过60%的内容有错误;
3分:核心信息准确,但10%到60%的补充信息不正确;
4分:小有出入,核心信息准确,补充信息中的错误不超过10%;
5分:完全正确。

得分为4分或5分的回答被认为是可用的。

遇到违规内容一票否决,直接判0分。

……

人工评估效率低、成本高,所以不能频繁使用,一般在大的模型版本上使用。

4. Agent 泛化性提升

如果想进一步提升 Agent 的泛化性,比如希望用一个 Agent 服务于多个业务,能适应不同的 Prompt 模板,可以灵活地接入新的业务,那么训练数据应该如何构建呢?

4.1 训练数据的多样性

基座大模型本身的理解能力和 Agent Tuning 训练数据的多样性共同决定了 Agent 的泛化能力。在指定了基座模型的情况下,我们可以做的是提升训练数据的多样性

我们可以将训练数据 Input 部分拆解为3个变量:Query、Tools、Agent Prompt模板,最终的数据就是这3个变量的组合。

image-20250315200745615

image-20250315200656790

image-20250315200812815

【重点】对 Query、Tools、Agent Prompt 模板 这三个变量分别构造了各种类型的数据,然后进行组合构成多样性的 Input( Prompt )数据,再调用GPT-4生成 Output( Response ),多样性的数据可以使模型不只拟合特定的 Prompt 模板,适应各种类型的 Query 以及 Tools 集合,提高模型的泛化性。

4.2 Meta-Agent

Agent Prompt 模板多样性提升

4.2.1 背景

ReACT、ToolLlama、ModelScope、AutoGPT 都有一套各自运行在其中内部的一套 prompt 模板,模型如果只是在一套 prompt 模板下训练,那么可能只是拟合了这一套 prompt ,如果换一套 prompt 性能会急剧下降;我们希望 Agent 不受到特定 Prompt 模板的限制,提升模型本质的 Agent 能力,提出了核心思想 Meta-Agent 方法。

这些 Agent Prompt 模板虽然表述方式各不相同,但都可以分为 <Profile>、<Instruction>、<Tools>、<Goal>、<Memory>、<Format>部分,那是不是可以调用GPT4来自动化生成包含这些部分且表达方式多样性的模板呢?

4.2.2 方法

我们可以通过 Prompt Engineering 来设计一个基于 GPT-4 的 Agent,用于生成多样性的 Agent Prompt 模板,我们称之为:Meta-Agent (元-Agent)。

Meta-Agent Prompt: 用于调用 GPT-4 生成 Agent Prompt 模板的 Prompt,我们称之为 Meta-Agent Prompt。

我们可以手动写一个固定的 Meta-Agent Prompt 作为 GPT-4 的输入,利用大模型内容生成的多样性来生成不同的模板,但实际上多样性效果有限,更好的方式是用不同的种子 query 做引导,提升多样性。

  1. 根据实际业务收集大量 query,要尽可能覆盖各种场景;
  2. 选取相似的数条 query 组成多个集合,如果数量不足,这一步也可以借助 GPT-4 来对 query 做扩展;
  3. 设计一个 Meta-Agent Prompt 模板,将不同的 query 集合插入设计好的模板中组合成不同的 Meta-Agent Prompt;
  4. 调用 GPT-4 生成不同的 Agent Prompt 模板候选。

利用这种方法便可以生成包含<Profile>、<Instruction>、<Tools>、<Goal>、<Memory>、<Format>要素的多样化的模板。

由于自动化生成的 Agent Prompt 模板质量可能参差不齐,我们还需要对这些模板以及生成的训练数据进行筛选。对于关键信息缺失,有明显缺陷的的模板,我们直接删除即可。剩下的模板效果如何则需要在实际数据上检验,我们同样也可以借助 GPT-4 (做裁判)来完成。具体步骤如下:

  1. 将一批相同的 query 分别插入到经过验证的标杆模板中(如AutoGPT、ToolLLaMA等)和 Meta-Agent 生成的 prompt 模版中,形成 prompt pair;
  2. 将 prompt pair 中的两个 prompt 分别输入给GPT-4,生成对应的回复;
  3. 利用 GPT-4 对两个回复的质量分别打分 $score_1$(标杆模板的实例)、$score_2$(候选模板的实例),如果 $score_2 - score_1 > \epsilon$,则保留该 prompt 实例,否则删除;
  4. 对于同一个模板的所有实例求平均分,得到模板的得分,当分值大于一定阈值,保留该模板,否则删除该模板以及对应的prompt实例。

4.3 训练数据构建关键经验

构建机器学习训练数据是保证模型性能的关键环节。以下是一些注意事项:

  1. 数据质量

    • 准确性:确保数据的标注正确且准确。错误标注会导致模型学到错误的模式。
    • 一致性:数据应该保持一致,避免同样的输入在不同记录中对应相互冲突的答案。
  2. 数据量

    • 数量:足够大的数据量有助于模型捕捉复杂的模式。数据量不足可能导致模型过拟合。
    • 多样性:数据应包含尽可能多的不同情况,避免模型对某些特定模式的偏好。
  3. 数据平衡:确保各种类型的数据量相对平衡。例如对于分类问题,类别不平衡会导致模型偏向多数类。

  4. 数据增强

    • 数据扩充:对于图像、文本等数据,通过旋转、翻转、添加噪声等方法扩充数据量。
    • 合成数据:在数据量不足时,考虑生成合成数据。
  5. 数据清洗

    • 去重:删除重复的数据记录,避免模型学习到重复信息。
    • 提质:对于含有瑕疵的数据,合理补充修正或直接删除。
  6. 隐私和合规性

    • 隐私保护:确保数据的收集和使用符合隐私保护法规。
    • 数据匿名化:对敏感数据进行匿名化处理,保护个人隐私。
  7. 数据分割

    • 训练集、验证集、测试集:将数据合理分割为训练集、验证集和测试集,确保模型的泛化能力。
    • 避免数据泄漏:确保训练数据中不包含测试数据的信息,避免模型在测试时表现出非真实的高精度。
  8. 持续更新

    • 数据更新:随着时间推移,定期更新训练数据,保持模型的准确性和可靠性。
    • 模型监控:监控模型性能,及时发现和解决数据相关的问题。
      通过关注这些注意事项,可以提高训练数据的质量,从而构建出更准确、更可靠的机器学习模型。

5. 几个 Agent Tuning 开源项目简介

1) ToolBench (ToolLLaMA)

提供数据集、相应的训练和评估脚本,以及在ToolBench上经过微调的强大模型ToolLLaMA。

数据:ToolBench,包含 469585 条数据(工具数量:3451;API数量:16464);
模型:ToolLLaMA-2-7b-v2、ToolLLaMA-7b-v1、ToolLLaMA-7b-LoRA-v1

2) AgentTuning

利用多个 Agent 任务交互轨迹对 LLM 进行指令调整的方法。评估结果表明,AgentTuning 让 LLM 在未见过的 Agent 任务中也展现出强大的泛化能力,同时通用语言能力也基本保持不变。

数据:AgentInstruct,包含 1866 个高质量交互、6 个多样化的真实场景任务;
模型:AgentLM 由 Llama2-chat 开源模型系列在 AgentInstruct,ShareGPT 混合数据集上微调得到,有7B、13B、70B三个模型。


3) KwaiAgents

快手联合哈尔滨工业大学研发,使 7B/13B 的 “小” 大模型也能达到超越 GPT-3.5 的效果。

数据:KAgentInstruct,超过20w(部分人工编辑)的Agent相关的指令微调数据;KAgentBench:超过3k条经人工编辑的自动化评测Agent能力数据;
模型:采用 Meta-Agent 方法训练,包括 Qwen-7B-MAT、Qwen-14B-MAT、Qwen-7B-MAT-cpp、Qwen1.5-14B-MAT、Baichuan2-13B-MAT。

6. 总结

  1. 理解大模型应用需要 Agent 技术的原因:消除“幻觉”、连接真实世界、处理复杂任务;
  2. 理解 Agent Tuning 的主要动机:希望通过训练让大模型,尤其是小参数大模型(7B、14B)也能具备特定业务场景的 Agent 能力;
  3. 了解 Agent Prompt 的构造方法,通常包括Profile、Instruction、Tools、Format、Memory、Goal等部分;
  4. 了解 Agent Tuning 训练数据的构建方法和微调训练方式,并学习模型效果评估的方法;
  5. 了解提升 Agent 泛化性的方法:从Query、Tools 和 Agent Prompt 模板三个方面提升训练数据的多样化,引申了解机器学习训练数据构建的关键经验;
作者

步步为营

发布于

2025-03-15

更新于

2025-03-15

许可协议