提示技术系列(13)——ReAct

发布于:2025-07-06 ⋅ 阅读:(16) ⋅ 点赞:(0)

什么是提示技术?

        提示技术是实现提示工程目标的具体技术手段,是提示工程中的“工具库”

什么又是提示工程?

        提示工程是指通过设计、优化和迭代输入到大语言模型(LLM)的提示(Prompt),系统性提升模型输出质量(如相关性、准确性、可控性)的实践领域。它是一个覆盖全流程方法论,包括:

  • 明确目标任务(如生成教学内容、问答、翻译);
  • 设计提示结构(如指令、上下文、示例);
  • 选择模型与参数(如温度、top_p);
  • 验证与迭代(根据输出调整提示)。

其核心是“通过工程化方法控制大语言模型(LLM)的行为”


概念

        ReAct(Reasoning + Acting)是一种结合推理与行动的提示技术框架,旨在让大语言模型在复杂任务中,同时具备逻辑推理能力外部工具/环境交互的能力。它通过动态生成推理链和行动指令,模拟人类的“思考-行动”循环,从而提升模型在多步骤任务重的表现。

核心思想:

  • 推理(Reasoning):模型生成中间推理步骤,解释当前状态、目标及下一步行动的依据。
  • 行动(Acting):模型调用外部工具(如搜索引擎、计算器、API)或执行特定操作(如提问、验证假设)以获取信息。
  • 迭代循环:推理与行动交替进行,逐步逼近任务目标。

ReAct,类似于人类解决复杂问题时的“先思考再行动”模式。例如,在规划旅游时,你会先分析预算、时间(推理),然后查询机票、酒店价格(行动),再根据结果调整计划(推理),如此循环,直到结果满足需求。

概念图解

应用场景

  1. 复杂任务规划:如规划为期五天的云南旅行等;
  2. 财务分析:如分析公司年度财报等;
  3. 科学研究助手:如论文研究、验证实验设计等;
  4. 交互式系统:如聊天机器人、智能助手等;
  5. 教育领域应用:如数学解题辅导,科学实验设计,编程教学等;
  6. ……

案例实操

使用工具:扣子

实现方式:扣子智能体

完整智能体如下:

测试输入:

规划一次 5 天的云南旅行,预算 12000 元,出发地:广州,明天 2025 年 7 月 4 日出发

运行结果:

大家若有编程基础的话,可以参考下面的代码案例来实现与体验不同场景下使用 ReAct 提示。

代码实现ReAct提示

技术栈:Python;LangChain

代码引用包导入:

pip install langchain_community==0.3.26;
pip install langchain==0.3.26;

具体代码:

import os
import random
from typing import Dict

from dotenv import load_dotenv
from langchain.agents import initialize_agent, Tool
from langchain.prompts import PromptTemplate
from langchain_community.chat_models import ChatZhipuAI


def weather_api(input_str: str) -> Dict[str, str]:
    """处理天气查询"""
    location = input_str.strip("'\" ")  # 去除引号和空格
    weathers = ["晴朗", "多云", "小雨", "阵雨"]
    return {
        "weather": random.choice(weathers),
        "temperature": f"{random.randint(10, 25)}℃",
        "location": location
    }


def flight_api(input_str: str) -> dict[str, int | str] | dict[str, str]:
    """处理机票查询"""
    try:
        from_city, to_city = [c.strip("'\" ") for c in input_str.split(",")]
        return {
            "price": random.randint(800, 3000),
            "from": from_city,
            "to": to_city
        }
    except Exception as e:
        return {"error": f"输入格式错误: {str(e)}"}


# 工具注册
tools = [
    Tool(
        name="weather",
        description="查询城市天气(输入格式:'城市名';输出:天气和温度)",
        func=weather_api,
    ),
    Tool(
        name="flight",
        description="查询机票价格(输入格式:'出发地,目的地';输出:价格)",
        func=flight_api
    ),
]

# 初始化 LLM
load_dotenv()

llm = ChatZhipuAI(
    model="glm-4",
    api_key=os.getenv("ZHIPUAI_API_KEY")
)

react_prefix = """你是一个智能旅行规划助手,可以调用以下工具:
{tools}

任务:{input}

请遵循以下格式进行推理和行动:
思考:首先需要做什么?
行动:调用工具名称(如 weather、flight)
观察:工具返回的结果
...(重复思考-行动-观察步骤)
最终答案:完整的旅行规划"""

react_prompt = PromptTemplate(
    template=react_prefix,
    input_variables=["input", "tools"],
)

from langchain.agents import AgentType

agent = initialize_agent(
    tools=tools,
    llm=llm,
    agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
    prompt=react_prompt,
    verbose=True,  # 打印中间步骤
    max_iterations=20,  # 限制最大推理步骤
)

user_input = "规划一次5天的云南旅行,预算12000元,从广州出发"
print("正在规划旅行,请稍候...")
response = agent.run(user_input)
print("最终规划结果:\n", response)

代码运行输出的中间结果,看起来就像我们在做这个任务的思考与行动过程,挺有意思的。

总结与思考

        ReAct 提示与自动推理并使用工具(ART)提示,都有着让 LLM 自动规划任务,推理并使用工具的含义,那么不免产生对比的好奇。

维度

ReAct

自动推理并使用工具(ART)

核心思想

通过交替进行“推理(Reasoning)”和“行动(Action)”,让LLM在任务中自主选择动作并执行。

引导LLM自动生成多步推理链,并动态调用外部工具来完成复杂任务。

是否依赖工具调用

是,LLM需决定何时调用工具(如API、搜索)。

是,LLM主动选择和调用合适的工具链。

是否强调推理步骤

是,LLM需先进行逻辑推理,再决定下一步操作。

是,强调生成明确的推理路径以支持工具调用。

是否生成可执行代码

否,仅生成自然语言推理和动作指令。

否,主要生成自然语言推理和工具调用描述。

输出形式

推理步骤 + 动作选择(如调用搜索引擎、数据库查询)

多步推理链 + 工具调用序列(如API调用、计算器)

是否支持动态交互

是,根据中间结果调整后续推理路径。

是,根据当前状态动态调整工具调用顺序。

是否适合非结构化任务

是,适用于自然语言理解+工具调用结合的任务。

是,尤其适合需要实时数据或多个工具协作的任务。

资源消耗

中等(取决于调用的工具数量)。

高(可能涉及多次网络请求、API调用)。

可解释性

高,推理路径清晰,动作选择透明。

高,推理过程与工具调用逻辑分离明确。

典型指令示例

“请一步步思考如何解决这个问题,并在需要时调用计算器或搜索最新数据。”

“请生成一个包含多步推理的思维链,并在适当位置调用相关工具完成计算或获取信息。”

一句话总结:

        ReAct 更强调“推理+动作”的交替循环,适用于模拟人类行为的交互式任务;而 ART 更注重“多步推理链+工具调用”的自动化流程,在需要访问外部数据和服务的复杂任务中表现更强。

好了,到此吧。


提示技术系列,截止到目前为止已经写了12篇,它们分别是:零样本;少样本;链式思考(CoT);自我一致性;生成知识提示;链式提示;主动提示;思维树(TOT);自动提示工程师;方向性刺激提示;自动推理并使用工具;程序辅助语言模型;

接下来分享:检索增强生成 (RAG) ?

为了方便大家学习,这里给出专栏链接:https://blog.csdn.net/quf2zy/category_12995183.html

欢迎大家一起来学习与交流……