云计算百科
云计算领域专业知识百科平台

记录下学习agent应用开发的第15天(实现Langchain下的memory)

         (各位访问大哥能否留一些宝贵建议给小弟,没人的话就当个人日常blog )之前我开发的rag智能体记忆逻辑是把每次问答内容以json文件格式保存,模型回答问题前都要读取这个文件去获取历史会话记录,以此实现记忆功能。今天我的任务是在Langchain框架下实现这个过程,通过使用封装好的组件减少代码量。

        首先引入几个新组件:MessagesPlaceholder(用于在聊天提示模板中动态插入消息内容,专门为消息列表设计)、HumanMessage(表示"用户说的话"的消息对象)、AIMessage(表示"AI 说的话"的消息对象)。

from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.messages import HumanMessage, AIMessage

        接下来定义prompt模板,和之前一样通过ChatPromptTemplate组件实现。这里把历史会话记录内容和用户文本设为动态插入,system prompt说明设定与规则并静态保留。

template = ChatPromptTemplate.from_messages([
("system", "你是求职助手。回答简洁,不超过两句话。"),
MessagesPlaceholder(variable_name="history"),
("user", "{input}"),
])

        因为本demo只是为了实现Langchain框架下的记忆功能,没有添加额外的功能模块,所以只有template和llm间的chain连接。

chain = template | llm

        创建一个空列表来存历史会话记录,因为创建一个json文件去存储在之前已经实现过了,这里就使用临时内存来存,主要查看结果,不追求长期使用。

history = []

        测试数据问题集,模拟用户连续向ai提问。每个问题都是独立的,只有当ai回答完上一个问题才继续提问,为的是验证ai是否记住前面的聊天内容。

questions = [
"我想找一份 Python 后端的工作。",
"基于我的目标,推荐我学什么技术?",
"这些技术里,哪个最重要?",
]

        将历史记录和当前用户文本拼入prompt模板再发给llm,同时将本次的用户文本和ai回答加到历史会话列表中。

for q in questions:
result = chain.invoke({"history": history, "input": q})
history.append(HumanMessage(content=q))
history.append(AIMessage(content=result.content))

        打印每轮的会话内容和记忆条数,通过两个方面判断memory模块是否正常。

print(f"用户:{q}")
print(f"助手:{result.content}\\n")
print(f" 目前历史记录条数:{len(history)}")

        测试结果如下,可以看到ai确实记住了历史会话内容。

        总结:今天完成了在Langchain框架下实现基础memory模块的任务,同时也更加熟练使用Langchain组件,减少了手搓代码的工作量。我尝试过使用RunnableWithMessageHistory组件(一个包装器,可以让链自动处理历史消息的填充和存储过程)和ChatMessageHistory组件(默认的内存中实现,适合临时对话)去创建历史会话列表,就可以省去手动保存记录(history.append)这段代码,但是测试结果没有实现记忆功能,经查询我了解到,这两个组件已被 LangChain 官方标记为废弃,替代组件在LangGraph中,所以只能手动建表去临时保存。

        第15天就到这吧。

赞(0)
未经允许不得转载:网硕互联帮助中心 » 记录下学习agent应用开发的第15天(实现Langchain下的memory)
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!