news 2026/8/12 10:04:02

为AI Agent接入长期记忆:MemOS CLI轻量集成实战指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
为AI Agent接入长期记忆:MemOS CLI轻量集成实战指南

1. 从“健忘”到“博闻”:为什么Agent需要长期记忆

如果你最近在折腾AI Agent,或者尝试过用Claude Code CLI、Hermes Agent这类工具来帮你写代码、处理任务,那你大概率遇到过同一个让人抓狂的问题:Agent的“健忘症”

想象一下这个场景:你让Agent帮你重构一个复杂的项目结构。它先分析了src/目录,给出了一个不错的方案。然后你接着问:“很好,那public/目录下的静态资源该怎么处理?” 这时,Agent很可能一脸茫然地反问你:“public/目录?我们之前有讨论过项目结构吗?” 你不得不把整个对话历史再粘贴给它,或者重新描述一遍上下文。几次来回之后,对话窗口被冗长的历史记录塞满,效率直线下降,体验感也大打折扣。

这就是当前绝大多数命令行Agent的现状:它们是强大的“单次执行者”,但却是糟糕的“连续协作者”。每一次调用,对于Agent来说,几乎都是一个全新的会话。它不记得几分钟前你让它做了什么,不记得你偏好的代码风格,更不记得那个反复出现的、需要特殊处理的配置文件。所有的“记忆”都依赖于你手动维护的上下文窗口,这不仅笨重,而且极不可靠。

长期记忆(Long-term Memory)要解决的,正是这个核心痛点。它不是一个简单的聊天记录保存功能,而是让Agent能够跨越单次会话的边界,持续积累关于你、你的项目、你的工作习惯的“知识”。这就像给你的命令行伙伴配备了一个永不丢失的笔记本。今天它学会了你的项目命名规范,明天它处理新模块时就能自动应用;这次你纠正了它对某个API的错误理解,下次遇到同类问题它就不会再犯。

MemOS CLI的推出,正是瞄准了这个刚需。它不是一个要取代现有Agent的庞然大物,而是一个轻量的“记忆中枢”。它的目标很明确:让任何能跑命令行的Agent,都能以最低的成本、最简的方式,获得长期记忆的能力。你不用再去研究复杂的LangGraph记忆模块集成,也不用担心记忆存储的可靠性和性能。MemOS CLI试图做的,就是把这个复杂的能力,封装成一个简单的mem命令。

2. MemOS CLI设计哲学:轻量、无侵入与标准化

在深入命令行细节之前,我们有必要先理解MemOS CLI背后的设计哲学。这决定了它是否真的能“轻量接入”,而不是给你本就复杂的工具链再增加一个负担。

2.1 轻量化的三重含义

首先,部署轻量。MemOS CLI本身是一个独立的二进制文件,没有复杂的依赖链。你不需要一个Python环境,不需要安装pipconda,更不需要配置数据库。从官网下载对应平台的二进制文件,赋予执行权限,它就能跑起来。这种极简的部署方式,是它能被快速采纳的前提。

其次,资源占用轻量。作为一个记忆存储和检索的服务,MemOS CLI在后台运行时对CPU和内存的消耗极低。它不会像一些全功能的向量数据库那样,动辄占用数百MB内存。这意味着你可以在开发机、甚至资源受限的服务器上长期运行它,而无需担心对主要任务造成干扰。

最后,也是最重要的,集成轻量。这是MemOS CLI的核心价值。它通过一个清晰的、基于HTTP的API(通常运行在本地端口,如http://localhost:5230)暴露所有功能。你的Agent不需要引入特定的SDK,不需要改变原有的代码结构。它只需要在需要存储或查询记忆时,向这个本地端点发送一个标准的HTTP请求(GET/POST)即可。这种无侵入式的集成,使得为现有Agent添加记忆功能,从一项“架构改造”工程,变成了一个“配置项”修改。

2.2 无侵入式集成:像使用环境变量一样使用记忆

无侵入式设计带来的最大好处是灵活性。你的Agent可以是任何技术栈的:Python写的,Go写的,甚至是一个Shell脚本包装的。只要它能发起HTTP请求,它就能与MemOS CLI交互。

例如,一个简单的Python Agent脚本,原本可能是这样的:

# 旧版本:无记忆,每次都是全新对话 def ask_agent(question, context=""): prompt = f"{context}\n\n用户:{question}" # 调用大模型API... return response

集成MemOS CLI后,它可能变成这样:

# 新版本:具备长期记忆能力 import requests MEMOS_URL = "http://localhost:5230/api/v1/memo" def get_related_memories(query): """从MemOS查询相关记忆""" params = {'contentSearch': query} try: resp = requests.get(f"{MEMOS_URL}", params=params) if resp.status_code == 200: return resp.json() # 返回记忆列表 except: pass return [] def save_memory(content, resource_name="default_agent"): """保存新的记忆到MemOS""" data = { 'content': content, 'visibility': "PRIVATE", 'resourceName': resource_name } try: requests.post(f"{MEMOS_URL}", json=data) except: pass # 记忆保存失败不应阻塞主流程 def ask_agent_with_memory(question, user_id="user_001"): # 1. 检索相关记忆 related_mems = get_related_memories(question) context_from_memory = "\n".join([m['content'] for m in related_mems[:3]]) # 取最相关的3条 # 2. 构建增强提示词 enhanced_prompt = f""" 相关历史记忆: {context_from_memory} 当前问题: 用户:{question} """ # 3. 调用大模型API获取回答 response = call_llm_api(enhanced_prompt) # 4. 将本次有意义的交互保存为记忆(可选,可设置阈值) if is_worth_remembering(question, response): memory_content = f"用户询问:{question}\n助手回答:{response}" save_memory(memory_content, resource_name=user_id) return response

可以看到,核心的Agent逻辑几乎没有改变,只是增加了两个辅助函数和几个调用点。记忆系统像一个外挂的“知识库”服务,随用随取,不用不扰。

2.3 标准化的记忆模型

MemOS CLI对“记忆”的建模也非常直接,这降低了使用者的心智负担。一条记忆(Memo)核心包含几个字段:

  • content: 记忆的内容文本,这是检索的主体。
  • resourceName: 资源名,可用于对记忆进行分类,例如按项目名用户ID任务类型划分。
  • visibility: 可见性,支持PUBLIC(公开)和PRIVATE(私有)。在Agent场景下,通常使用PRIVATE来隔离不同用户或不同Agent的记忆。

这种模型没有引入复杂的“向量嵌入”、“记忆链”等概念,而是采用了基于关键词和内容的全文检索。对于大多数Agent场景——记住用户偏好、项目配置、错误解决方案——这种简单直接的文本匹配已经足够有效,且避免了维护向量化模型的开销。

3. 实战:为你的命令行Agent快速接入MemOS

理论说再多,不如动手跑一遍。我们假设你有一个用Python编写的、基于OpenAI API的简单任务型Agent,现在我们来为它装上MemOS记忆引擎。

3.1 第一步:部署MemOS CLI

访问MemOS的GitHub Releases页面,找到适合你操作系统(macOS, Linux, Windows)的二进制文件。以Linux/macOS为例:

# 下载最新版本的MemOS CLI curl -L -o memos https://github.com/usememos/memos/releases/latest/download/memos_linux_amd64 # 赋予执行权限 chmod +x memos # 移动到系统路径(可选) sudo mv memos /usr/local/bin/

启动MemOS服务:

# 最简单的启动方式,数据会保存在当前目录的 `.memos` 文件夹下 memos --mode prod --port 5230

启动后,你会在终端看到服务运行的日志,并且可以通过浏览器访问http://localhost:5230看到一个简易的Web界面(用于管理记忆)。不过对Agent来说,我们只关心它的API。

3.2 第二步:设计你的记忆策略

在写代码之前,先想清楚:你的Agent需要记住什么?这直接决定了你调用MemOS API的时机和内容。这里有几个常见的策略:

  • 会话总结式记忆:在每次与用户的对话结束时,将本次对话的核心要点总结成一段文字,保存为一条记忆。例如:“用户于2023-10-27询问了关于项目X的日志配置问题,最终采用了按天滚动的Logback方案。”
  • 关键事实提取式记忆:在对话中实时识别并保存关键信息。例如,当用户说“我的项目ID是proj-123,API密钥是sk-xxx(已脱敏)”,Agent可以提取“用户的项目ID是proj-123”并保存。
  • 问答对记忆:直接将有价值的问答对保存下来。当用户再次提出类似问题时,可以直接检索出历史答案。这是最直接的方式。
  • 用户偏好记忆:记录用户的个性化设置,如“用户偏好使用4个空格缩进”、“用户要求所有响应中不要使用emoji”。

对于初学者,我建议从问答对记忆开始,因为它逻辑简单,效果立竿见影。

3.3 第三步:改造你的Agent代码

我们以一个简单的命令行问答助手为例。原始版本可能只是一个循环调用OpenAI API的脚本。

首先,安装必要的Python库(如果还没有):

pip install requests openai

然后,创建改造后的Agent脚本agent_with_memory.py

import json import requests from openai import OpenAI from datetime import datetime # 配置 MEMOS_SERVER = "http://localhost:5230" OPENAI_API_KEY = "your-openai-api-key" AGENT_IDENTITY = "你是一个乐于助人的编程助手,擅长Python和系统设计。" # 初始化OpenAI客户端 client = OpenAI(api_key=OPENAI_API_KEY) def search_memories(query, limit=5): """从MemOS检索相关记忆""" try: # MemOS的搜索API response = requests.get( f"{MEMOS_SERVER}/api/v1/memo", params={"contentSearch": query, "pageSize": limit} ) if response.status_code == 200: memos = response.json() if memos: # 按创建时间倒序,返回最新的相关记忆 memos.sort(key=lambda x: x.get('createdTs', 0), reverse=True) return [m['content'] for m in memos] except requests.exceptions.ConnectionError: print("⚠️ 无法连接到MemOS服务,本次对话将无记忆上下文。") except Exception as e: print(f"检索记忆时出错:{e}") return [] def create_memory(content, tags=None): """创建一条新记忆""" memo_data = { "content": content, "visibility": "PRIVATE", "resourceName": "coding_assistant" # 可以按用途分类 } if tags: memo_data["tags"] = tags try: response = requests.post( f"{MEMOS_SERVER}/api/v1/memo", json=memo_data ) if response.status_code == 200: print("💾 已保存记忆。") else: print(f"保存记忆失败,状态码:{response.status_code}") except requests.exceptions.ConnectionError: print("⚠️ 无法连接MemOS,记忆未保存。") def should_save_memory(user_input, ai_response): """一个简单的启发式规则,判断本次对话是否值得保存。 你可以根据业务逻辑扩展这个函数。""" # 规则1:回答中包含代码块,通常有价值 if "```" in ai_response: return True # 规则2:用户的问题是关于配置、错误解决的(通过关键词判断) keywords = ['如何配置', '错误解决', '为什么报错', '怎么实现', '最佳实践'] if any(keyword in user_input for keyword in keywords): return True # 规则3:回答长度较长,说明是详细解释 if len(ai_response.split()) > 50: return True return False def generate_response_with_memory(user_input): """核心函数:结合记忆生成回答""" # 1. 检索相关历史记忆 related_memories = search_memories(user_input) memory_context = "" if related_memories: memory_context = "\n\n【相关历史记录】\n" + "\n---\n".join(related_memories[:3]) # 最多3条 print(f"🔍 检索到{len(related_memories)}条相关记忆。") # 2. 构建系统提示词,注入记忆上下文 system_prompt = f""" {AGENT_IDENTITY} 你拥有一个长期记忆系统。以下是与当前问题可能相关的历史对话记录,供你参考: {memory_context} 请注意,历史记录仅供参考,当前问题应优先以最新信息和用户明确要求为准。 """ # 3. 调用大模型 try: completion = client.chat.completions.create( model="gpt-4o-mini", # 或 gpt-3.5-turbo messages=[ {"role": "system", "content": system_prompt}, {"role": "user", "content": user_input} ], temperature=0.7, max_tokens=1000 ) ai_response = completion.choices[0].message.content except Exception as e: ai_response = f"调用AI模型时出错:{e}" # 4. 判断并保存记忆 if should_save_memory(user_input, ai_response): # 将问答对保存为一条记忆 memory_content = f"用户问:{user_input}\n助手答:{ai_response[:300]}..." # 截断部分长回答 create_memory(memory_content, tags=["qa"]) return ai_response # 主循环 def main(): print("🤖 智能助手已启动(已启用长期记忆)。输入‘退出’或‘quit’结束。") print("-" * 50) while True: try: user_input = input("\n你:").strip() if user_input.lower() in ['退出', 'quit', 'exit']: print("助手:再见!") break if not user_input: continue print("助手:思考中...") response = generate_response_with_memory(user_input) print(f"\n{response}") except KeyboardInterrupt: print("\n\n程序被中断。") break except Exception as e: print(f"\n发生未知错误:{e}") if __name__ == "__main__": main()

3.4 第四步:运行与验证

  1. 确保MemOS服务在后台运行(memos --mode prod --port 5230)。
  2. 在一个新的终端窗口,运行你的增强版Agent:python agent_with_memory.py
  3. 进行多轮对话测试。例如:
    • 第一轮:问“Python里怎么读取JSON文件?”
    • 第二轮:问“我忘了,刚才说的那个方法,如果文件不存在怎么办?” 你会发现,在第二轮中,Agent能够自动检索到第一轮对话中关于json.load()的记忆,并在此基础上进行补充回答,而不是从头开始。

注意:这个示例中的should_save_memory函数非常基础。在实际生产中,你需要设计更精细的记忆价值判断逻辑,避免保存大量无用或重复的对话,导致记忆库污染。例如,可以结合对话的置信度、信息熵、或用户主动的“保存”指令来判断。

4. 进阶:记忆的优化、管理与安全考量

当你的Agent开始持续运行并积累记忆后,你会遇到一些新问题:记忆太多了怎么办?记忆有冲突怎么办?如何保证安全?这一章我们来探讨这些进阶话题。

4.1 记忆的检索优化:从关键词到语义

我们之前的示例使用了MemOS内置的contentSearch参数进行全文检索。这本质上是关键词匹配。对于更复杂的场景,你可能需要更精准的语义检索。

一个常见的进阶方案是混合检索

  1. 关键词初筛:先用MemOS的contentSearch快速过滤出大量可能相关的记忆。
  2. 语义精排:对初筛结果,使用一个轻量级的句子嵌入模型(如all-MiniLM-L6-v2,通过sentence-transformers库)计算用户问题与每条记忆的语义相似度。
  3. 按分数排序:只返回相似度最高的前N条记忆。

这样既能利用MemOS的快速存储和简单检索,又能获得接近向量数据库的语义理解能力。实现上,你可以在search_memories函数中增加精排步骤。

4.2 记忆的生命周期与清理

记忆不是越多越好。无用的、过时的记忆会干扰检索,降低效率。你需要为记忆设计TTL(生存时间)或清理策略。

  • 基于时间的清理:MemOS的每条记忆都有createdTs(创建时间戳)。你可以定期运行一个脚本,删除比如30天前的记忆。可以通过调用MemOS的DELETE /api/v1/memo/{id}API来实现。
  • 基于访问频率的清理:可以扩展MemOS的数据模型(或在外围维护一个元数据表),记录每条记忆被检索的次数和最近检索时间。长期未被访问的“冷记忆”可以被归档或删除。
  • 主动遗忘机制:允许用户或Agent本身对记忆进行“降权”或“删除”。例如,当用户说“这个办法不对,别记了”,Agent应该能调用API删除或标记对应的错误记忆。

4.3 记忆的冲突与消解

当关于同一事实存在多条矛盾记忆时(例如,用户之前说“我的服务器IP是A”,后来又说“IP换成了B”),Agent该如何处理?

  • 时间戳优先:最简单的策略是“最新记忆优先”。在检索到多条相关记忆时,默认采纳创建时间最新的一条。我们的示例代码中按时间倒序排序就隐含了这个策略。
  • 置信度加权:为每条记忆附加一个置信度分数。这个分数可以来源于:1) 记忆来源的可靠性(是用户明确声明的,还是AI推断的?);2) 记忆被后续对话验证的次数。在检索时,综合时间和置信度进行排序。
  • 主动询问:当检测到高度冲突的记忆时,Agent可以主动向用户确认:“关于服务器IP,我之前记录的是A,但后来有一条记录说是B。请问当前正确的IP是哪一个?” 并将用户的确认结果作为高置信度记忆保存。

4.4 安全与隐私考量

长期记忆涉及用户数据,安全至关重要。

  • 隔离与分类:务必使用resourceNamevisibility字段。为不同的用户、不同的项目、不同的Agent实例使用不同的resourceName,实现数据的逻辑隔离。所有Agent产生的记忆,visibility都应设为"PRIVATE"
  • 敏感信息脱敏:在保存记忆前,对可能包含密码、API密钥、手机号等敏感信息的文本进行脱敏处理。这可以在create_memory函数中增加一个过滤层。
  • 本地化部署:MemOS CLI可以完全本地运行,所有数据存储在本地磁盘(默认在.memos目录)。这是保障数据隐私的最根本方式。确保你的服务器或开发机的磁盘访问权限是安全的。
  • API访问控制:MemOS支持设置访问令牌。在生产环境中,启动服务时应使用--seed参数设置一个强密码,并在Agent调用API时在请求头中携带令牌(Authorization: Bearer <token>),防止未授权访问。

5. 踩坑实录:MemOS CLI集成中的典型问题与排查

在实际集成过程中,你难免会遇到一些问题。下面是我在几个项目中遇到的典型坑点及其解决方案,希望能帮你节省时间。

5.1 连接失败:MemOS服务未启动或端口冲突

这是最常见的问题。你的Agent脚本报错Connection refused

  • 排查步骤
    1. 检查进程:运行ps aux | grep memos(Linux/macOS) 或Get-Process -Name memos(Windows PowerShell),确认memos进程是否存在。
    2. 检查端口:运行netstat -an | grep 5230(Linux/macOS) 或netstat -ano | findstr :5230(Windows),查看5230端口是否处于LISTEN状态。
    3. 检查日志:重新启动MemOS,观察终端输出的日志是否有错误。例如,如果端口被占用,会明确报错。
  • 解决方案
    • 如果未启动,确保执行路径正确,并重新启动。
    • 如果端口冲突,可以更换端口启动:memos --mode prod --port 5231,并同步修改Agent脚本中的MEMOS_SERVER地址。
    • 检查防火墙设置,确保允许本地回环地址(127.0.0.1)的通信。

5.2 记忆检索不准确或为空

你明明保存了记忆,但查询时却返回空列表。

  • 可能原因1:contentSearch参数理解偏差。MemOS的contentSearch是大小写敏感的,且是简单的文本包含匹配。如果你搜索“JSON”,而记忆里是“json”,则匹配不到。
    • 解决:在搜索前,将查询词转换为小写,或者实现一个更宽松的搜索策略(如我们之前提到的混合检索)。
  • 可能原因2:记忆的resourceName不匹配。MemOS的搜索默认是在所有记忆中进行。但如果你保存记忆时指定了resourceName: "project_a",而另一个Agent用resourceName: "project_b"去搜索,虽然能搜到,但如果你在保存或搜索时通过API过滤了resourceName,就会导致找不到。
    • 解决:检查你的create_memorysearch_memories函数,确保resourceName的逻辑一致。如果希望跨项目共享部分记忆,可以设计一个公共的resourceName,如"general_knowledge"
  • 可能原因3:记忆内容太短或太泛。一条内容是“好的”的记忆,几乎无法被有效检索。
    • 解决:优化should_save_memory逻辑,避免保存无意义的对话片段。保存记忆时,尽量让content字段是完整的、自描述的句子或段落。

5.3 记忆库膨胀导致性能下降

运行几周后,发现Agent响应变慢,MemOS服务内存占用升高。

  • 可能原因:MemOS默认使用SQLite数据库,所有记忆存储在单一文件中。当记忆条数达到数十万时,简单的全文检索可能会变慢。
  • 解决方案
    1. 实施定期清理:如前所述,建立记忆的自动清理机制。
    2. 数据库优化:MemOS支持切换至PostgreSQL等更强大的数据库。你可以通过--driver--dsn启动参数进行配置。这对于生产环境、高频率使用的Agent是必要的。
    3. 分库分策:为不同重要级别的记忆设置不同的resourceName,并对应不同的清理策略。核心知识保留时间长,临时对话快速清理。

5.4 在异步或并发Agent环境下的问题

如果你的Agent是并发处理多个用户请求的,直接使用上面的简单代码可能会遇到线程安全问题或记忆错乱。

  • 问题:两个并发的用户会话可能同时读写MemOS,导致记忆张冠李戴。
  • 解决方案
    • 关键标识:在每一条记忆中,必须包含一个能唯一区分会话或用户的标识符,例如user_idsession_id。这可以通过resourceName(如"user_{id}")或记忆content中的特定字段来实现。
    • 检索时过滤:在search_memories时,除了问题关键词,还必须带上当前用户的标识符进行过滤。MemOS API支持组合查询,你需要根据标识符的存储方式,调整查询逻辑。
    • 考虑外部锁:对于极其严格的场景,可能需要在应用层(你的Agent服务)对记忆的读写加锁,但这会牺牲性能。通常,通过良好的标识符设计就能满足需求。

为你的命令行Agent赋予长期记忆,不再是需要深入研究LangChain记忆模块或搭建向量数据库的复杂工程。MemOS CLI提供了一条轻快直接的路径。它抓住了问题的本质——一个简单、可靠、易于集成的记忆存储与检索服务。

从我个人的集成经验来看,最大的收获不是技术上的,而是思维上的转变:从设计“一次性的问答”到设计“持续成长的伙伴”。你需要思考Agent应该记住什么、何时记住、如何利用记忆。这个过程本身,就是对你Agent能力边界和用户体验的一次重要升级。

开始行动吧,从一个最简单的问答对记忆策略入手,让你的命令行伙伴告别“健忘症”。你会发现,它能记住的越多,你用起来就越顺手,很多重复性的解释和上下文复述工作就自然消失了。这或许就是智能工具演进的一个小方向:不是变得更“聪明”,而是变得更“懂你”。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/12 10:03:58

终极指南:5分钟掌握PUBG罗技鼠标宏压枪技巧

终极指南&#xff1a;5分钟掌握PUBG罗技鼠标宏压枪技巧 【免费下载链接】logitech-pubg PUBG no recoil script for Logitech gaming mouse / 绝地求生 罗技 鼠标宏 项目地址: https://gitcode.com/gh_mirrors/lo/logitech-pubg 还在为PUBG中难以控制的武器后坐力而烦恼…

作者头像 李华
网站建设 2026/8/12 10:03:18

动图图解单链表:从节点结构到五大核心操作与C语言实现

1. 项目概述&#xff1a;为什么单链表值得你花时间彻底搞懂&#xff1f;如果你刚开始接触数据结构&#xff0c;或者被“链表”这个概念绕得有点晕&#xff0c;看到“动图图解”这几个字点进来&#xff0c;那咱们算是来对地方了。我是老张&#xff0c;一个写了十几年代码、带过不…

作者头像 李华
网站建设 2026/8/12 10:02:48

C++内存屏障:从编译器优化到多线程同步的底层原理与实践

1. 项目概述&#xff1a;为什么我们需要关心内存屏障&#xff1f;如果你写过C多线程程序&#xff0c;并且对性能有极致追求&#xff0c;那你大概率遇到过一些“诡异”的bug&#xff1a;明明逻辑上变量A的修改应该在线程B中可见&#xff0c;但实际运行时却时灵时不灵&#xff1b…

作者头像 李华
网站建设 2026/8/12 10:02:09

免费Windows内存优化神器:MemReduct 3.5.2终极使用指南

免费Windows内存优化神器&#xff1a;MemReduct 3.5.2终极使用指南 【免费下载链接】memreduct Lightweight real-time memory management application to monitor and clean system memory on your computer. 项目地址: https://gitcode.com/gh_mirrors/me/memreduct 你…

作者头像 李华
网站建设 2026/8/12 10:02:07

Docker化Hydra:构建Web登录自动化安全测试环境

1. 项目概述&#xff1a;为什么要把Hydra装进Docker&#xff1f;如果你做过Web安全测试或者渗透测试&#xff0c;肯定对Hydra不陌生。这个老牌的在线密码破解工具&#xff0c;以其支持协议多、速度快、稳定性好而闻名&#xff0c;尤其是在Web登录表单的爆破测试中&#xff0c;几…

作者头像 李华
网站建设 2026/8/12 10:02:04

G-Helper终极指南:3步解决华硕笔记本风扇噪音与性能平衡问题

G-Helper终极指南&#xff1a;3步解决华硕笔记本风扇噪音与性能平衡问题 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Vivobook, Zenbo…

作者头像 李华