智能体(Agent)的表现能力高度依赖于底座大模型,如果你想做AI智能体方向的产品,必须对智能体运转的原理有大致了解,不然很有可能项目做到一半发现产品推进不下去。Agent有许多种实现模式,其中ReAct模式是最早出现,也是目前使用最广泛的模式。下面我以React模式为例子介绍Agent由哪几部分组成、Agent如何进行Action、以及为什么Agent能够进行Action。
Agent组成部分
React模式的典型流程如下图所示,可以用一个有趣的循环来描述:思考(Thought)→ 行动(Action)→ 观察(Observation),简称TAO循环。
- 思考(Thought):和人一样,面对一个问题,LLM需要进行深入的思考。思考是一个推理步骤,它确定了LLM将如何解决问题并确定要采取的行动。基于思考,LLM 可以采取一些行动。
- 行动(Action):确定了思考的方向后,接下来就是行动的时刻。根据我们的思考,采取相应的措施或执行特定的任务,以期望推动问题向解决的方向发展。例如调用 Wikipedia API 来搜索数据。根据行动结果提供的新信息,LLM 观察结果
- 观察(Observation):行动之后,我们必须仔细观察结果。这一步是检验我们的行动是否有效,是否接近了问题的答案。如果LLM明白它得到了答案,那么就结束这个问题。否则根据观察,LLM再次产生新的想法,过程继续重复,直到LLM得到答案。 TAO循环示意图如下所示:
TAO循环示意图如下所示:
去年大厂卷大模型本身,今年将重心放在了智能体上,不了解智能体都不好意思说自己懂AI。正好知乎知学堂推出了一门AI解决方案公开课,针对智能体这个热门领域,介绍什么是智能体,我们能用智能体构建什么应用,智能体的应用边界怎么确定以及28个已经落地的商业案列。强烈建议看完本篇文章后,去系统学习公开课,相信你会更加了解智能体这个领域,公开课链接我放下面了。
我自己也仔细看了看公开课,从智能体原理到应用再到商业模式,干货还是不少,赶紧学起来吧!
回到主题上,关于TAO循环,我放上一个实操例子:
1、准备两个工具,其中一个可以通过API查询给定城市的天气信息(包括温度、体感温度、湿度和风速),输入参数为城市位置(eg.北京);另外一个可以查询当前的时间,输入参数无。两个工具的输出均是结构化json数据。
2、用户输入:今天我将从北京飞往三亚,请根据天气情况给我定制穿衣计划。
TAO循环真实案例如下:
{'role': 'user', 'content': '\nQuestion:今天我将从北京飞往三亚,请根据天气情况给我定制穿衣计划'},
{'role': 'assistant', 'content': 'Thought: 需要获取北京和三亚的实时天气信息。\nAction: get_current_weather\nAction Input: {"city_name": "北京"}'},
{'role': 'user', 'content': '\nObservation:{"城市位置": "北京", "温度": "23.94 C°", "体感温度": "23.28 C°", "湿度": "34%", "风速": "2.82 m/s"}'},
{'role': 'assistant', 'content': 'Thought: 需要获取三亚的实时天气信息。\nAction: get_current_weather\nAction Input: {"city_name": "三亚"}'},
{'role': 'user', 'content': '\nObservation:{"城市位置": "三亚", "温度": "30.09 C°", "体感温度": "36.28 C°", "湿度": "74%", "风速": "4 m/s"}'}
{'role': 'assistant', 'content': 'Thought: Thought: 根据获取到的天气信息,可以为从北京前往三亚的旅程制定穿衣计划。\n北京的天气:温度约为23.94°C,体感温度为23.28°C,湿度为34%,风速为2.82 m/s。建议穿着轻薄衣物,如长袖T恤、短裤或裙子,搭配一件轻便外套以应对温差变化。鞋子可以选择舒适的运动鞋或休闲鞋。\n三亚的天气:温度约为30.09°C,体感温度为36.28°C,湿度为74%,风速为4 m/s。建议穿着透气性好的轻薄衣物,如短袖上衣、短裤或裙子,选择凉鞋或拖鞋,以适应热带气候的高温与高湿环境。\n Final Answer: 从北京飞往三亚的旅行中,建议您在北京时穿着轻薄衣物并携带一件轻便外套以应对温差变化;到达三亚后,应穿着透气性好的轻薄衣物,并选择凉鞋或拖鞋,以适应热带气候的高温与高湿环境。'},可以发现TAO循环的具体实现形式仍然是问答的形式。大模型通过思考了解需要分别调用工具查询北京和三亚的天气,并且最后在Final Answer来提出衣服着装方面的建议。
这个时候大家就有疑问了,在上述例子第三行中Observation为工具API调用的结果,那么大模型回答问题的时候为什么能够形成TAO循环、大模型是怎样从Thought到选择正确的Action并且识别出工具的Action Input呢?
这就需要提示工程以及输出数据结构化。
Agent如何进行Action
提示工程
首先,需要构造系统提示词(system_prompt),系统提示词也是模型输入的一部分。这里套用React中的提示词模板,并结合上面自己设计两种工具,系统提示词设计如下所示:
Answer the following questions as best you can. You have access to the following tools:
get_current_weather: Call this tool to interact with the 天气查询 API. What is the 天气查询 API useful for? 基于给定的城市获取天气信息,天气信息包括温度、体感温度、湿度和风速。 Parameters: [{'name': 'city_name', 'description': '城市名称', 'required': True, 'schema': {'type': 'string'}}] Format the arguments as a JSON object.
get_current_time: Call this tool to interact with the 获取当前时间 API. What is the 获取当前时间 API useful for? 获取当前的系统时间。 Parameters: [] Format the arguments as a JSON object.
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 [get_current_weather,get_current_time]
Action Input: the input to the action
Observation: the result of the action
... (this Thought/Action/Action Input/Observation can be repeated zero or more times)
Thought: I now know the final answer
Final Answer: the final answer to the original input question
Begin!可以看到在系统提示词中,已经将各个工具以及对应工具的输入输出定义好。此外,也告诉大模型需要按照TAO的模式输出结果。当然,也会有朋友说,为什么我这样定义提示词就能够实现TAO呢?关于为什么的疑问我会在下一节说到。
回到主题上来,通过定义提示工程模板,大模型初步具备了TAO的能力。光有TAO的能力还是不够的,工具调用输入参数的格式和数据类型有严格要求,稍微错一点都会调用失败。所以设计系统提示词后,还需要解析大模型的输出内容,提取出工具API的输入参数。
结构化解析
在上面的示例中,大模型需要调用查询天气工具接口,分别查询北京和三亚的天气。由于大模型本身训练数据中存在天气查询相关的语料,因此输出会存在大模型幻觉问题。因此需要解析大模型输出,提取Action和Action Input。
当然上面说到的提示词工程和结构化解析都是理想情况,如果智能体不太复杂问题一般不大。但是如果你的业务场景比较复杂,就会存在大模型选错工具以及解析大模型输出的时候报错。所以如果你想做智能体方面的产品,一定要弄明白目标场景是否需要私有化部署,再尝试API调用大模型或者说用开源模型能否达到应用条件。毕竟再漂亮的提示词,大模型不行,整体应用效果也很差。
当然,应用不佳的情况也可以尝试微调。
为什么Agent能够进行Action?
单纯预训练和指令微调就算设计提示工程也不能实现TAO循环。
Agent能力也依赖于大模型的训练,与有监督微调(SFT)一样,需要构建基于agent数据的多轮对话问答对。
下面放一个agent能力微调数据示例,格式为:sharegpt.
{
"conversations": [
{
"from": "human",
"value": "你好,我出生于1990年5月15日。你能告诉我我今天几岁了吗?"
},
{
"from": "function_call",
"value": "{\"name\": \"calculate_age\", \"arguments\": {\"birthdate\": \"1990-05-15\"}}"
},
{
"from": "observation",
"value": "{\"age\": 31}"
},
{
"from": "gpt",
"value": "根据我的计算,你今天31岁了。"
}
],
"tools": "[{\"name\": \"calculate_age\", \"description\": \"根据出生日期计算年龄\", \"parameters\": {\"type\": \"object\", \"properties\": {\"birthdate\": {\"type\": \"string\", \"description\": \"出生日期以YYYY-MM-DD格式表示\"}}, \"required\": [\"birthdate\"]}}]"
}在TOB业务场景中,可针对系统内部接口(弄清楚接口的输入以及数据类型),准备数据开展Agent能力微调。在这里,我推荐使用llama_factory,里面已经定义好数据格式,并且支持几乎市面上所有主流LLM。按照标准去准备数据,就可以增强Agent能力啦。
总结
本文以React模式为基础,举例介绍了Agent由哪几部分组成、Agent如何进行Action、以及为什么Agent能够进行Action。本文示例完整实现代码见:
<a href="http://link.zhihu.com/?target=https%3A//github.com/GuoCoder/ai-app" class=" external" target="_blank" rel="nofollow noreferrer">https://github.com/GuoCoder/ai-app |
|