LangGraph 状态管理完全指南:从零到一掌握图状态机的核心利器

news2026/4/27 6:51:44
状态管理是LangGraph构建复杂AI智能体的基石。如果把节点比作智能体的“手脚”状态就是智能体的“大脑”——它记录着任务执行过程中的一切信息决定着每一步决策的准确性。状态设计得好智能体就聪明状态设计得差智能体就容易混乱。本文将带你系统性地掌握LangGraph状态管理的核心知识体系从状态定义、输入输出解耦到Reducer机制让每一位开发者都能构建高可靠、高可扩展的智能系统。一、状态管理为何如此重要在深入代码之前我们需要先搞明白一个问题为什么状态管理在LangGraph中如此重要先看一个实际场景。假设你正在构建一个跨国旅行规划智能体用户输入“帮我规划一趟从北京到纽约的7日游”。后续的执行过程中智能体需要调用航班API查询机票需要调用酒店API预订住宿需要调用天气API获取目的地的天气信息可能需要多轮与用户确认偏好最后综合所有信息生成完整的行程方案在这个过程中航班信息、酒店信息、用户确认的信息需要在整个工作流的多个节点中共享和传递。如果没有统一的状态管理开发者就必须在各个节点之间手动传递参数代码会变得极其混乱且难以维护根本无法应对复杂业务场景。这就是LangGraph状态管理的价值所在。StateGraph通过共享的状态对象让所有节点都从同一个“状态池”中读取和写入数据节点间通信变得透明且类型安全这正是LangGraph在生产级Agent开发中被誉为“行业首选”的核心原因。二、状态的定义State Schema全解析在LangGraph中State是整个图的内部状态空间包含了所有节点可能读写的字段。下面我们从核心概念到具体实现一步步掌握。2.1 State是什么简单来说State就是一个存储全局数据的容器。当图开始执行时LangGraph会自动创建一个State对象将所有节点的输入输出都汇总到这个对象中。每个节点读取State中的数据进行处理然后把更新结果返回给LangGraphLangGraph再将这些更新合并回State。用代码来理解最直观from typing_extensions import TypedDict from langgraph.graph import StateGraph, START, END # 1. 定义一个状态类继承自TypedDict class MyState(TypedDict): # 定义状态中会有哪些字段以及字段的类型 user_input: str # 用户输入 counter: int # 计数器 response: str # 系统响应 history: list # 对话历史 # 2. 定义一个节点函数输入是State返回的是对State的部分更新 def process_node(state: MyState) - dict: print(f当前进入的是处理节点收到的状态是{state}) # 节点逻辑: 读counter加1返回 new_count state[counter] 1 # 返回一个字典LangGraph会自动合并到全局State中 return {counter: new_count, response: f这是我第{new_count}次处理你的请求} # 3. 构建图 def build_graph(): builder StateGraph(MyState) # 告诉StateGraph我们的全局状态是这个结构 builder.add_node(process, process_node) # 添加节点 builder.add_edge(START, process) # 从开始到process builder.add_edge(process, END) # 从process到结束 graph builder.compile() return graph # 4. 执行图 if __name__ __main__: graph build_graph() result graph.invoke({ user_input: 你好我想订一张机票, counter: 0, response: , history: [] }) print(f\n最终返回的结果{result})运行这段代码你会看到State在节点间无缝传递的过程。最终返回结果中counter变成了1response也按照节点逻辑进行了更新。这就是最基础的State用法——覆盖更新模式。2.2 三个核心概念state_schema、input_schema、output_schemaLangGraph中有一个非常巧妙的设计将State细分为三个层次——state_schema内部完整状态、input_schema输入接口、output_schema输出接口。这种设计让API的输入输出接口更加清晰和安全。先用一张图来理解它们的关系input_schema是暴露给外界的“接口入口”只有这些字段可以被外部调用者传入state_schema是图内部实际使用的完整状态空间output_schema是暴露给外界的“返回结果”只有这些字段会被返回给调用者。from langgraph.graph import StateGraph, START, END from typing_extensions import TypedDict # 定义输入模式外部调用者只能传入question class InputState(TypedDict): question: str # 定义输出模式外部调用者只能看到answer class OutputState(TypedDict): answer: str # 定义完整状态模式内部节点可以访问全部字段 class OverallState(InputState, OutputState): # 字段继承自InputState和OutputState还可以扩展更多内部字段 internal_log: str # 记录内部处理日志但不会被输入或输出暴露 # 处理节点接收InputState返回包含answer和internal_log的更新 def answer_node(state: InputState) - dict: print(f收到用户问题: {state[question]}) # 模拟处理逻辑智能判断回复内容 question state[question] if 再见 in question or bye in question.lower(): answer 再见欢迎下次再来 else: answer f你好你问的是{question}我正在为你处理... # 内部日志只记录在内部状态中 internal_log f已处理问题: {question} return {answer: answer, internal_log: internal_log} # 构建图显式指定input_schema和output_schema builder StateGraph(OverallState, input_schemaInputState, output_schemaOutputState) builder.add_node(answer, answer_node) builder.add_edge(START, answer) builder.add_edge(answer, END) graph builder.compile() # 调用图时只需要传入question字段 result graph.invoke({question: 帮我查一下上海到北京的航班}) print(f返回结果: {result}) # 只包含answerinternal_log被过滤掉了 # 如果尝试传入state_schema中有但input_schema中没有的字段会报错 # result graph.invoke({question: 查航班, internal_log: some log}) # ❌ 报错这个小技巧在构建API服务时极为实用——你可以在内部任意扩展状态字段但只向外部用户暴露必要的信息既保证了灵活性又确保了接口的清晰和安全还能在一定程度上保护内部实现细节。2.3 私有状态传递节点间“悄悄传话”的高级技巧LangGraph还有一个很实用的隐藏功能——私有状态传递。如果一个节点返回了State中没有定义的字段LangGraph会把这些“新字段”放入临时内存中而不是写入全局State。后续节点在自己的输入Schema中声明需要这些字段时LangGraph便会从临时内存中取出来传递过去用完即销毁。这种机制非常适合在相邻节点之间传递“用过即弃”的中间数据比如API调用的临时token、中间计算结果等from langgraph.graph import StateGraph, START, END from typing_extensions import TypedDict # 定义全局状态不包含私有字段 class OverallState(TypedDict): a: str # 唯一被长期保存的公共字段 # 节点1的输出包含私有字段private_data不在全局State中 class Node1Output(TypedDict): private_data: str # 节点2的输入请求接收private_data字段 class Node2Input(TypedDict): private_data: str def node_1(state: OverallState) - Node1Output: print(f进入node_1收到的全局状态: {state}) # 返回的private_data字段不在全局State中 # LangGraph会将其放入临时内存 return {private_data: 这是我传给node_2的私密信息} def node_2(state: Node2Input) - OverallState: print(f进入node_2收到的输入: {state}) # 成功接收到了node_1传过来的私有数据 print(f从node_1接收到的私有数据: {state[private_data]}) # 返回全局状态更新 return {a: node_2处理完毕} def node_3(state: OverallState) - OverallState: print(f进入node_3收到的全局状态: {state}) # node_3无法访问private_data因为它的输入只定义了OverallState # 私有数据已经被node_2消费并销毁了 return {a: node_3处理完毕} # 构建顺序图 builder StateGraph(OverallState).add_sequence([node_1, node_2, node_3]) builder.add_edge(START, node_1) builder.add_edge(node_3, END) graph builder.compile() result graph.invoke({a: 初始值}) print(f最终结果: {result})这种设计的精妙之处在于它保证了全局State的“纯洁性”通过临时内存的方式实现节点间的单向通信用完即销毁不会污染全局状态也让数据传递更加精准可控。三、Reducer函数状态合并的“裁判员”如果说State是全局数据的仓库那么Reducer就是决定“如何合并更新”的规则制定者。每个节点返回后LangGraph都会调用对应字段的Reducer函数决定新值和旧值的合并方式。3.1 默认Reducer覆盖如果没有指定Reducer函数默认行为是“直接覆盖”——新来的值取代旧值from typing import List from typing_extensions import TypedDict from langgraph.graph import StateGraph, START, END class DefaultState(TypedDict): count: int items: List[str] def node_update_count(state: DefaultState) - dict: # 返回一个新的count值默认行为是直接覆盖 return {count: 999} def node_update_items(state: DefaultState) - dict: # 返回一个新的items列表默认行为是直接覆盖 # 注意旧的[apple, banana]会被完全替换而不是追加 return {items: [pineapple]} builder StateGraph(DefaultState) builder.add_node(update_count, node_update_count) builder.add_node(update_items, node_update_items) builder.add_edge(START, update_count) builder.add_edge(update_count, update_items) builder.add_edge(update_items, END) graph builder.compile() result graph.invoke({ count: 100, items: [apple, banana] }) print(result) # 输出: {count: 999, items: [pineapple]}这个例子清晰地展示了覆盖行为旧值被新值彻底替代旧值中的内容完全丢失了。3.2 add_messages智能的消息历史管理add_messages是LangGraph中专门为聊天机器人场景设计的内置Reducer。它不仅能自动将新消息追加到历史列表中还能根据消息ID智能地去重和更新杜绝消息重复堆积确保对话历史的准确性from typing import Annotated, List from typing_extensions import TypedDict from langgraph.graph import StateGraph, START, END from langgraph.graph.message import add_messages class MessageState(TypedDict): messages: Annotated[List, add_messages] # 使用add_messages Reducer def assistant_1(state: MessageState) - dict: # 系统会自动帮我们将新消息追加到历史中而不是覆盖 return {messages: [(assistant, 你好我是助手1号请问有什么可以帮你的)]} def assistant_2(state: MessageState) - dict: return {messages: [(assistant, 我是助手2号也可以为你服务)]} builder StateGraph(MessageState) builder.add_node(assistant1, assistant_1) builder.add_node(assistant2, assistant_2) builder.add_edge(START, assistant1) builder.add_edge(START, assistant2) # 两个节点并行执行 builder.add_edge(assistant1, END) builder.add_edge(assistant2, END) graph builder.compile() result graph.invoke({messages: [(user, 我需要帮助)]}) print(对话历史:) for msg in result[messages]: print(f {msg.type}: {msg.content}) # 输出: 你会在历史中看到用户消息和两个助手的所有回复而且消息以结构化对象展示add_messages内置的消息规范化能力非常强大——无论你传入的是元组、字典还是已构建的消息对象它都能自动转换成标准化的LangChain消息对象HumanMessage、AIMessage等大幅降低开发者的心智负担。此外它实现了类似CRDT的并发安全合并策略当多个节点同时返回消息列表时能够智能合并避免数据冲突。3.3 operator.add列表追加与数值累加当多个节点并行运行时如果用operator.add装饰列表字段它们的结果会自动合并成一个完整列表import operator from typing import Annotated, List from typing_extensions import TypedDict from langgraph.graph import StateGraph, START, END class ListState(TypedDict): data: Annotated[List[int], operator.add] # 列表会使用operator.add进行合并追加 # 等价于: data [new_item] def data_source_1(state: ListState) - dict: return {data: [1, 2, 3]} def data_source_2(state: ListState) - dict: return {data: [4, 5, 6]} builder StateGraph(ListState) builder.add_node(source1, data_source_1) builder.add_node(source2, data_source_2) builder.add_edge(START, source1) builder.add_edge(START, source2) builder.add_edge(source1, END) builder.add_edge(source2, END) graph builder.compile() result graph.invoke({data: [0]}) print(result) # 输出: {data: [0, 1, 2, 3, 4, 5, 6]}这个特性在需要多个节点并发收集数据的场景中尤其有用——比如同时调用多个API获取不同来源的数据然后再合并到一起统一处理import operator from typing import Annotated from typing_extensions import TypedDict from langgraph.graph import StateGraph, START, END class NumberAccumulateState(TypedDict): total: Annotated[int, operator.add] # 数值累加 def add_5(state: NumberAccumulateState) - dict: return {total: 5} def add_3(state: NumberAccumulateState) - dict: return {total: 3} builder StateGraph(NumberAccumulateState) builder.add_node(add5, add_5) builder.add_node(add3, add_3) builder.add_edge(START, add5) builder.add_edge(START, add3) builder.add_edge(add5, END) builder.add_edge(add3, END) graph builder.compile() result graph.invoke({total: 10}) print(result) # 输出: {total: 18} (10 5 3)3.4 自定义Reducer解决operator.mul的棘手问题LangGraph官方提供的operator.mul存在一个实际困扰许多开发者的问题调用图时会先默认调用一次Reducer用初始默认值和invoke传入的值相乘结果变成0。不过LangGraph的强大之处在于我们可以自定义Reducer来完美解决此类问题import operator from typing import Annotated from typing_extensions import TypedDict from langgraph.graph import StateGraph, START, END _multiply_first_call True # 全局标志位用于追踪是否为第一次调用 def safe_mul_reducer(current_value: float, new_value: float) - float: 安全的乘法Reducer 重点在LangGraph的初始化阶段正确处理初始值 global _multiply_first_call print(fReducer调用: current{current_value}, new{new_value}) if _multiply_first_call: # 第一次调用时直接使用新值避免被0相乘 _multiply_first_call False return new_value else: # 后续调用正常相乘 return current_value * new_value class MultiplyState(TypedDict): factor: Annotated[float, safe_mul_reducer] def multiply_by_2(state: MultiplyState) - dict: print(f节点multiply_by_2被调用) return {factor: 2.0} def multiply_by_3(state: MultiplyState) - dict: print(f节点multiply_by_3被调用) return {factor: 3.0} # 重置全局标志位 _multiply_first_call True builder StateGraph(MultiplyState) builder.add_node(by2, multiply_by_2) builder.add_node(by3, multiply_by_3) builder.add_edge(START, by2) builder.add_edge(START, by3) builder.add_edge(by2, END) builder.add_edge(by3, END) graph builder.compile() result graph.invoke({factor: 5.0}) print(f5.0 * 2.0 * 3.0 {result[factor]}) # 预期输出: 5.0 * 2.0 * 3.0 30.0这个自定义Reducer的核心在于利用全局标志位区分LangGraph内部的“初始化调用”和业务节点返回后的“正式更新调用”。初始化调用时直接使用新值避免默认0值的干扰正式更新时才执行正常的乘法运算。该方案的实用性不言而喻尤其适用于数值计算、配置参数等比链式放大场景。四、综合实战一个完整的聊天机器人现在让我们将以上所有知识融会贯通构建一个完整的聊天机器人流程from typing import Annotated, List, Dict, Any from typing_extensions import TypedDict from langgraph.graph import StateGraph, START, END from langgraph.graph.message import add_messages import operator # 1. 定义完整的状态类 class ChatStatus: 聊天状态枚举方便追踪状态流转 STARTING starting PROCESSING processing COMPLETED completed class ChatState(TypedDict): # 消息队列使用add_messages自动累加 messages: Annotated[List, add_messages] # 标签列表使用operator.add自动合并 tags: Annotated[List[str], operator.add] # 累计分数使用operator.add自动累加 score: Annotated[float, operator.add] # 系统状态覆盖更新 status: str # 额外的元数据自定义Reducer合并 metadata: Annotated[Dict[str, Any], lambda old, new: {**old, **new}] def fake_llm_response(user_message: str, is_positive: bool True) - str: 模拟LLM的响应 if is_positive: return f收到你的消息{user_message}很高兴为你服务 else: return f抱歉我无法处理{user_message}请换种方式提问。 def process_user_message(state: ChatState) - dict: 节点1处理用户的最新消息 print(f\n--- [节点:process] 开始处理 ---) print(f当前状态: status{state.get(status)}, 已有分数{state.get(score, 0)}) if not state.get(messages): print(没有消息被传入跳过处理!) return {} # 获取最新消息 latest_msg_obj state[messages][-1] user_message latest_msg_obj.content if hasattr(latest_msg_obj, content) else str(latest_msg_obj) print(f用户的最新消息: {user_message}) # 生成响应 assistant_response fake_llm_response(user_message) # 决定标签和分数 new_tags [processed] new_score 1.0 print(f生成回复: {assistant_response}) print(f添加标签: {new_tags}, 增加分数: {new_score}) return { messages: [(assistant, assistant_response)], tags: new_tags, score: new_score, status: ChatStatus.PROCESSING, metadata: {last_response_time: just_now} } def sentiment_analysis(state: ChatState) - dict: 节点2情感分析并发执行 print(f\n--- [节点:sentiment] 开始分析 ---) if not state.get(messages): print(没有消息跳过情感分析) return {} # 模拟情感分析此处永远返回正面的标签 new_tags [positive] new_score 0.5 print(f情感分析结果: 正面标签 {new_tags}, 分数 {new_score}) return { tags: new_tags, score: new_score, metadata: {sentiment: positive} } def finalize(state: ChatState) - dict: 节点3最终处理生成摘要 print(f\n--- [节点:finalize] 生成最终结果 ---) print(f最终统计: 总分数{state[score]}, 总标签数{len(state[tags])}) print(f所有元数据: {state.get(metadata, {})}) return { status: ChatStatus.COMPLETED, metadata: {finalized_at: done} } # 5. 构建完整的图 builder StateGraph(ChatState) builder.add_node(process, process_user_message) builder.add_node(sentiment, sentiment_analysis) builder.add_node(finalize, finalize) # 定义流转关系 builder.add_edge(START, process) builder.add_edge(START, sentiment) # process和sentiment并发执行 builder.add_edge(process, finalize) builder.add_edge(sentiment, finalize) builder.add_edge(finalize, END) graph builder.compile() # 执行图 result graph.invoke({ messages: [(user, 你好LangGraph我非常喜欢你的设计理念)], tags: [greeting], score: 0.0, status: ChatStatus.STARTING, metadata: {session_id: 12345} }) print(\n *40) print(最终完整的返回状态) for k, v in result.items(): print(f{k}: {v})在这个综合示例中我们展示了消息历史管理add_messages确保对话不会丢失并行收集tags和score分别被多个节点同时更新使用operator.add进行智能合并状态流跟踪status字段记录整个流程的生命周期便于调试和监控元数据合并自定义Reducer让不同节点的元数据可以安全合并而不会互相覆盖至此我们已经完整掌握了LangGraph状态管理的核心技术要领。五、总结与金篇要点LangGraph的状态管理体系是一套系统且强大的工程框架其设计理念体现了现代AI框架的核心追求。通过本文的学习相信你已经核心要点回顾✅理解State的核心地位State是整个LangGraph智能体的信息中心每个节点通过读写State共享数据并通过Reducer实现智能合并。✅掌握Reducer的多种用法默认的覆盖更新、针对对话场景精心设计的add_messages、通用合并的operator.add以及解决官方乘法缺陷的自定义Reducer灵活应对各种合并需求。✅活用私有状态传递在全局State基础上巧妙地实现节点间的“私密通道”传递临时数据保证了全局State的纯净性。✅分离输入、输出和内部状态通过input_schema和output_schema约束外部接口内部自由扩展实现API级的类型安全保障。在生产级Agent开发中合理使用LangGraph的状态管理体系可以大幅提升代码的可维护性、可扩展性和可观测性。希望本文能够成为你LangGraph学习路上的得力助手

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2558678.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…