大模型agent开发之给agent增加记忆的方法

增加memory的方法

给langchain的内置agent增加memory,本方法首先通过 ConversationBufferMemory 实例化并传递到 initialize_agentmemory 参数中,从而实现对话记忆的功能,还使用MessagePlaceHolder,该方法可以将memory的key传递到提示词模版中,提升agent记忆能力。

复制代码
from langchain.utilities import SerpAPIWrapper
from langchain.chains import LLMMathChain
from langchain.agents import initialize_agent, AgentType
import os
from langchain.agents import Tool,load_tools
from langchain.memory import ConversationBufferMemory
from langchain.prompts import  MessagesPlaceholder
# serppai的token
os.environ["SERPAPI_API_KEY"] = "95ac0e518f8e578cc81b149144efd7535d5d7ccab87244e946a1cf3bb14ef3e7"
class AgentsTemplate:

    def __init__(self,**kwargs):
        #构建一个搜索工具
        search = SerpAPIWrapper()
        self.prompt = kwargs.get("base_prompt")
        self.llm = kwargs.get("llm")
        llm_math_chain = load_tools(["serpapi", "llm-math"], llm=self.llm)
        self.tools = [
            Tool(
                name="Search",
                func=search.run,
                description= "useful for when you need to answer questions about current events or the current state of the world"
            ),
            Tool(
                name="Math Chain",
                func=llm_math_chain[1].run,
                description="useful for solving mathematical problems"
            )
        ]
        #load_tools(["serpapi", "llm-math"], llm=self.llm)
        # 记忆组件
        self.memory = ConversationBufferMemory(
            memory_key="chat_history",
            return_messages=True,
        )
        self.agentType = [AgentType.ZERO_SHOT_REACT_DESCRIPTION,
                          AgentType.CHAT_ZERO_SHOT_REACT_DESCRIPTION,
                          AgentType.CONVERSATIONAL_REACT_DESCRIPTION,
                          AgentType.CHAT_CONVERSATIONAL_REACT_DESCRIPTION,
                          AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION]

    #零样本增强式生成ZERO_SHOT_REACT_DESCRIPTION,
    #使用chatModel的零样本增强式生成CHAT_ZERO_SHOT_REACT_DESCRIPTION,
    def zero_agent(self,question,agentType):
        if agentType not in self.agentType:
            raise ValueError("无效的 AgentType,请选择有效的类型!")
        # 动态构建初始化参数
        agent_params = {
            "tools": self.tools,
            "llm": self.llm,
            "agent": agentType,
            "verbose": True,
            "memory": self.memory,
            "agent_kwargs" : {"extra_prompt_messages": [MessagesPlaceholder(variable_name="chat_history"),MessagesPlaceholder(variable_name="agent_scratchpad")],
                           },
            "handle_parsing_errors": True
        }
        #初始化代理
        agent = initialize_agent(**agent_params)
        print("-------------------")
        # 输出提示词模板
        prompt = agent.agent.llm_chain.prompt
        print("Prompt Template:")
        print(prompt)
        # print(agent.agent.prompt.messages)
        # print(agent.agent.prompt.messages[0])
        # print(agent.agent.prompt.messages[1])
        # print(agent.agent.prompt.messages[2])
        try:
            response = agent.run(question)
            print(f"运行的代理类型: {agentType}, 提问内容: {question}")
            print(f"agent回答: {response}")
            #self.memory.save_context(question,response)
        except Exception as e:
            print(f"代理运行时出错: {e}")
    #使用chatModel的零样本增强式生成
复制代码

其他添加memory的方法

LangChain 提供了多种 Memory 类型

1. ConversationBufferWindowMemory: 仅存储最近的 k 条消息,适合避免内存无限增长。

2. ConversationSummaryMemory: 将对话总结成摘要以保留上下文。

3. CombinedMemory: 可以组合多种 Memory 类型。

动态保存和加载 Memory: 该方法可以在对话结束时保存 memory 并在新对话时重新加载:

复制代码
# 保存 memory
with open("memory.json", "w") as file:
    file.write(self.memory.json())

# 加载 memory
from langchain.memory import ConversationBufferMemory
with open("memory.json", "r") as file:
    memory_data = file.read()
self.memory = ConversationBufferMemory.from_json(memory_data)
复制代码

 

posted @   我刀呢?  阅读(40)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示