当前位置: 首页 > news >正文

[Agent]AI Agent入门02——ReAct 基本理论与实战

ReAct介绍

ReAct(Reasoning and Acting)是一种通过协同推理(Reasoning)与行动(Acting)提升大语言模型(LLM)任务解决能力的技术。其核心思想是在解决复杂问题时交替生成推理和动作,形成闭环的决策流程。通过交叉推理和行动,ReAct 使智能体能够动态地在产生想法和特定于任务的行动之间交替,动态地处理复杂任务并提高决策的准确性和可靠性。

ReAct提出的动机

传统LLM在处理复杂任务时,常面临两大局限:

  • 推理孤立性:链式思维(CoT)仅依赖内部推理,易产生“幻觉”或错误传播。
  • 行动单一性:动作生成方法(API调用)缺乏动态调整能力,导致效率低下。

ReAct通过交替生成推理轨迹与任务动作,实现了两者的协同。例如,在问答任务中,模型先推理所需信息,再通过搜索API获取数据,最后结合反馈更新答案,形成“思考→行动→观察”的循环

核心流程

ReAct的核心流程为Thought → Action → Observation的迭代循环:

  • 推理(Thought) :分解任务目标,规划行动步骤。例如,在医疗诊断中,模型可能推理“需查询患者病史与近期检查结果”。
  • 行动(Action) :执行具体操作(如调用API、检索数据库)。例如,向医院系统发送数据请求。
  • 观察(Observation) :获取外部反馈(如返回的检查报告),并更新上下文信息。

**内部推理决定下一步行动的方向,外部数据修正或补充推理过程。**这一机制使模型能动态调整策略,避免CoT的静态推理局限

ReAct实战

LangGraph中实现了预构建的ReAct代理,但为了进一步理解ReAct的原理,这里我们使用 LangGraph 从零开始实现 ReAct 代理。

1. 定义模型和工具

在定义图时,首要任务是确定图的状态。状态由两部分构成,即图的模式以及 reducer 函数。

  • 图的模式涵盖了图中所有节点和边的输入模式,它可以采用 TypedDictPydantic 模型的形式来呈现。默认情况下,图将具有相同的输入和输出模式,但也可以通过自定义InputStateOutputState来为图定义不同的输入和输出模式。

  • 节点会发出对状态的更新,随后借助所指定的 reducer 函数来把这种更新应用到状态上,以此来实现对图状态的管理和调整。如果未显式指定 reducer 函数,则对该键的更新会覆盖原来的内容。

from typing import Annotated,Sequence,TypedDict
from langchain_core.messages import BaseMessage
from langgraph.graph.message import add_messagesclass AgentState(TypedDict):messages: Annotated[Sequence[BaseMessage], add_messages]

这里用本地模型,通过ollama调用

from langchain_openai import ChatOpenAImodel = ChatOpenAI(model="deepseek-r1:8b", temperature=0.0, api_key="ollama", base_url="http://localhost:11434/v1"
)

2. 构建工具函数

在 LangChain 中,@tool 是一个装饰器,它标识了该函数是一个可供智能体(Agent)使用的工具,智能体会根据设置的策略来决定是否调用以及何时调用该工具。

当智能体需要完成某个任务时,会根据任务的性质和上下文,判断是否需要调用已定义的工具。

工具函数的返回值会被智能体捕获并处理,以便将其整合到最终的回答或后续的处理流程中。

from langchain_core.tools import tool@tool
def get_weather(location: str):"""Call to get the weather from a specific location."""if any([city in location.lower() for city in ["sf", "san francisco"]]):return "It's sunny in San Francisco, but you better look out if you're a Gemini."else:return f"I am not sure what the weather is in {location}"tools = [get_weather]

3. 构建大模型链

如果是chatgpt或claude模型,可以直接绑定工具

model = model.bind_tools(tools)

但是deepseek不支持bind_tools函数,所以这里用prompt来指示大模型:

from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplatetool_descriptions = "\n".join([f"- {tool.name}: {tool.description}" for tool in tools])
prompt = ChatPromptTemplate.from_messages([("system", """你是一个有帮助的AI助手。当你需要信息时,使用以下工具之一:
{tool_descriptions}要使用工具,请按以下格式回应:
ACTION: tool_name
ACTION_INPUT: 工具的输入如果你不需要使用工具,直接回应用户即可。"""),("user", "{input}")
])chain = prompt | model | StrOutputParser()

4. 构建节点

在基本的 ReAct 代理中,只有两个节点,一个用于调用模型,另一个用于使用工具。

import json
from langchain_core.messages import ToolMessage, SystemMessage
from langchain_core.runnables import RunnableConfigtools_by_name = {tool.name: tool for tool in tools}def tool_node(state: AgentState):outputs = []last_message = state["messages"][-1]content = last_message.content# 解析模型输出中的ACTION和ACTION_INPUTif "ACTION:" in content and "ACTION_INPUT:" in content:action_line = content.split("ACTION:")[1].split("\n")[0].strip()tool_name = action_lineinput_line = content.split("ACTION_INPUT:")[1].split("\n")[0].strip()tool_input = input_linetool_result = tools_by_name[tool_name].invoke(tool_input)outputs.append(ToolMessage(content=json.dumps(tool_result),name=tool_name,tool_call_id="1",  ))return {"messages": outputs}def call_model(state: AgentState, config: RunnableConfig):user_input = state["messages"][-1].content if hasattr(state["messages"][-1], "content") else state["messages"][-1][1]response = chain.invoke({"input": user_input, "tool_descriptions": tool_descriptions})from langchain_core.messages import AIMessageai_message = AIMessage(content=response)return {"messages": [ai_message]}

should_continue 函数是一个判断智能体对话是否继续的函数,它的作用是根据智能体当前的状态来决定是否继续对话,或者结束对话

这个函数在多轮对话的智能体中起到关键的控制作用,帮助智能体根据自身的状态和对话进程来决定是否继续与用户进行对话,从而合理地管理和引导对话的走向,避免不必要的对话延续或者过早地结束对话。

def should_continue(state: AgentState):messages = state["messages"]last_message = messages[-1]content = last_message.content if hasattr(last_message, "content") else ""if "ACTION:" in content and "ACTION_INPUT:" in content:return "continue"else:return "end"

5. 构建图

StateGraph(AgentState) 表示这个状态图是基于 AgentState 这个状态类来构建的,表示智能体的工作流程。这个状态图定义了智能体在执行任务时的不同状态以及状态之间的转移条件和路径。

from langgraph.graph import StateGraph, ENDworkflow = StateGraph(AgentState)workflow.add_node("agent", call_model)
workflow.add_node("tools", tool_node)workflow.set_entry_point("agent")workflow.add_conditional_edges("agent",should_continue,{"continue": "tools","end": END,},
)
workflow.add_edge("tools", "agent")graph = workflow.compile()

6.查看流程图

from IPython.display import Image, displaytry:display(Image(graph.get_graph().draw_mermaid_png()))
except Exception:pass

生成的流程图如下:
在这里插入图片描述

7. 调用模型

定义了一个函数进行流式调用

def print_stream(stream):for s in stream:message = s["messages"][-1]if isinstance(message, tuple):print(message)else:message.pretty_print()inputs = {"messages": [("user", "what is the weather in sf")]}
print_stream(graph.stream(inputs, stream_mode="values"))

完整代码

from typing import Annotated,Sequence,TypedDict
from langchain_core.messages import BaseMessage
from langgraph.graph.message import add_messages
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplateclass AgentState(TypedDict):messages: Annotated[Sequence[BaseMessage], add_messages]from langchain_openai import ChatOpenAI
from langchain_core.tools import toolmodel = ChatOpenAI(model="qwen2.5:latest", temperature=0.0, api_key="ollama", base_url="http://localhost:11434/v1"
)@tool
def get_weather(location: str):"""Call to get the weather from a specific location."""if any([city in location.lower() for city in ["sf", "san francisco"]]):return "It's sunny in San Francisco, but you better look out if you're a Gemini."else:return f"I am not sure what the weather is in {location}"tools = [get_weather]tool_descriptions = "\n".join([f"- {tool.name}: {tool.description}" for tool in tools])
prompt = ChatPromptTemplate.from_messages([("system", """你是一个有帮助的AI助手。当你需要信息时,使用以下工具之一:
{tool_descriptions}要使用工具,请按以下格式回应:
ACTION: tool_name
ACTION_INPUT: 工具的输入如果你不需要使用工具,直接回应用户即可。"""),("user", "{input}")
])chain = prompt | model | StrOutputParser()import json
from langchain_core.messages import ToolMessage, SystemMessage
from langchain_core.runnables import RunnableConfigtools_by_name = {tool.name: tool for tool in tools}def tool_node(state: AgentState):outputs = []last_message = state["messages"][-1]content = last_message.contentif "ACTION:" in content and "ACTION_INPUT:" in content:action_line = content.split("ACTION:")[1].split("\n")[0].strip()tool_name = action_lineinput_line = content.split("ACTION_INPUT:")[1].split("\n")[0].strip()tool_input = input_linetool_result = tools_by_name[tool_name].invoke(tool_input)outputs.append(ToolMessage(content=json.dumps(tool_result),name=tool_name,tool_call_id="1",  ))return {"messages": outputs}def call_model(state: AgentState, config: RunnableConfig):user_input = state["messages"][-1].content if hasattr(state["messages"][-1], "content") else state["messages"][-1][1]response = chain.invoke({"input": user_input, "tool_descriptions": tool_descriptions})from langchain_core.messages import AIMessageai_message = AIMessage(content=response)return {"messages": [ai_message]}def should_continue(state: AgentState):messages = state["messages"]last_message = messages[-1]content = last_message.content if hasattr(last_message, "content") else ""if "ACTION:" in content and "ACTION_INPUT:" in content:return "continue"else:return "end"from langgraph.graph import StateGraph, ENDworkflow = StateGraph(AgentState)workflow.add_node("agent", call_model)
workflow.add_node("tools", tool_node)workflow.set_entry_point("agent")workflow.add_conditional_edges("agent",should_continue,{"continue": "tools","end": END,},
)
workflow.add_edge("tools", "agent")graph = workflow.compile()from IPython.display import Image, displaytry:display(Image(graph.get_graph().draw_mermaid_png()))
except Exception:passdef print_stream(stream):for s in stream:message = s["messages"][-1]if isinstance(message, tuple):print(message)else:message.pretty_print()inputs = {"messages": [("user", "what is the weather in sf")]}
print_stream(graph.stream(inputs, stream_mode="values"))

相关文章:

[Agent]AI Agent入门02——ReAct 基本理论与实战

ReAct介绍 ReAct(Reasoning and Acting)是一种通过协同推理(Reasoning)与行动(Acting)提升大语言模型(LLM)任务解决能力的技术。其核心思想是在解决复杂问题时交替生成推理和动作&a…...

uniapp自定义头部(兼容微信小程序(胶囊和状态栏),兼容h5)

很早之前就写过自定义头部,但是那时偷懒写死了,现在用插槽重新写了个 有两种形式: type1是完全自定义的,可以自己去组件改也可以用插槽改 type2是正常的返回标题和右边按钮,使用就是 title"标题" rightClic…...

mybatis的xml ${item}总是更新失败

场景 代码如下 void updateStatus(Param("deviceSerialIdCollection") Collection<String> deviceSerialIdCollection, Param("status") Integer status);<update id"updateStatus">UPDATE gb_monitor SET online#{status} WHERE d…...

数据库- JDBC

标题目录 JDBC基本概念JDBC 接口JDBC 工作原理 JDBC APIJDBC工作过程Driver 接口及驱动加载Connection 接口Statemen 接口ResultSet 接口PreparedStatement 接口 JDBC 基本概念 Java Database Connectivity&#xff1a;java访问数据库的解决方案希望用相同的方式访问不同的数…...

[26] cuda 应用之 nppi 实现图像格式转换

[26] cuda 应用之 nppi 实现图像格式转换 讲述 nppi 接口定义通过nppi实现 bayer 格式转rgb格式官网参考信息:http://gwmodel.whu.edu.cn/docs/CUDA/npp/group__image__color__debayer.html#details1. 接口定义 官网关于转换的原理是这么写的: Grayscale Color Filter Array …...

MYSQL-OCP官方课程学习截图

第一节 介绍...

医院信息管理系统全解析

目录 一、医院信息管理系统是什么 1. 概念阐释 2. 核心功能概述 二、医院信息管理系统的种类 1. 医院信息系统&#xff08;HIS&#xff09; 2. 电子病历系统&#xff08;EMR&#xff09; 3. 实验室信息管理系统&#xff08;LIS&#xff09; 三、医院信息管理系统的实际…...

模型上下文协议(MCP):技术解析与生态发展

一、概念与目标 模型上下文协议&#xff08;Model Context Protocol&#xff0c;MCP&#xff09;是由Anthropic于2024年11月推出的开源协议&#xff0c;旨在为大语言模型&#xff08;LLM&#xff09;与外部工具、数据源提供标准化的双向通信框架。其核心目标是打破数据孤岛&am…...

laravel中layui的table翻页不起作用问题的解决

本地测试是好的&#xff0c;部署的时候就发现&#xff0c;翻页不起作用了。但lay_num序号是可以变化的&#xff0c;查看api接口传递的数据&#xff0c;发现数据没有变化&#xff0c;加上page2等翻页&#xff0c;也是不起作用&#xff0c;看来是url参数返回给后台&#xff0c;后…...

python上测试neo4j库

安装完了neo4j库后&#xff0c;如何使用。用python来小试牛刀 1.从其他博客上找来demo #coding:utf-8 from py2neo import Graph,Node,Relationship##连接neo4j数据库&#xff0c;输入地址、用户名、密码 graph Graph(bolt://xx.xx.xx.xx:7687,userneo4j,passwordneo4j1234)…...

云原生周刊:Kubernetes v1.33 正式发布

开源项目推荐 Robusta Robusta 是一个开源的 K8s 可观测性与自动化平台&#xff0c;旨在增强 Prometheus 告警的智能化处理能力。它通过规则和 AI 技术对告警进行丰富化处理&#xff0c;自动附加相关的 Pod 日志、图表和可能的修复建议&#xff0c;支持智能分组、自动修复和高…...

网络安全入门综述

引言 在数字化时代&#xff0c;网络安全&#xff08;Cybersecurity&#xff09;已成为保护个人、企业和政府机构免受数字威胁的关键领域。随着互联网的普及、云计算的兴起以及物联网&#xff08;IoT&#xff09;设备的激增&#xff0c;网络攻击的频率和复杂性不断增加。从数据…...

LLaMA-Factory部署以及大模型的训练(细节+新手向)

LLaMA-Factory 经过一段时间的探索&#xff0c;从手动编写训练代码到寻求框架辅助训练&#xff0c;遇到了各种各样的问题。前面我介绍了dify的部署&#xff0c;但是并没有详细介绍使用方式&#xff0c;是因为我在尝试利用dify的时候碰到了很多困难&#xff0c;总结下来首先就是…...

ASP.NET MVC​ 入门指南四

21. 高级路由配置 21.1 自定义路由约束 除了使用默认的路由约束&#xff0c;你还可以创建自定义路由约束。自定义路由约束允许你根据特定的业务逻辑来决定一个路由是否匹配。例如&#xff0c;创建一个只允许特定年份的路由约束&#xff1a; csharp public class YearRouteCo…...

rabbitmq-集群部署

场景&#xff1a;单个pod&#xff0c;部署在主节点&#xff0c;基础版没有插件&#xff0c;进阶版多了一个插件 基础版本&#xff1a; --- apiVersion: v1 kind: PersistentVolume metadata:name: rabbitmq-pv spec:capacity:storage: 5GiaccessModes:- ReadWriteOncestorage…...

明远智睿SSD2351开发板:开启工业控制新征程

在工业控制领域&#xff0c;对开发板的性能、稳定性和扩展性有着极高的要求。明远智睿的SSD2351开发板凭借其卓越的特性&#xff0c;为工业控制带来了全新的解决方案。 SSD2351开发板搭载四核1.4GHz处理器&#xff0c;强大的运算能力使其在处理工业控制中的复杂任务时游刃有余。…...

RISCV学习(5)GD32VF103 MCU架构了解

RISCV学习&#xff08;5&#xff09;GD32VF103 MCU架构了解 1、芯片内核功能简介 GD32VF103 MCU架构&#xff0c;采用Bumblebee内核&#xff0c;芯来科技&#xff08;Nuclei System Technology&#xff09;与台湾晶心科技&#xff08;Andes Technology&#xff09;联合开发&am…...

IDEA2022.3开启热部署

1、开启IDEA的自动编译 1.1 具体步骤&#xff1a;打开顶部工具栏 File -> Settings -> Build,Execution,Deployment -> Compiler 然后勾选 Build project automatically 。 1.2 打开顶部工具栏 File -> Settings -> Advanced Settings -> Compiler -> 然…...

《算法吞噬幻想乡:GPT-4o引发的艺术平权运动与版权核爆》

一、引言&#xff1a;现象级AI艺术事件的社会回响 GPT - 4o吉卜力风格刷屏现象 在当今数字化浪潮中&#xff0c;GPT - 4o吉卜力风格的作品在网络上掀起了一阵刷屏热潮。吉卜力工作室以其独特的水彩质感、奇幻氛围和孤独美学&#xff0c;在全球范围内拥有大量粉丝。而GPT - 4o强…...

yolov5 源码 +jupyter notebook 笔记 kaggle

YOLOv5 | Kaggle 直接用的githuab的源码&#xff0c;git clone 后output才有文件 直接gitclone他的源码用Vscode看 好久没见过16g了 怎么这么便宜 https://gadgetversus.com/graphics-card/nvidia-tesla-p100-pcie-16gb-vs-nvidia-geforce-rtx-4060/#google_vignette 好的&am…...

聊天室系统:多任务版TCP服务端程序开发详细代码解释

1. 需求 目前我们开发的TCP服务端程序只能服务于一个客户端&#xff0c;如何开发一个多任务版的TCP服务端程序能够服务于多个客户端呢? 完成多任务&#xff0c;可以使用线程&#xff0c;比进程更加节省内存资源。 2. 具体实现步骤 编写一个TCP服务端程序&#xff0c;循环等…...

Python(15)迭代器和生成器

在 Python 编程领域中&#xff0c;迭代器和生成器是两个强大且独特的概念&#xff0c;它们为处理数据序列提供了高效且灵活的方式。这篇博客将结合菜鸟教程内容&#xff0c;通过丰富的代码示例&#xff0c;深入学习 Python3 中的迭代器与生成器知识&#xff0c;方便日后复习回顾…...

无刷空心杯电机及机器人灵巧手的技术解析与发展趋势

一、无刷空心杯电机结构与技术解析 1. 核心结构设计 无刷空心杯电机的核心设计突破在于无铁芯转子与电子换向系统的结合。其结构由以下关键部分构成: 定子组件:采用印刷电路板(PCB)或柔性电路板(FPC)作为绕组载体,通过三维绕线技术形成空心杯状绕组,彻底消除齿槽效应…...

如何修复卡在恢复模式下的 iPhone:简短指南

Apple 建议使用恢复模式作为最后的手段&#xff0c;以便在 iPhone 启动循环或显示 Apple 标志时恢复 iPhone。这是解决持续问题的简单方法&#xff0c;但您很少使用。但是&#xff0c;当您的 iPhone 卡住恢复模式本身时&#xff0c;您会怎么做&#xff1f;虽然 iPhone 卡在这种…...

蒋新松:中国机器人之父

名人说&#xff1a;路漫漫其修远兮&#xff0c;吾将上下而求索。—— 屈原《离骚》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 蒋新松&#xff1a;中国机器人之父 一、生平简介 1. 早年经历与求学道路 蒋新松出生…...

[Windows] MousePlus 5.5.9

[Windows] MousePlus 链接&#xff1a;https://pan.xunlei.com/s/VOOwKJ281kDaZV5_MpP1COd_A1?pwdn69c# MousePlus是一款轻便小巧的鼠标右键增强工具&#xff0c;使用鼠标右键拖动即可唤醒鼠标轮盘&#xff0c;这个功能界面和quicker的轮盘软件界面一样&#xff0c;操作逻辑…...

BT131-ASEMI无人机专用功率器件BT131

编辑&#xff1a;ll BT131-ASEMI无人机专用功率器件BT131 型号&#xff1a;BT131 品牌&#xff1a;ASEMI 封装&#xff1a;TO-92 批号&#xff1a;最新 引脚数量&#xff1a;3 特性&#xff1a;双向可控硅 工作温度&#xff1a;-40℃~150℃ 在智能化浪潮中&#xff0c…...

ETL架构、数据建模及性能优化实践

ETL&#xff08;Extract, Transform, Load&#xff09;和数据建模是构建高性能数据仓库的核心环节。下面从架构设计、详细设计、数据建模方法和最佳实践等方面系统阐述如何优化性能。 一、ETL架构设计优化 1. 分层架构设计 核心分层&#xff1a; 数据源层&#xff1a;对接O…...

30分钟上架鸿蒙原生应用,即时通信IM UI组件库全面适配HarmonyOS 原

自去年 10 月 8 日鸿蒙5开启公测以来&#xff0c;鸿蒙操作系统不断迭代&#xff0c;生态趋向稳健。当前&#xff0c;支持HarmonyOS操作系统的设备数量已超过 10 亿&#xff0c;上架HarmonyOS 5 应用市场的鸿蒙原生应用和元服务已超过2万个。这无疑为广大开发者提供了丰富的应用…...

【虚幻5蓝图Editor Utility Widget:创建高效模型材质自动匹配和资产管理工具,从3DMax到Unreal和Unity引擎_系列第二篇】

虚幻5蓝图Editor Utility Widget 一、基础框架搭建背景&#xff1a;1. 创建Editor Utility Widget2.根控件选择窗口3.界面功能定位与阶段4.查看继承树5.目标效果 二、模块化设计流程1.材质替换核心流程&#xff1a;2.完整代码如下 三、可视化界面UI布局1. 添加标题栏2. 构建滚动…...

机器学习第三篇 模型评估(交叉验证)

Sklearn:可以做数据预处理、分类、回归、聚类&#xff0c;不能做神经网络。原始的工具包文档&#xff1a;scikit-learn: machine learning in Python — scikit-learn 1.6.1 documentation数据集:使用的是MNIST手写数字识别技术&#xff0c;大小为70000&#xff0c;数据类型为7…...

php数据库连接

前言 最近在学习php&#xff0c;刚好学习到了php连接数据库记录一下 总结 //1、与mysql建立连接$conn mysql_connect("127.0.0.1","root","root");//设置编码mysql_set_charset(utf8);//2、选择要操作的数据库mysql_select_db("xuesheng…...

Android Studio学习记录1

Android Studio打包APK 本文为个人学习记录&#xff0c;仅供参考&#xff0c;如有错误请指出。本文主要记录在Android Studio中开发时遇到的问题和回答。 随着学习的深入&#xff0c;项目完成并通过测试之后免不了需要进入打包环节。这篇文章主要记录一下尝试打包APK的过程。我…...

【JAVA ee初阶】多线程(3)

一、出现线程安全的原因 1.【根本原因】线程的调度执行时随机的&#xff08;抢占式执行&#xff09;->罪魁祸首 2.多个线程同时修改同一个变量 如果是一个线程修改一个变量 或者 多个线程读取同一个变量 或者 多个线程修改不同变量 这些都没事。 3.修改操作不是原子的&a…...

【Java ee初阶】多线程(4)

一、java是怎么做到可重入的 java中&#xff0c;通过synchronized进行加锁&#xff0c;指定一个&#xff08;&#xff09;包含了一个锁对象。&#xff08;锁对象本身是一个啥样的对象&#xff0c;这并不重要&#xff0c;重点关注锁对象是不是同一个对象&#xff09; 后面搭配…...

Day15(贪心算法)——LeetCode121.买卖股票的最佳时机55.跳跃游戏

1 LeetCode121.买卖股票的最佳时机(LeetCode121) 1.1 题目描述 题目描述如下:   示例如下&#xff1a; 1.2 问题分析及解决 要求最大利润&#xff0c;即当天与之前天的价格之差最大值。因此我们可以遍历数组&#xff0c;记录下当前遇到的最小值&#xff0c;然后用当天的价…...

2025汽车制造企业数字化转型路径参考

以应用场景作为切入点&#xff0c;引导相关企业推进数字化深度转型和规模化改造&#xff0c;是目前实践探索出来的一条可行路径。 汽车制造行业是相对集聚的制造业领域&#xff0c;通过搭建“转型场景图谱——转型通用工具——转型路径指引”分析框架&#xff0c;聚焦需求侧共…...

雷池WAF的身份认证 - GitHub

雷池支持通过 GitHub 认证的方式&#xff0c;让用户使用 GitHub 身份安全登录应用或网站。使用此功能需要 GitHub 账号 。 第一步&#xff1a;在 GitHub 创建一个 OAuth 应用 可参阅 GitHub 官方文档&#xff0c;创建一个 GitHub OAuth 应用&#xff0c;并获取应用的 ClientI…...

【Linux】第十二章 安装和更新软件包

目录 1. 什么是RPM&#xff1f; 2. dnf是什么&#xff0c;它和rpm有什么联系和区别&#xff1f; 3. RHEL 中如何做才能启用对第三方存储库的支持&#xff1f; 4. 怎么理解RHEL9中的应用流(Application Streams)和模块(Modules)&#xff1f; 5. RHEL9 有两个必要的软件存储…...

【权限模型】RBAC模型详解

大家好&#xff0c;我是jstart千语。今天给大家介绍一下鉴权模型RBAC&#xff0c;传统的鉴权模式就是基于用户和权限之间的多对多关系。而RBAC就更加的精准&#xff0c;更好管理。 RBAC介绍 RBAC&#xff08;Role-Based Access Control&#xff09;是一种通过角色&#xff08;…...

tree命令

tree [选项] [目录...] 指定要显示的目录。如果没有指定目录&#xff0c;tree 会显示当前目录及其子目录结构。 常用选项 -a 显示所有文件和目录&#xff0c;包括隐藏文件&#xff08;以 . 开头的文件&#xff09;。 -d 只显示目录&#xff0c;不显示文件。 -L LEVEL …...

【Vue.js】组件数据通信:基于Props 实现父组件→子组件传递数据(最基础案例)

概览 前言父子通信流程关键技术点关键规则 实战1. 在父组件中注册子组件2. 子组件接收父组件传入的数据补充与总结 前言 在 Vue 3 中&#xff0c;父组件向子组件传递数据是通过props实现的。父组件在子组件的标签上绑定数据&#xff0c;子组件通过定义props接收这些数据。这种…...

信创时代技术栈选择与前景分析:国产替代背景下的战略路径与实践指南

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家、CSDN平台优质创作者&#xff0c;高级开发工程师&#xff0c;数学专业&#xff0c;10年以上C/C, C#, Java等多种编程语言开发经验&#xff0c;拥有高级工程师证书&#xff1b;擅长C/C、C#等开发语言&#xff0c;熟悉Java常用开…...

Python内置方法干货总结

如果你还在为提升Python代码能力发愁&#xff0c;那么掌握内置方法就是你的捷径&#xff01;很多初学者和进阶者忽略了这一“宝藏”&#xff0c;其实&#xff0c;Python的内置方法不仅能让你代码更简洁&#xff0c;还能大幅提升开发效率。今天&#xff0c;咱们就来一次系统梳理…...

小草GrassRouter多卡聚合路由器聚合卫星、MESH网络应用解决方案

一、多网融合解决方案 卫星网络融合‌ 支持接入卫星通信模块&#xff0c;在无地面网络覆盖的极端场景&#xff08;如偏远山区、海洋救援&#xff09;下&#xff0c;形成“5G卫星”双链路冗余传输&#xff0c;卫星链路可作为核心通信备份&#xff0c;确保关键指令和视频数据实…...

Spring反射机制

Spring反射机制 反射机制是加载类时&#xff0c;在运行时动态地获取类的信息&#xff0c;并且可以操作类或对象的属性、方法、构造函数等成员的能力。在 Java 里&#xff0c;反射机制的实现主要依赖于 java.lang.reflect 包下的多个类&#xff0c;以及 java.lang 包中的 Class…...

PCB硬件电路设计_pcb布线设计

1.MCU最小系统电路 这些电路都会非常接近MCU&#xff0c;他们的可靠性决定了MCU能否正常工作。 外围电路&#xff0c;为了布线整齐美观&#xff0c;尽量避免打过多的通孔。在布局的时候走线的顺序和元器件顺序尽可能的保持一直避免走线交叉。 2.晶振电路布线 一般情况下我们…...

Qt开发:XML文件的写入与读取

文章目录 一、使用 QDomDocument操作节点1.1 将信息写入XML文件中1.2.从XML文件中读取信息 二、使用 QXmlStreamWriter操作节点2.1 将信息写入XML文件中2.2 从XML文件中读取信息 三、总结 一、使用 QDomDocument操作节点 1.1 将信息写入XML文件中 #include <QDomDocument&…...

PCI/PXI 总线的可编程电阻卡

701X 系列是阿尔泰科技基于 PCI/PXI 总线的可编程电阻卡&#xff0c;多种电阻范围可选&#xff0c;稳定性好&#xff1b;准确 度低至 0.2%&#xff1b;分辨率设置精细&#xff0c;可低至 0.125Ω&#xff0c;适用于传感器仿真应用。 701X 系列高精度程控电阻模块具有高设置分辨…...

火语言RPA--腾讯云存储

【组件功能】&#xff1a;存储本地文件至腾讯云 选择本地文件&#xff0c;通过腾讯云存储配置上传至腾讯云对象存储的指定地域指定存储桶指定路径。 配置预览 配置说明 SecretId 支持T或# 前往官网获取或创建。参考链接&#xff1a;https://console.cloud.tencent.com/cam/…...