LangChain1.0-Agent记忆管理

发布时间:2026-02-01 19:45:37编辑:123阅读(3)

    Agent记忆管理,通过系统化地存储、组织、提取和应用历史信息,显著提升Agent的决策质量、效率、个性化和长期一致性。

    create_agent记忆管理

    在实际进行Agent开发时,还有一项工作至关重要,那就是需要管理智能体的记忆,不然前面问过的问题后面就会忘记。

    from langgraph.checkpoint.memory import InMemorySaver
    from langchain_ollama import ChatOllama
    from langchain.tools import tool
    from langchain.agents import create_agent
    from datetime import datetime
    import os
    
    
    
    model = ChatOllama(
        model="llama3.1:8b",
        temperature=0.7,
        top_p=0.95,
    )
    
    @tool
    def write_file(content:str):
        """
        将指定内容写入本地文件
        :param content:必要参数,字符串类型,用于表示需要写入文档的具体内容
        :return:写入结果提示信息
        """
        try:
            timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
            filename = f"output_{timestamp}.txt"
            with open(filename, 'w', encoding='utf-8') as f:
                f.write(content)
            abs_path = os.path.abspath(filename)
            return f"已成功写入本地文件:{abs_path}"
        except Exception as e:
            return f"文件写入失败:{e}"
    
    checkpointer = InMemorySaver()
    tools = []
    agent = create_agent(model=model, tools=tools, checkpointer=checkpointer)
    config = {
        "configurable":{
            # 线程id
            "thread_id":"1"
        }
    }
    # 此时记忆就自动保存在当前Agent和线程中
    response = agent.invoke({"messages":[{"role":"user", "content":"你好,我叫张三,好久不见"}]}, config)
    print("模型回复:", response['messages'][-1].content)
    
    # 查看当前Agent的记忆
    response_latest = agent.get_state(config)
    print("Agent记忆:", response_latest)
    
    # 再次对话,直接带入线程ID,即可带入此前对话记忆:
    res = agent.invoke({"messages":[{"role":"user", "content":"你还记得我叫什么名字吗"}]}, config)
    print("Agent记忆-模型回复:", res['messages'][-1].content)
    
    # 可以看到之前所有的历史聊天记录
    res_latest = agent.get_state(config)
    print("Agent记忆:", res_latest)
    
    # 新开一个线程池
    # 因为之前的聊天记录都在线程1里面,新开的线程2里面没有聊天记录,所以模型无法回答
    new_config = {
        "configurable":{
            # 线程id
            "thread_id":"2"
        }
    }
    new_res = agent.invoke({"messages":[{"role":"user", "content":"你还记得我叫什么名字吗"}]}, new_config)
    print("Agent记忆-模型回复:", new_res['messages'][-1].content)

    运行结果:

    模型回复: 你好!张三,很高兴和你见面!长时间不见的确有点让人感到怀念。有哪些新鲜事要分享吗?

    Agent记忆: StateSnapshot(values={'messages': [HumanMessage(content='你好,我叫张三,好久不见', additional_kwargs={}, response_metadata={}, id='0292d384-d3f5-4b88-b5db-d7d76a53f281'), AIMessage(content='你好!张三,很高兴和你见面!长时间不见的确有点让人感到怀念。有哪些新鲜事要分享吗?', additional_kwargs={}, response_metadata={'model': 'llama3.1:8b', 'created_at': '2026-02-01T11:36:13.778902333Z', 'done': True, 'done_reason': 'stop', 'total_duration': 1189919696, 'load_duration': 33047532, 'prompt_eval_count': 21, 'prompt_eval_duration': 8410880, 'eval_count': 38, 'eval_duration': 1147418060, 'logprobs': None, 'model_name': 'llama3.1:8b', 'model_provider': 'ollama'}, id='lc_run--019c18fd-3229-7760-a968-69941eca469e-0', tool_calls=[], invalid_tool_calls=[], usage_metadata={'input_tokens': 21, 'output_tokens': 38, 'total_tokens': 59})]}, next=(), config={'configurable': {'thread_id': '1', 'checkpoint_ns': '', 'checkpoint_id': '1f0ff623-6af1-6550-8001-35749fcf362d'}}, metadata={'source': 'loop', 'step': 1, 'parents': {}}, created_at='2026-02-01T11:36:13.780718+00:00', parent_config={'configurable': {'thread_id': '1', 'checkpoint_ns': '', 'checkpoint_id': '1f0ff623-5f89-6eb3-8000-cac0b9664fa0'}}, tasks=(), interrupts=())

    Agent记忆-模型回复: 当然记得了!你刚才已经告诉我的了,是张三。

    Agent记忆: StateSnapshot(values={'messages': [HumanMessage(content='你好,我叫张三,好久不见', additional_kwargs={}, response_metadata={}, id='0292d384-d3f5-4b88-b5db-d7d76a53f281'), AIMessage(content='你好!张三,很高兴和你见面!长时间不见的确有点让人感到怀念。有哪些新鲜事要分享吗?', additional_kwargs={}, response_metadata={'model': 'llama3.1:8b', 'created_at': '2026-02-01T11:36:13.778902333Z', 'done': True, 'done_reason': 'stop', 'total_duration': 1189919696, 'load_duration': 33047532, 'prompt_eval_count': 21, 'prompt_eval_duration': 8410880, 'eval_count': 38, 'eval_duration': 1147418060, 'logprobs': None, 'model_name': 'llama3.1:8b', 'model_provider': 'ollama'}, id='lc_run--019c18fd-3229-7760-a968-69941eca469e-0', tool_calls=[], invalid_tool_calls=[], usage_metadata={'input_tokens': 21, 'output_tokens': 38, 'total_tokens': 59}), HumanMessage(content='你还记得我叫什么名字吗', additional_kwargs={}, response_metadata={}, id='dd0ddafd-af9b-49cf-9e32-601588cd5c73'), AIMessage(content='当然记得了!你刚才已经告诉我的了,是张三。', additional_kwargs={}, response_metadata={'model': 'llama3.1:8b', 'created_at': '2026-02-01T11:36:14.207911696Z', 'done': True, 'done_reason': 'stop', 'total_duration': 423553171, 'load_duration': 28939883, 'prompt_eval_count': 77, 'prompt_eval_duration': 30481227, 'eval_count': 16, 'eval_duration': 362805261, 'logprobs': None, 'model_name': 'llama3.1:8b', 'model_provider': 'ollama'}, id='lc_run--019c18fd-36d6-7690-9543-dfab872f3793-0', tool_calls=[], invalid_tool_calls=[], usage_metadata={'input_tokens': 77, 'output_tokens': 16, 'total_tokens': 93})]}, next=(), config={'configurable': {'thread_id': '1', 'checkpoint_ns': '', 'checkpoint_id': '1f0ff623-6f05-6acb-8004-13ad254be866'}}, metadata={'source': 'loop', 'step': 4, 'parents': {}}, created_at='2026-02-01T11:36:14.208481+00:00', parent_config={'configurable': {'thread_id': '1', 'checkpoint_ns': '', 'checkpoint_id': '1f0ff623-6af3-6c8d-8003-8cfaf7662f09'}}, tasks=(), interrupts=())

    Agent记忆-模型回复: 对不起,我是第一个和你交谈的,所以我并不记得你的名字。每次新用户都会从头开始。


    上述是一个关于记忆管理最简单的demo版本。

    此外,关于记忆的管理,往往还涉及记忆持久化存储、跨线程记忆管理、总结历史记录、设置用户偏好记忆、记忆修改、语义搜索、数据加密、快照回复、人机交互等功能。

关键字