ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

openEuler+鲲鹏平台:Agent Memory记忆管理系统实战指南

openEuler+鲲鹏平台:Agent Memory记忆管理系统实战指南 2026中国国际大学生创新大赛的openEuler命题已经公布很多团队看到“基于鲲鹏平台的Agent Memory记忆管理系统”这个题目时第一反应是这又是一个“大而空”的赛题包装还是真有一个可以落地的技术方向先说结论这个命题恰恰是目前AI应用落地中最痛、最值得做、也最适合大学生团队在竞赛周期内出成果的方向。它不要求你训练大模型不要求你有昂贵算力而是考察你对AI应用架构的理解、对国产操作系统和国产硬件平台的适配能力以及对真实业务场景的洞察。换句话说这是一道“工程能力架构设计场景创新”的综合题而不是“调参炼丹”题。这篇文章会把这个命题拆开讲清楚Agent Memory到底解决什么问题、为什么必须跑在操作系统和硬件平台之上、基于openEuler和鲲鹏平台做记忆管理系统的技术路径是什么、参赛团队应该怎么规划开发节奏和答辩亮点。文章会给出可落地的架构方案、核心代码示例、环境搭建步骤和常见坑点目标只有一个——让你拿到题目后不是一脸茫然而是立刻知道该从哪里下手。1. 命题解读大赛到底想让你做什么先把这个题目拆成三个关键词openEuler、鲲鹏平台、Agent Memory记忆管理系统。openEuler是国产开源操作系统它不是一个“教学用的Linux发行版”而是真正面向服务器、云计算、边缘计算场景的企业级操作系统。openEuler 22.03 LTS 是长期支持版本很多企业正在把 CentOS 7.5 等存量系统迁移到 openEuler 上来这也是目前国内信创领域最大的存量替换需求之一。鲲鹏平台指的是基于鲲鹏处理器的服务器硬件环境典型代表是华为 TaiShan 服务器CPU 架构是 ARMv8AArch64。这意味着你的代码不仅要能在 openEuler 上跑还要考虑 ARM64 架构下的编译兼容性、依赖库可用性、性能优化空间。Agent Memory 记忆管理系统是当前 AI Agent 领域的热门方向。大语言模型本身没有记忆能力每次对话都是“无状态”的。Agent 要完成多轮任务、长期服务用户就必须有一套外部记忆系统来存储和检索历史信息。这个系统要解决三个核心问题记什么、怎么存、怎么召回。把这三点结合起来看这个命题的真实意图就清楚了大赛希望参赛团队在国产操作系统和国产硬件平台上构建一个面向 AI Agent 的记忆管理中间件或应用系统。它既考察你做 AI 应用的能力也考察你在国产技术栈上的适配能力还考察你对真实业务场景的工程化思考。从材料来看相关热搜词里出现了“openEuler 22.03 LTS SP4 安装 docker”“openEuler 配置 yum 源”“openEuler 开启 SSH 服务”等说明大量开发者在实际使用 openEuler 时遇到的都是最基础的环境问题。这也意味着在竞赛答辩现场如果你能流畅地讲清楚 openEuler 下的环境搭建、依赖管理、服务部署本身就是一个很大的加分项因为很多团队连环境都跑不起来。2. Agent Memory 核心概念它到底解决了什么痛提到 Agent Memory很多人会误以为它就是把聊天记录存到数据库里。如果只是这样那这个题目就没有技术深度了。先来看一个真实场景。假设你要开发一个“企业智能客服 Agent”它需要记住用户上次反馈的问题、记住用户所在的城市、记住用户是会员还是普通用户、记住用户对某个问题的偏好处理方式。如果 Agent 每次收到新消息都从零开始那它就永远是一个“失忆”的对话机器人。而如果把所有历史消息都塞给大模型又会面临 token 成本爆炸、上下文超长、关键信息被淹没的问题。Agent Memory 系统要做的就是在大模型外面加一层“外部记忆层”用工程手段解决下面几个问题第一记忆的分层。不是所有信息都值得长期保存。用户今天问了一句“北京天气怎么样”这个信息明天可能就没用了但用户说“我住在北京我是海淀区的”这就属于长期记忆。所以记忆系统要把短期记忆当前会话、工作记忆任务执行中的临时状态、长期记忆用户画像、长期偏好区分开。第二记忆的存储。长期记忆用什么存简单的键值对可以存用户配置关系型数据库可以存结构化信息向量数据库可以存语义信息。不同记忆类型要用不同的存储引擎这对系统设计能力是个很好的考察点。第三记忆的召回。这是最核心也最难的部分。用户说“上次那个解决方案再给我讲讲”系统怎么知道“上次”指的是哪一次这里需要做语义检索、相关性排序、甚至需要与用户的当前意图做匹配。如果召回不准确记忆系统就是个摆设。第四记忆的更新与遗忘。用户改了自己的偏好系统怎么更新用户要求删除历史数据系统能不能真正删除这涉及数据一致性、隐私合规、遗忘机制。在竞赛答辩中如果能主动讲清楚“记忆的写入策略、更新策略、过期策略、删除策略”会明显提升评委的技术认可度。从技术架构上看Agent Memory 不是一个单一组件而是一个包含存储引擎、检索服务、管理接口、与 Agent 框架对接 SDK 的中间件系统。这个系统可以独立于大模型存在也可以对接任意 Agent 框架。这种“与模型解耦”的设计恰恰是它在工程上的价值所在。3. 为什么选择 openEuler 与鲲鹏平台适配本身就是竞争力很多团队会有一个疑问这个题目的重点到底是 AI 算法还是系统适配从大赛命题考察的角度看适配和优化本身就是这个赛题的硬性得分点。原因很简单如果只是在 x86 服务器上用 Ubuntu 和 Redis 做一个记忆系统那这个命题就没有任何“国产平台”特色了。命题专门强调 openEuler 和鲲鹏平台说明评委希望看到团队能在国产技术栈上完成从代码编译、依赖安装到服务部署、性能验证的全流程。这里有一个很现实的技术背景openEuler 基于 Linux 内核但它的软件仓库、包管理方式、默认配置与 Ubuntu/CentOS 都有差异。鲲鹏平台的 ARM64 架构意味着很多在 x86 上预编译好的二进制包不能直接用需要源码编译或用 ARM64 版本替换。这些看起来是“脏活累活”但在竞赛中恰恰是最能体现工程能力的地方。从资料来看openEuler 22.03 LTS SP4 是目前社区比较常用的版本。很多开发者在迁移 CentOS 7.5 到 openEuler 时会关心对应关系。从社区实践看openEuler 22.03 LTS 在定位上接近 CentOS 的稳定长期支持版本适合作为服务器系统的迁移目标。要注意的是openEuler 的 DNF/Yum 仓库需要正确配置系统安装完成后第一步通常是确认网络源或本地源可用然后才能安装后续组件。在鲲鹏平台上跑 Agent Memory 系统还需要考虑一个关键问题操作系统、数据库、中间件、AI 推理框架是否都有 ARM64 版本。比如 Redis 有 ARM64 版本MySQL/MariaDB 有 ARM64 版本Python 的很多依赖也可以源码编译。但一些 Java 生态的库、一些依赖 x86 指令集的二进制 SDK就需要格外小心。所以这篇文章要给参赛团队的第一个建议是不要把“openEuler鲲鹏”当成一个装饰性的背景板而要把它当成系统设计的第一约束。你的每一步技术选型都要先问一句在 ARM64 openEuler 上能不能顺利部署性能损耗是多少有没有替代方案4. 系统整体架构设计先画图再写代码基于前面的分析一个适合竞赛周期通常 3 到 6 个月的 Agent Memory 记忆管理系统可以按如下架构来设计。接入层面向 Agent 框架的 SDK/API。对外提供统一的记忆读写接口例如save_memory()、get_memory()、delete_memory()、search_memory()。这样可以屏蔽底层存储细节让任意 Agent 框架通过 HTTP 或 Python SDK 接入。处理层记忆的写入、更新、召回逻辑。写入时对文本做清洗、分段、提取关键信息更新时根据记忆类型决定是覆盖、追加还是新建召回时根据用户当前查询做检索、排序、过滤。存储层多级存储引擎。短期记忆可以用 Redis键值 TTL 过期结构化长期记忆可以用 MySQL/MariaDB非结构化语义记忆可以用向量数据库或基于文本索引的检索服务。为了降低竞赛环境的部署复杂度初期可以先只做 Redis MySQL 两级存储后续再扩展向量检索。管理台可视化管理界面。展示记忆条目、记忆类型、召回命中情况、存储统计。这一层是竞赛答辩的“面子工程”但也很重要因为评委能直观看到系统在工作。平台层openEuler 鲲鹏。所有组件统一部署在 openEuler 系统上通过 DNF 安装依赖通过 Docker 或 systemd 管理服务生命周期。初期建议直接用 Docker Compose 拉起 Redis、MySQL 和应用服务后期可以做鲲鹏环境下的性能优化。这个架构的核心优势是每一层都可以单独验证每一层都有明确的竞赛展示点。接入层展示代码工程能力处理层展示算法思维存储层展示数据设计能力管理台展示产品化思维平台层展示国产化适配能力。这里要特别强调竞赛答辩时不要只演示一个“能跑的命令行工具”。一个带 Web 管理界面的系统和一个纯脚本工具在评委眼中的档次是完全不同的。哪怕界面做得很朴素只要能把记忆列表、召回结果、命中得分展示出来就足以说明你“做了完整的产品闭环”。5. 环境搭建openEuler 上的基础准备从大量网络搜索词来看“openEuler 怎么安装”“openEuler 怎么配 yum 源”“openEuler 怎么开 SSH”是开发者最高频的痛点。这一节就完整演示在 openEuler 22.03 LTS 上搭建 Agent Memory 开发环境的过程。第一步确认系统版本与架构。SSH 登录服务器后先执行cat /etc/openEuler-release uname -a预期会看到类似 openEuler 22.03 (LTS-SP4) 的信息架构为 aarch64。如果是 x86 架构的虚拟机也能跑通本文所有操作但就失去了“基于鲲鹏平台”的竞赛意义建议尽量使用鲲鹏 ARM64 环境。第二步配置 yum 源。openEuler 默认的 yum 源有时会因为网络问题不可用需要切换为可用镜像源。以清华源为例方法如下# 备份原始 repo 文件 mkdir -p /etc/yum.repos.d/backup mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup/ # 写入 openEuler 22.03 LTS 的镜像源 cat /etc/yum.repos.d/openEuler.repo EOF [openEuler] nameopenEuler 22.03 LTS baseurlhttps://mirrors.tuna.tsinghua.edu.cn/openeuler/openEuler-22.03-LTS-SP4/everything/aarch64/ enabled1 gpgcheck0 EOF # 刷新缓存 dnf clean all dnf makecache如果服务器是 x86_64 架构把 baseurl 里的aarch64换成x86_64即可。这里要提醒gpgcheck0仅适合竞赛开发环境快速验证生产环境应配置 GPG 密钥校验。第三步安装基础工具链。dnf install -y vim git curl wget tar gcc gcc-c make dnf install -y python3 python3-pip python3-devel dnf install -y redis mysql-server这里安装 Redis 和 MySQL 是为了后续存储层使用。如果 DNF 安装失败可以先用dnf search redis确认包名不同版本的小版本号可能不同。第四步启动 Redis 与 MySQL 服务。systemctl start redis systemctl enable redis systemctl start mysqld systemctl enable mysqld # 检查状态 systemctl status redis systemctl status mysqldMySQL 安装后默认 root 密码通常记录在日志中grep temporary password /var/log/mysqld.log拿到临时密码后执行安全初始化mysql_secure_installation第五步确认 Python 环境。python3 --version pip3 --version建议为项目创建独立的虚拟环境mkdir -p /opt/agent-memory cd /opt/agent-memory python3 -m venv venv source venv/bin/activate pip install --upgrade pip到这里基础环境就绪了。接下来的依赖安装比如redis-py、flask、sqlalchemy、pymysql都在虚拟环境中进行。6. 核心代码实现从零搭建记忆管理服务下面用一个最小可运行的项目演示 Agent Memory 系统的核心链路写入记忆、查询记忆、语义召回。这里不依赖任何大模型 API只用文本匹配和简单关键词打分实现一个可演示的“轻量召回”目的是先把整个工程链路跑通。6.1 项目结构/opt/agent-memory/ ├── app.py # Flask Web 服务 ├── memory_store.py # 存储与召回逻辑 ├── requirements.txt # Python 依赖 ├── templates/ │ └── index.html # 简易管理页面6.2 安装依赖pip install flask redis sqlalchemy pymysql6.3 存储层封装memory_store.py# 文件路径/opt/agent-memory/memory_store.py import redis import time import re from sqlalchemy import create_engine, Column, String, Text, Integer, Float, DateTime, text from sqlalchemy.orm import declarative_base, sessionmaker from datetime import datetime Base declarative_base() class MemoryItem(Base): __tablename__ memory_items id Column(Integer, primary_keyTrue, autoincrementTrue) user_id Column(String(64), indexTrue, nullableFalse) memory_type Column(String(32), defaultlong) # short / work / long content Column(Text, nullableFalse) source Column(String(128), defaultmanual) created_at Column(DateTime, defaultdatetime.utcnow) updated_at Column(DateTime, defaultdatetime.utcnow, onupdatedatetime.utcnow) class MemoryStore: def __init__(self, redis_host127.0.0.1, redis_port6379, mysql_dsnmysqlpymysql://root:yourpassword127.0.0.1:3306/agent_memory): self.redis_client redis.Redis(hostredis_host, portredis_port, decode_responsesTrue) self.engine create_engine(mysql_dsn, echoFalse) Base.metadata.create_all(self.engine) self.Session sessionmaker(bindself.engine) def save_memory(self, user_id, memory_type, content, sourcemanual): 写入一条记忆 短期记忆存 Redis带 TTL长期记忆存 MySQL。 if memory_type short: key fmem:short:{user_id} self.redis_client.lpush(key, content) self.redis_client.ltrim(key, 0, 19) # 最多保留最近 20 条短期记忆 self.redis_client.expire(key, 3600) # 1 小时后过期 return {status: ok, storage: redis, memory_type: short} else: session self.Session() item MemoryItem(user_iduser_id, memory_typememory_type, contentcontent, sourcesource) session.add(item) session.commit() memory_id item.id session.close() return {status: ok, storage: mysql, memory_type: memory_type, id: memory_id} def get_recent_short_memory(self, user_id): 获取短期记忆Redis 列表。 key fmem:short:{user_id} items self.redis_client.lrange(key, 0, 9) return [{content: item, storage: redis} for item in items] def search_long_memory(self, user_id, query, top_k5): 轻量召回关键词打分 时间倒序不依赖外部向量库。 session self.Session() items session.query(MemoryItem).filter( MemoryItem.user_id user_id, MemoryItem.memory_type long ).order_by(MemoryItem.updated_at.desc()).limit(100).all() query_tokens set(re.findall(r[\u4e00-\u9fa5]|[a-zA-Z0-9], query.lower())) scored [] for item in items: content_tokens set(re.findall(r[\u4e00-\u9fa5]|[a-zA-Z0-9], item.content.lower())) overlap len(query_tokens content_tokens) if overlap 0: score overlap / max(len(query_tokens), 1) scored.append({ id: item.id, content: item.content, memory_type: item.memory_type, score: round(score, 4), created_at: item.created_at.strftime(%Y-%m-%d %H:%M:%S) if item.created_at else , source: item.source }) scored.sort(keylambda x: (x[score], x[created_at]), reverseTrue) session.close() return scored[:top_k] def delete_memory(self, memory_id): 按 ID 删除长期记忆。 session self.Session() item session.query(MemoryItem).filter(MemoryItem.id memory_id).first() if item: session.delete(item) session.commit() session.close() return {status: ok, deleted_id: memory_id} session.close() return {status: not_found}这段代码的设计思路是短期记忆用 Redis 列表 TTL 过期实现“当次对话快速存取、自动遗忘”长期记忆用 MySQL 持久化实现“跨会话稳定保存”。召回阶段先做中文/英文 token 切分再计算查询与记忆内容的重叠度按得分和更新时间排序。这个轻量召回方案虽然不如向量检索“高级”但胜在零额外依赖、逻辑透明、答辩时容易解释。6.4 Web 服务层app.py# 文件路径/opt/agent-memory/app.py from flask import Flask, request, jsonify, render_template from memory_store import MemoryStore app Flask(__name__) store MemoryStore( redis_host127.0.0.1, redis_port6379, mysql_dsnmysqlpymysql://root:yourpassword127.0.0.1:3306/agent_memory ) app.route(/) def index(): return render_template(index.html) app.route(/api/memory/save, methods[POST]) def save_memory(): data request.get_json() user_id data.get(user_id) memory_type data.get(memory_type, long) content data.get(content) source data.get(source, api) if not user_id or not content: return jsonify({status: error, message: user_id and content are required}), 400 result store.save_memory(user_id, memory_type, content, source) return jsonify(result) app.route(/api/memory/short, methods[GET]) def get_short_memory(): user_id request.args.get(user_id) if not user_id: return jsonify({status: error, message: user_id is required}), 400 return jsonify({status: ok, data: store.get_recent_short_memory(user_id)}) app.route(/api/memory/search, methods[GET]) def search_memory(): user_id request.args.get(user_id) query request.args.get(query) top_k int(request.args.get(top_k, 5)) if not user_id or not query: return jsonify({status: error, message: user_id and query are required}), 400 result store.search_long_memory(user_id, query, top_k) return jsonify({status: ok, data: result}) app.route(/api/memory/delete, methods[POST]) def delete_memory(): data request.get_json() memory_id data.get(memory_id) if not memory_id: return jsonify({status: error, message: memory_id is required}), 400 result store.delete_memory(memory_id) return jsonify(result) if __name__ __main__: app.run(host0.0.0.0, port8000)6.5 前端管理页templates/index.html用一个最简单的 HTML 页面实现“写入记忆、查询短期记忆、搜索长期记忆、删除记忆”的完整演示。!-- 文件路径/opt/agent-memory/templates/index.html -- !DOCTYPE html html langzh-CN head meta charsetUTF-8 titleAgent Memory Management System/title style body { font-family: Arial, sans-serif; max-width: 800px; margin: 40px auto; padding: 20px; } .card { border: 1px solid #ddd; border-radius: 8px; padding: 16px; margin-bottom: 16px; } input, textarea, button { margin: 4px 0; padding: 8px; width: 100%; box-sizing: border-box; } .output { background: #f5f5f5; padding: 12px; border-radius: 4px; white-space: pre-wrap; word-break: break-all; } /style /head body h1Agent Memory 记忆管理系统/h1 div classcard h3写入记忆/h3 input idsave_user placeholderUser ID valueuser123 select idsave_type option valueshort短期记忆/option option valuework工作记忆/option option valuelong selected长期记忆/option /select textarea idsave_content rows2 placeholder记忆内容/textarea button onclicksaveMemory()保存/button /div div classcard h3查询短期记忆/h3 input idshort_user placeholderUser ID valueuser123 button onclickgetShort()查询/button div classoutput idshort_output等待输入.../div /div div classcard h3语义召回长期记忆/h3 input idsearch_user placeholderUser ID valueuser123 input idsearch_query placeholder查询内容 button onclicksearchMemory()搜索/button div classoutput idsearch_output等待输入.../div /div script async function saveMemory() { const user_id document.getElementById(save_user).value; const memory_type document.getElementById(save_type).value; const content document.getElementById(save_content).value; const resp await fetch(/api/memory/save, { method: POST, headers: {Content-Type: application/json}, body: JSON.stringify({user_id, memory_type, content, source: web}) }); document.getElementById(short_output).textContent JSON.stringify(await resp.json(), null, 2); } async function getShort() { const user_id document.getElementById(short_user).value; const resp await fetch(/api/memory/short?user_id user_id); const data await resp.json(); document.getElementById(short_output).textContent JSON.stringify(data, null, 2); } async function searchMemory() { const user_id document.getElementById(search_user).value; const query document.getElementById(search_query).value; const resp await fetch(/api/memory/search?user_id${user_id}query${encodeURIComponent(query)}); const data await resp.json(); document.getElementById(search_output).textContent JSON.stringify(data, null, 2); } async function deleteMemory(memory_id) { if (!confirm(确认删除记忆 # memory_id ?)) return; const resp await fetch(/api/memory/delete, { method: POST, headers: {Content-Type: application/json}, body: JSON.stringify({memory_id}) }); const data await resp.json(); alert(JSON.stringify(data)); location.reload(); } /script /body /html6.6 创建 MySQL 数据库启动服务前需要先在 MySQL 中创建数据库mysql -u root -pCREATE DATABASE IF NOT EXISTS agent_memory DEFAULT CHARACTER SET utf8mb4;如果 MySQL 的 root 密码不是yourpassword记得同步修改app.py中mysql_dsn的连接串。6.7 启动服务cd /opt/agent-memory source venv/bin/activate python app.py浏览器访问http://服务器IP:8000就能看到管理页面。7. 运行验证与效果演示服务启动后建议按下面的顺序做一轮完整验证。这个过程既是你自己的功能测试也是竞赛答辩时的演示脚本。第一步写入一条长期记忆。在管理页面中User ID 填user123记忆类型选“长期记忆”内容填“用户住在北京海淀区偏好使用国产化技术栈是openEuler社区关注者”点击保存。预期返回结果里会出现storage: mysql和新的id。第二步再写入一条工作记忆。内容填“当前正在处理企业智能客服项目的记忆系统设计”类型选“工作记忆”。这步是为了验证不同记忆类型走不同存储路径。第三步写入两条短期记忆。内容分别填“今天天气不错”和“用户问了Redis的使用方法”类型选“短期记忆”。第四步查询短期记忆。在“查询短期记忆”区域点击查询预期能看到两条短期记忆。这里可以演示 Redis TTL 的效果等一小时后再次查询短期记忆会被自动清空也可以直接执行redis-cli keys mem:short:*查看 Redis 中的 key。第五步语义召回。在“语义召回”区域查询内容填“住在哪里”或“国产系统”点击搜索。预期会召回“用户住在北京海淀区偏好使用国产化技术栈”这条长期记忆并给出匹配分数。这里可以解释召回基于关键词重叠计算后续如果要提升智能度可以替换为向量检索。第六步删除记忆。调用删除接口传入某条长期记忆的 ID再搜索验证该条不再出现。通过这套验证你已经完整演示了 Agent Memory 系统的“增、查、删”核心链路。如果答辩时间有限只需演示第一步、第五步和第六步就能把系统的技术完整度讲清楚。8. 常见问题与排查方法根据 openEuler 上的开发经验把最高频的问题汇总成表参赛团队遇到问题时可以先按这个清单排查。问题现象可能原因排查方式解决方案dnf makecache报网络错误yum 源不可达或架构不匹配curl -I测试 baseurl 是否可访问检查 repo 中架构名更换可用镜像源确认 aarch64/x86_64 正确pip install安装缓慢或失败默认 PyPI 源网络不稳定查看 pip 日志使用国内镜像源pip install -i https://mirrors.aliyun.com/pypi/simple/Redis 启动失败端口被占用或配置文件错误journalctl -u redis -n 50检查/etc/redis.conf确认bind和portMySQL root 登录失败临时密码过期或密码错误grep temporary password /var/log/mysqld.log按日志中的临时密码登录重置为强密码SQLAlchemy 连接 MySQL 报错pymysql 未安装或 DSN 错误检查pip list打印完整异常堆栈安装pymysql核对用户名、密码、数据库名Flask 页面无法访问防火墙未放行端口curl http://127.0.0.1:8000本机测试openEuler 使用firewall-cmd --add-port8000/tcp --permanent放行中文内容存 MySQL 乱码数据库字符集不是 utf8mb4SHOW CREATE DATABASE agent_memory;建库时显式指定DEFAULT CHARACTER SET utf8mb4ARM64 下某个 Python 包无预编译 wheel包依赖 C 扩展查看 pip 是否尝试源码编译安装编译依赖gcc、python3-devel或寻找 ARM64 wheel这里特别提醒一个 openEuler 的常见误区很多新手在 openEuler 上习惯性地用apt-get安装软件结果直接报错。openEuler 属于 RPM 系使用dnf/yum作为包管理器与 Ubuntu 的apt完全不同。如果团队之前只熟悉 Debian 系系统建议先花一周时间熟悉 openEuler 的基本操作。9. 技术选型建议什么该用什么可以缓一缓很多团队拿到题目后第一反应是“我要上大模型”“我要用向量数据库”“我要做多 Agent 协同”。这些方向本身没错但在竞赛周期内技术选型要分优先级。第一优先级把核心链路跑通。Redis MySQL Flask 这套组合足以支撑一个完整可演示的 Agent Memory 系统。短期记忆走 Redis长期记忆走 MySQL召回用关键词打分管理页面用简单 HTML。这套方案在 1 到 2 周内可以完成。第二优先级引入向量检索。如果时间充裕可以使用轻量级的向量检索方案。在 ARM64 openEuler 上部署 Milvus 或 Chroma 需要额外验证兼容性建议先在 x86 环境验证逻辑再迁移到鲲鹏环境。如果不想引入额外服务可以使用sentence-transformers配合 NumPy 实现内嵌向量检索但要注意模型下载和 ARM64 推理的依赖问题。第三优先级对接真实 Agent 框架。LangChain 和 LlamaIndex 都支持自定义记忆组件。如果你的系统提供了标准 API可以通过自定义 Memory 类对接 LangChain实现“用你的记忆系统替换 LangChain 默认的对话缓冲记忆”。这个对接演示在答辩中非常有冲击力因为它证明了你的系统不是玩具而是可以真实嵌入到 Agent 开发流程中的中间件。第四优先级性能优化与平台特性展示。在鲲鹏平台上可以展示多线程调度、NUMA 亲和性、ARM64 指令集优化等内容。比如使用numactl绑定进程到指定 CPU 核心对比优化前后的接口延迟。这类优化不一定要做得很深但能体现团队对国产硬件平台的理解。10. 竞赛加分项这些细节最容易打动评委从历年大赛的评审习惯来看评委打分不仅看功能是否完成更看重项目的“系统完整性”和“技术深度”。下面这些细节是参赛团队最容易拉开差距的地方。第一记忆更新的版本控制。用户修改长期偏好后旧版本内容应该保留还是覆盖建议在表中增加version字段每次更新不是直接 UPDATE而是插入新版本并保留旧版本。这样做的好处是系统可以回溯用户的历史偏好变化在隐私合规方面也更容易解释。第二记忆召回的排序解释。召回结果里不仅要给“命中了什么”还要给“为什么命中”。比如在接口返回值中补充命中的关键词、相似度分数、更新时间。评委看到这些细节会认为你的团队真的理解了“检索”的本质而不是简单调库。第三安全与合规设计。Agent Memory 系统天然涉及用户隐私数据。建议在系统里加入简单的权限控制按 user_id 隔离、数据删除接口、脱敏显示功能。如果团队能主动讲清楚“用户数据可删除、短期记忆自动过期、长期记忆可审计”这在答辩中是很强的加分项因为大赛非常看重项目的实际落地潜力。第四国产化适配报告。准备一份文档记录在 openEuler 鲲鹏环境下每个组件的版本、安装方式、踩坑过程、性能数据。这份报告本身就是竞赛成果的一部分也是评委判断团队工程能力的直接材料。第五演示脚本要精心设计。不要现场临时操作。把前面第 7 节的验证流程做成一个完整的“演示剧本”每一步操作对应一句技术讲解控制好每步时间。实际操作中演示环节最容易翻车的点是网络连接、数据库未启动、前端页面样式错乱建议提前录好一份备用视频。11. 分阶段开发计划建议竞赛周期通常在 3 到 6 个月建议按下面四个阶段来规划。阶段一第 1 到 2 周环境准备与需求梳理。完成 openEuler 环境安装、yum 源配置、基础组件部署。同时团队内部明确 Agent Memory 的定位、目标用户和演示场景。这个阶段的产出是一份系统设计文档和环境部署手册。阶段二第 3 到 6 周核心功能开发。完成存储层、API 层、管理页面的第一版跑通写入、查询、删除的全链路。这个阶段不要追求花哨功能稳定性优先。阶段三第 7 到 10 周场景深化与 Agent 对接。选择 1 到 2 个具体场景做深比如“企业智能客服的长期用户画像记忆”或“科研助手的文献偏好记忆”。尝试对接 LangChain 等 Agent 框架做替换默认记忆组件的验证。阶段四第 11 到 14 周答辩材料整理与演示优化。编写项目文档、制作演示视频、整理国产化适配报告、准备评委问答。这个阶段的核心是把“做出来的东西”变成“讲得清楚的东西”。这里要特别提醒不要在前 6 周就纠结向量数据库选型或性能调优。先把最基础的功能跑通再逐步迭代。很多团队最后没拿到名次不是能力不够而是前期浪费时间太多最后连基本演示都没做好。12. 基于“均衡卡珊德拉”的训练底座微调与部署要点如果把范围扩大一些一些参赛团队可能会想在裁判评分权重更高的“模型效果”维度上做文章比如对开源模型做领域微调。此时建议参考“均衡卡珊德拉”这类均衡训练方案的设计思路它强调数据质量、约束对齐和训练效率的平衡而不是一味堆算力。在鲲鹏平台上做微调要注意三点一是优先使用开源社区已适配 ARM64 的训练框架二是数据准备阶段把指令质量放在第一位用几千条高质量数据优于几十万条噪声数据三是微调完成后必须做效果回归避免通用能力被破坏。Agent Memory 系统完全可以和微调结合用记忆系统管理训练数据的版本、记录微调样本的来源和更新记录。这样记忆管理就不再只是一个 AI 应用的附属模块而是成为 AI 开发生命周期的元数据底座。这个立意比单纯做一个“对话机器人记忆工具”要高出不少。13. 总结2026中国国际大学生创新大赛的 openEuler 命题表面上是在考一个“记忆管理系统”本质上是在考团队的三层能力能不能在国产操作系统和国产芯片上做好工程适配能不能设计出逻辑清晰的 AI 应用架构能不能把一个技术想法打磨成可演示、可解释、有落地潜力的完整系统。这篇文章给出的方案没有依赖昂贵的算力或复杂的算法openEuler 提供稳定的底座Redis 负责短期记忆自动过期MySQL 承载长期记忆持久化Flask 提供统一的 API 和演示界面一道轻量召回逻辑展示了“检索”的核心思路。这个最小体系能让任何一支团队在两周内跑通再把剩余时间投入到场景挖掘和答辩打磨上。建议拿到题目的团队第一步先按照第 5 节的内容完成服务器环境搭建第二步把第 6 节的代码部署到自己的环境中跑通第三步约一次小组内部的模拟答辩。把这三步走完你对这个命题的理解就已经超过大多数参赛队伍了。
返回列表