掘金 人工智能 7小时前
0基础进大厂,第13天:AI-ReAct——思维链式调用API
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文详细介绍了AI-ReAct模式,这是一种强大的LLM设计范式,旨在增强大模型的决策和推理能力。通过结合语言模型(LLM)的思考推理与外部工具的调用执行,ReAct模式能够将复杂问题分解,一步步解决。文章通过一个股票助手案例,演示了如何构建ReAct Agent,包括准备工作(API密钥、依赖安装)、设计核心提示词(Prompt)、定义工具函数以及实现关键的对话循环逻辑。重点解析了正则表达式在解析模型回复、触发工具调用中的作用,以及状态保持、结构化交互和循环推理等关键设计特点,最终使AI能够像人类一样主动获取信息并给出综合答案。

✨ **ReAct模式的核心是“推理与行动”的结合,** 它通过让大模型(LLM)将复杂问题分解为一系列小步骤,并在必要时调用外部工具来获取信息,从而模拟人类的决策和推理过程。这种设计显著提升了AI处理复杂任务的能力。

🛠️ **工具集成是ReAct模式的关键组成部分,** 文章通过定义一个名为`get_closing_price`的股票查询工具,展示了如何为AI提供访问外部数据源的能力。通过结构化的工具描述和参数定义,AI能够准确理解并调用合适的工具来完成任务。

🔄 **对话循环与状态保持是ReAct Agent运作的基础,** Agent通过维护一个`messages`列表来保存完整的对话历史,确保AI能够理解上下文并连续进行推理。循环结构使得AI能够根据AI的回复,决定是继续思考、调用工具,还是直接给出最终答案。

🔍 **正则表达式在ReAct模式中扮演着至关重要的解析角色,** 它用于从AI的回复中精确提取“最终答案”或“Action”(工具调用指令)及相应的“Action Input”(工具参数),是实现AI与工具之间结构化交互的关键技术。

💡 **ReAct模式的整体设计强调了AI的自主性和灵活性,** 通过预定义的提示词模板引导AI进行思考和规划,并允许AI根据问题需要主动选择是否使用工具、调用哪个工具以及输入什么参数。这种设计使得AI能够更有效地解决需要多步推理和外部信息支持的问题。

引言

在第9天和第10天,我们分别学习了AI的基础入门知识——如何开启与AI的循环对话、如何引入第三方接口。今天来聊聊如何让AI模拟人类做出决策的思维推理过程。

Agent 智能体

什么是ReAct?

准备工作

这里依然选用deepseek的API服务

依赖安装

需要的依赖

创建一个llm.py文件
// 若为首次引入,需要在终端输入 pip install openaiimport openai from OpenAIclient = OpenAI(    api_key = "放上你的密钥",    base_url="https://api.deepseek.com/v1")
创建一个tools.py文件

这个文件专门用来存放调用外部接口的工具函数,这里自定义一个函数模拟外部接口

# 工具列表,第三方函数的说明书tools =[     {    "name": "get_closing_price",    "description": "使用该工具获取指定的股票信息",    "parameters": {        "type": "object",        "properties": {            "name": {                "type": "string",                "description": "股票名称,例如:贵州茅台、青岛啤酒"            }        },        "required": ["name"]    }}]def get_closing_price(name):    if name == "贵州茅台":        return "1488.21"    elif name == "青岛啤酒":        return "67.92"    else:        return "未找到相关信息"
创建一个prompt.py文件

这个文件是一个专门用来设计提示词的文件,也是AI-ReAct的核心,提示词会引导大模型该如何思考、并嵌套了变量,告诉大模型应该做出什么样的行动

# 使用三引号"""创建多行字符串,可以保留字符串中的换行和格式REACT_PROMPT = """{instructions}TOOLS:------您可以使用以下工具:{tools}使用工具时,请使用以下格式: ``思考: 我需要使用工具吗? 是行动: 要采取的行动,必须是[{tool_names}]其中之一行动输入: 该行动的输入内容``然后等待人类使用 Observation 回复您操作的结果。... (这个思考/行动/行动输入/观察可以重复 N 次)当您有回应要对人类说,或者不需要使用工具时,您必须使用以下格式:``思考: 我需要使用工具吗? 否最终答案: [在此输入您的回应]``开始!新输入: {input}"""
创建一个agent.py文件

这是一个主文件
1-20行都是简单的代码,就是导包和定义了一个发送消息的函数
这里主要介绍循环部分,是如何利用提示词模板引导大模型的

# 导入所需的库import json  # 用于处理JSON数据from llm import client  # 导入LLM客户端from prompt import REACT_PROMPT  # 导入预设的提示模板from tools import get_closing_price,tools  # 导入工具函数import re  # 导入正则表达式库# 定义发送消息到LLM的函数def send_messages(messages):    """    向LLM发送消息并获取响应    :param messages: 消息列表    :return: LLM的响应    """    response = client.chat.completions.create(        model="deepseek-chat",  # 使用deepseek-chat模型        messages=messages,  # 传入消息列表        temperature=0.1,  # 设置温度参数,控制生成文本的随机性    )    return responseif __name__ == "__main__":    # 设置助手的角色说明    instructions = "你是一个股票助手,可以回答股票相关的问题"    # 设置用户查询    query = "青岛啤酒和贵州茅台的收盘价哪个贵?"        # 使用模板构建完整的提示    prompt = REACT_PROMPT.format(instructions=instructions,tools=tools,tool_names="get_closing_price",input=query)        # 初始化消息列表    messages = [{"role": "user", "content": prompt}]    # 开始对话循环    while True:        # 发送消息并获取响应        # print("发送消息到模型...", messages)        response = send_messages(messages)        response_text = response.choices[0].message.content        # 打印模型的回复        print("大模型的回复:")        print(response_text)        # 检查是否有最终答案        # 使用正则表达式搜索回复文本中是否包含"Final Answer:",\s*匹配任意空白字符,(.*)捕获冒号后面的所有内容        final_answer_match = re.search(r'最终答案:\s*(.*)', response_text)        if final_answer_match:            # 从正则匹配结果中提取第一个捕获组(括号内匹配到的内容),即"Final Answer:"后面的文本内容            final_answer = final_answer_match.group(1)            print("最终答案:", final_answer)            # 如果有最终答案,结束对话            break        # 将模型的回复添加到消息历史        messages.append(response.choices[0].message)        # 解析模型回复中的动作和参数        action_match = re.search(r'Action:\s*(\w+)', response_text)        action_input_match = re.search(r'Action Input:\s*({.*?}|".*?")', response_text, re.DOTALL)  # 非贪婪匹配,匹配到第一个"}"或"""        # 如果成功解析到动作和参数        if action_match and action_input_match:            tool_name = action_match.group(1)  # 获取工具名称            params = json.loads(action_input_match.group(1))  # 解析参数            print("工具名称:", tool_name)            print("参数:", params)            if tool_name == "get_closing_price":                observation = get_closing_price(params["name"])  # 调用工具函数                print("调用第三方API结果:", observation)                # 将观察结果添加到消息历史                messages.append({'role': 'user', 'content': f"observation:{observation}"})

AI-ReAct案例的整体工作逻辑

这个案例实现了一个 ReAct(Reasoning and Acting) 模式的AI Agent,它可以:

    推理:分析问题并决定是否需要使用工具行动:调用外部工具获取信息观察:处理工具返回的结果循环:重复上述过程直到得出最终答案

对话循环部分代码详解

让我逐步分析 agent.py 中的对话循环:

while True:    # 1. 发送消息并获取响应    response = send_messages(messages)    response_text = response.choices[0].message.content        # 2. 检查是否有最终答案    final_answer_match = re.search(r'最终答案:\s*(.*)', response_text)    if final_answer_match:        final_answer = final_answer_match.group(1)        print("最终答案:", final_answer)        break  # 找到最终答案,退出循环        # 3. 将模型回复添加到消息历史    messages.append(response.choices[0].message)        # 4. 解析模型回复中的动作和参数    action_match = re.search(r'Action:\s*(\w+)', response_text)    action_input_match = re.search(r'Action Input:\s*({.*?}|".*?")', response_text, re.DOTALL)        # 5. 如果解析到动作,执行工具调用    if action_match and action_input_match:        tool_name = action_match.group(1)        params = json.loads(action_input_match.group(1))                if tool_name == "get_closing_price":            observation = get_closing_price(params["name"])            # 将观察结果添加到消息历史            messages.append({'role': 'user', 'content': f"observation:{observation}"})

为什么需要正则表达式?

正则表达式在这里起到了结构化解析的作用:

1. 检测最终答案

final_answer_match = re.search(r'最终答案:\s*(.*)', response_text)

2. 解析工具调用

action_match = re.search(r'Action:\s*(\w+)', response_text)action_input_match = re.search(r'Action Input:\s*({.*?}|".*?")', response_text, re.DOTALL)

工作流程示例

以查询"青岛啤酒和贵州茅台的收盘价哪个贵?"为例:

第一轮对话:

用户输入 → AI回复:思考: 我需要使用工具吗? 是行动: get_closing_price  行动输入: {"name": "青岛啤酒"}

系统处理:

第二轮对话:

AI收到observation:67.92 → AI回复:思考: 我需要使用工具吗? 是行动: get_closing_price行动输入: {"name": "贵州茅台"}

第三轮对话:

AI收到observation:1488.21 → AI回复:思考: 我需要使用工具吗? 否最终答案: 贵州茅台的收盘价(1488.21)比青岛啤酒(67.92)贵

关键设计特点

    状态保持:通过 messages 列表维护完整的对话历史结构化交互:使用预定义的格式让AI按照特定模式回复工具集成:通过正则表达式解析实现工具调用循环推理:直到找到最终答案才结束

这种设计让AI能够像人类一样进行多步推理,在需要时主动获取外部信息,最终给出综合的答案。

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

AI-ReAct 大模型 智能体 LLM 工具调用
相关文章