code/05-agents/memory.py
50 行 · 2.2 KBコードと実行結果は実際に動かしたときのまま載せているため、コメントと出力は中国語です。
"""给智能体加上长期记忆:两个工具,remember 把事实存进文件,recall 在需要时把它们找出来。
演示两次完全独立的对话:第一次用户交代了自己的情况,第二次是新对话,看智能体会不会用上。
在 AI-Course/code/05-agents 目录下运行:python memory.py
"""
import json
import time
from pathlib import Path
import agent_loop
from agent_loop import RealModel, run_agent, tool
MEMORY_FILE = Path(__file__).parent / "memory.json"
def load():
return json.loads(MEMORY_FILE.read_text()) if MEMORY_FILE.exists() else []
@tool("把一条关于用户的长期有用的事实存下来,比如用户的环境、偏好、项目情况。"
"只存以后的对话可能用到的事实,不要存一次性的问题。",
fact="一句话描述的事实,例如:用户的项目运行在 Python 3.9 上")
def remember(fact):
facts = load()
facts.append({"fact": fact, "time": time.strftime("%Y-%m-%d %H:%M")})
MEMORY_FILE.write_text(json.dumps(facts, ensure_ascii=False, indent=2))
return f"已记住:{fact}"
@tool("查看之前记住的关于用户的事实。回答涉及用户自己的环境、项目、偏好时,先调用它。")
def recall():
facts = load()
return "\n".join(f"- {f['fact']}({f['time']})" for f in facts) or "还没有记住任何事实"
agent_loop.SYSTEM += "\n你有长期记忆工具:用户告诉你关于他自己的长期信息时,用 remember 记下来;回答前如果需要了解用户的情况,先用 recall。"
if __name__ == "__main__":
MEMORY_FILE.unlink(missing_ok=True)
model = RealModel()
print("===== 第一次对话")
run_agent(model, "先跟你交代一下:我们公司的项目还在用 Python 3.9,所有外网请求都必须走公司代理 "
"http://10.1.2.3:8080。今天先不问问题,你记一下。")
print("\n记忆文件的内容:")
print(MEMORY_FILE.read_text())
print("\n===== 第二次对话(全新的消息列表,模型看不到第一次说过的话)")
run_agent(model, "帮我写一段用 httpx 请求 https://api.github.com 的代码,要能在我们的环境里直接跑。")