【llm_inference】react框架(最小code实现)
ReAct:结合推理和行动的大语言模型推理架构
GitHub Code: 人人都能看懂的最小实现
引言
在人工智能领域,大语言模型(LLM)的应用日益广泛,但如何让模型能够像人类一样,在思考的基础上采取行动,并根据行动结果继续推理,这是一个重要的研究方向。ReAct(Reasoning + Acting)推理架构就是为解决这一问题而生的。本文将深入剖析 ReAct 推理架构的实现原理和具体应用。
ReAct 架构概述
ReAct 是一种结合了推理(Reasoning)和行动(Acting)的语言模型推理架构。它允许模型在回答问题时,通过不断的思考、采取行动、观察结果,最终得出答案。这种方式模拟了人类解决问题的过程,使得模型的推理过程更加透明和可控。
核心组件
- 思考(Thought):模型对当前情况进行分析和推理
- 行动(Action):根据推理结果选择并执行特定工具
- 观察(Observation):获取行动的结果
- 最终答案(Final Answer):综合所有信息得出的结论
技术实现解析
1. 工具定义
class WebSearch:def __init__(self, name:str='web_search', threshold:int=8000):self.system_prompt = """
你是一位洞察研究员。
1. 为用户查询寻找详细信息,并尽可能简单地将内容总结为一句话
2. 如果用户的问题是关于具体数值的,只返回数值结果,不需要任何额外解释。
"""self.name = nameself.description = "用于网络搜索的工具"
这个实现展示了如何定义一个工具类,每个工具都包含:
- 名称(name)
- 描述(description)
- 系统提示(system_prompt)
- 执行逻辑(__call__方法)
2. 推理流程实现
ReAct 的核心推理流程通过 react 函数实现:
def react(question: str, tools: List[Callable]) -> str:# 构建提示模板# 循环执行推理过程# 解析响应并执行工具# 返回最终答案
关键步骤解析:
-
提示词构建
- 将可用工具信息注入到提示模板中
- 设定标准化的输出格式
- 引导模型按照 Thought-Action-Observation 循环进行推理
-
循环推理过程
- 获取模型响应
- 解析响应中的行动指令
- 执行相应工具
- 将观察结果反馈给模型
-
结果处理
- 使用正则表达式提取最终答案
- 格式化输出结果
实现细节深度解析
1. 消息格式化
def format_message(messages: List[Dict], last_content_length: int = 0) -> int:"""格式化打印新增的消息内容"""
这个函数巧妙地实现了增量式的消息打印,通过记录上次打印的内容长度,只打印新增的内容,提高了交互体验。
2. 工具执行机制
工具执行采用了装饰器模式,通过 __call__ 方法实现了统一的调用接口:
def __call__(self, query:str):results = serpapi_search(query)msg = [{"role":"system","content":self.system_prompt},{"role":"user", "content": f"查询内容是:{query},搜索结果是:{results}"}]answer = get_model_response_sync(model_name="deepseek-chat", messages=msg)return answer
3. 正则表达式解析
使用正则表达式精确提取模型响应中的关键信息:
regex = r"Action: \[(.*?)\][\s]*Action Input: (.*?)(?:\n|$)"
action_match = re.search(regex, response, re.DOTALL)
应用示例
以下是一个实际的应用示例:
def main():query = "2024年欧洲杯和2024年美洲杯冠军"print("\n🚀 Starting new query:", query)search_tool = WebSearch()tools = [search_tool]result = react(query, tools)print("最终答案:")print(result)
这个例子展示了如何使用 ReAct 架构来回答一个需要实时信息的问题。系统会:
- 初始化搜索工具
- 提交查询
- 通过反复推理和搜索
- 最终得出答案
总结
ReAct 推理架构为大语言模型提供了一个强大的推理框架,使其能够像人类一样思考和行动。通过将推理过程分解为思考、行动和观察三个步骤,不仅提高了模型的推理能力,还增强了推理过程的可解释性。
这种架构特别适合需要多步推理和外部工具调用的复杂任务,例如信息搜索、数据分析等。通过合理的工具设计和灵活的扩展机制,ReAct 架构可以适应各种不同的应用场景。
相关文章:
【llm_inference】react框架(最小code实现)
ReAct:结合推理和行动的大语言模型推理架构 GitHub Code: 人人都能看懂的最小实现 引言 在人工智能领域,大语言模型(LLM)的应用日益广泛,但如何让模型能够像人类一样,在思考的基础上采取行动,…...
PT8M2103 触控 I/O 型 8-Bit MCU
1 产品概述 ● PT8M2103 是一款可多次编程(MTP)I/O 型8位 MCU,其包括 2K*16bit MTP ROM、256*8bit SRAM、PWM、Touch 等功能,具有高性能精简指令集、低工作电压、低功耗特性且完全集成触控按键功能。为各种触控按键的应用,提供了一种简单而又…...
英语时态学习+名词副词形容词变形方式
开发出头不容易 不如跨界卷英语 英语中的16种时态是由四种时间(现在、过去、将来、过去将来)和四种体(一般、进行、完成、完成进行)组合而成的。以下是每种时态的详细说明和例句: 一般现在时 (Simple Present) 用法…...
浏览器解析页面流程
从输入一个url到页面解析完成的流程 1. 网络进程 1. 获取url 浏览器首先判断输入的url是否有http缓存,如果有则直接从http缓存中读取数据并显示。如果没有,则进行下一步。进行DNS解析,获取域名对应的IP地址。 2.下载html文件 浏览器根据I…...
图的遍历之DFS邻接矩阵法
本题要求实现一个函数,对给定的用邻接矩阵存储的无向无权图,以及一个顶点的编号v,打印以v为起点的一个深度优先搜索序列。 当搜索路径不唯一时,总是选取编号较小的邻接点。 本题保证输入的数据(顶点数量、起点的编号等…...
Java --- JVM编译运行过程
目录 一.Java编译与执行流程: 二.编译过程: 1.编译器(javac): 2.字节码文件(.class): 三.执行过程: 1.启动JVM(Java虚拟机): 2…...
HTML5 拖拽 API 深度解析
一、HTML5 拖拽 API 深度解析 1.1 背景与发展 HTML5 的拖拽 API 是为了解决传统拖拽操作复杂而设计的。传统方法依赖鼠标事件和复杂的逻辑计算,而 HTML5 提供了标准化的拖拽事件和数据传递机制,使得开发者能够快速实现从一个元素拖拽到另一个元素的交互…...
GO--基于令牌桶和漏桶的限流策略
至于为什么要限流,字面意思已经很清楚了,就是为了减轻服务器的压力 下面我们将介绍两个限流策略----漏桶和令牌桶。 漏桶 原理介绍 漏桶,顾名思义就是一个漏斗,漏斗嘴的大小是固定的,所以不管漏斗现容量多大&#…...
MongoDB性能监控工具
mongostat mongostat是MongoDB自带的监控工具,其可以提供数据库节点或者整个集群当前的状态视图。该功能的设计非常类似于Linux系统中的vmstat命令,可以呈现出实时的状态变化。不同的是,mongostat所监视的对象是数据库进程。mongostat常用于…...
Axure设计之模拟地图人员移动轨迹
在产品原型设计时,为了更好的表达和呈现预期的效果,让客户或开发看一眼就能理解要实现的功能,往往需要在产品设计时尽量去接近现实,这就需要我们在使用Axure制作原型时应具有高度细节和逼真度的原型设计。原型设计不仅包含了产品的…...
Android环境搭建
Android环境搭建 第一步:安装 Homebrew 执行以下命令来安装 Homebrew: /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"检测是否安装成功: brew --version第二步:安装 No…...
前端工程化面试题(一)
如何使用 Docker 部署前端项目? 使用 Docker 部署前端项目通常涉及以下几个步骤: 创建项目:首先,需要在本地创建并配置好前端项目。 准备 Docker 文件: .dockerignore:这个文件用于排除不需要上传到 Dock…...
模型案例:| 手机识别模型!
导读 2023年以ChatGPT为代表的大语言模型横空出世,它的出现标志着自然语言处理领域取得了重大突破。它在文本生成、对话系统和语言理解等方面展现出了强大的能力,为人工智能技术的发展开辟了新的可能性。同时,人工智能技术正在进入各种应用领…...
期权懂|个股期权交割操作流程是什么样的?
期权小懂每日分享期权知识,帮助期权新手及时有效地掌握即市趋势与新资讯! 个股期权交割操作流程是什么样的? 一、行权申报: 期权买方在行权日通过其经纪商提交行权指令,表明其决定行使期权权利。 二、行权匹配…...
【openGauss】openGauss execute执行update语句,获取更新的行数
【openGauss】openGauss execute执行update语句,获取更新的行数 在openGauss中,可以使用execute语句执行update语句,并通过GET DIAGNOSTICS语句获取更新的行数。下面是一个示例: DO $$ DECLAREupdated_rows INTEGER; BEGINEXECUT…...
P8780 [蓝桥杯 2022 省 B] 刷题统计
题目描述 小明决定从下周一开始努力刷题准备蓝桥杯竞赛。他计划周一至周五每天做 𝑎道题目,周六和周日每天做 𝑏 道题目。请你帮小明计算,按照计划他将在第几天实现做题数大于等于 𝑛 题? 输入格式 输入一行包含三…...
切比雪夫不等式:方差约束下的概率估计
切比雪夫不等式:方差约束下的概率估计 背景 在概率分析中,切比雪夫不等式是一个常用的工具,它通过引入随机变量的 方差信息,给出了偏离均值的概率界限。这一不等式是对 马尔科夫不等式 的自然扩展,结合了更丰富的分布…...
使用CancellationTokenSource来控制长时间sql查询中断
前端 <!-- 透明的覆盖层,显示在页面上方,包含进度条 --><Grid Visibility"{Binding IsLoading}" Background"Transparent" HorizontalAlignment"Stretch" VerticalAlignment"Stretch" ZIndex"1&…...
小红薯最新x-s 算法补环境教程12-06更新(下)
在上一篇文章中已经讲了如何去定位x-s生成的位置,本篇文章就直接开始撸代码吧 如果没看过的话可以看:小红薯最新x-s算法分析12-06(x-s 56)(上)-CSDN博客 1、获取加密块代码 首先来到参数生成的位置&…...
wazuh-modules-sca
wazuh中安全配置评估模块主线程执行wm_sca_main最后在wm_sca_start中循环执行,不会返回 // Module main function. It wont return #ifdef WIN32 DWORD WINAPI wm_sca_main(void *arg) {wm_sca_t *data (wm_sca_t *)arg; #else void * wm_sca_main(wm_sca_t * dat…...
从LCD屏幕到车载摄像头:聊聊LVDS接口在你身边那些‘看不见’的应用
从LCD屏幕到车载摄像头:聊聊LVDS接口在你身边那些‘看不见’的应用 走在科技产品琳琅满目的商场里,你可能不会注意到,那些让你眼前一亮的4K显示屏、流畅的触控体验,甚至自动驾驶汽车里的"眼睛",背后都藏着一…...
Altium Designer 21 规则设置保姆级指南:从新手到老鸟,这些默认值千万别乱动
Altium Designer 21 规则设置实战精要:默认值的智慧与关键调整策略 作为一名从学生时代就开始使用Altium Designer的硬件工程师,我至今记得第一次打开规则设置面板时的眩晕感——密密麻麻的选项像是一道道关卡,让人既想全部征服又担心误操作导…...
网易云音乐API深度解析:模块化接口开发与实战应用指南
网易云音乐API深度解析:模块化接口开发与实战应用指南 【免费下载链接】NeteaseCloudMusicApiBackup 项目地址: https://gitcode.com/gh_mirrors/ne/NeteaseCloudMusicApiBackup 在当今音乐应用开发领域,后端服务的稳定性和可扩展性至关重要。网…...
手把手教你用Cubic为团队批量定制Ubuntu服务器模板镜像(含安全加固步骤)
企业级Ubuntu镜像定制实战:基于Cubic的自动化安全加固方案 在DevOps和云原生技术普及的今天,标准化系统镜像已成为企业IT基础设施的关键组成部分。想象一下这样的场景:当新服务器上线或集群需要扩容时,运维团队不再需要逐台安装系…...
Thorium浏览器实战指南:为什么这个Chromium分支能让你告别卡顿与隐私泄露?
Thorium浏览器实战指南:为什么这个Chromium分支能让你告别卡顿与隐私泄露? 【免费下载链接】thorium Chromium fork named after radioactive element No. 90. Source code and Linux releases. Windows/MacOS/ARM builds served in different repos, li…...
告别手动水印:如何用Semi-Utils将批量照片处理时间从5小时缩短到5分钟
告别手动水印:如何用Semi-Utils将批量照片处理时间从5小时缩短到5分钟 【免费下载链接】semi-utils 一个批量添加相机机型和拍摄参数的工具,后续「可能」添加其他功能。 项目地址: https://gitcode.com/gh_mirrors/se/semi-utils 还在为数百张照片…...
C-Eval:中文大模型能力评估的“高考”与诊断工具
1. 项目概述:为什么我们需要一个“中文大模型高考”?最近两年,大模型的热度居高不下,各种评测榜单也层出不穷。但不知道你有没有发现一个现象:很多号称在某某英文评测集上“刷”到SOTA(State-of-the-Art&am…...
模力方舟与口袋龙虾:开源中国的AI云端与端侧协同生态解析
本文解析开源中国通过“模力方舟”与“口袋龙虾”平台构建的AI协同生态。该生态旨在解决AI开发与落地中的资源分散与端侧部署难题,为开发者、企业及终端用户提供从云端资源调用到边缘智能部署的一站式通路。核心结论是,这种“云-边-端”协同模式降低了技…...
taotoken api密钥管理与审计日志保障ubuntu服务器访问安全
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 Taotoken API密钥管理与审计日志保障Ubuntu服务器访问安全 1. 场景概述 在基于Ubuntu的服务器环境中集成大模型服务,安…...
避开HAL库:STM32F103寄存器级PWM移相全桥配置避坑指南
STM32F103寄存器级PWM移相全桥实战:从原理到避坑指南 在嵌入式开发领域,许多工程师习惯使用HAL库或标准库进行STM32开发,这确实能提高开发效率。但当项目对时序精度、资源占用或性能有极致要求时,直接操作寄存器往往能带来更优的效…...
