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

news/2025/1/7 11:04:49/文章来源:https://www.cnblogs.com/Ethereal-hzc/p/18653183

增加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.promptprint("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)

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/864440.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Verilog6_串行通信协议

Verilog内容总结6_串行通信协议一、通信协议概述 1.串行通信与并行通信串行通信(serial communication):数据通过单根数据线一位一位地传输;成本低但速度慢;适用于远距离传输,用于计算机与外设之间,如UART、\(I^2C\)、SPI并行通信(parallel communication):通过多根数…

二进制码与格雷码之间的转换

二进制码到格雷码的转换 (1)格雷码的最高位(最左边)与二进制码的最高位相同。 (2)从左到右,逐一将二进制码相邻的两位相加(舍去进位),作为格雷码的下一位。格雷码到二进制码的转换 (1)二进制码的最高位(最左边)与格雷码的最高位相同。 (2)将产生的每一位二进制…

20241407《计算机基础与程序设计》课程总结

每周作业链接汇总 第0周作业: 自我介绍第一周作业: 1.基于VirtualBox虚拟机安装Ubuntu和安装Linux系统 2.快速浏览一遍教材计算机科学概论(第七版),课本每章提出至少一个自己不懂的或最想解决的问题第二周作业: 数字化 信息安全 *自学教材:计算机科学概论(第七版)第1章…

运算放大器在运算方面的应用

集成运算放大器与外部电阻、电容、半导体器件等构成闭环电路后,能对各种模拟信号进行比例、加法、减法、微分、积分、对数、反对数、乘法和除法等运算。运算放太器工作在线性区时,通常要引入深度负反馈。所以,它的输出电压和输入电压的关系基本决定于反馈电路和输入电路的结…

SpringBoot原理分析-1

SpringBoot原理分析 作为一个javaer,和boot打交道是很常见的吧。熟悉boot的人都会知道,启动一个springboot应用,就是用鼠标点一下启动main方法,然后等着就行了。我们来看看这个main里面。 @SpringBootApplication public class ExampleApplication {public static void mai…

CF补题 950-Div.3

CF补题 950-Div.3-20250102 Dashboard - Codeforces Round 950 (Div. 3) - Codeforces A: 题目大意:给出一个字符串,要求重复的字母必须 \(\ge m\) ,求缺失字母总个数 #include <iostream> #include <map> using namespace std;map<char, int> mp;int ma…

第十五周学习总结

学期2024-2025-1 学号20241414 《计算机基础与程序设计》第十五周学习总结 作业信息这个作业属于哪个课程 2024-2025-1-计算机基础与程序设计这个作业要求在哪里 2024-2025-1计算机基础与程序设计第一周作业这个作业的目标 课程总结作业正文 本博客链接每周作业链接汇总整体评价…

【ADB基础】ADB及Monkey测试

什么是monkey Monkey 是Android SDK提供的一个命令行工具,可以简单方便的发送伪随机的用户事件流,对Android APP做压力(稳定性)测试。主要是为了测试app是否存在无响应和崩溃的情况。 monkey命令说明monkey 测试命令使用及详细说明 常用命令 语法:adb shell monkey -p 包名…

20241314 《计算机基础与程序设计》课程总结

20241314 《计算机基础与程序设计》课程总结每周作业链接汇总第一周课程概论 工业革命与浪潮之巅 信息与信息安全 计算机系统概论 计算机安全 计算的限制思维作业第二周课程概论 数字化与信息安全第三周课程概论 数字逻辑门 数据类型 冯诺依曼体系第四周课程概论 计算机系统 计…

同硕计算机专业:统考+课程+源码学习资料全部免费送!

考研之路,道阻且长。对于计算机专业的学子来说,备考之路更是充满挑战。为了帮助广大考生高效备战,我在此精心整理了一套同硕计算机专业统考历年真题和复习重点、专业课程学习和相关源码资料,并免费分享给大家!我的全部学习资料都放在那里,后续我还会增加资料分享放在那里…

20241316 《计算机基础与程序设计》课程总结

20241316 《计算机基础与程序设计》课程总结第一周作业:浏览教材并提出问题第二周作业: 自学教材计算机科学概论(第七版)第1章并完成云班课测试 《C语言程序设计》第1章并完成云班课测试第三周作业:计算机科学概论(第七版)第2章,第3章 并完成云班课测试第四周作业:学习…

Windows环境下反弹shell各类姿势

在渗透测试过程中我们有时候需要通过Windows平台来反弹shell到我们的VPS主机以及CS端,那么这个过程中我们就需要借助Windows平台内置的可执行程序来执行命令,其中首选的就是powershell,本篇文章我们主要介绍如何通过Windows平台中如何通过powershell来反弹shell操作。 power…