使用LangChain的Memory支持Kimi上下文聊天

发布于:2024-05-23 ⋅ 阅读:(280) ⋅ 点赞:(0)

17bcc78f01685ce095a2965df668a549.png

使用LangChain创建简易聊天机器人 这篇文章中介绍了 LangChain 的简单使用,其中重点介绍了 LangChain 中 Models和Prompts 这 2 个模块的功能。

这篇文章来看下 LangChain 中的 Memory 模块的作用。

39973a4da522100311835a4d90024917.gif

没有 Memory 的日子

Kimi LLM 大模型

上篇文章使用的是本地的大模型 Mistral,这篇文章换一种收费的模型试一下。目前国内最火的大模型当属 Kimi了, 它使用的大模型是 Moonshot。直接去官网注册即送 15 元的免费额度。然后在 API Key 管理界面创建 API Key 即可,如下图:

143eb91ce2e15224057407e31e5935f3.png

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太阳队",结果如下:

a61701573069a48da85b6f7edf59cce7.png

接下来再继续提问 "它的头号球星是谁",结果如下:

052521fcf83a168eecb6bc8f75a48e03.png

正如红框中内容所示,此时 Moonshot 大模型是不知道 "它" 代表的是什么的,也就是说大模型默认是没有上下文功能的。而 LangChain 的 Memory 就可以帮助实现上下文记忆功能。

56d057a37a6d282342a9011726acc318.gif

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 打印出来。结果如下:

cf1e71242947e29ab648a86aad710156.png

可以看到,上下文内容都已经保存在 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')

最终打印结果如下:

8ef49cb94157cb318955de59aa70e7e3.png

可以看到,根据我们之前预设到 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 大模型已经能够理解此时的 "它" 代表的就是上次提问的 "太阳队"。

如果你喜欢本文
长按二维码关注

网站公告

今日签到

点亮在社区的每一天
去签到