当前位置:   article > 正文

AI探索实践14 - Typescript开发AI应用6:将对话历史记录添加到上下文_messagesplaceholder

messagesplaceholder

大家好,我是feng,欢迎关注公众号和我一起探索。如果文章对你有所启发,请为我点赞、转发!

图片

一、重点回顾

上文《AI探索实践13 - Typescript开发AI应用5:抓取网页、文档分割、向量存储与检索链语义检索的使用 【推荐】》我们对抓取网页、文档加载、分割文档、嵌入、从向量数据库检索等关键的概念进行了一一了解。

在用户和大模型的对话过程中,为了更好的帮助大模型提供准确的回答,除了加载第三方文档数据之外,还有一个重要的内容:用户和大模型的对话历史记录。因为有些问题必须结合之前的问答记录结合RAG,才能得到更准确的回答。

本文介绍如何将对话的历史记录,加入到整个链中,以更好地辅助大模型应答。

二、消息对象类型

在LangChain中,有专门的类代表消息对象。在@langchain/core/messages中,有3个主要的消息类型:

  1. AIMessage: 代表大模型消息

  2. HumanMessage:代表用户的消息

  3. SystemMessage:代表系统消息

有了这3种类型的消息,就能够让我们灵活定义链中的逻辑。

三、自定义历史记录

注:本文代码基于上一篇代码基础上进行编写。

3.1 创建对话历史记录数组

  1. const chatHistory = [
  2. new HumanMessage('你好,我是张山'),
  3. new AIMessage('你好,张山。有什么可以帮到你?'),
  4. new HumanMessage('What is LCEL ?'),
  5. new AIMessage('LCEL stands fro Langchain Expression Language'),
  6. new HumanMessage('What does LCEL stand for?'),
  7. new AIMessage('Langchain Expression Language'),
  8. ];

我们可以轻松构建一个消息对象,只需要将内容作为构造参数即可。上面的代码,构建了一个包含6条件消息记录的数组。

3.2 调整提示语模板

在提示语模板中,增加历史记录变量:

  1. const prompt = ChatPromptTemplate.fromTemplate(`
  2. 回答用户的问题。
  3. Context:{context}
  4. 历史记录: {chat_history}
  5. 问题:{input}。
  6. `);

虽然在模板中,我们定义了一个 chat_history 的变量,但是我们在调用链时,并不能直接将上面定义的消息数组: chatHistory 传入链中。这是因为 chatHistory 是一个数组,而提示语模板中 chat_history 变量,需要的是一个字符串类型。我们需要进行一个转换的处理。LangChain中,@langchain/core/prompts中的MessagesPlaceholder类负载处理这种逻辑。

要使用额外的逻辑处理,那么原有基于字符串类型的模板就不适用了,需要修改提示语模板为消息模板:

  1. // MessagesPlaceholder 的作用就是接收一个消息对象数组,并将它转化为字符串
  2. const prompt = ChatPromptTemplate.fromMessages([
  3. ['system', '根据接下来的上下文: {context} 回答用户提出的问题。'],
  4. new MessagesPlaceholder('chat_history'),
  5. ['user', '{input}'],
  6. ]);

 

四、将历史记录传入链

  1. const response = await chain.invoke({
  2. //input: 'what is it?',
  3. input: '我的名字叫什么?',
  4. chat_history: chatHistory,
  5. //input: '密码是多少',
  6. //context: docs,
  7. });
  8. console.log(response);


最后,我们传入变量,并将写好的历史记录数组传入链中即可。

运行链,观察输出结果:

图片

图片

可以看到,对话历史记录数组连同抓取的网页内容,一起打印出来。在调用链时,我们提出的问题是:我的名字叫什么?这个问题和抓取网页的内容完全不相干,但是由于有对话的历史记录的存在,大模型得以准确地回答。

五、总结

在实际的应用开发中,我们往往会将历史记录存入数据库中。当用户开启历史会话时,从数据库中读取历史记录后,显示在页面上。每当用户提出对话时,将历史记录数组转为模板中的变量作为上下文,一起提交给大模型。

由于大模型每次对话对于token长度的处理能力有所限制,我们应该在页面上引导用户在不同的问题,使用新的会话。这样不至于由于历史记录过长,超出token长度限制,或上下文内容重复导致大模型错误或者幻觉类的回答。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小惠珠哦/article/detail/991482
推荐阅读
相关标签
  

闽ICP备14008679号