深度强化学习与LLM结合:构建《游戏王》AI智能体的技术实践

news2026/4/29 4:13:53
1. 项目概述用AI攻克《游戏王》的深度强化学习智能体如果你是一位《游戏王》的资深玩家或者对AI在复杂策略游戏中的应用感兴趣那么“YGO Agent”这个项目绝对值得你花时间深入了解。简单来说这是一个旨在通过深度学习和强化学习技术训练出能够媲美甚至超越人类顶尖玩家的《游戏王》AI智能体的开源项目。它不仅仅是一个简单的“脚本”或“外挂”而是一个完整的、基于现代AI研究范式的训练与部署平台。项目核心由两部分构成ygoenv是一个基于高性能并行环境库envpool和《游戏王》开源核心ygopro-core构建的游戏环境为AI训练提供了标准化的“健身房”而ygoai则是一系列利用强化学习和大语言模型LLM技术训练的AI智能体目标是实现类似AlphaGo在围棋领域的突破。这个项目的价值在于它将一个规则极其复杂、决策空间巨大的集换式卡牌游戏转化为了一个可被AI学习和优化的环境。对于研究者而言这是一个绝佳的、充满挑战的强化学习基准测试平台对于玩家和开发者来说它提供了一个可以训练、部署并与自己对战的AI对手甚至未来可能成为辅助构筑、分析对局的强大工具。接下来我将以一个实践者的视角为你深入拆解这个项目的技术架构、实操部署、训练过程以及背后的设计逻辑。2. 核心架构与设计思路拆解2.1 为什么选择强化学习与LLM结合《游戏王》AI的构建是一个公认的难题。传统的基于规则或搜索树的AI如早期的Windbot在面对成千上万张卡牌、海量连锁效果和庞大的决策空间时其规则库会变得异常臃肿且难以维护泛化能力极差。YGO Agent选择了深度强化学习RL这条道路其核心思路是让AI通过与环境的交互自我对弈或与环境模拟器对弈来学习最优策略而非硬编码规则。然而直接应用RL也面临巨大挑战如何将一张卡牌复杂多变的效果文本转化为AI模型能够理解的数值特征这里项目巧妙地引入了大语言模型LLM。项目团队将卡牌信息名称、效果文本、属性、种族等转化为自然语言描述然后使用预训练的LLM如BERT、GPT等为每张卡生成一个高维度的“嵌入向量”。这个向量捕捉了卡牌的语义信息例如“青眼白龙”和“真红眼黑龙”在向量空间中的距离会比它们与一张通常的魔法卡更近。模型在训练时不是去理解“破坏场上怪兽”这条规则而是学习这些嵌入向量与胜利之间的统计关联。这种“语义理解”的引入是项目能处理复杂卡牌效果的关键。2.2 环境构建ygoenv的高性能之道ygoenv是整个项目的基石。它没有选择从零开始用Python模拟游戏逻辑而是选择站在巨人的肩膀上——集成了成熟的《游戏王》开源实现ygopro-coreC。为了满足强化学习需要海量并行环境进行数据采集的需求项目又基于envpool进行了封装。envpool是一个专为强化学习设计的高性能并行环境执行库。它的核心优势在于它用C实现了环境逻辑并通过零拷贝共享内存技术与Python端交互避免了Python全局解释器锁GIL和频繁的数据序列化/反序列化开销。在YGO Agent中这意味着你可以同时运行数十甚至上百个《游戏王》对局环境每个环境都在独立的线程或进程中飞速运转为RL算法提供源源不断的训练数据。这种设计使得在单台多核CPU服务器上也能获得极高的数据吞吐量是训练得以进行的前提。注意ygoenv提供的step和reset等接口完全遵循OpenAI Gym标准这意味着任何兼容Gym的RL算法库如Stable-Baselines3, RLlib理论上都可以接入。不过项目目前主要使用其自研的cleanba训练框架进行优化。2.3 智能体设计从感知到决策的神经网络ygoai中的智能体是一个典型的“演员-评论家”架构的深度神经网络。它需要处理高度结构化的游戏状态。观察空间被设计为多个部分的组合卡片信息一个多维张量编码了手牌、场上、墓地、卡组等区域所有卡片的状态和嵌入向量。全局信息如双方生命值、当前阶段、回合数等。可用动作一个经过编码的、当前合法的动作列表召唤、发动效果、攻击宣言等。动作掩码一个布尔矩阵用于屏蔽非法动作确保AI不会做出违反游戏规则的操作。网络首先通过多层感知机或LSTM长短期记忆网络处理这些观察信息输出两部分一是策略头为每个合法动作生成一个概率分布下一步做什么二是价值头评估当前局面的胜率期望。训练的目标就是通过策略梯度等方法不断调整网络参数使得智能体选择的动作能最大化累积奖励最终赢得对局。3. 环境部署与模型评估实战3.1 快速安装与避坑指南项目提供了预编译的二进制文件针对Ubuntu 22.04这能省去大量的编译时间。但根据我的经验环境配置依然是新手的第一道坎。以下是基于实战的步骤和常见问题排查步骤一基础依赖安装首先确保你的Python环境推荐3.10-3.12和pip已就绪。然后安装JAX及其依赖。JAX是项目选择的数值计算库因其在GPU上的高性能和自动微分特性而被采用。# 对于大多数用户安装CPU版本进行初步测试即可 pip install -U jax0.4.28 jaxlib0.4.28 # 如果你有NVIDIA GPU并配置了CUDA 12可以安装GPU版本以加速 # pip install -U jax[cuda12]0.4.28 pip install flax distrax chex步骤二获取项目与预编译库git clone https://github.com/sbl1996/ygo-agent.git cd ygo-agent # 根据你的Python版本选择对应的.so文件例如Python 3.10对应cp310 wget -O ygopro_ygoenv.so https://github.com/sbl1996/ygo-agent/releases/download/v0.1/ygopro_ygoenv_cp310.so mv ygopro_ygoenv.so ygoenv/ygoenv/ygopro/ygopro_ygoenv.so make步骤三验证安装进入脚本目录运行一个简单的评估脚本让一个随机策略的AI自己玩几局。cd scripts python -u eval.py --deck ../assets/deck/ --num_episodes 32 --strategy random --num_envs 16如果看到类似len76.5758, reward-0.1751, win_rate0.3939的输出恭喜你环境安装成功。win_rate接近0.5是合理的因为随机策略对随机策略胜率应该围绕50%波动。常见问题与解决方案GLIBCXX版本冲突这是最常遇到的问题。错误信息通常包含version GLIBCXX_3.4.30 not found。这通常是因为Anaconda或Miniconda环境中的libstdc.so.6库版本低于系统版本而预编译的.so文件链接了更高版本的系统库。解决按照项目文档的指引备份后替换conda环境中的链接。更稳妥的做法是创建一个新的虚拟环境使用系统Python而非conda的Python可以避免大部分库冲突。# 进入你的conda环境的lib目录 cd $CONDA_PREFIX/lib # 备份旧库可选但建议 cp libstdc.so.6 libstdc.so.6.backup cp libstdc.so libstdc.so.backup # 创建指向系统新版本库的软链接 ln -sf /usr/lib/x86_64-linux-gnu/libstdc.so.6.0.30 libstdc.so.6.0.30 ln -sf libstdc.so.6.0.30 libstdc.so.6 ln -sf libstdc.so.6 libstdc.so预编译二进制不兼容如果你使用的不是Ubuntu 22.04/24.04或者系统架构不同如ARM预编译文件很可能无法工作。解决必须从源码编译。这需要安装gcc,cmake,xmake等构建工具。按照项目Building from source部分的说明操作。注意从源码编译ygopro-core及其依赖可能耗时较长且对系统环境要求更严格。CUDA/JAX版本不匹配如果你安装了GPU版本的JAX但运行出错可能是CUDA驱动版本与JAX不兼容。解决运行nvidia-smi查看CUDA驱动版本然后对照 JAX官方文档 安装对应CUDA工具包版本的JAX。或者在调试阶段暂时使用CPU版本。3.2 获取与评估预训练模型项目在Releases页面提供了训练好的模型检查点文件如0546_22750M.flax_model。这个模型是在海量对局相当于32张4090 GPU训练5天数据上训练得到的已经具备了很强的实力。下载与放置模型cd scripts # 创建一个checkpoints目录存放模型 mkdir -p checkpoints cd checkpoints # 从Releases页面找到模型文件的直链使用wget下载 wget https://github.com/sbl1996/ygo-agent/releases/download/v0.1/0546_22750M.flax_model让两个AI对战我们可以使用battle.py脚本让两个模型互相对战以评估其相对强弱。这对于比较不同训练阶段的模型或不同超参数下的模型非常有用。cd scripts # 假设我们让一个训练了50轮的模型model_new对战官方提供的强模型model_strong python -u battle.py \ --checkpoint1 checkpoints/1720859207_0M.flax_model \ --checkpoint2 checkpoints/0546_22750M.flax_model \ --num-episodes 128 \ --deck ../assets/deck/BlueEyes.ydk \ --seed 42关键参数解析--checkpoint1/2: 指定两个模型的路径。--num-episodes: 对战局数越多结果越稳定但耗时越长。--deck: 指定使用的卡组文件或目录。这里指定了“青眼白龙”卡组。--seed: 随机种子确保实验可复现。--xla_device cpu: 如果强制使用CPU运行可以加上此参数。运行后你会看到详细的胜负统计例如一个win_rate0.03125的结果意味着checkpoint1的模型只赢了大约3%的对局与checkpoint2差距悬殊。输出中的“Payoff matrix”和“Length matrix”提供了更细粒度的先后手胜率和平均对局长度数据。实操心得在评估时--seed参数非常重要。不同的种子可能导致完全不同的抽牌顺序从而影响胜率。为了得到可靠的结论建议用多个不同的种子运行多次然后取平均胜率。此外初期可以使用较少的对局数如32局快速验证最终评估时再使用较大的局数如512或1024局。3.3 与AI进行真人对决这是项目最吸引人的功能之一将训练好的模型部署为API服务然后通过支持AI功能的《游戏王》客户端如Neos与它实时对战。步骤一启动模型API服务cd scripts export CHECKPOINTcheckpoints/0546_22750M.tflite # 也可以使用.flax_model.tflite是优化后的格式 uvicorn ygoinf.server:app --host 127.0.0.1 --port 3000 --log-config../assets/log_conf.yamluvicorn是一个快速的ASGI服务器。这条命令会在本地的3000端口启动一个Web服务。看到Uvicorn running on http://127.0.0.1:3000的提示即表示启动成功。你可以在浏览器访问http://127.0.0.1:3000如果看到返回简单的OK说明服务运行正常。步骤二在Neos客户端中配置AI打开浏览器访问 Neos 。注册并登录一个Moecube账号。在“Deck Building”中构建或导入一个卡组。注意目前AI仅支持项目assets/deck/目录下包含的卡组如“青眼白龙”、“英雄”等使用不支持的卡牌会导致AI无法行动或出错。进入“Match”大厅将鼠标移到右上角头像点击弹出的“System Settings”。点击“AI Settings”在输入框中填入你的API地址http://127.0.0.1:3000点击“Apply AI Settings”保存。点击“Custom Room”务必勾选“Enable AI Assist”。输入房间名和密码格式为NOCHECK#六位数字例如NOCHECK#123456。这个密码是防止他人误入的。点击“Join Room”选择你的卡组点击“Duel Ready”。步骤三开始对战现在你需要一个对手。有两种方式方式A推荐按CtrlN新开一个浏览器标签页再次打开Neos。这次不要开启AI辅助进入同一个自定义房间使用刚才设置的密码选择卡组并准备。然后回到第一个标签页运行AI的页面点击“Start Game”。方式B使用其他YGOPro兼容客户端如KoishiPro、YGOPro2连接到Koishi服务器koishi.momobako.com:7210加入你创建的房间。对局开始后AI控制的角色会自动进行它的回合。你可以观察它的出牌逻辑并与它交互。Neos窗口必须保持前台焦点否则游戏会暂停。重要提示AI的决策速度取决于你的API服务器性能主要是CPU/GPU。在复杂的局面下AI可能需要几秒钟的时间“思考”。这是正常的因为它需要在庞大的动作空间中进行前向推理。如果等待时间过长可以考虑在启动API服务时使用性能更好的机器或确保JAX正确调用了GPU。4. 从零开始训练你自己的AI智能体4.1 单GPU训练流程详解训练自己的AI是项目的核心乐趣所在。即使你只有一张消费级显卡如GTX 1650也可以尝试训练一个基础模型。以下命令展示了如何针对“青眼白龙”卡组进行训练cd scripts python -u cleanba.py \ --actor-device-ids 0 \ # Actor进程使用的GPU ID数据采集 --learner-device-ids 0 \ # Learner进程使用的GPU ID模型学习 --deck ../assets/deck/BlueEyes.ydk \ # 指定训练卡组 --local-num_envs 16 \ # 每个Actor上的并行环境数 --num-minibatches 8 \ # 每次参数更新时使用的minibatch数量 --learning-rate 1e-4 \ # 学习率 --vloss_clip 1.0 \ # 价值函数损失裁剪系数 --save_interval 50 \ # 每50个迭代保存一次模型 --local_eval_episodes 32 \ # 每次评估时对战的局数 --eval_interval 50 \ # 每50个迭代评估一次 --seed 0 \ # 随机种子 --tb_dir None \ # 禁用TensorBoard日志如需记录可指定路径 --checkpoint checkpoints/my_blue_eyes_model.flax_model # 模型保存路径前缀关键参数深度解析并行环境 (--local-num_envs)这是加速训练的关键。每个环境都是一个独立的对局实例。设置16意味着同时进行16场游戏来收集数据。更多的并行环境能更快地产生训练样本但也会消耗更多CPU和内存。你需要根据你的CPU核心数来调整通常设置为CPU逻辑核心数的1/2到2/3为宜。Minibatches与学习率 (--num-minibatches,--learning-rate)在PPO等策略梯度算法中每次更新参数时会使用一批经验数据一个batch。这个batch会被进一步分成多个minibatch进行梯度计算。--num-minibatches 8意味着将batch分成8份。学习率1e-4是一个比较保守的起始值对于《游戏王》这种稀疏奖励、长期依赖的任务过高的学习率容易导致训练不稳定。评估与保存 (--eval_interval,--save_interval)定期评估至关重要。--eval_interval 50表示每训练50个迭代iter就让当前模型与一个随机策略的对手对战local_eval_episodes局并计算胜率。这是监控训练进度的核心指标。--save_interval则控制模型快照的保存频率便于回滚到之前的版本或进行后续分析。训练开始后控制台会输出类似下面的日志global_step204800, avg_return0.0676, avg_length194 eval_time11.6271, eval_return1.4659, eval_win_rate0.9844 204800 actor_update50, train_time3.97, data_time10.07, put_time0.00 Saved model to /home/user/ygo-agent/scripts/checkpoints/1720859207_0M.flax_modelglobal_step: 总的环境交互步数。avg_return: 近期采集数据的平均回报奖励可以粗略反映策略质量。eval_win_rate: 评估胜率这是最直接的指标。如上例中0.9844意味着当前模型对随机策略的胜率达到了98.44%说明它已经学会了基本的游戏规则和致胜策略。SPS: 每秒步数反映了数据采集和训练的速度。4.2 卡组、嵌入与超参数调优卡组支持--deck参数可以是一个单独的.ydk文件也可以是一个包含多个.ydk文件的目录。训练时环境会从这个集合中随机选取卡组进行对局。项目assets/deck/目录下的卡组是经过充分测试的。如果你想训练自己的卡组需要确保卡组中的所有卡片都在scripts/code_list.txt的支持列表中。否则环境初始化时会报错。嵌入文件--embedding_file参数用于指定卡牌嵌入向量文件如embed.pkl。这个文件包含了code_list.txt中所有卡片的LLM生成的特征向量。如果不指定此参数模型将不使用预训练的嵌入而是随机初始化一个嵌入层从头开始学习。使用预训练的嵌入可以显著加快训练收敛速度并可能提升模型在未见过的卡片组合上的泛化能力。项目在Releases中提供了嵌入文件。超参数调优建议训练一个强大的AI是一门实验艺术。以下是一些可能影响性能的关键超参数和调整思路超参数默认/示例值作用与调整建议--learning-rate1e-4学习率。训练的灵魂。如果训练曲线震荡剧烈或胜率不升反降尝试降低如3e-5。如果收敛太慢可谨慎提高如3e-4。--num-minibatches8Minibatch数量。影响梯度估计的方差。增大此值如16可以使训练更稳定但会增加计算开销。--vloss_clip1.0价值损失裁剪。防止价值网络更新过快。如果价值损失波动大可以适当降低如0.5。--entropy-coef(脚本内定)熵奖励系数。鼓励探索。在训练初期可以设置一个较大的值如0.01促进探索后期逐渐减小。--gamma(脚本内定)折扣因子。决定未来奖励的重要性。对于《游戏王》这种一局定胜负的游戏可以设置得较高如0.99。--gae-lambda(脚本内定)GAE参数。用于平衡偏差和方差。通常设置在0.9-0.95之间。--clip-range(脚本内定)策略裁剪范围。PPO算法的核心参数限制每次策略更新的幅度。通常为0.1-0.3。避坑经验不要一开始就调整所有参数。建议先使用默认参数在小规模如单卡组、较少并行环境下运行观察训练曲线胜率、回报是否正常上升。如果训练完全失败胜率始终在0.5徘徊首先检查环境是否安装正确、卡组是否被支持。如果训练初期有上升但后期崩溃可能是学习率过高或裁剪范围太小。记录每次实验的配置和结果至关重要。4.3 分布式训练展望对于想要训练包含全卡池、多卡组、达到顶尖水平的AI单卡训练是远远不够的。项目路线图中提到了分布式训练这需要大量的计算资源如多台多卡服务器。分布式训练的核心思想是将数据采集Actor和模型更新Learner分离多个Actor进程分布在不同的CPU机器或容器中每个Actor运行大量并行环境源源不断地生成游戏轨迹状态、动作、奖励数据并发送到中心缓冲区。一个或多个Learner进程通常运行在强大的GPU服务器上从缓冲区中采样数据计算梯度并更新模型参数然后将更新后的模型参数同步给所有Actor。这种架构可以极大地提升数据吞吐量是训练大规模模型的关键。项目目前这部分尚在开发中TODO但基于envpool和cleanba的设计实现分布式训练在架构上是清晰的。对于有兴趣的研究者或团队可以关注项目的后续更新或尝试基于现有代码进行扩展。5. 项目深度解析与未来潜力5.1 技术栈选型的优势与考量YGO Agent在技术选型上体现出了鲜明的工程与科研结合导向。使用JAX而非PyTorch或TensorFlow是一个值得品味的决定。JAX的核心优势在于其“函数式”和“可组合”的特性配合jax.jit即时编译能在GPU上获得极高的计算性能。这对于需要处理大量并行环境、进行高频次模型推理的RL任务来说性能提升是显著的。此外JAX的pmap和xmap等原语为分布式计算提供了优雅的抽象为未来的分布式训练铺平了道路。当然这也带来了较高的学习门槛且生态系统相较于PyTorch仍不够丰富。选择envpool作为环境接口则是直击了RL训练中的性能瓶颈——环境模拟速度。传统用Python纯模拟的游戏环境即使使用多进程进程间通信和数据拷贝的开销也很大。envpool的C底层和零拷贝设计使得它能在单机上轻松支撑上千个环境的并行运行将数据生成效率提升了一个数量级。这对于《游戏王》这种单局步数可能上百的游戏来说是能否在合理时间内完成训练的关键。5.2 动作空间与状态表示的挑战《游戏王》的决策复杂度远超围棋或星际争霸。其动作空间不仅是离散的而且是动态且高维的。在某个时点合法的动作可能包括通常召唤、特殊召唤、发动场地魔法、发动怪兽效果、进入战斗阶段、直接攻击等等且每个动作还可能涉及目标选择。项目采用了一种“扁平化”的表示方法将当前所有可能的合法动作编码成一个固定大小的张量例如(24, 12)并配合一个动作掩码来屏蔽非法动作。神经网络输出一个在所有合法动作上的概率分布。状态表示则更为复杂。需要编码的信息包括双方手牌每张卡的类型、属性、攻击力、效果文本嵌入、场上怪兽/魔法陷阱区位置、状态、关联关系、墓地、除外区、卡组数量、生命值、阶段信息等。项目通过精心设计的多部分观察空间cards_,global_,actions_,mask_来承载这些信息。如何更高效、更结构化地表示游戏状态以帮助模型更好地理解局势仍然是该领域一个开放的研究问题。5.3 从AI对战到实战应用的想象空间目前项目主要聚焦于训练一个强大的对战AI。但其潜力远不止于此。结合路线图的规划我们可以展望几个激动人心的方向AI辅助构筑让AI基于海量对局数据学习卡牌之间的协同效应为玩家推荐卡组构筑优化方案甚至自动生成针对特定环境的“赛马”卡组。对局分析与解说利用训练好的价值网络实时评估对局双方的胜率曲线为观众提供数据化的局势解读。AI可以指出“关键回合”或“致命失误”。新卡牌零样本泛化利用LLM生成的嵌入向量当新卡牌发布时即使没有对应的对局数据AI也能基于其文本描述将其嵌入到已有的向量空间中做出合理的决策推断。这能极大降低AI的维护成本。BO3赛制与心理博弈支持多局制胜BO3赛制并让AI能够利用前几局获得的信息如对手的卡组构成、操作习惯来调整后续对局的策略模拟人类比赛中的心理战。蒙特卡洛树搜索集成像AlphaGo一样在模型输出的策略和价值基础上进行前瞻性的搜索以做出更深远、更精确的决策尤其是在残局阶段。5.4 常见问题排查与社区资源在实践过程中你可能会遇到各种各样的问题。以下是一个快速排查指南问题现象可能原因解决方案导入ygoenv失败提示GLIBCXX错误系统或conda环境中的C标准库版本过低。按照前文所述更新或链接到高版本libstdc.so.6。训练时eval_win_rate始终在0.5附近波动1. 学习率设置不当。2. 网络结构或超参数不适合。3. 环境或模型初始化有问题。1. 大幅降低学习率如到1e-5试跑。2. 检查--deck路径是否正确卡组是否被支持。3. 使用--strategy random运行评估脚本确认环境本身能正常进行随机对局。与AI对战时AI长时间不操作或报错1. API服务未成功启动或地址错误。2. 客户端卡组包含了AI不支持的卡片。3. 模型文件损坏或版本不匹配。1. 在浏览器访问http://127.0.0.1:3000确认API服务返回OK。2. 确保使用assets/deck/内的卡组。3. 重新下载模型文件并确认使用.tflite或正确的.flax_model格式。训练速度非常慢SPS很低1. 使用了CPU版本的JAX。2.--local-num_envs设置过高超出CPU负载。3. 数据I/O或模型保存成为瓶颈。1. 确认已安装GPU版JAX且CUDA可用。2. 降低--local-num_envs观察CPU占用率。3. 将模型保存间隔--save_interval调大或更换更快的存储设备。出现内存不足OOM错误1. 并行环境数或Batch size设置过大。2. 模型参数量过大。3. GPU显存不足。1. 减少--local-num_envs和--num-minibatches。2. 尝试在cleanba.py中减小神经网络隐藏层大小。3. 使用--xla_device cpu在CPU上运行或使用更小的模型。遇到无法解决的问题时最有效的途径是加入项目的Discord社区。在https://discord.gg/EqWYj4G4Ys你可以直接向开发者和其他社区成员提问通常能获得快速、专业的解答。在提问前最好准备好你的错误日志、环境配置和已尝试的步骤这样有助于他人高效地帮助你。从我个人的实践来看YGO Agent是一个将前沿AI研究与经典卡牌游戏结合得相当出色的项目。它不仅为AI研究者提供了一个极具挑战性的新环境也为游戏玩家打开了一扇窥见未来游戏AI形态的窗户。从克隆代码、解决环境依赖到成功启动训练并看到第一个模型战胜随机对手再到部署API与自己对战整个过程充满了工程挑战和探索乐趣。尽管目前它还远未达到“完美”在卡牌支持、决策速度等方面仍有很长的路要走但其架构设计和实现思路已经为后续的发展奠定了坚实的基础。对于任何对AI、游戏或两者交叉领域感兴趣的朋友我都强烈建议你亲手尝试一下这个项目感受让机器学会打牌的奇妙过程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2555364.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;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…