首页 > 其他分享 >大模型agent开发之给agent增加记忆的方法

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

时间:2025-01-05 15:55:28浏览次数:1  
标签:prompt 模型 agent 记忆 llm memory print self

增加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)

 

标签:prompt,模型,agent,记忆,llm,memory,print,self
From: https://www.cnblogs.com/Ethereal-hzc/p/18653183

相关文章

  • 自学资料 - Dalle2模型 - 文生图技术
    Dalle2模型-论文中为unCliP目录Dalle2模型-论文中为unCliP1.Dalle2的引言2.GAN模型优缺点优点缺点3.AE和DAE(denoisingAE)原理共同点4.VAE(变分自编码器)优点5.VQVAE(向量自编码器)原理优点6.Dalle模型原理7.Diffusion模型模型更新过程优点缺点:8.Dalle2......
  • 基于SMO+PLL滑膜观测器、MARS模型参考自适应观测器二合一的simulink仿真模型
      一、在永磁同步电机滑模观测器控制中,转子的位置和转速信息与反动电势密切相关。滑模观测器控制基本设计思路是:利用永磁同步电机的电压、电流信息,通过永磁同步电机数学模型,估算出电机在两相静止坐标系中的反电动势信息,估算出转子位置与转速,分别将其反馈给矢量控制的电流环......
  • 基于simulink的HSMO高阶滑膜观测器仿真模型
     一、引言高阶滑模观测器(HSMO)‌是一种基于滑模变结构理论的观测器,主要用于实时估计电机转子的位置和速度。它通过设计合适的滑模面和控制器,能够在电机运动过程中实现快速而准确的转子位置和速度估计‌。工作原理高阶滑模观测器的工作原理基于滑模控制理论,通过设计特定的滑......
  • DeepSurv:Cox比例风险深度神经网络模型(神经网络+疾病预后模型)
    DeepSurv,一个Cox比例风险深度神经网络和先进的生存分析方法,用于模拟患者的预后变量(协变量)与治疗效果之间的相互作用。一、Cox比例风险模型当下,医学研究者使用生存模型来评估预后变量在如死亡或癌症复发等结果中的重要性。一个常用且标准的生存模型是Cox比例风险模型 (CPH......
  • 维度情感模型
    一.维度情感模型人类的情感是复杂繁琐的认知过程,很难对人类情感进行简单的概括,现阶段的情感模型大多分为两种,分别是离散情感模型和维度情感模型。传统上,情感被看作是离散的类别,例如快乐、悲伤、愤怒等。离散情感模型将情感分为独立的类别,著名的心理学家Ekman等人总结了六种基本......
  • 即插即用,无痛增强模型生成美感!字节跳动提出VMix:细粒度美学控制,光影、色彩全搞定
    文章链接:https://arxiv.org/pdf/2412.20800代码地址:https://github.com/fenfenfenfan/VMix项目地址:https://vmix-diffusion.github.io/VMix/亮点直击分析并探索现有模型在光影、色彩等细粒度美学维度上生成图像的差异,提出在文本提示中解耦这些属性,并构建一个细粒度......
  • 模型训练二三事:参数个数、小批量、学习率衰减
    获取torch参数总数在PyTorch中,要获取一个模型的参数总数,可以使用以下命令:total_params=sum(p.numel()forpinmodel.parameters())这里,model 是你的模型实例。model.parameters() 返回模型中所有参数的迭代器,p.numel() 返回单个参数的元素总数。sum 函数用来将这......
  • Python机器学习算法KNN、MLP、NB、LR助力油气钻井大数据提速参数优选及模型构建研究
    全文链接:https://tecdat.cn/?p=38601原文出处:拓端数据部落公众号分析师:HuayanMu随着机器学习和大数据分析技术的发展,帮助客户进行油气行业数字化转型势在必行,钻井提速参数优选呈现由经验驱动、逻辑驱动向数据驱动转变的趋势。机械钻速最大化、机械比能最小化是钻井过程中常考......
  • Python图注意力神经网络GAT与蛋白质相互作用数据模型构建、可视化及熵直方图分析
    全文链接:https://tecdat.cn/?p=38617原文出处:拓端数据部落公众号摘要: 本文聚焦于图注意力网络GAT在蛋白质-蛋白质相互作用数据集中的应用。首先介绍了研究背景与目的,阐述了相关概念如归纳设置与转导设置的差异。接着详细描述了数据加载与可视化的过程,包括代码实现与分析,如数......
  • Zabbix5.0版本(自定义监控+报警+图版模型)
    目录1.自定义监控(1)监控系统登入数量(2)监控TCP22端口是否存活,并做值映射(3)自定义监控服务器内存百分比(4)配置多条件触发2.自定义报警(1)配置邮件发件人,我用的qq邮箱,在设置账户里,开启服务,邮箱同理(2)配置报警媒介类型(3)开启动作(4)配置收件人(5)dd压测是否发送邮箱(6)自定义告警内......