赞
踩
在 使用LangChain创建简易聊天机器人 这篇文章中介绍了 LangChain 的简单使用,其中重点介绍了 LangChain 中 Models和Prompts 这 2 个模块的功能。
这篇文章来看下 LangChain 中的 Memory 模块的作用。
没有 Memory 的日子
Kimi LLM 大模型
上篇文章使用的是本地的大模型 Mistral,这篇文章换一种收费的模型试一下。目前国内最火的大模型当属 Kimi了, 它使用的大模型是 Moonshot
。直接去官网注册即送 15 元的免费额度。然后在 API Key 管理界面创建 API Key 即可,如下图:
LangChain 集成 Moonshot
LangChain 集成 Moonshot 很方便,直接使用 Moonshot() 方法就能创建模型实例。如下:
- # 创建 Moonshot 模型实例
- llm = Moonshot()
创建好模型实例之后,就可以直接调用 invoke 方法,并打印结果。如下:
- answer = llm.invoke("用户输入的问题")
- print(answer, '\n')
简单修改一下,持续接收用户输入,并打印结果。代码如下 :
- # langchain-memory.py
- from langchain_community.llms.moonshot import Moonshot
-
- # Generate your api key from: https://platform.moonshot.cn/console/api-keys
- os.environ["MOONSHOT_API_KEY"] = "这里输入你的Moonshot API Key"
-
- # 创建 Moonshot 模型实例
- llm = Moonshot()
-
- while True:
- # 由用户输入 question
- question = input("> ")
- answer = llm.invoke(question)
- print(answer, '\n')
执行上述代码,并询问 "介绍下NBA太阳队"
,结果如下:
接下来再继续提问 "它的头号球星是谁",结果如下:
正如红框中内容所示,此时 Moonshot 大模型是不知道 "它" 代表的是什么的,也就是说大模型默认是没有上下文功能的。而 LangChain 的 Memory 就可以帮助实现上下文记忆功能。
Memory 实现上下文记忆
要在 LangChain 中实现 Memory 记忆功能,主要使用ConversationBufferMemory和ConversationChain。
ConversationBufferMemory
ConversationBufferMemory 用来保存连续对话中的上下文内容,具体使用如下:
- from langchain.chains import ConversationChain
- from langchain.memory import ConversationBufferMemory
-
- # 创建一个Memory对象
- memory = ConversationBufferMemory()
- memory.save_context({"input":"HI"}, {"output":"what's up"})
- memory.save_context({"input":"My name is Danny"}, {"output":"Nice to meet you Danny."})
- print(memory.buffer)
上述代码中,创建 ConversationBufferMemory 后,并通过 save_context
方法预先设置了上下文信息。可以通过 memory.buffer
将当前 ConversationBufferMemory 中的 buffer 打印出来。结果如下:
可以看到,上下文内容都已经保存在 memory.buffer中。有了 memory 之后就可以创建 ConversationChain了。如下:
- from langchain.chains import ConversationChain
-
- # 创建 ConversationChain,并指定 memory
- conversation = ConversationChain(
- llm=kimi_llm,
- memory=memory,
- verbose=False
- )
ConversationChain
创建好 ConversationChain 之后,可以调用 predict 方法查询当前对话结果。根据之前调用 save_context 的内容,我们可以尝试查询 "what is my name ?" 并打印结果:
- answer = conversation.predict(input="what is my name?")
- print(answer, '\n')
最终打印结果如下:
可以看到,根据我们之前预设到 memory 中的内容,大模型 kimi_llm 已经可以给出正确的答案。
Kimi 添加 Memory 记忆
最后完善上文Kimi大模型的连续对话功能,完整代码如下:
- # langchain-moonshot-chat.py
- from langchain_community.llms.moonshot import Moonshot
- from langchain.chains import ConversationChain
- from langchain.memory import ConversationBufferMemory
- import os
-
- # Generate your api key from: https://platform.moonshot.cn/console/api-keys
- os.environ["MOONSHOT_API_KEY"] = "这里输入你的Moonshot API Key"
-
- # 创建 Moonshot 模型实例
- kimi_llm = Moonshot()
-
- # 创建一个Memory对象
- memory = ConversationBufferMemory()
- memory.save_context({"input":"HI"}, {"output":"what's up"})
- memory.save_context({"input":"My name is Danny"}, {"output":"Nice to meet you Danny."})
- print(memory.buffer)
-
- conversation = ConversationChain(
- llm=kimi_llm,
- memory=memory,
- verbose=False
- )
-
- answer = conversation.predict(input="what is my name?")
- print(answer, '\n')
-
- while True:
- # 由用户输入 question
- question = input("> ")
- answer = conversation.invoke(question)
- print(answer, '\n')
- 最终运行结果如下:可以看出,这时候 kimi 大模型已经能够理解此时的 "它" 代表的就是上次提问的 "太阳队"。
-
- 如果你喜欢本文
- 长按二维码关注
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。