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

LangChain Memory 完全指南:InMemorySaver、SQLite、Redis Stack 实战与避坑

LangChain Memory 完全指南从内存到 Redis让你的 AI 真正记住对话 文章概览解决什么问题AI 对话没记忆每次重启服务就失忆为什么值得读从踩坑到源码3 种方案 5 个避坑指南生产环境可直接复制你能获得什么InMemorySaver → SQLite → Redis Stack 完整迁移路径附 Docker 配置和代码示例 一句话总结测试用 InMemorySaver小项目用 SQLite大项目用 Redis Stack —— 别再用内存存储撑生产环境了⚡ 开篇一个让人崩溃的 Bug最近做 LangChain 项目时我遇到一个特别离谱的问题开发环境一切正常# 第一轮responseagent.invoke({messages:[HumanMessage(content她叫小美)]},{configurable:{thread_id:1}})# 第二轮AI 记住了✅responseagent.invoke({messages:[HumanMessage(content她叫什么)]},{configurable:{thread_id:1}})# 输出她叫小美 ✅但是服务一重启……# 重启后再问responseagent.invoke({messages:[HumanMessage(content她还记得我吗)]},{configurable:{thread_id:1}})# 输出我不认识你... 我当时就懵了代码明明没改配置也没变怎么重启一下就不行了排查了两小时才发现真凶是 InMemorySaver —— 它只存内存进程死了数据就没了这就好比你用记事本写日记没点保存电脑一关全没了。 先说结论✅ 核心结论方案存储位置适用场景推荐度InMemorySaver进程内存本地测试⭐⭐SqliteSaverSQLite 文件单机小项目⭐⭐⭐⭐RedisSaverRedis 服务器分布式大项目⭐⭐⭐⭐⭐ 正确方案# 生产环境推荐Redis Stackfromlanggraph.checkpoint.redisimportRedisSaver checkpointerRedisSaver.from_conn_string(redis://:passwordhost:6379)checkpointer.setup()# 首次需要初始化表结构agentcreate_agent(modelyour_model,checkpointercheckpointer# 关键传入 checkpointer)⚠️ 避坑提醒普通 Redis 不行必须用 Redis Stack因为需要 RediSearch 和 RedisJSON 模块。 问题背景为什么 AI 需要记忆想象一下这个场景第一轮对话 用户“我喜欢一个女生她叫小美” AI“哦~ 小美啊那你可以这样表达…”第二轮对话 用户“那个女生叫什么名字” AI如果没记忆“哪个女生你没告诉我啊”这就是没有记忆的 AI —— 每次对话都是全新的开始。在真实项目中这种体验简直是灾难客服机器人用户说了三次问题AI 还要问您想咨询什么智能助手刚设置完偏好下一句话就忘了代码助手前面定义的变量后面全不认识LangChain 的解决方案Short-term MemoryLangChain 提供了短期记忆Short-term Memory机制在同一个线程Thread内记住之前所有的对话历史。核心组件叫Checkpointer检查点保存器fromlanggraph.checkpoint.memoryimportInMemorySaver agentcreate_agent(modelmodel,checkpointerInMemorySaver()# ← 就是这个东西)工作原理✅ 每次调用agent.invoke()时自动保存当前状态✅ 下次调用时根据thread_id恢复历史消息✅ AI 可以看到完整的对话上下文我遇到的问题我在开发环境用InMemorySaver测试得很好# 第一轮responseagent.invoke({messages:[HumanMessage(content她叫小美)]},{configurable:{thread_id:1}})# 第二轮AI 记住了小美responseagent.invoke({messages:[HumanMessage(content她叫什么)]},{configurable:{thread_id:1}})# 输出她叫小美 ✅但是服务一重启或者换个终端thread_id1的记忆就没了因为 InMemorySaver 是存内存的进程死了数据就没了。这就好比你用记事本写日记没点保存电脑一关全没了。 问题排查过程❌ 第一次怀疑是不是 thread_id 配置错了怀疑原因不同对话用了相同的thread_id导致串台验证方法# 打印每次调用的 messagesprint(response[messages])# 发现确实记录了历史消息结论❌ 不是thread_id的问题配置正确。❌ 第二次怀疑是不是模型不支持多轮对话怀疑原因Qwen-Turbo 不支持长上下文验证方法# 手动拼接历史消息测试messages[SystemMessage(content你是幽默大师),HumanMessage(content她叫小美),AIMessage(content好的我知道了),HumanMessage(content她叫什么)]model.invoke(messages)# 输出她叫小美 ✅结论❌ 模型支持多轮对话不是模型的锅。❌ 第三次怀疑是不是代码逻辑有问题怀疑原因create_agent的参数传错了验证方法# 检查 agent 配置print(agent.config)# 发现checkpointer 确实是 InMemorySaver结论❌ 代码没问题Checkpointer 配置正确。✅ 第四次发现真相InMemorySaver 只存内存关键线索# 重启服务后responseagent.invoke({messages:[HumanMessage(content她还记得我吗)]},{configurable:{thread_id:1}})# 输出我不认识你... 恍然大悟InMemorySaver 内存存储 进程重启 数据清空这就好比你跟朋友聊天朋友记得你说的话 ✅但朋友失忆了重启全忘了 ❌最终结论测试环境可以用 InMemorySaver但生产环境必须用持久化存储 原理解析通俗版7.1 什么是 Checkpointer人话版本Checkpointer 就是一个自动保存器。每次对话结束它自动把聊天记录存起来。下次对话开始它自动把记录加载出来。技术版本classCheckpointer:defsave(self,thread_id,state):保存状态到存储passdefload(self,thread_id):从存储加载状态pass7.2 三种 Checkpointer 对比方案存储位置适用场景优点缺点InMemorySaver进程内存本地测试简单快速重启丢失SqliteSaverSQLite 文件单机小项目无需安装数据库不支持高并发RedisSaverRedis 服务器分布式大项目高性能、支持集群需要 Redis Stack7.3 数据存储结构以 Redis 为例当你使用 RedisSaver 时Redis 中会存储这些 Keythread_id 1 │ ▼ checkpoint_latest ← 当前最新状态 │ ▼ checkpoint_版本号 ← 历史快照 │ ┌────┴────┐ ▼ ▼ checkpoint checkpoint_write (完整快照) (执行日志) │ ▼ write_keys_zset ← 日志索引有序集合具体说明checkpoint_latest最新的对话状态快速读取checkpoint_xxx每个版本的完整快照支持回滚checkpoint_write写入操作的详细日志write_keys_zset按时间排序的日志索引为什么要这么设计快速读取直接读checkpoint_latest不用遍历历史版本回滚出问题时可以恢复到任意版本调试方便可以查看完整的操作日志7.4 工作流程图用户发送消息 │ ▼ ┌─────────────────┐ │ 1. 加载历史 │ ← 从 Checkpointer 读取 │ (load) │ └────────┬────────┘ │ ▼ ┌─────────────────┐ │ 2. 拼接消息 │ ← 历史消息 新消息 │ │ └────────┬────────┘ │ ▼ ┌─────────────────┐ │ 3. 调用模型 │ ← 发送给 LLM │ │ └────────┬────────┘ │ ▼ ┌─────────────────┐ │ 4. 保存状态 │ → 写入 Checkpointer │ (save) │ └─────────────────┘ 正确解决方案方案一InMemorySaver仅测试环境⚠️适用场景本地开发、单元测试、Demo 演示 代码示例fromlangchain.chat_modelsimportinit_chat_modelfromlangchain.agentsimportcreate_agentfromlangchain.messagesimportSystemMessage,HumanMessagefromlanggraph.checkpoint.memoryimportInMemorySaver# 1. 初始化模型modelinit_chat_model(modelqwen-turbo,model_provideropenai,base_urlhttps://dashscope.aliyuncs.com/compatible-mode/v1)# 2. 创建 Agent带内存记忆agentcreate_agent(modelmodel,system_promptSystemMessage(content你是一个幽默大师),checkpointerInMemorySaver()# ⚠️ 仅用于测试)# 3. 第一轮对话config{configurable:{thread_id:1}}responseagent.invoke({messages:[HumanMessage(content我喜欢一个女生她叫小美)]},config)print(response[messages][-1].content)# 4. 第二轮对话AI 会记住小美responseagent.invoke({messages:[HumanMessage(content那个女生叫什么)]},config)print(response[messages][-1].content)# 输出她叫小美 ✅⚠️ 缺点提醒❌ 进程重启后数据丢失❌ 不支持多进程/分布式❌ 不能用于生产环境方案二SqliteSaver单机小项目✅ 推荐适用场景个人项目、小型应用、单机部署 前置依赖uvaddlanggraph-checkpoint-sqlite 代码示例fromlangchain.chat_modelsimportinit_chat_modelfromlangchain.agentsimportcreate_agentfromlangchain.messagesimportSystemMessage,HumanMessagefromlanggraph.checkpoint.sqliteimportSqliteSaverimportos# 1. 初始化模型modelinit_chat_model(modelqwen-turbo,model_provideropenai,base_urlhttps://dashscope.aliyuncs.com/compatible-mode/v1)# 2. 创建数据目录os.makedirs(data,exist_okTrue)# 3. 使用 SQLite 存储持久化到文件withSqliteSaver.from_conn_string(data/checkpoints.sqlite# 数据库文件路径)asmemory:# 4. 创建 Agentagentcreate_agent(modelmodel,system_promptSystemMessage(content你是一个幽默大师),checkpointermemory)# 5. 会话配置config{configurable:{thread_id:1}}# 6. 调用responseagent.invoke({messages:[HumanMessage(content我喜欢一个女生她叫小美)]},config)print(response[messages][-1].content)# 重启服务后记忆依然存在 ✅✅ 优点✅ 数据持久化到文件✅ 无需安装额外数据库✅ 适合小型项目⚠️ 注意事项❌ 不支持高并发写入❌ 不适合分布式部署❌ 大量数据时性能下降方案三RedisSaver生产环境✅✅ 强烈推荐适用场景企业级应用、高并发场景、分布式系统 前置依赖uvaddlanggraph-checkpoint-redis⚠️ 重要提示必须使用 Redis Stack普通 Redis 不行因为需要RediSearch用于搜索和索引RedisJSON用于存储 JSON 数据 Docker Compose 配置version:3.8services:redis:image:redis/redis-stack:latest# 必须用 redis-stackcontainer_name:redis7restart:alwaysports:-6379:6379# Redis 端口-8001:8001# Redis Insight 管理界面environment:REDIS_ARGS:--requirepass 123456 # 密码 --appendonly yes # 开启 AOF 持久化 --maxmemory 512mb # 最大内存 --maxmemory-policy allkeys-lru # 内存淘汰策略volumes:-./data:/data# 数据持久化networks:default:name:redis-network 启动命令docker-composeup-d Python 代码示例fromlangchain.chat_modelsimportinit_chat_modelfromlangchain.agentsimportcreate_agentfromlangchain.messagesimportHumanMessagefromlanggraph.checkpoint.redisimportRedisSaver# 1. 初始化模型modelinit_chat_model(modelqwen-turbo,model_provideropenai,base_urlhttps://dashscope.aliyuncs.com/compatible-mode/v1)# 2. 初始化 Redis Checkpointerredis_cmRedisSaver.from_conn_string(redis://:123456192.168.191.128:6379# 格式redis://:密码主机:端口)# 3. 手动获取连接对象checkpointerredis_cm.__enter__()# 4. 首次执行需要 setup创建必要的索引checkpointer.setup()# 5. 创建 Agentagentcreate_agent(modelmodel,system_prompt你是一个幽默大师能够用幽默的语言回答用户的问题。,checkpointercheckpointer)# 6. 会话配置config{configurable:{thread_id:1# 每个 user 用不同的 thread_id}}# 7. 第一轮对话responseagent.invoke({messages:[HumanMessage(content我喜欢一个女生她叫小美)]},config)print(response[messages][-1].content)# 8. 第二轮对话即使重启服务记忆依然存在responseagent.invoke({messages:[HumanMessage(content那个女生叫什么名字)]},config)print(response[messages][-1].content)# 输出她叫小美 ✅✅✅✅ 优点✅ 支持高并发每秒万级读写✅ 数据持久化AOF RDB✅ 支持分布式部署✅ 支持集群模式✅ 适合生产环境⚠️ 注意事项❌ 需要额外的 Redis 服务❌ 必须用 Redis Stack不能是普通 Redis 避坑指南 坑 1普通 Redis 存储会报错错误现象Error: Redis command FT.CREATE is not available原因LangChain 的 RedisSaver 内部使用了RediSearch和RedisJSON模块普通 Redis 没有这两个模块。正确做法# ❌ 错误普通 Redisdockerrun-d--nameredis redis:latest# ✅ 正确Redis Stackdockerrun-d--nameredis redis/redis-stack:latest如何验证是否安装成功# 进入 Redis 容器dockerexec-itredis7 redis-cli-a123456# 检查模块MODULE LIST# 应该输出# 1) 1) name# 2) ReJSON# 3) ver# 4) 99999# 2) 1) name# 2) search# 3) ver# 4) 99999 坑 2忘记调用 setup() 方法错误现象Error: Index not found原因首次使用 RedisSaver 时需要调用setup()方法来创建必要的索引结构。正确做法checkpointerRedisSaver.from_conn_string(redis://:passwordhost:6379)checkpointercheckpointer.__enter__()checkpointer.setup()# ⚠️ 这一步不能少注意setup()只需要执行一次后续启动不需要再次调用除非清空了 Redis 数据 坑 3thread_id 混用导致串台错误现象用户 A 说我叫张三用户 B 问我叫什么AI 回答你叫张三原因多个用户使用了相同的thread_id。正确做法# ❌ 错误所有用户共用一个 thread_idconfig{configurable:{thread_id:1}}# ✅ 正确每个用户使用唯一的 thread_idimportuuid user_idget_current_user_id()# 从 session/token 获取config{configurable:{thread_id:str(user_id)}}最佳实践defget_user_config(user_id):return{configurable:{thread_id:fuser_{user_id},# 加前缀避免冲突user_id:user_id}} 坑 4消息过长导致上下文溢出错误现象Error: This models maximum context length is XXX tokens原因长时间对话导致消息历史超过模型的上下文窗口限制。解决方案三种方案 A裁剪消息Trim Messagesfromlangchain.agents.middlewareimportbefore_modelfromlangchain.messagesimportRemoveMessagefromlanggraph.graph.messageimportREMOVE_ALL_MESSAGESbefore_modeldeftrim_messages(state,runtime):只保留最近的 N 条消息messagesstate[messages]iflen(messages)10:returnNone# 不需要裁剪# 保留第一条系统消息 最近 9 条first_msgmessages[0]recent_messagesmessages[-9:]return{messages:[RemoveMessage(idREMOVE_ALL_MESSAGES),# 清空所有first_msg,*recent_messages]}agentcreate_agent(modelmodel,middleware[trim_messages],# 注册中间件checkpointercheckpointer)方案 B删除旧消息Delete Messagesafter_modeldefdelete_old_messages(state,runtime):删除最早的消息messagesstate[messages]iflen(messages)20:# 删除最早的 10 条return{messages:[RemoveMessage(idm.id)forminmessages[:10]]}returnNone方案 C消息摘要SummarizationMiddleware✅ 推荐fromlangchain.agents.middlewareimportSummarizationMiddleware agentcreate_agent(modelgpt-4,middleware[SummarizationMiddleware(modelgpt-4-mini,# 用于摘要的小模型trigger(tokens,4000),# 超过 4000 token 时触发keep(messages,20)# 至少保留 20 条消息)],checkpointercheckpointer)工作原理当消息超过阈值时自动调用小模型生成摘要用摘要替换早期的详细消息既保留关键信息又控制 token 数量 坑 5SQLite 并发写入锁冲突错误现象Error: database is locked原因SQLite 同一时间只允许一个写操作高并发时会锁表。解决方案# 方案 1降低并发简单粗暴fromqueueimportQueueimportthreading task_queueQueue()lockthreading.Lock()defsafe_invoke(agent,message,config):withlock:returnagent.invoke(message,config)# 方案 2改用 PostgreSQL 或 Redis推荐fromlanggraph.checkpoint.postgresimportPostgresSaver checkpointerPostgresSaver.from_conn_string(postgresql://user:passlocalhost:5432/langchain) 最后总结 核心原因AI 失忆不是因为模型笨而是因为你没给它配笔记本Checkpointer。✅ 正确方案测试用 InMemorySaver小项目用 SQLite生产环境用 Redis Stack。⚠️ 避坑提醒普通 Redis 存不了 LangChain 记忆必须用 Redis Stack这个坑我替你踩过了。 一句话经验很多时候 Bug 不是代码写错了而是选错了工具。就像你不能用记事本去管理企业级数据库一样你也不能用 InMemorySaver 去支撑生产环境。 附录快速选型指南你的场景推荐方案理由本地学习/DemoInMemorySaver零配置开箱即用个人项目/工具SqliteSaver无需装数据库文件即存储企业应用/SAASRedisSaver (Stack)高性能、支持集群已有 PostgreSQLPostgresSaver复用现有基础设施需要审计日志PostgreSQL RedisPG 存日志Redis 存热数据 参考资源官方文档https://docs.langchain.com/oss/python/langchain/short-term-memoryCheckpoint 列表https://docs.langchain.com/oss/python/integrations/checkpointers/indexRedis Stackhttps://redis.io/docs/stack/如果这篇文章帮到了你欢迎点赞、收藏、转发有问题评论区见我看到都会回复~ 作者介绍写文不易Bug 更不易。如果这篇文章对你有帮助可以搜一搜空门技术栈这里分享✅ Java / Spring AI / 企业级项目实战✅ Docker / RAG知识库 / 微服务踩坑✅ Python、前端、AI应用落地✅ 偶尔分享一些「头发保卫战」经验 一个热爱技术、持续填坑的开发者陪你一起少踩坑少加班多写优雅代码。 推荐阅读看了 3 天官方文档后我决定自己写一篇 LangChain 人话教程GPT-5.5 变强、Spring AI 更新、Ollama 爆漏洞今天值得看的技术热点还在复制粘贴 if-else模板方法模式专治重复代码CSDNLangChain 入门实战指南

相关文章:

LangChain Memory 完全指南:InMemorySaver、SQLite、Redis Stack 实战与避坑

LangChain Memory 完全指南:从内存到 Redis,让你的 AI 真正"记住"对话 📋 文章概览 解决什么问题: AI 对话没记忆?每次重启服务就失忆? 为什么值得读: 从踩坑到源码,3 种方…...

ncmdumpGUI完全手册:解锁网易云音乐NCM格式的终极Windows解决方案

ncmdumpGUI完全手册:解锁网易云音乐NCM格式的终极Windows解决方案 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换,Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 你是否曾为网易云音乐下载的NCM格…...

保姆级教程:5分钟快速搭建你的DNC服务器,实现Fanuc/西门子数控程序远程传输与管理

数控机床程序远程管理实战:5分钟构建企业级DNC服务 在金属加工车间里,老师傅们弯腰在机床控制面板上手动输入程序的场景正逐渐成为历史。当车间里同时运行着发那科、西门子和三菱等不同品牌的数控设备时,如何高效管理这些设备的加工程序&…...

基于 Vibe Coding 的 OJ 平台

基于 Vibe Coding 的 OJ 平台 Github: https://github.com/wjlwjlwjlwjl-cmd/vibe-coding-based-oj-platform Gitee: https://gitee.com/wangs-joyful-home/vibe-coding-based-oj-platform 一个类 LeetCode 的在线编程评测平台,支持题目管理、代码提交、自动判题、提…...

OneMore:如何通过160+个功能命令彻底改变你的OneNote使用体验

OneMore:如何通过160个功能命令彻底改变你的OneNote使用体验 【免费下载链接】OneMore A OneNote add-in with simple, yet powerful and useful features 项目地址: https://gitcode.com/gh_mirrors/on/OneMore OneMore是一款专为OneNote设计的强大插件&…...

Pydantic序列化避坑指南:model_dump vs dict、exclude/include高级用法与SerializeAsAny解析

Pydantic序列化避坑指南:model_dump vs dict、exclude/include高级用法与SerializeAsAny解析 在Python生态中,Pydantic已经成为数据验证和序列化的标杆工具。但许多开发者在实际使用中,常常会遇到一些看似简单却容易踩坑的序列化问题。本文将…...

树莓派4B部署YOLOv8保姆级避坑指南:从PyTorch版本选择到模型推理全流程

树莓派4B部署YOLOv8实战手册:从版本适配到高效推理的深度解析 引言 在嵌入式设备上部署现代计算机视觉模型,就像给一辆微型赛车装上F1引擎——潜力巨大但挑战重重。最近帮朋友在树莓派4B上部署YOLOv8时,我们花了三天时间才走出"依赖地狱…...

Python:4 == 4.0 结果为True的原因

特殊情况:在 Python 中,整数和浮点数进行比较时,如果数值相等,则结果为 True。即 4 4.0 的结果是 True。如果两个对象代表相同的概念或数值,即使类型不同(如 int 和 float),也可能返…...

从0到1搭建AI-PPT流水线,支持中英双语自动适配+品牌VI强制注入(含可运行Python脚本+Power Automate配置包)

更多请点击: https://intelliparadigm.com 第一章:从0到1搭建AI-PPT流水线,支持中英双语自动适配品牌VI强制注入(含可运行Python脚本Power Automate配置包) 本方案构建端到端自动化PPT生成流水线,输入结构…...

物联网接入层技术剖析(四):当epoll遇见MQTT

Netty与高性能网络服务、Linux高并发网络编程实战、从epoll到Netty:物联网接入层技术剖析、深入理解I/O多路复用、服务端网络编程进阶指南 Netty与物联网:当epoll遇见MQTT 0 写在前面 这个系列写了三篇,从 select 到 epoll,从内…...

Sunshine游戏串流服务器:打造个人游戏云的终极免费方案

Sunshine游戏串流服务器:打造个人游戏云的终极免费方案 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine 想要在任何设备上畅玩PC游戏吗?Sunshine作为一款开源…...

OpenAI通用推理模型攻克近80年数学难题,打脸7个月前虚假突破质疑

【导语:5月21日,OpenAI宣布其一款未对外发布的内部通用推理模型独立完成原创数学证明,推翻了匈牙利数学家保罗埃尔德什1946年提出的“平面单位距离猜想”,这是AI首次独立攻克数学领域核心著名公开难题。】AI攻克近80年几何猜想Ope…...

面试官问CyclicBarrier和CountDownLatch区别?这样回答直接拿Offer(附源码级对比和避坑点)

面试官问CyclicBarrier和CountDownLatch区别?这样回答直接拿Offer(附源码级对比和避坑点) 在Java并发编程的面试中,CyclicBarrier和CountDownLatch的区别几乎是必问的高频考点。但真正能打动面试官的,绝不仅仅是背诵教…...

别再找组策略了!Windows 11家庭版/专业版通用,一条命令搞定密码永不过期

Windows 11密码永不过期终极指南:告别繁琐设置,一条命令解决所有版本难题 每次开机都被"密码即将过期"的提示烦扰?作为Windows 11用户,你可能已经尝试过各种图形界面设置却无功而返。特别是家庭版用户,面对缺…...

Realsense D435i相机标定避坑指南:从棋盘格准备到OpenCV立体校正全流程

Realsense D435i相机标定实战:从硬件配置到立体校正的完整避坑手册 在三维视觉和机器人领域,相机标定是构建精准感知系统的基石。Intel Realsense D435i作为一款广泛使用的深度相机,其标定质量直接影响着SLAM、三维重建等应用的精度。本文将分…...

WinAsar:告别命令行!551KB的Electron asar文件可视化处理神器

WinAsar:告别命令行!551KB的Electron asar文件可视化处理神器 【免费下载链接】WinAsar Portable and lightweight GUI utility to pack and extract asar( Electron archive ) files, Only 551 KB! 项目地址: https://gitcode.com/gh_mirrors/wi/WinA…...

Richard Socher创业公司获6.5亿美元融资,欲让AI自动化研发引领底层范式转移

Richard Socher创业公司获巨额融资一家创业公司获得了GV(Alphabet旗下VC)和Greycroft共同领投的6.5亿美元早期融资,NVIDIA和AMD也参与本轮融资,它的估值达到了46.5亿美元。这家公司的创始人是Richard Socher,他是AI领域…...

别再手动改Hex了!用Vector HexView的/remap命令,5分钟搞定固件地址重映射

嵌入式开发革命:Vector HexView自动化重映射技术实战指南 在汽车电子和物联网设备开发中,固件地址调整如同家常便饭。每当内存布局变更、Bootloader升级或外设地址重新分配时,嵌入式工程师们就不得不面对一项枯燥且容易出错的任务——手动修改…...

Graphormer实战:用最短路径和虚拟节点搞定分子性质预测(附PyTorch代码)

Graphormer实战:从分子结构到性质预测的完整实现指南 在药物发现和材料科学领域,准确预测分子的物理化学性质可以大幅加速研发进程。传统方法依赖昂贵的实验测量或复杂的量子化学计算,而图神经网络(GNN)和Transformer的结合——Graphormer&a…...

5分钟实现OBS多平台同步直播:obs-multi-rtmp插件完全指南

5分钟实现OBS多平台同步直播:obs-multi-rtmp插件完全指南 【免费下载链接】obs-multi-rtmp OBS複数サイト同時配信プラグイン 项目地址: https://gitcode.com/gh_mirrors/ob/obs-multi-rtmp 你是否厌倦了在不同直播平台间来回切换的繁琐操作?obs-…...

城通网盘下载速度慢?3分钟学会ctfileGet终极免费提速方案

城通网盘下载速度慢?3分钟学会ctfileGet终极免费提速方案 【免费下载链接】ctfileGet 获取城通网盘一次性直连地址 项目地址: https://gitcode.com/gh_mirrors/ct/ctfileGet 你是否曾经被城通网盘的龟速下载折磨得抓狂?面对50KB/s的限速、无尽的验…...

QQ音乐加密音频一键解密:qmcdump终极指南

QQ音乐加密音频一键解密:qmcdump终极指南 【免费下载链接】qmcdump 一个简单的QQ音乐解码(qmcflac/qmc0/qmc3 转 flac/mp3),仅为个人学习参考用。 项目地址: https://gitcode.com/gh_mirrors/qm/qmcdump 你是否曾为QQ音乐下…...

ABAQUS结果导出太麻烦?试试这个隐藏技巧,5分钟搞定截面节点应力数据到Excel

ABAQUS结果导出效率革命:5分钟精准捕获截面节点数据的全流程指南 在结构仿真分析领域,数据后处理往往消耗工程师40%以上的工作时间。当我第一次面对ABAQUS中复杂的应力云图,试图提取某个螺栓连接面的节点应力数据时,整整浪费了两天…...

DownKyi:解锁B站8K超高清视频下载的5个核心优势

DownKyi:解锁B站8K超高清视频下载的5个核心优势 【免费下载链接】downkyi 哔哩下载姬downkyi,哔哩哔哩网站视频下载工具,支持批量下载,支持8K、HDR、杜比视界,提供工具箱(音视频提取、去水印等)…...

从‘微软 ORG’到流畅中文NLP:你的zh_core_web_sm模型真的装对了吗?

从‘微软 ORG’到流畅中文NLP:你的zh_core_web_sm模型真的装对了吗? 当你在Spacy中加载zh_core_web_sm模型,运行示例文本"微软准备用十亿美金买下这家英国的创业公司"后,看到"微软"被正确标记为ORG&#xff0…...

保姆级教程:在Gazebo中为你的ROS机器人添加激光雷达和摄像头(附完整xacro配置)

Gazebo传感器配置实战:从激光雷达到摄像头的全流程解析 在机器人仿真开发中,让虚拟机器人"看得见"往往比让它"动起来"更具挑战性。许多开发者精心设计了URDF模型,却在Gazebo中遭遇传感器数据无法显示的困境——激光雷达没…...

从炼丹炉到生产线:在Linux服务器上为Stable Diffusion部署配置PyTorch环境(驱动+CUDA+Anaconda实战)

从炼丹炉到生产线:Linux服务器部署PyTorch环境全流程指南 引言:为什么需要专业化的AI开发环境? 在AI模型开发领域,我们常常把训练模型比作"炼丹"——需要精准控制各种"火候"参数。而要让这个"炼丹炉&quo…...

Flowable工作流回退功能避坑指南:从ruoyi-vue-pro源码看如何优雅处理并行网关

Flowable工作流并行网关回退机制深度解析:从ruoyi-vue-pro看复杂场景解决方案 在业务流程自动化领域,并行网关的处理一直是工作流引擎中最具挑战性的场景之一。当流程需要回退时,并行分支带来的状态管理复杂度会呈指数级增长。传统串行节点的…...

UVa 273 Jack Straws

题目分析 本题的题目背景源自一种名为 “Jack Straws\texttt{Jack Straws}Jack Straws” 的游戏,玩家需要从桌上一堆杂乱摆放的塑料或木质 “稻草” 中逐根取出,而不扰动其他稻草。本题不关心游戏过程,只关心一个问题:给定若干根稻…...

捡垃圾实战:让ESXi 7.0 U3识别老古董Mellanox ConnectX-2 10G网卡(附驱动修改全流程)

老硬件焕新:ESXi 7.0 U3下Mellanox ConnectX-2网卡驱动改造指南 在二手市场以几十元价格淘到的Mellanox ConnectX-2 10G双口网卡,性能依然强劲,却因为官方停止支持而无法在现代虚拟化平台上使用。本文将带你深入探索如何通过驱动改造&#xf…...