让你的聊天机器人更智能:添加记忆功能的实用指南

161 阅读2分钟

引言

在AI驱动的对话系统中,记忆功能是增强用户体验的重要特性。聊天机器人通过利用对话的上下文来提升智能化处理能力。本文旨在为开发者提供实用的知识和技术,以改进聊天机器人的记忆功能。

主要内容

简单消息传递

最简单的记忆机制是将之前的聊天记录直接传递给模型。虽然这种方法实现简单,但当消息数量增加时,可能导致信息过载的问题。

from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI

prompt = ChatPromptTemplate.from_messages([
    ("system", "You are a helpful assistant."),
    ("placeholder", "{messages}")
])
chat = ChatOpenAI(model="gpt-3.5-turbo-0125")  # 使用API代理服务提高访问稳定性

chain = prompt | chat
messages = [("human", "Translate 'I love programming' to French."), 
            ("ai", "J'adore la programmation."),
            ("human", "What did you just say?")]
ai_response = chain.invoke({"messages": messages})
print(ai_response.content)  # 输出: I said "J'adore la programmation," which means "I love programming" in French.

使用消息存储类

使用LangChain的ChatMessageHistory可以方便地存储和加载聊天记录。它支持与多个提供商的集成。

from langchain_community.chat_message_histories import ChatMessageHistory

demo_history = ChatMessageHistory()
demo_history.add_user_message("Translate 'I love programming' to French.")
demo_history.add_ai_message("J'adore la programmation.")

# 使用API代理服务提高访问稳定性
response = chain.invoke({"messages": demo_history.messages})

自动历史管理

使用LangChain的RunnableWithMessageHistory自动管理消息历史,可以让开发更简洁高效。

from langchain_core.runnables.history import RunnableWithMessageHistory

chain_with_history = RunnableWithMessageHistory(
    chain,
    lambda session_id: demo_history,
    input_messages_key="input",
    history_messages_key="chat_history"
)

chain_with_history.invoke({"input": "What did I just ask you?"}, {"configurable": {"session_id": "unused"}})

修剪消息

为了处理长对话,可以通过修剪旧消息来减少模型的注意力负担。

from operator import itemgetter
from langchain_core.messages import trim_messages

trimmer = trim_messages(strategy="last", max_tokens=2, token_counter=len)

chain_with_trimmer = (
    RunnablePassthrough.assign(chat_history=itemgetter("chat_history") | trimmer)
    | prompt
    | chat
)

chain_with_trimmer.invoke({"input": "Where does P. Sherman live?"}, {"configurable": {"session_id": "unused"}})

概述记忆

通过对话概述来保持信息的简洁是另一种有效策略。

def summarize_messages(chain_input):
    stored_messages = demo_history.messages
    if len(stored_messages) == 0:
        return False
    summarization_prompt = ChatPromptTemplate.from_messages([
        ("placeholder", "{chat_history}"),
        ("user", "Distill the above chat messages into a single summary message.")
    ])
    summarization_chain = summarization_prompt | chat
    summary_message = summarization_chain.invoke({"chat_history": stored_messages})
    demo_history.clear()
    demo_history.add_message(summary_message)
    return True

chain_with_summarization = (
    RunnablePassthrough.assign(messages_summarized=summarize_messages)
    | chain_with_history
)

chain_with_summarization.invoke({"input": "What did I say my name was?"}, {"configurable": {"session_id": "unused"}})

常见问题和解决方案

  1. 上下文窗口限制:LLMs和聊天模型具有上下文窗口限制。通过修剪消息或生成对话概要可以有效应对。

  2. 多用户会话管理:可通过RunnableWithMessageHistory中的session_id来处理多用户会话。

总结和进一步学习资源

通过本文,我们探讨了如何为聊天机器人添加记忆功能的多种方法。为了更进一步学习推荐访问LangChain的文档,以及OpenAI的API指南

参考资料

  1. LangChain Documentation
  2. OpenAI API Reference

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!