构建个人AI记忆体:向量数据库与语义搜索实践指南

news2026/5/12 16:53:27
1. 项目概述构建你的个人AI记忆体最近几年AI助手越来越聪明但总感觉它们“记性”不太好。你昨天刚和它聊过你家的猫叫“橘子”今天再问它它可能就忘了。或者你让它帮你总结上周的工作周报它只能基于你当前对话的上下文来生成无法主动调用你过往积累的所有项目资料。这种“健忘”和“信息孤岛”的问题正是“个人AI记忆体”这个项目想要解决的。简单来说marswangyang/personal-ai-memory这个项目就是一个帮你打造专属、持久、可检索的AI记忆库的工具。它不是一个独立的AI模型而是一个“记忆中枢”或“外部大脑”。你可以把日常的聊天记录、工作文档、读书笔记、网页收藏、甚至是社交媒体上的碎片想法都喂给它。它会帮你把这些信息结构化地存储起来并建立索引。当你在任何需要的时候——比如在写邮件、做计划、或者与另一个AI助手对话时——这个记忆体就能被快速检索和调用为AI提供关于“你”的长期背景信息让AI的回答更个性化、更连贯、更懂你。这背后的核心需求其实很朴素我们希望AI能像一位老友或一位资深助理一样了解我们的过去、习惯和偏好。无论是个人知识管理PKM的深度用户还是希望提升工作效率的职场人亦或是开发者想为自己的应用增加“记忆”功能这个项目都提供了一个极具潜力的起点。它解决的不仅是“存储”问题更是“关联”和“应用”的问题让散落各处的信息碎片真正成为你数字生命的一部分。2. 核心架构与设计思路拆解要理解这个项目我们得先抛开代码看看它要解决的核心问题是什么。一个有效的个人AI记忆体必须满足几个关键特性持久化存储、高效检索、灵活集成和隐私安全。personal-ai-memory的设计正是围绕这些点展开的。2.1 为什么是向量数据库 嵌入模型项目最核心的技术选型是使用向量数据库来存储记忆并用嵌入模型将文本转化为向量。这是当前处理非结构化文本语义检索的“黄金标准”方案。传统的数据库如MySQL靠关键词匹配你搜“苹果”它找不到“iPhone”或“库克”。而向量数据库存储的是文本的“语义向量”——一种高维空间的数学表示。经过训练的嵌入模型如OpenAI的text-embedding-ada-002或开源的BGE、Sentence Transformers能把语义相近的文本映射到向量空间中相近的位置。举个例子你把“我今天去超市买了苹果和香蕉”这句话存入记忆。当你之后问“我昨天买了什么水果”时尽管问题里没有“苹果”和“香蕉”这两个词但嵌入模型会将问题也转化为向量。由于“水果”与“苹果”、“香蕉”在语义空间中是接近的向量数据库就能通过计算向量间的“距离”如余弦相似度把之前那条关于苹果和香蕉的记忆找出来。这就是语义搜索的魅力它让检索变得智能不再依赖死板的关键词。注意嵌入模型的选择至关重要。通用模型如OpenAI的效果稳定但可能涉及API调用和费用开源模型如all-MiniLM-L6-v2可以本地部署隐私性好但效果和速度需要权衡。项目通常会提供配置选项让你根据自身情况选择。2.2 记忆的“元数据”与“分块”策略光有向量还不够。一条记忆除了核心内容“我养了一只猫它叫橘子”还应该包含丰富的元数据比如这条记忆的来源是来自与ChatGPT的对话还是来自你导入的PDF文档、创建时间、关联的人物或项目标签等。元数据就像图书馆书籍的索引卡能让我们用更传统、更精确的方式过滤和查找记忆。例如“找出所有上个月标记为‘工作项目A’的记忆”。因此一个设计良好的记忆体其数据库表结构一定包含向量字段和多个元数据字段。另一个关键设计是文本分块。你不可能把一整本100页的PDF作为一个“记忆点”存进去那样检索出来的结果会过于庞大和模糊。通用的做法是将长文本按一定的策略切割成大小适中的“块”Chunks。常见的分块策略有固定大小分块按字符数或词数切割简单但可能割裂语义。滑动窗口分块块之间有部分重叠避免信息在边界丢失。基于语义的分块利用句号、换行等自然分隔符尽可能保证每个块的语义完整性。personal-ai-memory项目需要实现或集成一个合理的分块器这是影响后续检索效果的基础。2.3 整体工作流设计一个完整的记忆处理流程可以概括为“存、管、用”三个环节记忆写入存从各种来源命令行输入、文件、监控剪贴板、API接收获取原始文本。经过清洗、分块后调用嵌入模型得到向量最后将“文本块”、“向量”和“元数据”一并存入向量数据库。记忆管理管提供管理界面或API允许用户查看、搜索、更新或删除已有的记忆。这里既支持基于元数据的精确查询也支持基于向量的语义搜索。记忆读取用这是价值体现的一环。当用户提出问题或需要上下文时系统将问题转化为向量在数据库中进行相似性搜索返回最相关的几条记忆。这些记忆可以作为“上下文”或“知识”注入到大型语言模型如GPT的提示词中从而让LLM生成基于你个人记忆的答案。这个设计思路清晰地将记忆存储向量数据库、记忆理解嵌入模型和记忆应用LLM解耦使得每个部分都可以独立优化和替换架构非常灵活。3. 关键技术组件与工具选型解析要实现上述架构我们需要挑选合适的“轮子”。personal-ai-memory作为一个开源项目其技术栈的选择平衡了性能、易用性和社区生态。3.1 向量数据库Chroma vs. Pinecone vs. Weaviate向量数据库是核心存储引擎。项目可能会优先考虑轻量级、易于嵌入和开源的方案。Chroma这是一个非常流行的开源向量数据库特别为AI应用设计。它提供了简单的Python/JavaScript API可以内存存储也可以持久化到磁盘非常适合个人项目或中小型应用起步。它的优势在于“开箱即用”集成LLM生态好。Pinecone这是一个全托管的云端向量数据库服务。如果你不想操心服务器运维且数据量较大Pinecone是很好的选择。它性能强劲自动处理索引优化但这是付费服务且数据需要上传到云端。Weaviate另一个功能强大的开源向量数据库。它除了向量搜索还内置了GraphQL接口支持将向量搜索和元数据过滤进行复杂组合查询功能更全面但部署和配置相对复杂一些。对于个人AI记忆体这个场景Chroma往往是首选。因为它足够轻量可以完全运行在你的本地电脑上所有数据隐私都由你自己掌控这与项目的“个人”属性高度契合。项目源码中很可能会直接使用Chroma的客户端库来完成数据存取。3.2 嵌入模型云端API与本地部署的权衡嵌入模型负责将文本转化为向量。这里面临一个经典选择使用云端API还是本地模型云端API如OpenAI Embeddings优点是效果稳定、省心无需考虑计算资源。只需一个API调用即可。缺点是会产生持续费用且所有文本都需要发送到第三方服务器对隐私敏感的用户来说是个顾虑。本地模型如Sentence-Transformers库优点是数据完全私有离线可用一次部署长期使用。缺点是需要本地GPU或CPU资源转换速度可能较慢且模型效果需要自行评估和选择。一个健壮的项目应该同时支持这两种模式。例如在配置文件中提供一个embedding_model选项可以设置为openai需配置API Key或local并指定本地模型的名称如all-MiniLM-L6-v2。这样用户可以根据自己的隐私要求和硬件条件灵活选择。3.3 应用层框架与集成方式这个记忆体最终要以某种形式被我们使用。常见的集成方式有命令行工具CLI最直接的方式。通过命令如memory add “今天学会了用Python处理CSV文件” --tag “学习编程”来添加记忆用memory search “Python数据处理”来搜索。这种方式对开发者和喜欢终端的用户非常友好。桌面应用/系统托盘工具提供图形界面可能常驻在系统托盘支持全局快捷键快速记录灵感或搜索记忆体验更流畅。HTTP API服务将记忆体封装成一个RESTful API服务。这是最灵活的方式允许其他任何应用如你的笔记软件、自动化脚本、甚至是另一个AI助手通过HTTP请求来存储或查询记忆。这为生态扩展提供了无限可能。浏览器插件监控你在网页上的高亮文本或浏览记录一键保存到记忆库中。在项目初期CLI HTTP API的组合是一个务实的选择。CLI用于管理和调试HTTP API用于开放集成。项目可能会使用像FastAPI这样的现代Python框架来快速构建API因为它自动生成交互式文档对开发者非常友好。4. 从零搭建核心功能实现步骤假设我们现在要从零开始参考personal-ai-memory的思路实现一个最基本的个人记忆系统。以下是一个简化的实操指南涵盖了核心环节。4.1 环境准备与依赖安装首先确保你的Python环境建议3.8以上已经就绪。创建一个新的虚拟环境是个好习惯。# 创建并激活虚拟环境 python -m venv venv source venv/bin/activate # Linux/Mac # venv\Scripts\activate # Windows # 安装核心依赖 pip install chromadb # 向量数据库 pip install sentence-transformers # 本地嵌入模型 pip install openai # 如需使用OpenAI嵌入 pip install fastapi uvicorn # 用于构建API服务 pip install python-dotenv # 管理环境变量如API密钥sentence-transformers库封装了众多优秀的开源嵌入模型我们先用一个轻量级的模型all-MiniLM-L6-v2它平衡了速度和效果。4.2 构建记忆存储与检索引擎接下来我们创建一个核心的MemoryEngine类它封装了与ChromaDB的交互以及嵌入逻辑。# memory_engine.py import chromadb from chromadb.config import Settings from sentence_transformers import SentenceTransformer import uuid from typing import List, Dict, Any class MemoryEngine: def __init__(self, persist_directory: str ./memory_db, embedding_model_name: str all-MiniLM-L6-v2): 初始化记忆引擎。 :param persist_directory: 数据库持久化目录 :param embedding_model_name: 句子转换器模型名称 # 初始化嵌入模型本地 self.embedder SentenceTransformer(embedding_model_name) # 初始化Chroma客户端设置持久化路径 self.client chromadb.PersistentClient(pathpersist_directory) # 获取或创建一个名为“personal_memories”的集合类似数据库的表 self.collection self.client.get_or_create_collection(namepersonal_memories) def _generate_embedding(self, text: str) - List[float]: 生成文本的向量嵌入。 # sentence-transformers模型直接返回向量列表 return self.embedder.encode(text).tolist() def add_memory(self, content: str, metadata: Dict[str, Any] None): 添加一条记忆。 if metadata is None: metadata {} # 确保有基本元数据如时间戳 if timestamp not in metadata: from datetime import datetime metadata[timestamp] datetime.now().isoformat() # 生成唯一ID和向量 memory_id str(uuid.uuid4()) embedding self._generate_embedding(content) # 存入Chroma集合 self.collection.add( documents[content], embeddings[embedding], metadatas[metadata], ids[memory_id] ) print(fMemory added with ID: {memory_id}) def search_memories(self, query: str, n_results: int 5) - List[Dict]: 搜索相关记忆。 # 将查询文本也转化为向量 query_embedding self._generate_embedding(query) # 在集合中进行相似性搜索 results self.collection.query( query_embeddings[query_embedding], n_resultsn_results ) # 整理返回结果 memories [] if results[documents]: for i in range(len(results[documents][0])): memory { content: results[documents][0][i], metadata: results[metadatas][0][i], id: results[ids][0][i], distance: results[distances][0][i] # 相似度距离越小越相关 } memories.append(memory) return memories # 简单测试 if __name__ __main__: engine MemoryEngine() engine.add_memory(我的宠物猫叫橘子它今年三岁了喜欢吃鱼。, {type: pet, tags: [cat, home]}) engine.add_memory(Python中处理CSV文件可以用pandas库的read_csv函数。, {type: knowledge, tags: [programming, python]}) query 关于我的猫有什么信息 found engine.search_memories(query) for mem in found: print(f内容: {mem[content]}) print(f标签: {mem[metadata].get(tags, [])}) print(f相关性分数: {1 - mem[distance]:.4f}) # 将距离转换为相似度分数 print(- * 40)这段代码构建了一个最核心的“记忆大脑”。它能够存储带标签的记忆并能根据语义进行搜索。你可以看到搜索“关于我的猫”成功找到了之前存储的关于“橘子”的记忆尽管它们没有共同的关键词。4.3 实现文本分块与批量导入现在我们需要处理更实际的场景导入长文档。这就需要用上之前讨论的分块策略。# text_chunker.py from typing import List import re class TextChunker: staticmethod def split_by_sentence(text: str, chunk_size: int 500, overlap: int 50) - List[str]: 按句子分割文本并尽量保证块的大小接近chunk_size。 这是一个简化的实现实际项目中可以使用更高级的库如 langchain 的文本分割器。 :param overlap: 块之间的重叠字符数防止信息在边界丢失。 # 使用简单的句号、问号、感叹号分割句子中文需调整 sentences re.split(r(?[.!?])\s, text) chunks [] current_chunk [] current_length 0 for sentence in sentences: sent_length len(sentence) # 如果当前块为空或者加上这句不超过块大小就加入 if current_length sent_length chunk_size or not current_chunk: current_chunk.append(sentence) current_length sent_length else: # 否则保存当前块并开始新块带上重叠 chunks.append( .join(current_chunk)) # 新块从上一块的末尾overlap个字符开始这里简化处理为保留最后几个句子 # 更精确的做法是按字符重叠 overlap_sentences [] overlap_len 0 # 从当前块末尾倒序取句子直到重叠长度达标 for sent in reversed(current_chunk): if overlap_len len(sent) overlap: overlap_sentences.insert(0, sent) # 加到开头 overlap_len len(sent) else: break current_chunk overlap_sentences [sentence] current_length overlap_len sent_length # 添加最后一个块 if current_chunk: chunks.append( .join(current_chunk)) return chunks # 在MemoryEngine中增加批量导入方法 def add_document(self, document: str, metadata: Dict[str, Any] None): 将长文档分块后存入记忆。 chunks TextChunker.split_by_sentence(document) for i, chunk in enumerate(chunks): # 为每个块复制元数据并添加块序号 chunk_metadata metadata.copy() if metadata else {} chunk_metadata[chunk_index] i chunk_metadata[total_chunks] len(chunks) self.add_memory(chunk, chunk_metadata)这个分块器虽然简单但已经能处理很多情况。在实际项目中你可能会直接使用langchain库中更成熟、支持多种语言和分割符的RecursiveCharacterTextSplitter。4.4 封装为RESTful API服务为了让其他应用能方便地使用记忆体我们用FastAPI快速搭建一个API服务。# api_server.py from fastapi import FastAPI, HTTPException from pydantic import BaseModel from typing import Optional, List import uvicorn from memory_engine import MemoryEngine app FastAPI(titlePersonal AI Memory API) engine MemoryEngine() # 全局记忆引擎实例 class MemoryCreate(BaseModel): content: str source: Optional[str] api tags: Optional[List[str]] [] class QueryRequest(BaseModel): query: str top_k: Optional[int] 5 app.post(/memories/) async def create_memory(memory: MemoryCreate): 添加一条新记忆。 metadata {source: memory.source, tags: memory.tags} try: engine.add_memory(memory.content, metadata) return {message: Memory added successfully.} except Exception as e: raise HTTPException(status_code500, detailstr(e)) app.post(/memories/search/) async def search_memories(request: QueryRequest): 搜索相关记忆。 try: results engine.search_memories(request.query, n_resultsrequest.top_k) # 格式化返回将numpy float等类型转换为Python原生类型 for r in results: r[distance] float(r[distance]) return {query: request.query, results: results} except Exception as e: raise HTTPException(status_code500, detailstr(e)) app.get(/health) async def health_check(): return {status: healthy} if __name__ __main__: uvicorn.run(app, host0.0.0.0, port8000)运行这个脚本一个本地的记忆API服务就启动了。你可以用curl或Postman测试POST /memories/添加记忆。POST /memories/search/搜索记忆。至此一个具备核心功能的个人AI记忆体后端就完成了。它具备了存储、语义搜索和API接口可以作为一个独立服务运行。5. 高级功能与优化方向基础功能实现后我们可以考虑如何让它变得更强大、更智能。personal-ai-memory这类项目的深度往往体现在这些高级特性上。5.1 记忆的自动分类与打标手动为每一条记忆添加标签tags是繁琐的。我们可以利用LLM的能力实现自动打标。例如在add_memory方法中当一条新记忆存入时可以异步调用一个LLM如通过OpenAI API或本地运行的Ollama来生成摘要和关键词。# 伪代码示例自动打标函数 def auto_tag_with_llm(content: str) - Dict[str, Any]: prompt f 请分析以下文本内容并完成以下任务 1. 生成一个简短的摘要不超过50字。 2. 提取3-5个最关键的关键词或标签。 3. 判断其主要类别如工作、学习、生活、想法、待办、引用等。 文本内容{content} 请以JSON格式返回包含字段summary, keywords, category。 # 调用LLM API例如OpenAI的ChatCompletion # response openai.ChatCompletion.create(...) # 解析返回的JSON # 将summary, keywords, category合并到记忆的元数据中这样每一条记忆入库时都自动带上了丰富的语义标签极大提升了后续基于元数据过滤和管理的便利性。5.2 记忆的关联与图谱构建单一的搜索返回的是一个个孤立的记忆块。更高级的模式是构建记忆图谱。我们可以分析记忆之间的共现关系、时序关系或通过LLM识别出的实体关系如人、地点、组织、概念将它们连接起来。例如记忆A提到“和Alice在咖啡馆讨论项目X”记忆B提到“项目X的截止日期是下周”。系统可以自动或半自动地建立“Alice”、“项目X”、“咖啡馆”这些实体节点并创建“参与讨论”、“有关联”这样的关系边。当用户查询“项目X”时不仅可以返回直接相关的记忆还可以推荐与之关联的“Alice”和“截止日期”的记忆。这需要引入图数据库如Neo4j或利用向量数据库本身的多向量关联特性实现起来更复杂但能极大地提升记忆的“智能”程度。5.3 与现有工作流的深度集成记忆体的价值在于“用”无缝集成到现有工作流是关键。浏览器插件开发一个简单的浏览器插件可以将当前网页的标题、URL和选中的文本一键保存到记忆API。笔记软件联动为Obsidian、Logseq等支持插件的笔记软件编写插件将选中的笔记块同步到记忆库或者从记忆库中搜索并插入相关内容到当前笔记。系统级快速捕获实现一个全局快捷键如CtrlShiftM调出一个迷你输入框快速记录当下的灵感或想法自动保存。作为AI助手的记忆插件如果你使用像OpenAI的GPTs、Claude的自定义指令或者开源的Oobabooga等聊天前端你可以编写一个插件或修改系统提示词让AI在回答前先通过API查询你的个人记忆库将相关记忆作为上下文注入。这才是真正的“拥有记忆的AI助手”。6. 部署、维护与隐私安全考量一个为自己服务的工具稳定性和安全性同样重要。6.1 本地部署与数据备份最安全的部署方式就是完全本地化。这意味着向量数据库Chroma数据文件存储在你的硬盘上。嵌入模型使用本地运行的Sentence Transformer模型。API服务运行在你的个人电脑或家庭服务器上。你需要确保数据目录有定期备份。由于ChromaDB的数据是存储在本地文件夹中的你可以简单地用rsync或任何备份工具将这个文件夹同步到云端或其他硬盘。建议编写一个简单的定时备份脚本。6.2 性能优化与规模扩展随着记忆条数增长超过数万条你可能需要关注性能索引优化ChromaDB默认使用HNSW索引对于海量数据百万级你可能需要调整索引参数如hnsw:space,hnsw:construction_ef,hnsw:search_ef来权衡构建速度、搜索速度和精度。硬件加速如果使用本地嵌入模型且有NVIDIA GPU确保安装了对应版本的torch和cuda可以极大提升向量化速度。分库分表如果记忆类型差异很大如纯文本、代码片段、图片描述可以考虑为不同类型的记忆创建不同的Chroma集合针对性更强也可能提升搜索效率。6.3 隐私安全是生命线这是个人记忆体的核心原则。端到端加密对于极度敏感的记忆可以考虑在客户端存入前对文本内容进行加密将密文和向量向量由密文生成意义不大通常还是用原文生成向量一起存储。检索时先解密再展示。但这会牺牲搜索的便捷性因为LLM无法理解加密后的上下文。更常见的做法是信任本地存储环境。网络隔离确保API服务如果运行在本地网络不被公网直接暴露。如果需要在不同设备间同步建议通过安全的VPN内网连接或者使用端到端加密的同步服务。最小权限原则记忆体服务本身不应有过高的系统权限。定期审查其访问日志。7. 常见问题与故障排查实录在实际搭建和使用过程中你肯定会遇到各种问题。这里记录一些典型场景和解决思路。7.1 搜索结果不相关怎么办这是最常见的问题。可能的原因和解决方案如下问题现象可能原因排查与解决思路搜A返回B两者语义明显无关1. 嵌入模型不适合你的文本领域。2. 文本分块不合理导致单个块语义混杂。1.更换嵌入模型尝试不同的Sentence Transformer模型如paraphrase-multilingual-MiniLM-L12-v2对多语言支持更好all-mpnet-base-v2效果更好但更慢。2.调整分块策略减小分块大小或改用基于语义的分割如按段落。对于代码有专门的分割器。搜“苹果公司”返回“吃苹果”的记忆嵌入模型未能区分一词多义。1.丰富元数据在存入时手动或自动添加更明确的标签如entity: companyvsentity: fruit。搜索时结合元数据过滤。2.使用更先进的模型一些新模型对上下文理解更好。或者在查询时采用“查询扩展”将“苹果公司”重写为“Apple Inc. 科技公司”再搜索。完全搜不到已知存在的记忆1. 搜索的top_k值太小。2. 向量索引未正确构建或持久化。1.增大top_k比如从5调到20。2.检查数据持久化确认ChromaDB的persist_directory设置正确且程序有写入权限。重启服务后检查记忆是否还在。7.2 内存或磁盘占用过高现象程序运行一段时间后变慢或磁盘空间快速减少。排查向量维度检查嵌入模型的向量维度。all-MiniLM-L6-v2是384维all-mpnet-base-v2是768维。维度越高占用空间越大搜索也越慢。在效果可接受的前提下选择维度更小的模型。ChromaDB持久化Chroma在运行时会在内存中缓存数据。确保定期关闭客户端连接或检查是否有内存泄漏。对于非常大的数据集考虑使用Chroma的client.reset()或分集合存储。清理无用记忆实现一个记忆“过期”或“归档”机制定期清理非常陈旧的、低价值的记忆。7.3 API服务调用失败现象前端或其它应用无法连接到记忆API。排查步骤检查服务状态首先在服务器上运行curl http://localhost:8000/health看服务是否正常。检查防火墙和端口如果从外部访问确保服务器防火墙开放了8000端口或你指定的端口。检查CORS如果前端网页调用API浏览器可能会因CORS跨域资源共享策略而阻止请求。需要在FastAPI应用中添加CORS中间件。from fastapi.middleware.cors import CORSMiddleware app.add_middleware( CORSMiddleware, allow_origins[*], # 生产环境应替换为具体的前端域名 allow_credentialsTrue, allow_methods[*], allow_headers[*], )查看日志使用uvicorn运行时可添加--log-level debug参数查看详细的请求和错误日志。7.4 如何评估记忆系统的效果没有标准答案但可以建立自己的评估体系主观评估定期用一些对你重要的、历史的问题进行搜索看返回的记忆是否是你想要的。记录下“满意”和“不满意”的案例。构建测试集手动创建一批“查询-相关记忆”对。定期运行这些查询计算召回率Recall系统找到了多少相关记忆和精确率Precision系统返回的记忆中有多少是相关的。A/B测试当你更换嵌入模型或调整分块大小时用同一批查询测试新旧两个版本对比结果。搭建个人AI记忆体是一个持续迭代的过程。它不仅仅是一个技术项目更像是在精心培育一个数字化的“第二大脑”。从最简单的文本存储和检索开始逐步加入自动摘要、关联发现、情感分析这条记忆是积极的还是消极的甚至预测提示基于过往习惯提醒你下周该给猫打疫苗了这个系统会变得越来越懂你最终成为你不可或缺的智能外挂。

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