news 2026/8/24 1:59:40

AI辅助开发中的上下文管理:构建持久记忆系统解决AI“失忆”问题

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
AI辅助开发中的上下文管理:构建持久记忆系统解决AI“失忆”问题

在AI辅助开发的浪潮中,你是否也遇到过这样的困扰:让AI助手帮你写一个功能,第一次对话它给出了清晰的思路和代码框架;当你第二次对话,想基于之前的成果继续完善时,它却像得了“失忆症”,完全忘记了之前的上下文,需要你从头复述一遍需求,甚至可能给出前后矛盾的方案。这种“断片”现象,在跨对话、长周期的开发任务中尤为致命,严重影响了开发效率和代码质量。

本文将以一个真实的“律所案件管理系统”AI开发实战为例,深入剖析AI“失忆”的根源,并系统性地讲解如何构建一套有效的Memory(记忆)与上下文管理方案。我们将从核心概念入手,逐步搭建一个能够记住项目背景、技术栈、业务规则和对话历史的智能开发助手,实现跨对话的连贯协作,让AI真正成为你可靠的“结对编程”伙伴。

1. 背景与核心概念:为什么AI会“失忆”?

在深入解决方案之前,我们首先要理解问题的本质。AI模型(尤其是基于Transformer架构的大语言模型)在单次对话中表现出的“记忆力”,实际上是对其输入上下文窗口(Context Window)内所有Token(词元)的全局注意力计算。一旦对话长度超过这个窗口,或者开启新的对话会话(Session),模型就无法“看到”之前的对话内容了。

核心概念解析:

  • 上下文窗口(Context Window):指模型单次处理所能接受的最大文本长度(如4K、8K、16K、128K Tokens)。这是模型能力的硬性限制。
  • 会话(Session):用户与AI模型的一次连续交互。在Web界面或API调用中,通常一次页面刷新或新建聊天就会开启一个新会话,上下文清零。
  • 记忆(Memory):在AI应用开发中,特指为了让智能体(Agent)或助手在跨会话、长周期任务中保持状态一致性,而持久化存储的关键信息。这不同于计算机内存,而是一种应用层的状态管理。

“失忆”带来的开发痛点:

  1. 需求重复沟通:每次都要重新描述项目背景、技术选型(如Spring Boot + Vue)、业务规则(如案件状态流转逻辑)。
  2. 代码风格断裂:AI可能在新对话中采用不同的命名规范、包结构或设计模式,导致项目代码风格混乱。
  3. 逻辑前后矛盾:之前约定好的接口设计、数据模型,在新对话中被推翻或遗忘,产生冲突。
  4. 效率严重打折:开发者需要花费大量时间充当“上下文搬运工”,而不是专注于核心逻辑设计。

因此,一个成熟的AI辅助开发工作流,必须包含一套精密的“记忆系统”,将重要的、需要长期保持的信息从短暂的对话上下文中剥离出来,进行持久化存储和智能检索。

2. 环境准备与项目概述

在开始构建记忆系统前,我们先明确本次实战的目标和环境。

项目目标:开发一个简易的“律所案件管理系统”后端模块,使用AI辅助,并确保在多次、跨天的对话中,AI能始终保持对项目的“记忆”。

技术栈:

  • 后端框架:Spring Boot 2.7.x
  • 数据库:MySQL 8.0
  • ORM框架:MyBatis-Plus
  • 项目管理:Maven
  • AI模型平台:DeepSeek API(或其他支持长上下文/有记忆功能API的模型,如OpenAI GPT-4, 文心一言等)。本文方案是模型无关的。
  • 开发工具:IDEA或VSCode

核心思路:我们不依赖某个特定AI产品的“记忆”功能(如某些聊天机器人的“记忆库”),而是从应用架构层面,主动地、结构化地管理要传递给AI的上下文。这通常包括:

  1. 项目记忆:项目结构、技术栈、依赖版本、配置文件。
  2. 业务记忆:需求文档、实体关系图(ERD)、API接口文档、业务规则。
  3. 对话记忆:历史对话的摘要、关键决策点、待办事项。
  4. 代码记忆:核心模块的代码片段、接口定义、数据模型。

我们将创建一个“项目上下文知识库”,在每次与AI交互时,动态地将相关记忆注入到本次对话的提示词(Prompt)中。

3. 记忆系统架构设计

一个有效的记忆系统需要解决三个问题:记什么、怎么存、如何取

3.1 记忆的分类与存储(记什么 & 怎么存)

我们将记忆分为两类,采用不同的存储策略:

记忆类型内容示例存储形式更新频率
静态记忆项目介绍、技术栈说明、Mavenpom.xml、配置文件、数据库DDL脚本、ER图。项目根目录下的文本文件(如PROJECT_CONTEXT.md)、代码文件本身。低,随项目变更而手动更新。
动态记忆本次开发任务的目标(如“开发案件创建API”)、历史对话摘要、已实现的接口列表、遇到的错误及解决方案、下一步计划。结构化数据(JSON/YAML)或向量数据库(用于语义检索)。例如一个dev_log.json文件或ChromaDB向量库。高,每次有意义的对话后都更新。

推荐的项目文件结构:

law-case-management/ ├── src/ │ ├── main/ │ └── test/ ├── docs/ # 记忆存储目录 │ ├── project_context.md # 静态记忆:项目总览 │ ├── tech_stack.md # 静态记忆:技术栈详情 │ ├── business_requirements.md # 静态记忆:业务需求 │ ├── api_design.md # 静态记忆:API设计 │ └── dev_log.json # 动态记忆:开发日志 ├── pom.xml └── README.md

3.2 记忆的检索与注入(如何取)

每次向AI发起请求时,我们不能一股脑把所有记忆都塞进上下文(会浪费Token且可能干扰模型)。我们需要一个“记忆检索”环节。

  1. 基于关键词的检索:适用于静态记忆。根据当前对话的主题(如“用户登录”),去project_context.md等文件中查找相关章节。
  2. 基于向量的语义检索:适用于动态和非结构化记忆。将记忆片段转换为向量(Embedding),存储到向量数据库(如ChromaDB, Pinecone)。当新问题到来时,将问题也转换为向量,在数据库中查找最相关的几条记忆片段。
  3. 固定模板注入:将最核心、必须的记忆(如当前技术栈、项目名称)设计成Prompt固定模板的一部分。

记忆注入Prompt模板示例:

你是一个专业的Java后端开发助手,正在协助开发【律所案件管理系统】。 ## 项目核心上下文(请始终遵循): {{ 注入的核心静态记忆,如技术栈、项目包名 }} ## 当前开发任务: {{ 本次对话的具体任务描述 }} ## 相关历史上下文(最近几次对话的摘要): {{ 从动态记忆中检索到的相关历史记录 }} ## 请开始你的工作: 用户:{{ 用户本次的具体问题 }}

4. 完整实战:构建律所案件管理系统的记忆上下文

让我们一步步为“律所案件管理系统”构建记忆体系。

4.1 创建静态记忆文档

首先,创建docs/project_context.md,这是AI理解项目的“说明书”。

# 律所案件管理系统 - 项目上下文手册 ## 项目简介 本项目旨在为中小型律师事务所开发一套内部案件管理系统,用于跟踪案件生命周期、管理客户信息、分配律师任务及记录关键时间节点。 ## 技术栈 (强制遵守) - **后端**: Spring Boot 2.7.18 - **Java版本**: JDK 11 - **数据库**: MySQL 8.0.33 - **ORM**: MyBatis-Plus 3.5.4 - **项目管理**: Maven - **API风格**: RESTful - **包根路径**: `com.lawfirm.casebook` ## 数据库设计核心实体 1. **Client (客户)**: id, name, phone, email, id_number, address 2. **Case (案件)**: id, case_number, title, description, status, priority, open_date, close_date, client_id (外键) 3. **Lawyer (律师)**: id, name, employee_id, specialty, phone 4. **CaseAssignment (案件分配)**: id, case_id, lawyer_id, assigned_date, is_primary 5. **TimelineEvent (时间线事件)**: id, case_id, event_type, description, event_date, created_by ## 通用规范 - 所有实体类均使用Lombok注解 (`@Data`, `@NoArgsConstructor`, `@AllArgsConstructor`)。 - Controller层统一返回 `Result<T>` 对象,包含code, msg, data字段。 - Service接口命名以 `I` 开头,实现类以 `Impl` 结尾。 - 所有日期字段在数据库中为 `datetime` 类型,在Java中使用 `LocalDateTime`。 - 使用MyBatis-Plus的通用Mapper,避免手写基础CRUD SQL。

接着,创建docs/business_requirements.md,定义业务规则。

# 核心业务规则 ## 案件状态流转 案件状态 (`Case.status`) 为枚举值,流转规则如下: 1. `PENDING` (待受理) -> `IN_PROGRESS` (处理中): 当案件被分配给至少一名律师后。 2. `IN_PROGRESS` -> `PENDING_REVIEW` (待结案审核): 当律师手动标记“完成”时。 3. `PENDING_REVIEW` -> `CLOSED` (已结案): 当具有“审核”权限的管理员确认后。 4. 任何状态均可转为 `ARCHIVED` (已归档),但不可逆。 ## 权限规则 - 普通律师:只能查看和操作自己被分配的案件。 - 合伙人/管理员:可以查看所有案件,分配案件,审核结案。 - 系统自动记录 `TimelineEvent`,如“案件创建”、“状态变更”、“分配律师”。 ## API安全要求 - 所有API(除登录外)需通过JWT Token认证。 - 请求和响应中,敏感信息(如客户身份证号)需脱敏。

4.2 创建动态记忆日志

创建docs/dev_log.json,用于记录开发进程和关键决策。这是一个不断追加的日志文件。

[ { "timestamp": "2024-05-27T10:00:00", "session_id": "session_001", "task": "项目初始化与实体类设计", "summary": "根据ERD创建了Client, Case, Lawyer, CaseAssignment, TimelineEvent五个核心实体类。使用了Lombok和MyBatis-Plus注解。确定了包结构为com.lawfirm.casebook.entity。", "key_decisions": [ "使用MyBatis-Plus的@TableId(type = IdType.AUTO)作为主键策略。", "Case实体的status字段使用String类型,在Service层用枚举控制。", "所有时间字段使用LocalDateTime。" ], "next_steps": ["设计并实现Client的CRUD API。"] }, { "timestamp": "2024-05-27T14:30:00", "session_id": "session_002", "task": "实现ClientController的CRUD接口", "summary": "完成了Client的增删改查接口。创建了IClientService和ClientServiceImpl。统一了返回格式Result<T>。", "key_decisions": [ "分页查询使用MyBatis-Plus的Page对象,接收current和size参数。", "创建和更新使用同一个ClientDTO接收参数,但更新时需要验证ID存在性。", "全局异常处理器已创建,捕获业务异常(BusinessException)和系统异常。" ], "issues_resolved": ["解决了LocalDateTime序列化到前端为数组的问题,在pom.xml中引入了jackson-datatype-jsr310依赖。"], "next_steps": ["实现Case实体及与Client的关联查询API。"] } ]

4.3 与AI协作的实践流程

现在,假设我们要开始第三次对话,任务是“实现Case实体及与Client的关联查询API”。

第一步:准备本次对话的Prompt你需要手动(或通过一个简单脚本)整合上下文。从dev_log.json中取出最近一条记录的summarynext_steps,从project_context.mdbusiness_requirements.md中提取相关部分。

构造出的Prompt如下:

你是一个专业的Java后端开发助手,正在协助开发【律所案件管理系统】。 ## 项目核心上下文(请始终遵循): - 技术栈:Spring Boot 2.7.18, MyBatis-Plus 3.5.4, MySQL, JDK11。 - 包根路径:`com.lawfirm.casebook`。 - 实体类使用Lombok和MyBatis-Plus注解。 - Controller返回统一的`Result<T>`对象。 - 数据库已有Client实体,字段包括id, name, phone, email等。 ## 当前开发任务: 实现Case实体及与Client的关联查询API。需要创建Case实体类、Mapper、Service、Controller,并实现一个能根据案件ID查询案件详情(包含客户基本信息)的接口。 ## 相关历史上下文(最近一次对话摘要): 【2024-05-27 14:30】已完成Client的CRUD接口。使用了MyBatis-Plus的Page进行分页。创建了全局异常处理器。解决了LocalDateTime序列化问题。 ## 请开始你的工作: 请根据以上信息,首先给出Case实体类的代码,需包含与Client的外键关联(client_id)。然后,请说明如何实现“根据案件ID查询案件详情(包含客户名、电话)”的SQL和Service层设计。请使用MyBatis-Plus的方案。

将这个精心构造的Prompt发送给AI(如DeepSeek-Coder),你将获得高度贴合项目现有上下文的回答。AI会记得技术栈、包结构、返回格式,并基于上次对话的成果进行构建。

第二步:执行AI生成的方案并更新记忆获得AI的代码建议后,你将其实现到项目中。完成后,立即更新dev_log.json,添加一条新记录。

{ "timestamp": "2024-05-27T16:45:00", "session_id": "session_003", "task": "实现Case实体及与Client的关联查询API", "summary": "创建了Case实体、Mapper、IService和ServiceImpl。在Case实体中定义了@TableField(\"client_id\")。创建了CaseController,实现了getCaseWithClientInfo接口。该接口使用MyBatis-Plus的QueryWrapper进行表关联查询,返回一个自定义的CaseVO对象,包含了案件信息和客户姓名、电话。", "key_decisions": [ "使用@TableField注解处理外键字段,而非@TableId。", "关联查询未使用MyBatis-Plus的连表API(beta版不稳定),而是使用了自定义SQL在Mapper.xml中实现,更清晰。", "创建了CaseVO(View Object)用于封装关联查询结果,避免污染实体类。" ], "code_snippets": { "CaseVO": "package com.lawfirm.casebook.vo; import lombok.Data; import java.time.LocalDateTime; @Data public class CaseVO { private Long id; private String caseNumber; private String title; private String status; private LocalDateTime openDate; // Client Info private String clientName; private String clientPhone; }", "Mapper XML片段": "<select id=\"selectCaseWithClientById\" resultType=\"com.lawfirm.casebook.vo.CaseVO\"> SELECT c.*, cli.name as client_name, cli.phone as client_phone FROM t_case c LEFT JOIN t_client cli ON c.client_id = cli.id WHERE c.id = #{caseId} </select>" }, "next_steps": ["实现案件状态变更的业务逻辑,需遵循`business_requirements.md`中定义的状态流转规则。"] }

通过这个流程,每一次与AI的对话都建立在之前所有工作的“记忆”之上,形成了一个良性的、可追溯的协作循环。

5. 进阶:自动化与向量记忆库

上述手动管理记忆的方式对于中小型项目完全可行。但对于更复杂的项目或追求更高自动化,可以考虑以下进阶方案:

5.1 使用向量数据库实现语义记忆检索

当记忆条目非常多时(如数百条对话记录、多个需求文档),手动查找相关记忆变得困难。此时,可以将记忆片段转换为向量存入向量数据库。

简化流程:

  1. 将每条记忆(如dev_log.json的一条记录,或需求文档的一段)通过Embedding模型(如OpenAI的text-embedding-3-small,或开源的BGESentenceTransformer模型)转换为向量。
  2. 存入向量数据库(如ChromaDB,它轻量且易于集成)。
  3. 当新问题到来时,将问题也转换为向量,在向量数据库中执行相似度搜索,找出最相关的K条记忆。
  4. 将这些相关记忆注入Prompt。

示例代码片段(使用ChromaDB和SentenceTransformers):

# 这是一个Python脚本示例,用于展示向量记忆检索的思路 from sentence_transformers import SentenceTransformer import chromadb from chromadb.config import Settings # 初始化嵌入模型和向量数据库客户端 model = SentenceTransformer('all-MiniLM-L6-v2') chroma_client = chromadb.Client(Settings(chroma_db_impl="duckdb+parquet", persist_directory="./chroma_db")) collection = chroma_client.get_or_create_collection(name="dev_memory") # 函数:添加一条记忆到向量库 def add_memory_to_vector_db(text, metadata): embedding = model.encode(text).tolist() collection.add( documents=[text], embeddings=[embedding], metadatas=[metadata], ids=[f"id_{metadata['timestamp']}"] ) # 函数:检索相关记忆 def retrieve_related_memories(query, n_results=3): query_embedding = model.encode(query).tolist() results = collection.query( query_embeddings=[query_embedding], n_results=n_results ) return results['documents'][0] # 返回最相关的n条记忆文本 # 假设我们有一条新记忆 new_memory_text = "实现了案件状态从‘处理中’到‘待结案审核’的变更接口,需要律师权限。" metadata = {"timestamp": "2024-05-28", "type": "dev_log"} add_memory_to_vector_db(new_memory_text, metadata) # 当新问题到来时 user_query = "如何实现案件结案功能?" related_memories = retrieve_related_memories(user_query) print("相关记忆:", related_memories) # 输出可能包含之前关于状态流转、权限控制的记忆,将其注入Prompt。

5.2 集成AI Agent开发框架

LangChain、LlamaIndex等框架内置了强大的记忆管理组件(如ConversationBufferMemory,ConversationSummaryMemory,VectorStoreRetrieverMemory),可以大幅简化上述流程。你可以定义一个“律所开发Agent”,为其配备合适的记忆工具。

# LangChain 示例思路 from langchain.memory import ConversationSummaryBufferMemory, VectorStoreRetrieverMemory from langchain.vectorstores import Chroma from langchain.embeddings import OpenAIEmbeddings from langchain.chat_models import ChatOpenAI from langchain.agents import initialize_agent, Tool from langchain.agents import AgentType # 1. 创建向量记忆检索器 vectorstore = Chroma(...) retriever = vectorstore.as_retriever() vector_memory = VectorStoreRetrieverMemory(retriever=retriever) # 2. 创建对话摘要记忆(管理近期对话) summary_memory = ConversationSummaryBufferMemory(llm=ChatOpenAI(temperature=0), max_token_limit=1000) # 3. 将记忆组合,创建Agent llm = ChatOpenAI(temperature=0, model_name="gpt-4") tools = [...] # 定义你的工具,如代码执行、文件读写等 agent = initialize_agent( tools, llm, agent=AgentType.CONVERSATIONAL_REACT_DESCRIPTION, memory=[vector_memory, summary_memory], # 组合记忆 verbose=True ) # 现在,这个agent在对话中会自动检索相关记忆并维持对话连贯性。

6. 常见问题与排查思路

在实施上下文管理方案时,你可能会遇到以下问题:

问题现象可能原因排查与解决思路
AI仍然给出不符合技术栈的代码。静态记忆文档 (project_context.md) 不够突出或未被正确注入Prompt。1. 检查Prompt模板,确保“核心上下文”部分被正确替换并放置在指令开头。
2. 在核心上下文中使用强调性语言,如“强制使用Spring Boot 2.7.x”、“必须遵循MyBatis-Plus规范”。
跨多天对话后,AI忘记了几天前的关键设计决策。动态记忆 (dev_log.json) 未被有效检索,或者摘要信息丢失了细节。1. 确保每次对话后都更新了日志,且摘要 (summary) 包含了足够的关键信息。
2. 引入向量检索,将更早的、非最近但语义相关的记忆找回来。
3. 对于极其重要的决策,将其写入静态记忆文档。
记忆文件太多,管理混乱。记忆系统缺乏结构化和定期整理。1. 建立清晰的目录结构,区分静态/动态记忆。
2. 定期(如每周)回顾dev_log.json,将已经稳定、通用的决策沉淀到project_context.md中。
3. 考虑使用更专业的工具,如Notion、Obsidian管理静态记忆,并用脚本同步到Prompt。
使用向量检索后,注入的无关记忆太多,干扰AI。检索到的记忆数量 (n_results) 设置过多,或Embedding模型不匹配导致相关性差。1. 减少n_results,例如从5条减到2条。
2. 尝试不同的Embedding模型或对记忆文本进行清洗(去除无关代码、日志)。
3. 在注入记忆时,明确告诉AI“以下是可能相关的历史信息,请谨慎参考”。
AI生成的代码引入了新的依赖,导致项目冲突。记忆系统中未包含完整的pom.xml依赖信息。pom.xml的关键依赖部分作为静态记忆的一部分。或者在Prompt中明确要求:“添加任何新依赖前,请先列出完整依赖坐标,并说明与现有依赖(Spring Boot 2.7.18, MyBatis-Plus 3.5.4...)的兼容性”。

7. 最佳实践与工程建议

  1. 记忆最小化与结构化:不要试图记住一切。只记忆关键的、影响全局的、容易遗忘的信息。使用Markdown、JSON等结构化格式,便于人和机器阅读。
  2. 版本化你的记忆:将docs/目录纳入Git版本控制。这样记忆的演变过程也被记录下来,可以回溯任何时间点的项目上下文。
  3. Prompt工程是核心:记忆系统最终服务于Prompt。精心设计你的Prompt模板,明确指令、角色、上下文、输出格式。将记忆作为上下文的一部分,清晰地进行分隔和标注。
  4. 人始终在循环中(Human-in-the-loop):AI是助手,不是替代者。始终由开发者来审核AI生成的代码、更新记忆文件、做出关键架构决策。记忆系统是辅助你决策的工具,而非自动决策机。
  5. 从简单开始,逐步自动化:不要一开始就追求全自动的向量记忆库。从手动维护project_context.mddev_log.json开始,当感到效率瓶颈时,再引入脚本自动化检索和注入,最后考虑向量数据库。
  6. 为不同的AI模型微调策略:不同的AI模型(如DeepSeek-Coder, GPT-4, Claude)对上下文的理解和记忆能力有差异。对于上下文窗口较小的模型,需要更精炼的记忆摘要;对于代码能力强的模型,可以注入更多代码片段作为示例。
  7. 安全与隐私:记忆文件中可能包含项目代码、设计甚至业务逻辑。务必妥善保管,不要将其上传至不受信任的AI平台或公开仓库。如果使用云服务进行向量化或存储,了解其数据隐私政策。

通过实施这样一套系统的Memory与上下文管理方案,你就能彻底告别AI辅助开发中的“断片”时刻。它将离散的对话串联成连贯的软件开发流水线,让AI成为拥有“长期记忆”和“项目经验”的智能同事,从而在数小时或数天内,高效、一致地协助你完成从设计到实现的整个开发过程,真正兑现“AI赋能开发”的潜力。

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

AI Agent与Codex模型协同:5天完成42页英文综述的自动化科研写作实践

上周&#xff0c;我接到一个任务&#xff1a;把一篇42页的英文综述从零到一&#xff0c;从规划到排版&#xff0c;全部搞定。这听起来像是一个需要数周、甚至数月才能完成的苦差事。但这次&#xff0c;我决定换一种方式——不依赖传统的文献管理、写作、图表绘制、排版工具链&a…

作者头像 李华
网站建设 2026/8/24 1:57:32

基于MiniMax-H3的AI短剧全自动生成工作流实战指南

如果你正在寻找一个能真正“一键生成”本地短剧的AI工具&#xff0c;而不是那些需要你手动拼凑提示词、反复调整参数、最后只得到几张风格不一的静态图的玩具&#xff0c;那么这篇文章就是为你准备的。最近&#xff0c;MiniMax 推出的 H3 模型在开发者社区引起了不小的讨论。很…

作者头像 李华
网站建设 2026/8/24 1:57:18

Spring Boot Jackson配置全解析:从核心配置到高级特性实战

1. 项目概述&#xff1a;为什么我们需要关注Jackson配置&#xff1f;在Spring Boot项目中&#xff0c;处理JSON数据几乎是一项日常任务。无论是构建RESTful API接收前端请求&#xff0c;还是将数据序列化后存入缓存、发送消息&#xff0c;JSON都是那个绕不开的中间格式。而Jack…

作者头像 李华
网站建设 2026/8/24 1:55:31

从零跑通 CLAN 域适应:GTA5 到 Cityscapes 语义分割完整实战指南

从零跑通 CLAN 域适应&#xff1a;GTA5 到 Cityscapes 语义分割完整实战指南 【免费下载链接】CLAN ( TPAMI2022 / CVPR2019 Oral ) Taking A Closer Look at Domain Shift: Category-level Adversaries for Semantics Consistent Domain Adaptation 项目地址: https://gitco…

作者头像 李华
网站建设 2026/8/24 1:54:10

3步接入Builder.io可视化编辑:React页面改文案不再等发版

3步接入Builder.io可视化编辑&#xff1a;React页面改文案不再等发版 【免费下载链接】builder Visual Development for React, Vue, Svelte, Qwik, and more 项目地址: https://gitcode.com/GitHub_Trending/bu/builder 上周二&#xff0c;首页 banner 的文案改了三次才…

作者头像 李华
网站建设 2026/8/24 1:53:39

QQ空间历史说说一键导出:扫码即用的 4 步本地备份方案

QQ空间历史说说一键导出&#xff1a;扫码即用的 4 步本地备份方案 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你翻相册看到 2014 年的一张合影&#xff0c;顺手去 QQ 空间找当年配的…

作者头像 李华