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 的代码,要能在我们的环境里直接跑。")