基于MCP协议构建AI记忆系统:从向量检索到生产部署全解析

news2026/5/6 10:13:08
1. 项目概述AI记忆系统的核心价值最近在折腾AI应用开发特别是想让AI助手能记住我们之前的对话实现更连贯、个性化的交互。这听起来简单但真做起来你会发现“记忆”功能是区分一个玩具级AI和一个真正有用助手的关键。我试过不少方案要么是简单的向量数据库存一下下次检索要么就是搞个复杂的知识图谱维护成本高得吓人。直到我深入研究了ermermermermidk/mcp-ai-memory这个项目才算是找到了一个在功能、性能和易用性上相对平衡的解法。这个项目本质上是一个实现了MCPModel Context Protocol协议的AI记忆服务器。简单来说MCP协议可以理解为AI应用和外部工具、数据源之间的一种标准化“对话”方式。而mcp-ai-memory就是专门负责“记忆”这个功能的服务器。它能让你的AI应用比如基于Claude API、GPT API或本地大模型的应用拥有一个持久化、可查询、可管理的记忆系统。想象一下你和AI聊过你喜欢喝美式咖啡讨厌下雨天下次聊天时它能主动提起“今天天气不错不像上次下雨让你心情不好要来杯美式吗”这种体验的基石就是它。它适合谁呢如果你是AI应用开发者想为你的聊天机器人、智能客服或者个人助理添加长期记忆能力或者你是AI技术的重度使用者希望搭建一个私人的、可记忆所有交互历史的AI伙伴那么这个项目提供的思路和工具链就非常值得参考。接下来我会结合我的实操经验从设计思路到踩坑实录完整拆解如何利用这类MCP记忆服务器来构建一个真正“有记性”的AI应用。2. 核心架构与设计思路拆解2.1 为什么是MCP协议层解耦的优势在深入代码之前我们必须先理解为什么这个项目选择基于MCP协议来构建。这决定了整个系统的设计哲学。传统的AI记忆实现往往是紧耦合在应用代码里的你可能在对话逻辑中直接调用向量数据库的SDK把对话摘要存进去查询时再写一段检索代码。这种方式在初期快速验证想法时没问题但一旦你想换一个记忆后端比如从Pinecone换到Chroma或者想给记忆系统增加新的能力比如基于时间过滤、记忆重要性评分就需要大动干戈地修改主应用代码。MCP协议的核心思想是“关注点分离”和“标准化接口”。它将AI应用客户端和提供特定能力的外部服务服务器分离开并通过一个统一的JSON-RPC over stdio/SSE/HTTP协议进行通信。对于记忆功能来说mcp-ai-memory项目就是一个独立的MCP服务器。你的AI应用客户端只需要实现MCP客户端协议就可以通过发送标准化的请求来调用记忆服务的“存储”、“搜索”、“更新”、“删除”等功能完全不用关心记忆在底层是用什么数据库、什么算法实现的。这种架构带来了几个明显的好处可插拔性今天我用这个记忆服务器明天我发现另一个实现了相同MCP接口但性能更好的服务器我可以直接替换主应用代码一行都不用改。独立演进记忆系统的优化和升级可以独立进行。比如这个项目优化了检索算法我只需要更新服务器所有使用它的AI应用都能立即受益。复用与共享一个部署好的MCP记忆服务器可以被多个不同的AI应用同时使用实现记忆的跨应用共享当然需要权限管理。生态兼容随着MCP生态的发展会有越来越多标准化的工具服务器出现如计算器、搜索引擎、文件系统访问器等。你的AI应用通过集成一个MCP客户端就能获得接入整个生态的能力而不是为每个功能都重新造轮子。mcp-ai-memory项目正是这一理念在“记忆”领域的实践。它定义了一套关于记忆操作的标准化MCP工具Tools和资源Resources让任何兼容MCP的AI客户端都能以统一的方式与它交互。2.2 记忆的数据模型与存储策略理解了协议层我们再看它如何定义“记忆”。一个记忆单元Memory Item通常包含哪些信息项目源码和设计给出了关键字段内容记忆的核心文本信息。比如“用户说他最喜欢的编程语言是Python”。嵌入向量将上述内容通过文本嵌入模型如OpenAI的text-embedding-3-small转换成的数值向量。这是实现语义搜索的基石。元数据这是让记忆变得“智能”和“可管理”的关键。通常包括timestamp: 记忆创建或相关事件发生的时间戳。用于按时间线组织记忆。source/conversation_id: 记忆的来源例如是哪一次对话的ID。便于进行会话隔离或关联。importance/score: 记忆的重要性评分。可以由AI在存储时自动评估例如“用户结婚纪念日”比“用户今天吃了面包”更重要用于检索时的加权。tags: 用户或系统打上的标签如#preference、#fact、#todo便于分类过滤。唯一标识符通常是UUID用于精确更新或删除某条记忆。在存储策略上这类系统通常采用“向量数据库 元数据索引”的混合模式。向量存储将嵌入向量存入专门的向量数据库如Chroma、Qdrant、Weaviate。这是为了支持高效的语义相似性搜索。当你问“我之前提过关于咖啡的事情吗”系统会将问题也转换成向量然后在向量空间中查找最相似的记忆向量。元数据存储将记忆的ID、内容文本、元数据时间、来源、标签等存入一个关系型数据库如SQLite、PostgreSQL或文档数据库。这是为了支持高效的精确过滤和查询。比如“找出上个月所有打上#preference标签的记忆”。mcp-ai-memory项目需要处理这两类数据的同步和关联。一种常见的实现是将向量数据库仅作为“索引”使用真正的记忆数据主体存在关系数据库中向量数据库里只存ID和向量通过ID进行关联查询。这样做的好处是对记忆内容的复杂更新修改文本、元数据可以在关系数据库中原子性完成而无需处理向量数据库和关系数据库之间复杂的事务。3. 核心功能解析与实操要点3.1 标准化MCP工具Tools详解MCP服务器通过向客户端声明一系列“工具”来暴露自己的能力。mcp-ai-memory项目最核心的就是以下几个工具理解它们的输入输出是使用的关键。3.1.1create_memory- 创建记忆这是最基础的工具。客户端调用它传入记忆内容和必要的元数据。输入参数content(字符串必需): 要记住的文本内容。metadata(对象可选): 包含如timestamp,source,importance,tags等字段。内部操作为记忆生成唯一ID。调用配置的嵌入模型API将content转换为向量。将向量存入向量数据库。将{id, content, metadata}存入关系数据库。返回成功状态和记忆ID。实操注意content的质量直接决定检索效果。最好存储的是经过提炼的“事实”或“观点”而不是冗长的原始对话。例如存储“用户住在北京朝阳区”比存储一整句“我跟你讲哦我住在北京就是朝阳区那边挺方便的”要更好。通常需要在客户端先做一步文本摘要或信息提取。3.1.2search_memories- 搜索记忆这是实现“回忆”功能的核心工具。它支持两种主要的搜索模式语义搜索基于查询文本的向量相似度。这是最常用、最自然的方式。元数据过滤基于时间范围、标签、来源等条件进行筛选。输入参数query(字符串可选): 用于语义搜索的查询文本。如果不提供则仅进行元数据过滤。filters(对象可选): 例如{tags: [#preference], start_time: 2024-01-01, end_time: 2024-12-31}。limit(整数): 返回结果的数量。内部操作如果有query则将其转换为查询向量。在向量数据库中执行相似性搜索得到一组候选记忆ID和相似度分数。如果指定了filters则在关系数据库中对上一步得到的ID集合或全部ID应用元数据过滤。综合相似度分数和元数据如重要性评分对结果进行排序。返回排序后的记忆列表每条记忆包含内容、元数据和相关性分数。实操心得limit参数需要谨慎设置。设得太小可能漏掉相关记忆设得太大会增加处理开销并可能引入噪声。通常结合AI客户端的上下文窗口长度来定比如返回top 5-10条最相关的记忆。另外混合搜索语义过滤非常强大。例如查询“我喜欢的音乐”并过滤标签#music可以精准找到相关记忆避免搜到“我喜欢吃音乐形状的饼干”这种语义相关但主题无关的内容。3.1.3update_memory与delete_memory- 管理记忆记忆不是一成不变的。用户可能改变喜好或者某些记忆变得过时。update_memory: 需要传入记忆ID和新的content或metadata。这里有一个关键点如果content更新了必须重新生成嵌入向量并更新向量数据库否则语义搜索就会失效。这个操作必须是原子的确保两个数据库同步。delete_memory: 根据ID删除记忆。同样需要从两个数据库中同时删除。注意事项直接暴露删除工具给AI需要非常小心。AI可能会误删重要记忆。一种更安全的模式是提供archive_memory或deactivate_memory工具将其标记为不活跃而不是物理删除方便恢复。3.2 记忆的检索、评分与上下文构建仅仅把记忆存进去、搜出来还不够。如何把搜到的记忆有效地“喂”给大模型让它能利用这些记忆生成回复是另一个技术要点。3.2.1 检索结果的后处理与重排序从向量数据库返回的相似性搜索结果可能不是最优的。常见的后处理策略包括重要性加权将每条记忆的importance分数与相似度分数融合提升重要记忆的排名。时间衰减更近期的记忆可能更具相关性。可以引入一个时间衰减因子让相似度分数随着时间差增大而减小。多样性筛选避免返回多条内容高度重复的记忆。可以使用MMR最大边界相关性等算法在相关性和多样性之间取得平衡。mcp-ai-memory项目可以在服务器端集成这些重排序逻辑也可以将原始结果返回由客户端根据自身策略处理。对于性能要求高的场景建议在服务器端做减少网络传输和数据序列化开销。3.2.2 构建对话上下文这是客户端的工作但模式是通用的。当AI需要回复时客户端会调用search_memories以当前用户消息或结合最近几条对话历史作为查询获取相关记忆。将这些记忆片段以一种清晰的格式编排进发给大模型的提示词Prompt中。 一个常见的Prompt模板如下你是一个拥有记忆的AI助手。以下是你之前与用户交互中记住的相关信息 memory - [记忆1的时间]用户提到他喜欢Python和爵士乐。 - [记忆2的时间]用户说他住在北京养了一只猫叫“橘子”。 /memory 当前对话历史 用户{最新用户消息} 请根据你的记忆和对话历史进行回复。关键技巧在Prompt中清晰地区分“记忆”和“当前对话历史”并给记忆加上时间戳有助于大模型更好地理解信息的时效性和来源。同时要严格控制注入上下文的记忆文本总长度不能超过模型的上下文窗口限制。4. 部署与集成实操全流程4.1 本地开发环境搭建与配置我们以在本地开发环境运行和测试mcp-ai-memory为例讲解完整流程。假设项目使用Python开发。4.1.1 环境准备与依赖安装首先克隆项目并安装依赖。注意这类项目通常依赖特定的嵌入模型和数据库。git clone repository-url # 此处替换为实际仓库地址 cd mcp-ai-memory python -m venv venv # 创建虚拟环境强烈推荐 source venv/bin/activate # Linux/Mac激活Windows用 venv\Scripts\activate pip install -r requirements.txtrequirements.txt里很可能包含mcpSDK、chromadb(向量数据库)、sqlalchemy(关系数据库ORM)、openai(用于嵌入模型) 等。4.1.2 关键配置文件解析项目通常会有一个配置文件如config.yaml或.env文件这是核心。# config.yaml 示例 embedding_model: provider: openai # 或 local 使用本地模型如 all-MiniLM-L6-v2 model_name: text-embedding-3-small api_key: ${OPENAI_API_KEY} # 从环境变量读取 vector_store: type: chroma persist_directory: ./data/chroma # 向量数据持久化路径 relational_store: type: sqlite database_url: sqlite:///./data/memories.db server: host: 0.0.0.0 port: 8000 # 可能指定传输方式stdio, sse, http嵌入模型选择如果追求零API成本和高隐私可以使用本地嵌入模型如通过sentence-transformers库但效果和速度可能不如OpenAI的专用模型。对于生产环境OpenAI或Cohere的嵌入模型通常是更可靠的选择。数据库选择开发期用SQLite和Chroma本地模式最简单。生产环境可以考虑PostgreSQL pgvector将向量存储直接集成到PG中或Qdrant/Weaviate这类专业的云向量数据库。4.1.3 启动MCP记忆服务器配置好后启动服务器。启动方式取决于项目设计可能是运行一个Python脚本。python -m mcp_ai_memory.server # 或者 uvicorn mcp_ai_memory.server:app --host 0.0.0.0 --port 8000 # 如果是HTTP服务器服务器启动后会在指定端口监听或者准备好通过stdio与客户端通信。4.2 与AI客户端集成实战服务器跑起来了现在需要让你的AI应用客户端连接它。这里以编写一个简单的Python客户端为例。4.2.1 初始化MCP客户端你需要使用MCP客户端SDK如官方JavaScript/TypeScript的modelcontextprotocol/sdk或Python的mcp库来连接服务器。# 示例代码假设使用一个Python MCP客户端库 import asyncio from mcp import Client, StdioServerParameters async def main(): # 配置服务器连接参数以stdio为例这是MCP常见通信方式 server_params StdioServerParameters( commandpython, # 启动服务器的命令 args[-m, mcp_ai_memory.server] # 服务器的参数 ) client Client(server_params) await client.connect() # 连接成功后客户端会收到服务器声明的可用工具列表 tools await client.list_tools() print(可用工具:, [t.name for t in tools]) # 现在可以使用这些工具了 # ... 后续调用工具代码 await client.close() if __name__ __main__: asyncio.run(main())如果是HTTP或SSE服务器连接参数会是服务器URL。4.2.2 在对话循环中调用记忆工具接下来在每次需要AI回复的循环中集成记忆的读写。async def chat_cycle(user_input: str, conversation_id: str): # 1. 在生成回复前先搜索相关记忆 search_result await client.call_tool( tool_namesearch_memories, arguments{ query: user_input, # 用用户当前输入作为搜索查询 filters: {conversation_id: conversation_id}, # 可选限定当前会话 limit: 5 } ) # search_result 包含记忆列表 relevant_memories search_result.content # 假设返回格式如此 # 2. 构建包含记忆的Prompt prompt build_prompt(user_input, chat_history, relevant_memories) # 3. 调用大语言模型如OpenAI GPT获取回复 llm_response await call_llm_api(prompt) # 4. 可选从本轮对话中提取有价值的信息存储为新记忆 # 这里可以简单存储也可以用另一个LLM调用来判断是否值得存储以及如何摘要 if should_create_memory(llm_response, user_input): memory_content extract_memory_content(llm_response, user_input) await client.call_tool( tool_namecreate_memory, arguments{ content: memory_content, metadata: { conversation_id: conversation_id, timestamp: get_current_time(), tags: [auto_generated] } } ) return llm_response这个循环体现了记忆的“读-用-写”闭环。关键决策点在于第4步存储什么何时存储全存会导致记忆爆炸存储无意义信息不存又会丢失有价值信息。一个常见的策略是让另一个LLM或同一个LLM在另一个步骤中对对话进行摘要判断其中是否包含需要长期记忆的用户偏好、事实陈述或待办事项然后只存储这个摘要。5. 性能优化与生产级考量当从Demo走向生产环境时你会遇到一系列性能和可靠性问题。5.1 向量检索的性能瓶颈与优化向量相似性搜索是计算密集型操作尤其是在记忆条数向量数超过数万甚至百万时。索引选择大多数向量数据库支持多种索引类型如HNSW近似最近邻速度快、精度高、内存占用大、IVF倒排文件可量化内存占用小。Chroma默认使用HNSW。对于海量数据千万级可能需要考虑IVF_PQ乘积量化等更节省内存的索引。过滤与检索的先后顺序先过滤再检索还是先检索再过滤这取决于你的数据分布和查询模式。如果元数据过滤能大幅缩小候选集例如按用户ID过滤那么先过滤再对缩小后的集合进行向量检索效率更高。mcp-ai-memory的实现需要优化这个查询路径。分页与缓存对于高频的相似查询比如用户常问类似问题可以在客户端或服务器端增加缓存层缓存查询向量和对应的结果ID列表。对于历史记忆浏览功能需要实现基于元数据如时间的分页而不是每次都做向量搜索。5.2 记忆的维护与生命周期管理记忆系统不能只存不删否则会变成垃圾场。记忆去重在存储新记忆前可以先进行一次高相似度的搜索。如果发现已有高度相似的记忆相似度超过0.95可以选择更新原有记忆的时间戳和元数据而不是创建新条目。记忆衰减与归档可以为记忆设计一个“活跃度”或“强度”字段。每次被成功检索并利用其强度增加随着时间推移强度缓慢衰减。当强度低于某个阈值时记忆可以被自动归档移出主检索索引或标记为待清理。这模拟了人类的遗忘曲线。手动审查与清理提供管理界面允许用户查看、搜索、合并或删除自己的记忆。这是确保记忆准确性和隐私性的最终手段。5.3 安全、隐私与权限这是生产部署的生命线。数据加密所有持久化数据数据库文件应进行静态加密。传输层必须使用HTTPS对于HTTP/SSE服务器。记忆隔离必须严格区分不同用户、不同应用、不同会话的记忆。这主要通过元数据中的user_id,app_id,conversation_id来实现并在所有查询中强制加上对应的过滤器。服务器端绝不能返回未经隔离过滤的记忆。敏感信息处理在存储记忆前应考虑对内容进行脱敏处理例如自动检测并屏蔽手机号、邮箱、身份证号等个人身份信息PII。这可以在客户端或服务器端的存储前钩子hook中实现。审计日志记录所有记忆的创建、读取、更新、删除操作以便在出现问题时追溯。6. 常见问题与排查技巧实录在实际开发和集成过程中我遇到了不少坑这里记录下最典型的几个问题和解决思路。6.1 记忆检索不准或返回无关内容这是最常见的问题。可能原因1嵌入模型不匹配。你用OpenAI的text-embedding-ada-002存的向量但后来换成了text-embedding-3-small或者换成了本地模型向量空间不一致导致搜索失效。排查检查服务器配置的嵌入模型是否与存储记忆时使用的模型一致。解决如果必须更换模型需要有一个迁移脚本用新模型将所有存量记忆的内容重新计算向量并更新。可能原因2存储的内容质量差。存储了过于冗长、模糊或包含太多无关信息的文本。排查直接查看数据库中存储的content字段样本。解决优化客户端的记忆提取逻辑。不要存原始对话而是存提炼后的陈述句。例如将“我昨天去了那家新开的咖啡馆拿铁味道不错但有点贵。” 提炼为“用户认为XX咖啡馆的拿铁好喝但价格偏高。”可能原因3搜索查询过于简短或歧义。用户输入“它”这种指代不明的查询向量搜索很难有效。解决在客户端对查询进行“查询扩展”。利用大模型或规则将短查询扩展成更完整的句子。例如结合对话历史将“它”扩展为“我们刚才讨论的那本小说《三体》”。6.2 服务器启动失败或连接超时可能原因1依赖缺失或版本冲突。排查仔细查看服务器启动时的错误日志。常见的如ImportError。解决确保在虚拟环境中安装并严格按requirements.txt安装。对于版本冲突可以使用pip freeze检查或尝试使用poetry、pdm等更现代的依赖管理工具。可能原因2数据库连接失败。排查检查配置文件中的数据库路径或URL是否正确是否有写入权限。解决对于SQLite确保所在目录存在对于远程数据库检查网络、防火墙和认证信息。可能原因3MCP通信方式不匹配。排查客户端配置的传输方式stdio/SSE/HTTP是否与服务器启动的模式一致。解决查阅项目文档明确服务器支持的通信方式并在客户端正确配置。6.3 集成后AI表现异常如“幻觉”引用错误记忆可能原因Prompt中记忆注入格式混乱或信息过载。排查打印出发送给大模型的完整Prompt检查记忆部分的格式是否清晰记忆条数是否过多。解决格式化确保每条记忆用明确的分隔符如---隔开并包含关键元数据如时间。截断与摘要如果记忆内容太长对其进行摘要。只保留核心信息。优先级排序只注入相关性相似度*重要性最高的前3-5条记忆而不是全部搜索结果。明确指令在Prompt中加强指令如“请严格依据以下记忆事实进行回答如果记忆中没有相关信息请直接说明你不知道不要编造。”6.4 性能随记忆数量增长而下降可能原因向量搜索未使用索引或索引类型不当。排查检查向量数据库的日志或监控看查询耗时。对于Chroma可以检查集合的索引情况。解决确保为向量列创建了适当的索引如HNSW。在Chroma中创建集合时可以指定hnsw:space等参数。如果数据量极大1000万考虑升级向量数据库方案如使用支持分布式索引的Qdrant Cloud或Weaviate Cluster。引入缓存层对高频查询进行缓存。记忆系统的构建是一个持续迭代的过程从简单的键值存储到具备语义理解、动态衰减、主动推理的智能记忆体mcp-ai-memory项目提供了一个基于标准化协议的坚实起点。我的体会是与其追求一个功能大而全的记忆系统不如先基于MCP这样松耦合的架构实现一个核心可用的版本然后在实际使用中根据具体的业务场景和用户反馈逐步深化和扩展其能力。比如可以先实现基于向量搜索的语义回忆再增加基于时间线的记忆流视图最后再探索记忆之间的关联图谱构建。这样步步为营既能快速验证价值又能保持系统的灵活性和可维护性。

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