即插即用AI记忆协议:跨模型兼容的记忆中间件

news2026/5/22 3:04:35
1. 项目概述不是“插件”而是一套可即插即用的AI记忆增强协议你有没有遇到过这样的情况刚让大模型帮你梳理完一份30页产品需求文档的逻辑漏洞转头问它“第三章提到的用户分层标准是否和第五章的测试样本筛选条件冲突”它却一脸茫然反问你“您指的是哪份文档”或者你反复给同一个模型喂入相同的背景知识——公司组织架构、项目SOP、客户历史沟通记录——每次提问前都得重新粘贴一遍像在给一个健忘但聪明的同事做每日晨会简报。这不是模型能力不足而是当前主流LLM架构里“记忆”这件事被设计成了一次性上下文快照而非持续演化的认知基底。这篇标题里说的“This Plug-and-Play AI Memory Works With Any Model”指的正是一种绕过模型内部结构限制、在推理层外部构建稳定记忆体的技术路径。它不修改任何模型权重不依赖特定厂商API不绑定某个框架而是通过一套标准化的数据协议、状态管理机制与查询路由逻辑让任意开源或闭源大模型Llama 3、Qwen、Claude、GPT-4 Turbo都能“记住”你希望它记住的东西。核心关键词是插拔式Plug-and-Play、跨模型兼容Works With Any Model和AI记忆AI Memory——这三者组合起来解决的其实是人机协作中最基础也最恼人的断层模型没有“昨天”。它适合三类人一是需要长期维护知识库的产品经理与技术文档工程师二是高频调用多个模型做对比验证的研究者三是正在搭建企业级AI助手但被RAG延迟和幻觉问题反复折磨的开发者。它不是替代RAG而是给RAG装上“记忆锚点”不是取代微调而是让微调后的模型能动态加载新经验。我第一次在本地跑通这个方案时用的是一个7B参数的Qwen模型没动一行模型代码只加了不到200行Python胶水逻辑就让它记住了我过去两周所有会议纪要里的关键决策节点并能在后续提问中自动关联引用。这种“即插即用”的真实感远比读论文来得直接。2. 内容整体设计与思路拆解为什么必须绕开模型内部做一层“记忆中间件”2.1 根本矛盾模型的“无状态性”与人类协作的“有状态性”不可调和所有主流大语言模型无论大小其推理过程本质上是纯函数式Pure Function的输入一段token序列输出另一段token序列中间不保留任何可复用的状态。这是它高效、可并行、易部署的基石但也正是它无法形成“记忆”的根源。你喂给它的上下文context window就像一张临时便签纸——推理结束纸就烧掉。而人类协作中“记忆”是分层的短期记忆刚聊完的三句话、中期记忆本周项目进展、长期记忆公司使命与核心流程。传统RAG试图用向量数据库模拟中期记忆但它有两个硬伤第一检索结果是静态快照无法反映“这个信息在上周已被推翻”这类动态语义第二每次查询都要重走一遍嵌入→检索→重排序→拼接的完整链路延迟高、成本高、且容易把无关片段强行塞进上下文反而干扰模型判断。所以这个项目的整体设计思路非常清醒不挑战模型的无状态本质而是在它之外建一座“记忆驿站”。这座驿站不存储原始数据而是存储记忆元数据Memory Metadata谁在什么时间、基于什么意图、以什么置信度、关联了哪些实体、标记了哪些时效标签。当模型完成一次推理后驿站自动解析其输出中的事实性陈述、决策结论、待办事项生成结构化记忆条目当下次提问触发相关语义时驿站不是扔一堆文档片段过去而是精准推送一条带上下文锚点的“记忆提示”Memory Prompt比如“您曾在2024-05-12的会议中确认登录页A/B测试的胜出版本为V2.3统计显著性p0.01”。这种设计把“记忆”从数据搬运工升级成了认知协作者。2.2 “即插即用”的技术实现三根支柱与零耦合原则所谓“Plug-and-Play”绝不是一句营销话术而是由三个严格的技术支柱支撑的第一支柱协议层抽象Protocol Abstraction它定义了一套极简的JSON-RPC风格接口只有四个核心方法store(memory_item)、recall(query, context_hint)、forget(memory_id)、list(filters)。所有与模型的交互都通过这四个方法完成。这意味着无论你用的是Ollama本地运行的Phi-3还是通过OpenAI API调用GPT-4o只要你的调用代码里封装了这四个方法的适配器Adapter就能接入记忆系统。我实测写过Ollama、vLLM、OpenAI、Anthropic四家的适配器每家平均50行代码核心逻辑就是把模型的chat.completions.create请求包装成recall调用把模型的输出解析后喂给store。没有SDK没有私有协议只有HTTP/HTTPS或本地Unix Socket通信。第二支柱记忆图谱引擎Memory Graph Engine它不使用传统向量库而是基于轻量级图数据库如LiteGraph一个仅2MB的嵌入式Rust库构建记忆节点。每个记忆节点是一个带属性的顶点Vertex属性包括source_id来源会话ID、timestamp毫秒级时间戳、confidence0.0~1.0、entity_refs关联的实体ID列表如“用户ID:U123”、“需求ID:REQ-456”、valid_until有效期时间戳。节点之间用有向边连接边类型包括contradicts推翻、supports支持、extends延伸。当你问“登录页V2.3的测试结果如何”系统不是模糊检索“登录页”或“V2.3”而是先定位到source_idmeeting_20240512这个节点再沿supports边找到其关联的test_result节点最后提取其中的p_value和conclusion字段。这种图谱关系让记忆具备了逻辑自洽能力避免了RAG常见的“张冠李戴”。第三支柱上下文感知注入Context-Aware Injection这是“即插即用”最精妙的一环。它不把记忆条目粗暴拼接到用户提问后面而是根据当前对话的语义焦点Semantic Focus和推理阶段Reasoning Stage动态决定注入位置与形式。比如在用户提问初期Stage 1它可能只注入一条高置信度的事实摘要“关于登录页A/B测试历史结论为V2.3胜出p0.01”当模型开始生成详细分析Stage 2它会注入原始会议记录片段及时间戳当模型输出待办事项Stage 3它会注入一条带action_required标签的记忆“需在2024-05-20前向设计团队同步V2.3最终稿”。这种分阶段、分粒度的注入让记忆成为推理的“脚手架”而非“干扰项”。我做过对照实验同一组问题在纯RAG、固定Prompt注入、本方案三种方式下测试GPT-4o的准确率本方案在需要多跳推理的问题上准确率高出23%且平均响应延迟仅增加87ms远低于RAG的320ms。提示这个设计的核心哲学是“记忆服务于推理而非堆砌信息”。很多团队一上来就想把所有历史聊天记录全存进向量库结果检索越来越慢答案越来越散。真正的记忆增强是做减法——只存那些会被未来问题反复引用、且具有明确时效与置信度的关键断言。3. 核心细节解析与实操要点从零搭建一个可用的记忆中间件3.1 记忆元数据的设计为什么必须包含“置信度”与“有效期”很多人初看这个方案第一反应是“不就是个带时间戳的键值对数据库吗” 这是个危险的误解。记忆元数据的设计直接决定了系统能否在真实场景中存活。我们来看一个典型失败案例某电商团队将所有客服对话中提取的“用户投诉原因”存为记忆未设置信度。结果模型在回答“最近用户最常抱怨什么”时把一条被后续工单明确标注为“误报”的投诉用户自己打错电话号码导致无法接通当作了高权重事实给出错误归因。因此confidence字段不是可选项而是必填项且必须有明确计算依据。我们的实践是三级置信度来源来源可信度Source Confidence来自结构化数据源如CRM系统导出的工单为0.95来自人工标注的会议纪要为0.85来自模型自身输出中解析的断言为0.7需经规则校验。内容一致性Content Consistency该断言是否与图谱中已存在的3个以上同类节点一致每一致一项0.05最高0.15。时效衰减Temporal Decay采用指数衰减公式decay e^(-t/τ)其中t为距今小时数τ为半衰期默认72小时。一个3天前的会议结论衰减后置信度为0.67而一个1小时前的实时监控告警衰减后仍为0.99。valid_until字段同样关键。它不是简单地设为“永久”而是根据信息类型动态计算决策类如“批准预算”now 365 days一年内有效除非被新决策推翻状态类如“服务器宕机”now 2 hours两小时内若无新状态更新则自动失效预测类如“Q3营收预计增长12%”now 90 days季度预测有效期为三个月这个设计让系统天然具备“遗忘”能力。我在调试时故意制造了一个冲突先存入“项目上线日期为2024-06-15”两天后又存入“因合规审查延期至2024-07-10”系统自动在图谱中建立contradicts边并将旧节点的valid_until设为2024-06-15T00:00:00Z即原定上线时刻确保此后所有查询都只看到新日期。这种基于规则的自动生命周期管理是纯向量检索永远做不到的。3.2 图谱构建与查询如何用100行代码实现高效的“记忆导航”图谱引擎是整个方案的“大脑”但它的实现可以异常轻量。我们不使用Neo4j这类重型图库而是基于SQLite的FTS5全文索引自定义图遍历函数。核心表结构只有两张-- 记忆主表 CREATE TABLE memories ( id TEXT PRIMARY KEY, source_id TEXT NOT NULL, timestamp INTEGER NOT NULL, -- Unix毫秒时间戳 confidence REAL NOT NULL CHECK(confidence BETWEEN 0.0 AND 1.0), valid_until INTEGER NOT NULL, -- Unix毫秒时间戳 content TEXT NOT NULL, entity_refs TEXT, -- JSON数组如 [U123, REQ-456] tags TEXT -- CSV字符串如 decision,high_priority ); -- 关系边表 CREATE TABLE memory_edges ( from_id TEXT NOT NULL, to_id TEXT NOT NULL, edge_type TEXT NOT NULL CHECK(edge_type IN (supports, contradicts, extends)), weight REAL DEFAULT 1.0, PRIMARY KEY (from_id, to_id, edge_type) );查询逻辑的关键在于将自然语言查询转化为图谱遍历路径。我们不依赖LLM做语义解析而是用一套预定义的模式匹配规则。例如当用户问“X和Y的关系是什么”系统会用NER模型spaCy轻量版识别X、Y为实体在memories表中查找entity_refs包含X或Y的所有节点对这些节点执行SQL查询SELECT * FROM memory_edges WHERE (from_id IN (:x_nodes) AND to_id IN (:y_nodes)) OR (from_id IN (:y_nodes) AND to_id IN (:x_nodes))根据edge_type返回结构化答案“节点AX与节点BY存在‘supports’关系依据来源会议纪要20240512”。这套逻辑用Python实现不到100行却能处理90%以上的“关系型”记忆查询。我把它封装成一个独立服务memory-router通过gRPC暴露接口。实测在10万条记忆数据下平均查询延迟为12msP99延迟45ms。相比之下同等规模下用ChromaDB做向量检索P99延迟为210ms且内存占用高3倍。轻量才是“即插即用”的前提。注意不要试图用LLM去解析用户问题并生成Cypher查询。那会引入不可控延迟和幻觉。记忆查询的本质是确定性导航不是开放性生成。把NLU自然语言理解和图谱导航分开前者用规则小模型后者用SQL才是工业级稳健方案。4. 实操过程与核心环节实现手把手部署一个可工作的记忆系统4.1 环境准备与最小可行服务MVP搭建我们以Linux/macOS环境为例目标是30分钟内跑通一个可交互的记忆服务。全程无需GPU4GB内存足矣。第一步安装核心依赖# 创建虚拟环境 python3 -m venv memory-env source memory-env/bin/activate # 安装核心库总包体积15MB pip install fastapi uvicorn httpx python-dotenv spacy sqlite-utils # 下载轻量级spaCy模型仅12MB python -m spacy download en_core_web_sm第二步初始化记忆数据库创建init_db.pyimport sqlite3 import os def init_database(db_pathmemory.db): conn sqlite3.connect(db_path) cursor conn.cursor() # 创建memories表 cursor.execute( CREATE TABLE IF NOT EXISTS memories ( id TEXT PRIMARY KEY, source_id TEXT NOT NULL, timestamp INTEGER NOT NULL, confidence REAL NOT NULL, valid_until INTEGER NOT NULL, content TEXT NOT NULL, entity_refs TEXT, tags TEXT ) ) # 创建memory_edges表 cursor.execute( CREATE TABLE IF NOT EXISTS memory_edges ( from_id TEXT NOT NULL, to_id TEXT NOT NULL, edge_type TEXT NOT NULL, weight REAL DEFAULT 1.0, PRIMARY KEY (from_id, to_id, edge_type) ) ) # 为常用查询字段添加索引 cursor.execute(CREATE INDEX IF NOT EXISTS idx_source ON memories(source_id)) cursor.execute(CREATE INDEX IF NOT EXISTS idx_time ON memories(timestamp)) cursor.execute(CREATE INDEX IF NOT EXISTS idx_valid ON memories(valid_until)) conn.commit() conn.close() print(fDatabase initialized at {db_path}) if __name__ __main__: init_database()运行python init_db.py生成memory.db。第三步编写核心API服务创建main.py这是整个系统的入口from fastapi import FastAPI, HTTPException, BackgroundTasks from pydantic import BaseModel from datetime import datetime, timedelta import sqlite3 import json import uuid from typing import List, Optional, Dict, Any app FastAPI(titleAI Memory Router, version0.1) class MemoryItem(BaseModel): content: str source_id: str confidence: float 0.7 entity_refs: Optional[List[str]] None tags: Optional[List[str]] None valid_until_hours: int 72 # 默认有效期72小时 class RecallQuery(BaseModel): query: str context_hint: Optional[str] None # 当前对话上下文摘要 def get_db_connection(): return sqlite3.connect(memory.db) app.post(/store) def store_memory(item: MemoryItem): conn get_db_connection() cursor conn.cursor() mem_id str(uuid.uuid4()) now_ms int(datetime.now().timestamp() * 1000) valid_until_ms now_ms (item.valid_until_hours * 3600 * 1000) cursor.execute( INSERT INTO memories (id, source_id, timestamp, confidence, valid_until, content, entity_refs, tags) VALUES (?, ?, ?, ?, ?, ?, ?, ?) , ( mem_id, item.source_id, now_ms, item.confidence, valid_until_ms, item.content, json.dumps(item.entity_refs) if item.entity_refs else None, ,.join(item.tags) if item.tags else None )) conn.commit() conn.close() return {status: success, id: mem_id} app.post(/recall) def recall_memory(query: RecallQuery): # 简化版基于关键词匹配生产环境应替换为NER图谱遍历 conn get_db_connection() cursor conn.cursor() # 提取查询中的关键词此处用空格分割模拟实际用spaCy keywords query.query.lower().split() placeholders OR .join([content LIKE ?] * len(keywords)) params [f%{kw}% for kw in keywords] cursor.execute(f SELECT id, content, confidence, timestamp, valid_until FROM memories WHERE ({placeholders}) AND valid_until ? ORDER BY confidence DESC, timestamp DESC LIMIT 3 , (*params, int(datetime.now().timestamp() * 1000))) results cursor.fetchall() conn.close() if not results: return {results: []} return { results: [ { id: r[0], content: r[1], confidence: r[2], timestamp: r[3], valid_until: r[4] } for r in results ] } if __name__ __main__: import uvicorn uvicorn.run(app, host0.0.0.0, port8000, reloadTrue)第四步启动服务并测试# 启动API服务 uvicorn main:app --reload # 在另一个终端用curl测试 curl -X POST http://localhost:8000/store \ -H Content-Type: application/json \ -d { content: Qwen-7B模型在代码补全任务上平均准确率比Llama-3-8B高2.3%, source_id: benchmark_20240515, confidence: 0.92, entity_refs: [model:qwen-7b, model:llama-3-8b], tags: [benchmark, accuracy] } curl -X POST http://localhost:8000/recall \ -H Content-Type: application/json \ -d {query: qwen vs llama accuracy}你会得到一条结构化记忆结果。这就是MVP——一个真正“即插即用”的记忆服务它不依赖任何大模型本身就是一个独立的、可被任何应用调用的微服务。接下来你只需为你的模型调用代码写一个适配器把每次chat.completions.create前的recall和后的store逻辑加上记忆就活了。4.2 与任意模型的集成以Ollama和OpenAI为例的适配器编写Ollama适配器ollama_adapter.pyimport httpx import json from typing import Dict, Any, List class OllamaMemoryAdapter: def __init__(self, ollama_urlhttp://localhost:11434, memory_urlhttp://localhost:8000): self.ollama_url ollama_url self.memory_url memory_url def _recall_from_memory(self, query: str, context_hint: str ) - str: 从记忆服务召回相关提示 try: resp httpx.post( f{self.memory_url}/recall, json{query: query, context_hint: context_hint}, timeout5.0 ) if resp.status_code 200: data resp.json() if data[results]: # 取置信度最高的结果生成记忆提示 top data[results][0] return f[MEMORY] {top[content]} (Confidence: {top[confidence]:.2f}) except Exception as e: print(fMemory recall failed: {e}) return def chat_with_memory(self, model: str, messages: List[Dict], options: Dict None) - Dict[str, Any]: 增强版Ollama聊天自动注入记忆 # 1. 构建查询用最后一条用户消息作为recall query user_query for msg in reversed(messages): if msg[role] user: user_query msg[content][:200] # 截断防超长 break # 2. 召回记忆提示 memory_prompt self._recall_from_memory(user_query) # 3. 将记忆提示插入到系统消息末尾 enhanced_messages messages.copy() if memory_prompt and enhanced_messages and enhanced_messages[0][role] system: enhanced_messages[0][content] f\n\n{memory_prompt} # 4. 调用Ollama原生API payload { model: model, messages: enhanced_messages, stream: False } if options: payload[options] options resp httpx.post( f{self.ollama_url}/api/chat, jsonpayload, timeout120.0 ) resp.raise_for_status() # 5. 解析响应并尝试存储新记忆简化版存整个response result resp.json() if message in result and content in result[message]: self._store_new_memory(result[message][content], ollama_chat) return result def _store_new_memory(self, content: str, source_id: str): 存储模型输出为新记忆可选需业务规则过滤 try: httpx.post( f{self.memory_url}/store, json{ content: content[:500], # 截断 source_id: source_id, confidence: 0.7 }, timeout5.0 ) except Exception as e: pass # 失败则忽略OpenAI适配器openai_adapter.pyfrom openai import OpenAI import httpx class OpenAIMemoryAdapter: def __init__(self, api_key: str, memory_url: str http://localhost:8000): self.client OpenAI(api_keyapi_key) self.memory_url memory_url def _recall_from_memory(self, query: str) - str: try: resp httpx.post( f{self.memory_url}/recall, json{query: query}, timeout5.0 ) if resp.status_code 200: data resp.json() if data[results]: return f[MEMORY] {data[results][0][content]} except Exception as e: pass return def chat_completions_create(self, **kwargs): 拦截openai.ChatCompletion.create调用 messages kwargs.get(messages, []) if not messages: return self.client.chat.completions.create(**kwargs) # 提取用户最新问题 user_query for msg in reversed(messages): if msg[role] user: user_query msg[content][:200] break # 注入记忆 memory_prompt self._recall_from_memory(user_query) if memory_prompt and messages: # 在system消息后插入或新建system消息 if messages[0][role] system: messages[0][content] f\n\n{memory_prompt} else: messages.insert(0, {role: system, content: memory_prompt}) # 调用原生API return self.client.chat.completions.create(**kwargs)这两个适配器就是“即插即用”的全部秘密。你不需要改模型不需要改框架只需要在调用模型前把messages数组交给适配器处理一下记忆就生效了。我在一个内部工具中用Ollama适配器替换了原有代码的3行调用就让一个7B模型拥有了跨会话记忆能力。这才是真正的“插拔”。5. 常见问题与排查技巧实录那些文档里不会写的坑与解法5.1 问题速查表高频故障现象、根本原因与现场修复指令故障现象根本原因现场诊断命令修复方案预防措施召回结果为空但数据库里明明有数据valid_until时间戳格式错误存成了秒级而非毫秒级sqlite3 memory.db SELECT valid_until FROM memories LIMIT 5;查看数值是否为13位数字修改store逻辑确保int(datetime.now().timestamp() * 1000)用UPDATE memories SET valid_until valid_until * 1000 WHERE length(valid_until)10;批量修复在store接口加入参数校验if len(str(valid_until)) 13: raise ValueError(valid_until must be millisecond timestamp)记忆提示注入后模型输出质量下降甚至胡言乱语记忆提示文本过长挤占了模型的有效上下文空间curl http://localhost:8000/recall?querytest | jq .results[].content | wc -c查看平均长度在_recall_from_memory中增加截断逻辑return result[content][:120] ...或启用“摘要模式”用小模型对召回内容做摘要为/recall接口增加max_length参数默认120字符对content字段建立全文索引提升短文本匹配精度多个并发请求时数据库报database is lockedSQLite在高并发写入时锁表lsof -i :8000查看服务进程ps aux | grep uvicorn确认实例数改用aiosqlite异步驱动或在get_db_connection()中增加重试逻辑for i in range(3): try: ... except sqlite3.OperationalError: time.sleep(0.1)生产环境切换至PostgreSQL或使用sqlite-utils的--wal模式启用WAL日志模型输出中解析出的记忆条目与已有记忆冲突但图谱未自动建立contradicts边冲突检测规则过于宽松未覆盖“同实体、反结论”场景sqlite3 memory.db SELECT content FROM memories WHERE entity_refs LIKE %U123% ORDER BY timestamp DESC LIMIT 5;手动比对扩展冲突规则当新记忆的entity_refs与旧记忆完全相同时检查content中是否含否定词not, no, fail, reject或数值反转→, increase→decrease在store逻辑中加入NLP规则引擎用spaCy识别情感倾向与数值比较关系5.2 实操心得三个让我少踩半年坑的关键技巧技巧一给每条记忆打上“来源指纹”而不是依赖source_id字符串最初我把source_id设为“meeting_20240512”结果发现不同会议可能有相同ID比如两个团队都开了“周例会”。后来我改成source_id hashlib.sha256(f{source_type}:{source_content[:100]}.encode()).hexdigest()[:12]即用内容哈希生成唯一指纹。这样即使两个会议都叫“周例会”只要内容不同ID就不同。更重要的是这个指纹可以反向追溯当我看到一条记忆ID为a1b2c3...我能立刻用SELECT * FROM memories WHERE id LIKE a1b2c3%查出所有相关记忆形成完整的记忆脉络。这比任何source_id命名规范都可靠。技巧二在/recall接口里埋一个“记忆热度”计数器我发现在/recall的SQL查询里加一行UPDATE memories SET recall_count recall_count 1 WHERE id ?然后在memories表里加一个recall_count INTEGER DEFAULT 0字段。运行一周后按recall_count排序发现TOP10的记忆全是“项目截止日期”、“负责人姓名”、“关键指标定义”这类信息。这直接指导了我优化记忆采集策略对这类高热度实体主动设置更长的valid_until如365天并降低confidence衰减系数。让系统自己学会“什么值得被记住”比人工设定规则更精准。技巧三用“记忆健康度”仪表盘替代日志监控不要只看/recall的HTTP状态码。我写了一个简单的健康检查端点/health返回JSON{ total_memories: 12450, expired_memories: 231, avg_recall_latency_ms: 12.4, conflict_resolution_rate: 0.87, memory_utilization_percent: 63.2 }其中conflict_resolution_rate是contradicts边数量 / 总记忆数memory_utilization_percent是valid_until在未来的记忆占比。我把这个端点接入Grafana设置告警当conflict_resolution_rate 0.7时说明记忆冲突未被有效处理需人工介入当memory_utilization_percent 30时说明大部分记忆已过期需检查采集逻辑。这个仪表盘让我从“修bug”变成了“管健康”效率提升巨大。最后分享一个个人体会这个方案的价值不在于它多炫酷而在于它把“AI记忆”从一个玄学概念变成了一个可测量、可调试、可运维的工程模块。当你能用SELECT语句查出一条记忆的完整生命周期当你能用UPDATE语句手动修正一条错误记忆当你能用EXPLAIN QUERY PLAN优化一次召回延迟——那一刻你就真正掌控了AI的“记忆”。它不再是一个黑箱里的幻觉而是一块你可以亲手擦拭、校准、升级的精密零件。

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