本文最后更新于 2026-05-23,文章内容可能已经过时。

别再让 Claude 每次都重新认识你:用 Claude API 搭一个可持续更新的长期记忆助手

大多数人做“私人 AI 助手”,第一反应是给模型塞一份固定人设:你是谁、你喜欢什么、你讨厌什么。

这当然有用,但它只解决了第一层问题:让 AI 在这一刻看起来懂你。真正难的不是“记住你一次”,而是在你不断变化的工作、偏好和目标里,持续更新对你的理解

比如你三个月前还在写 PRD,现在开始自己上手 Python;上周你还喜欢长解释,这周你只想直接看结论;昨天你让它帮你分析竞品,今天你又开始用它整理会议纪要。一个真正好用的私人助手,不该只有“记忆”,还要有记忆更新机制、权重排序和过期清理能力

所以这篇文章不再讲“怎么让 Claude 记住你的习惯”这种入门版思路,而是直接往前走一步:用 Claude API 搭一个可以持续维护用户画像、自动更新长期记忆的个人 AI 助手

你会得到的不是一个会背提示词的机器人,而是一套能随着你一起变化的轻量记忆架构。

一、问题不在“有没有记忆”,而在“记忆会不会演化”

一、为什么你的 AI 助手"没有记忆"

很多人以为 AI 健忘是产品设计失误,其实这是底层架构的必然结果。

当前主流 AI 产品——ChatGPT、Claude.ai——的工作方式是对话隔离:每次新建对话,模型都从零开始。它能"记住"的,只有当前这个对话窗口里的内容,也就是所谓的上下文窗口(Context Window)

上下文窗口再大(Claude 支持 200K token),也有两个根本限制:

1. 关窗口就清零:对话结束,记忆消失,下次从头来

2. 无法跨会话积累:你用了半年,它对你的了解还是 0

这和人类记忆的运作方式完全不同。你的同事用了你三个月,会知道你喜欢直接给结论、不喜欢被反问"你想要什么效果"。这种持久记忆,是当前 AI 产品普遍缺失的。

解法不复杂:在 AI 的外面套一层记忆管理系统,每次对话前把"用户档案"注入进去,对话后把新学到的信息写回去。这就是今天要做的事。

二、长期记忆助手该怎么设计:存储、更新、淘汰三件事

先看架构,消除恐惧:

┌─────────────────────────────────────────────────────┐

│ 用户输入 │

└──────────────────────┬──────────────────────────────┘

┌─────────────────────────────────────────────────────┐

│ 读取长期记忆与短期状态(user_profile.json) │

└──────────────────────┬──────────────────────────────┘

┌─────────────────────────────────────────────────────┐

│ 动态拼装 System Prompt(注入用户档案) │

└──────────────────────┬──────────────────────────────┘

┌─────────────────────────────────────────────────────┐

│ Claude API 调用 │

└──────────────────────┬──────────────────────────────┘

┌─────────────────────────────────────────────────────┐

│ 输出给用户 + 提取新增偏好 → 更新长期记忆 │

└─────────────────────────────────────────────────────┘

技术选型原则:零依赖、可本地跑、数据不出本机。
  • 模型层:Claude API(claude-opus-4-6claude-sonnet-4-6
  • 记忆层:本地 JSON 文件(轻量)或 SQLite(稍复杂但更结构化)
  • 胶水层:Python 脚本,约 150 行搞定

没有服务器,没有数据库运维,没有月租费。你的偏好数据完全在自己硬盘上。

三、手把手实现:把“会更新的记忆层”接到 Claude API 上

第一步:调通 Claude API 基础对话

新建 api_call.py

# api_call.py

import anthropic

def chat(system_prompt: str, user_message: str, history: list = None) -> str:

"""

基础对话函数

system_prompt: 系统提示词(包含用户档案)

user_message: 用户当前输入

history: 历史消息列表(本次会话内)

"""

client = anthropic.Anthropic(

api_key="your_api_key_here",

# 国内用户替换为兼容接口:

# base_url="https://api.884819.xyz"

)

messages = history or []

messages.append({"role": "user", "content": user_message})

response = client.messages.create(

model="claude-opus-4-6", # 或 claude-sonnet-4-6(更快更便宜)

max_tokens=2048, # 单次回复最大长度

temperature=0.7, # 创造性程度,0=严谨,1=发散

system=system_prompt, # 关键:系统提示词在这里注入

messages=messages

)

return response.content[0].text

💡 获取 API Key 说明
本文所有代码基于 Claude API 实现。如果你在国内访问 Anthropic 官方有障碍,可以通过 [api.884819.xyz](https://api.884819.xyz) 获取兼容接口——格式与官方完全一致,文中代码无需任何修改,把 base_url 改成上面的地址即可直接跑通。新用户注册即送体验 token,国产模型(Deepseek/千问等)完全免费,无月租按量付费。

第二步:把静态档案升级成“长期记忆 + 短期状态”双层结构

先设计记忆文件格式。新建 user_profile.json

{

"name": "Alex",

"long_term": {

"coding_style": "简洁优先,少注释,多类型声明,使用中文注释",

"language_preference": "回复用中文,代码用英文变量名",

"reply_style": "直接给结论,不要反问,不要废话",

"current_focus": "正在学习 Rust,对所有权机制还不熟悉",

"dislikes": "表情包、过度鼓励、'当然!'开头的回复"

},

"short_term": {

"current_project": "用 Rust 写一个命令行 Todo 工具",

"last_topic": "借用检查器报错处理"

},

"updated_at": "2025-01-15"

}

然后实现记忆读取与 System Prompt 拼装,新建 memory.py

# memory.py

import json

from pathlib import Path

from datetime import date

PROFILE_PATH = Path("user_profile.json")

def load_profile() -> dict:

"""读取用户档案,不存在则返回空档案"""

if not PROFILE_PATH.exists():

return {"long_term": {}, "short_term": {}}

with open(PROFILE_PATH, "r", encoding="utf-8") as f:

return json.load(f)

def build_system_prompt(profile: dict) -> str:

"""

动态拼装 System Prompt

将用户档案注入到系统提示词中

"""

name = profile.get("name", "用户")

long_term = profile.get("long_term", {})

short_term = profile.get("short_term", {})

# 将偏好字典转为可读文本

long_term_text = "\n".join(

f"- {k}: {v}" for k, v in long_term.items()

) if long_term else "(暂无记录)"

short_term_text = "\n".join(

f"- {k}: {v}" for k, v in short_term.items()

) if short_term else "(暂无记录)"

return f"""你是 {name} 的私人 AI 助手,你非常了解他/她的习惯和偏好。

【用户长期偏好】

{long_term_text}

【当前上下文】

{short_term_text}

请严格遵守以上偏好,不要在回复中提及"根据您的偏好"等字样,自然地按照用户习惯回复即可。"""

def save_profile(profile: dict):

"""写回更新后的用户档案"""

profile["updated_at"] = str(date.today())

with open(PROFILE_PATH, "w", encoding="utf-8") as f:

json.dump(profile, f, ensure_ascii=False, indent=2)

第三步:实现对话后的自动习惯提取与写回

这是整个系统最关键的环节——让 Claude 自己来总结"从这段对话中学到了什么"。

memory.py 中增加提取函数:

def extract_habits(conversation: str, current_profile: dict, api_client) -> dict:

"""

用 Claude 从对话中提炼新的用户习惯

conversation: 本次对话的完整文本

"""

meta_prompt = f"""你是一个用户习惯分析助手。请分析以下对话,提取用户展现出的偏好、习惯或当前关注点。

【当前已知档案】

{json.dumps(current_profile, ensure_ascii=False, indent=2)}

【本次对话】

{conversation}

请以 JSON 格式返回需要更新的字段,格式如下:

{{

"long_term": {{"字段名": "新值或更新值"}},

"short_term": {{"字段名": "新值或更新值"}}

}}

规则:

1. 只返回有新信息的字段,不要重复已知内容

2. 如果没有新信息,返回 {{"long_term": {{}}, "short_term": {{}}}}

3. 只返回 JSON,不要其他内容"""

# 注意:这里用简单模式调用,不注入用户档案

response = api_client.messages.create(

model="claude-sonnet-4-6", # 用轻量模型做提取,省 token

max_tokens=512,

temperature=0, # 提取任务要严谨,temperature 设 0

messages=[{"role": "user", "content": meta_prompt}]

)

try:

updates = json.loads(response.content[0].text)

# 合并到现有档案

current_profile["long_term"].update(updates.get("long_term", {}))

current_profile["short_term"].update(updates.get("short_term", {}))

return current_profile

except json.JSONDecodeError:

return current_profile # 解析失败就保持原样

最后是主程序 main.py

# main.py

import anthropic

from memory import load_profile, build_system_prompt, extract_habits, save_profile

def main():

client = anthropic.Anthropic(

api_key="your_api_key_here",

# base_url="https://api.884819.xyz" # 国内用户取消注释

)

profile = load_profile()

history = []

conversation_log = []

print("私人 AI 助手已启动。输入 'quit' 退出,输入 '忘掉[关键词]' 删除特定记忆。\n")

while True:

user_input = input("你:").strip()

if user_input.lower() == "quit":

# 退出时触发习惯提取

if conversation_log:

print("\n正在更新记忆档案...")

full_conversation = "\n".join(conversation_log)

profile = extract_habits(full_conversation, profile, client)

save_profile(profile)

print("记忆已更新。再见!")

break

# 处理"遗忘指令"

if user_input.startswith("忘掉"):

keyword = user_input[2:].strip()

keys_to_remove = [k for k in profile["long_term"] if keyword in k or keyword in str(profile["long_term"][k])]

for k in keys_to_remove:

del profile["long_term"][k]

save_profile(profile)

print(f"已从记忆中删除与"{keyword}"相关的内容。")

continue

system_prompt = build_system_prompt(profile)

response = chat_with_claude(client, system_prompt, user_input, history)

print(f"\nAI:{response}\n")

# 记录对话历史(用于本次会话连贯性)

history.append({"role": "user", "content": user_input})

history.append({"role": "assistant", "content": response})

conversation_log.append(f"用户:{user_input}\nAI:{response}")

def chat_with_claude(client, system_prompt, user_message, history):

messages = list(history) + [{"role": "user", "content": user_message}]

response = client.messages.create(

model="claude-opus-4-6",

max_tokens=2048,

temperature=0.7,

system=system_prompt,

messages=messages

)

return response.content[0].text

if __name__ == "__main__":

main()

三个文件,不到 150 行,一个有记忆的 AI 助手就跑起来了。

四、让记忆"更聪明"的三个进阶技巧

技巧一:记忆分层,防止无限膨胀

随着使用时间增长,user_profile.json 会越来越大,最终拖慢 token 消耗。解法是分层管理

  • 长期偏好long_term):编程风格、语言偏好、性格特征——不常变,永久保留
  • 短期上下文short_term):当前项目、最近话题——每周自动清理一次

save_profile 中加一段清理逻辑,short_term 超过 5 条就删最旧的,保持精简。

技巧二:遗忘指令,给用户掌控权

上面代码里已经实现了基础版:用户说"忘掉我之前说的编程语言偏好",系统自动匹配并删除相关字段。

这个设计很重要——记忆系统必须可控,否则用户会产生"被监控"的不适感。

技巧三:记忆摘要,定期压缩

long_term 字段超过 20 条时,让 Claude 做一次"记忆压缩":把相关条目合并成更简洁的描述。比如把"喜欢简洁回复"、"不喜欢废话"、"讨厌过度解释"合并成"回复风格:极简直接"。

五、部署与日常使用

三种使用形态

命令行版(就是上面的 main.py):程序员首选,直接 python main.py 跑起来。 本地 Web UI 版:装一个 gradio,加十行代码,就能在浏览器里用:
pip install gradio anthropic
import gradio as gr

把 main() 的逻辑包一层 gradio 接口即可

手机快捷指令版:在本地跑一个 Flask 服务,iOS 快捷指令或 Android Tasker 调用本地 IP,实现手机端直接使用——适合非程序员用户。

费用估算

基于 Claude API 实际定价,每天 20 次对话的月均成本大约在 $1-2 以内(使用 claude-sonnet-4-6,每次对话含记忆注入约 1500 token 输入 + 500 token 输出)。

轻度使用成本极低。通过 [api.884819.xyz](https://api.884819.xyz) 接入的读者可以参考其定价页面做实际估算,通常比直接购买官方套餐更灵活,按量付费没有月租压力。

第一周使用 Checklist

把助手"喂熟"的关键,是主动告诉它你的习惯,而不是等它猜:

  • [ ] 第一天:告诉它你的名字、职业、主要使用场景
  • [ ] 第二天:明确说出你不喜欢的回复风格(比如"不要用 emoji")
  • [ ] 第三天:告诉它你当前最重要的项目或学习目标
  • [ ] 第四天:测试它是否记住了——开新会话,问同一个问题
  • [ ] 第五天:用"忘掉"指令清理一条不准确的记录,验证遗忘功能
  • [ ] 第七天:打开 user_profile.json 看看它学到了什么,手动修正错误

尾声:这才是 AI 助手本来应该有的样子

这套系统搭完,你会发现一件事:你开始期待打开它

不是因为它更聪明,而是因为它认识你。它知道你在学 Rust、知道你不喜欢废话、知道你的代码注释要用中文。你不需要每次都重新介绍自己,它就是那个用了三个月、真的了解你工作习惯的助手。

这不是什么遥远的 AGI 愿景,这是今天下午就能搭出来的东西。

下篇预告

这个助手现在只有"文字记忆"。

下一篇,我们给它接上眼睛——让它能读你发的截图、分析你的文档、记住你上传过的资料。Claude 的视觉能力 + 本地知识库,一个真正的"第二大脑"长什么样?

关注本号,下周更新《给私人 AI 助手装上眼睛:文档理解 + 多模态记忆实战》

本文由8848AI原创,转载请注明出处。关注8848AI,带你从零开始学AI。

#AI教程 #Claude #私人AI助手 #Python #持久记忆 #8848AI #AI开发 #ClaudeAPI

四、什么时候该从 JSON 升级到 SQLite 或向量检索?

如果你只是个人使用,几十到几百条偏好记录,JSON 其实够用,优点是透明、可编辑、迁移成本低。

但当你的助手开始处理三类信息时,建议升级:

  • 时间敏感的信息:比如最近项目、当前目标、临时禁忌词,需要有过期机制
  • 多来源记忆:聊天、文档、会议纪要、任务系统同时写入
  • 冲突偏好:用户过去喜欢详细解释,现在更偏向短回复,需要保留时间戳和权重

这时更合理的方案是:短期状态放 SQLite,长期稳定偏好放 JSON,长文本经验再交给向量检索。这样既不重,也不会把一个个人助手做成过度设计的“AI 大平台”。

五、结语

很多人做私人 AI 助手,停在了“给模型加一段人设提示词”这一步。但真正拉开差距的,不是提示词写得多漂亮,而是你有没有把记忆的写入、更新、排序和淘汰这套机制补上。

Claude API 本身已经足够强,缺的往往只是外面那层属于你自己的记忆系统。把这层补起来,AI 才不是一次性的问答工具,而会慢慢变成一个越用越顺手的长期助手。

如果你想直接调用稳定的 Claude / Gemini / GPT 接口来搭自己的私人 AI 助手,可以直接去 api.884819.xyz 试,省掉不少接入和兼容层的时间。