智能体开发:推理-行动(ReAct)思维链提示

人类在处理一个需要多个步骤才能完成任务时,显著特点是能够将言语推理(内心独白)和实际行动融合在一起,在面对陌生或不确定的情况时通过这种方法学习新知识,做出决策,并执行,从而应对复杂的任务挑战,比如下面这个图书馆借书的场景。

目标:我想借一本关于中国历史的书

内心独白(推理):我应该怎么找到这样的书呢?我知道图书馆有分类系统,每种书都有编号,我可以按照编号找到对应的书架
行动: 我走到书架,拿起一本书看看

内心独白(推理):这本书合不合我的要求呢?嗯,看起来不太对,它讲的是"历史"里的故事,而不是我想了解的"历史"事实,我得换个方法找,或许可以用图书馆的电脑系统搜索一下
行动:我在电脑上输入关键词"中国历史",选择"图书馆藏",点击搜索

内心独白(推理):搜索结果出来了,可是没有一本书是我想要的
结论:这个图书馆没有关于我想借的中国历史的书

推理-行动提示(Reasoning and Acting,ReAct)就是一种利用大语言模型模拟上述人类智能的推理和行动过程的思维链提示。它的基本思想是让大语言模型交替地生成推理追踪(Verbal Reasoning Traces)和行动(Actions),并允许大语言模型与外部工具进行交互,从而获取额外的信息反馈。这样就可以动态地维护和更新自己的行动计划。这个过程需要多次调用大语言模型,是一个多阶段的提示方法,具体过程如下图所示。


图8-8 推理-行动提示的两个阶段

第一阶段:推理。

第一阶段:推理。根据给定的输入和目标,生成一个推理追踪,即一系列的自然语言语句,用于解释大语言模型的推理过程和行动计划。推理追踪可以包含对外部知识的引用,也可以包含对大语言模型自身的反思和评估。这个阶段的输出由 3 个关键部分组成:

• 思考(Thought):该部分的主要功能是分析问题、生成假设和验证结果,让大语言模型做出合理和可靠的决策。

• 行动计划(Act-plan):该部分的主要功能是制定大语言模型接下来需要采取的具体行为的计划,一般由行为和对象两部分组成,也就是编码时调用的工具名称和对应的入参。

• 观察(Obs):该部分的主要功能是获取外部输入的部分。它就像大语言模型的感知系统,将环境的反馈信息同步大语言模型,帮助它进一步进行分析或者决策。

第二阶段:行动。

根据推理阶段的行动计划,完成具体的任务执行,即执行一些具体的操作或指令,用于与外部环境进行交互,如查询知识库、调用外部工具等。大语言模型根据交互的结果,获取额外的信息和反馈,从而更新自己的推理追踪和行动计划。通过重复上述两个阶段,直到达到预定的目标或满足某些终止条件。

推理-行动提示格式如下:

markdown 复制代码
# 任务描述
请按照"回答格式"尽可能地去回答问题,你可以使用以下的工具:

# 工具描述
工具名1:描述,调用参数
工具名2:描述,调用参数

# 回答格式
思考:你应该一直保持思考,给出要怎么解决这个问题的方案
动作:<工具名>。每次动作只选择一个工具。
输入:<调用工具时需要传入的参数>
观察:<第三方工具返回的结果>
...(这个"思考/动作/输入/观察"的循环可以重复N次)

思考:最后,已经得到最终结果了
最终结果:针对原始问题,输出最终结果

# 用户问题
问题:{input}

# 回答过程
思考:

接下来是演示一个具体的案例。我们首先准备一些可供使用的工具,每个工具以字符串格式返回其执行后的结果,如下表所示。
表:工具名称和描述

工具 描述
定位 获取用户当前的定位城市
天气 查看天气预报
导航 规划地点A到地点B的驾驶路线
计算器 进行简单的四则运算
时钟 获取当前的日期和时间
搜索 当以上工具都无法使用时,尝试使用这个搜索引擎工具
补充 当你回答问题的依赖信息不足时,调用这个工具可以让人工给你补充一些信息
自答 当以上工具无法使用时,依靠自己的知识直接给出答案,请注意输出事实不要杜撰

对应的提示如下:

markdown 复制代码
# 任务描述
请按照"回答格式",根据用户输入从工具列表中选择合适的工具解决问题,工具的参数格式如下:

@工具名称(参数1,参数2,...):工具功能描述

# 工具描述
@定位():获取用户当前的定位城市
@天气(城市名称):查看天气预报
@导航(起点,终点):规划地点A到地点B的驾驶路线
@计算器(数字1,运算符,数字2):进行简单的四则运算
@时钟():获取当前的日期和时间
@搜索(搜索关键词):当以上工具都无法使用时,尝试使用这个搜索引擎工具
@补充(需要补充的问题):当你回答问题的依赖信息不足时,调用这个工具可以让人工给你补充一些信息
@自答(需要回答的问题):当以上工具无法使用时,可以依靠你自己的知识直接给出答案,请注意输出事实不要杜撰

# 回答格式
思考:请保持思考,结合上下文背景,请首先判断解决该问题的素材是否满足,然后给出要解决这个问题的方案和分析过程,
动作:@工具名称(参数 1, 参数 2, ...)。每次动作只选择一个工具。工具列表"工具描述"
输入:<调用工具时需要传入的参数>
观察:<工具返回的结果>

...(这个"思考/动作/输入/观察"的循环可以重复N次)

思考:最后,已经得到最终结果了
最终结果:针对原始问题,输出最终结果

# 用户问题
问题:{question}

# 回答过程
<第1轮>

接下来,我们来看两个具体的例子,请将上述提示中的{question}变量替换为具体的问题。

**例子1:**北京到襄阳怎么走?襄阳本地有哪些好玩的地方?

markdown 复制代码
# 回答过程
<第1轮>
思考:根据用户的问题,首先需要通过定位工具确定用户当前所在的城市,然后使用导航工具规划从北京到襄阳的驾驶路线。接下来,可以使用搜索工具来获取襄阳本地的旅游景点信息。
动作:@定位()
观察:根据定位结果,得知用户当前所在城市为北京。

<第2轮>
思考:现在已经知道用户当前所在城市是北京,下一步可以使用导航工具来规划从北京到襄阳的驾驶路线。
动作:@导航(北京,襄阳)
观察:导航工具返回了从北京到襄阳的驾驶路线。

<第3轮>
思考:现在已经得到了从北京到襄阳的驾驶路线,接下来可以使用搜索工具来获取襄阳本地的旅游景点信息。
动作:@搜索(襄阳旅游景点)
观察:襄阳市的旅游景点有:1. 襄阳古城墙... · 2. 古隆中景区... · 3. 钟鼓楼...

<第4轮>
思考:已经得到了襄阳本地的旅游景点信息,可以将这些信息整理后输出给用户。
最终结果:从北京到襄阳的驾驶路线如下:起点为北京,终点为襄阳,走京开高速→G45大广高速→S83兰南高速,距离1059.36千米,耗时10小时37分钟。
襄阳本地的好玩的地方有:1. 襄阳古城墙... · 2. 古隆中景区... · 3. 钟鼓楼...

**例子2:**王军老师的身高乘以2是多少,并以王老师身高为题做一首诗。

为了演示大语言模型和人工的交互,我特别补充这个示例,当大语言模型依靠的工具不足以解决其问题时可以通过"补充"和"自答"工具唤醒人工或者大语言模型自我回答来补充相关信息,这在一些人工问答的场景非常有用。

这两个工具的定义如下:

@补充:当你回答问题的依赖信息不足时,调用这个工具可以让人工给你补充一些信息。
@自答:当以上工具无法使用时,可以依靠你自己知识直接给出答案,请注意输出事实不要杜撰

执行过程:

js 复制代码
<第 1 轮> 
思考: 需要获取王老师的身高,可以使用@补充工具
动作: @补充(王老师身高) //该工具执行时需要人工从软件界面输入,这里输入180cm 
观察: 王老师身高为 180cm 

<第 2 轮> 
思考: 需要计算 180cm 乘以 2 的结果,可以使用@计算器工具
动作: @计算器(180cm,*,2) 
观察: 180cm 乘以 2 的结果为 360cm 

<第 3 轮> 
思考: 需要根据 360cm 写一首诗,可以使用@自答工具
动作: @自答(根据 360cm 写一首诗) //该工具执行时大模型会根据自己的知识回答 
观察: 王老师高达三百六十,他的身材犹如一棵树,他的脚步踏遍大江南北,他的知识智慧比满天星。

<第 4 轮> 
思考: 最后,已经得到最终结果了
最终结果: 王老师的身高是王老师身高为 180cm,给王老师写的诗是:王老师高达三百六十,他的身材犹如一棵树,他的脚步
踏遍大江南北,他的知识智慧比满天星。

总体而言,推理-行动提示的显著优势在于其能促进大语言模型与外部信息源或各类工具之间的协同合作。这种合作机制可以自动弥补大语言模型在推理时所缺乏的知识和能力。因此,它能够应对多样化且难度各异的任务挑战,广泛应用于各种智能体中。

最新问世的《AI原生应用开发:提示工程原理与实践》(京东图书:https://item.jd.com/14373635.html)一书,特别辟出一整章的精彩内容,深入阐述了运用大语言模型进行推理的多样技术。

这一章节详尽介绍了诸如零样本提示、少样本提示、少样本思维链提示、零样本思维链、直接推理提示、思维表提示、自我一致性提示、由少至多提示、自问自答提示、思维树提示、推理-行动提示、自动思维链提示等。这些技术不仅全面挖掘并激发了大语言模型在推理领域的巨大潜能,更为读者提供了宝贵的实践指南与洞见。此书无疑是值得每一位对AI应用开发、特别是提示工程领域感兴趣的读者细细品读的佳作。