[从零开始构建一个记忆功能的AI聊天机器人]

122 阅读3分钟
# 从零开始构建一个记忆功能的AI聊天机器人

## 引言
在当前的数字化时代,聊天机器人已成为提升用户体验和自动化对话的重要工具。本文将介绍如何设计和实现一个基于大型语言模型(LLM)的聊天机器人,该机器人不仅能进行对话,还能记住之前的交互。

## 主要内容

### 熟悉聊天模型和聊天历史
构建一个有效的聊天机器人首先需要了解聊天模型、提示模板以及如何管理聊天历史。这些概念帮助我们处理和存储对话信息,使机器人具备上下文记忆能力。

### 设置开发环境
我们推荐使用Jupyter Notebook,因为它提供了一个交互式环境,便于我们在实践中学习和测试。若您尚未安装,可参考[安装指南](https://jupyter.org/install)进行安装。

### 安装LangChain
LangChain是一款方便处理LLM应用的库,可通过以下方式安装:

使用Pip:
```shell
pip install langchain

使用Conda:

conda install langchain -c conda-forge

配置LangSmith进行链调用追踪

为了追踪和调试复杂的LLM调用链,我们建议使用LangSmith。请确保设置环境变量以启用追踪:

import getpass
import os

os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_API_KEY"] = getpass.getpass()

使用语言模型

LangChain支持多种语言模型,以下为OpenAI模型的设置示例:

import getpass
import os

os.environ["OPENAI_API_KEY"] = getpass.getpass()

from langchain_openai import ChatOpenAI

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

实现聊天机器人

我们使用LangChain的RunnableWithMessageHistory来处理聊天历史,使机器人记住之前的对话。

from langchain_core.chat_history import (
    BaseChatMessageHistory,
    InMemoryChatMessageHistory,
)
from langchain_core.runnables.history import RunnableWithMessageHistory

store = {}

def get_session_history(session_id: str) -> BaseChatMessageHistory:
    if session_id not in store:
        store[session_id] = InMemoryChatMessageHistory()
    return store[session_id]

with_message_history = RunnableWithMessageHistory(model, get_session_history)

config = {"configurable": {"session_id": "user123"}}

response = with_message_history.invoke(
    [HumanMessage(content="Hi! I'm Alice")],
    config=config,
)

print(response.content)

用户可以通过更改session_id来区分不同的会话。

添加提示模板

使用提示模板可以优化与LLM的交互。例如,通过添加系统消息来传递指令。

from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder

prompt = ChatPromptTemplate.from_messages(
    [
        ("system", "You are a helpful assistant."),
        MessagesPlaceholder(variable_name="messages"),
    ]
)

chain = prompt | model

管理对话历史

管理对话历史至关重要,以防止消息超出LLM的上下文窗口。LangChain提供了trim_messages帮助函数来简化此过程。

代码示例

一个完整的实现包括初始化模型、设置聊天历史、添加提示模板以及管理历史的逻辑。

# 使用API代理服务提高访问稳定性
from langchain_core.messages import HumanMessage, AIMessage
from langchain_core.runnables import RunnablePassthrough

chain = (
    RunnablePassthrough.assign(messages=itemgetter("messages") | trim_messages) 
    | prompt 
    | model
)

config = {"configurable": {"session_id": "abc20"}}

response = chain.invoke(
    {"messages": [HumanMessage(content="Hello, I'm Todd.")], "language": "English"},
    config=config,
)

print(response.content)

常见问题和解决方案

  • 聊天内容不被记住: 确保会话ID一致,并正确保存和加载历史。
  • 响应缓慢: 使用流式传输功能以提升用户体验。

总结和进一步学习资源

这篇文章介绍了如何构建一个基础的聊天机器人,您可以进一步学习以下高级主题:

参考资料

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

---END---