ConversationChain 是一种带记忆功能的链,它可以记住用户与AI之前的所有的对话内容,把它们作为上下文传递给下一次对话,这样 AI 可以根据这个上下文更好的与用户进行对话。
在这个 Node.js 程序文件顶部,导入 ConversationChain,它来自 langchain/chains。然后在这个 model 的下面,再创建一个 chain,声明一个 chain,它的值可以新建一个 ConversationChain,提供一个对象参数,需要设置一下 llm,也就是语言模型,这里就是上面创建的这个 model,它是一个 OpenAI 语言模型。
然后声明一个 response1,等于 await,用一下这个 chain 上面的 call 这个方法,提供一个对象参数,里面需要一个 input 属性,它的值是一段文本 “我叫王皓,在 ninghao.net 工作”。下面可以在控制台上输出 response1。
再声明一个 response2,等于 await,用一下 chain 上面的 call 这个方法,提供一个对象参数,设置一下 input 属性,比如 “我是谁”。在控制台上再输出这个 response2。
创建这个 OpenAI 的时候,可以把它的 temperature 设置成 0 。
在终端,执行 node index.mjs,运行一下应用。这里会输出两个调用对话链得到的响应。这个响应数据是一个对象,里面会有一个 response 属性,属性的值就是语言模型的回应。
第一次调用链的时候,我告诉了它我的名字,还有工作的地方,第二次再次调用链,当我问它我是谁的时候,模型可以根据我们之前的对话判断出我是谁。
prompt 与 memory
回到项目,这里我们在控制台上再输出这个 chain 上面的 prompt ,这个属性的值就是这个 ConversationChain 默认会使用一个提示模板,再输出一下 chain 上面的 memory,它是这个 Chain 使用的记忆。
在终端,再运行一下应用,你会发现对话链上的 prompt 就是一个提示模板,在创建这个链的时候我们可以自己定义这个提示模板,如果不特别定义的话,就会使用这个默认的模板。
这个提示模板里说下面是人类与人工智能之间的友好对话,并且告诉 AI,如果不知道问题的答案不要胡诌。这个模板里有两个参数,history 是对话的历史记录,input 这个参数的值就是人类要跟 AI 说的话。这个对话链默认使用的记忆是这个 BufferMemory。
ChatMessageHistory
我们也可以自己创建一个 BufferMemory,导入一些历史聊天信息,再把这个 memory 交给对话链使用。
在这个程序文件的顶部,导入一个 BufferMemory,还有一个 ChatMessageHistory,它来自 langchain/memory。然后再导入 HumanChatMessage,还有 AIChatMessage,它们来自 langchain/schema。
声明一个 chatHistory,表示聊天历史,它的值可以新建一个 ChatMessageHistory,它是一个数组,里面是一组信息,可以新建一个 HumanChatMessage,设置一条信息 “我叫王皓,在 ninghao.net 工作”,在这个数组里再新建一个 AIChatMessage,提供一个文本参数,“你好王皓,ninghao.net 是个非常好的技术网站。”
下面声明一个 memory,它的值可以新建一个 BufferMemory ,提供一个对象,里面添加一个 chatHistory,对应的值就是上面准备好的这个 chatHistory。
在新建这个 ConversationChain 的时候,设置一下 memory 属性,它的值就是上面定义的这个 memory 。
然后再用一下这个对话链,比如问它 “我是谁”。 在终端,运行一下应用,模型可以根据聊天历史判断出我是谁。