Skip to main content
Open In ColabOpen on GitHub

Xata

Xata is a serverless data platform, based on PostgreSQL and Elasticsearch. It provides a Python SDK for interacting with your database, and a UI for managing your data. With the XataChatMessageHistory class, you can use Xata databases for longer-term persistence of chat sessions.

本笔记本涵盖:

  • 一个简单的示例,展示 XataChatMessageHistory 的作用。
  • 一个更复杂的例子,使用 REACT 代理,根据基于知识库或文档(存储在 Xata 中作为向量存储)回答问题,并且还具有长期可搜索的过去消息历史记录(存储在 Xata 中作为记忆存储)。

设置

创建一个数据库

Xata UI 中创建一个新的数据库。你可以随意命名,在这个记事本中我们将使用 langchain。Langchain 集成可以自动创建用于存储记忆的表,并且我们将在本示例中使用它。如果你想预先创建该表,请确保其具有正确的模式,并在创建类时将 create_table 设置为 False。预先创建表可以在每次会话初始化时节省一次与数据库的往返操作。

首先让我们安装依赖项:

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

接下来,我们需要获取Xata的环境变量。您可以通过访问您的账户设置来创建一个新的API密钥。要找到数据库URL,请前往您已创建的数据库的设置页面。数据库URL应该看起来像这样:https://demo-uni3q8.eu-west-1.xata.sh/db/langchain

import getpass

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

创建一个简单的内存存储

为了单独测试内存存储功能,让我们使用以下代码片段:

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?")

上面的代码创建了一个ID为session-1的会话,并在其中存储了两条消息。运行上述代码后,如果您访问Xata UI,您应该看到一个名为memory的表格,并且这两条消息已添加到其中。

你可以使用以下代码检索特定会话的消息历史记录:

history.messages

基于数据的记忆型对话问答链

现在让我们看一个更复杂的例子,我们将OpenAI、Xata向量存储集成以及Xata内存存储集成结合起来,在你的数据上创建一个问答聊天机器人,并支持后续问题和历史记录。

我们将需要访问 OpenAI API,因此请配置 API 密钥:

import os

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

为了存储聊天机器人将搜索答案的文档,请使用 Xata UI 将一个名为 docs 的表添加到您的 langchain 数据库中,并添加以下列:

  • content 的类型为“文本”。这用于存储 Document.pageContent 的值。
  • embedding 的类型为“Vector”。请使用您计划使用的模型的维度。在本笔记本中,我们使用具有 1536 个维度的 OpenAI 嵌入。

让我们创建向量存储并添加一些示例文档到其中:

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"
)

在运行上述命令后,如果前往 Xata UI,你应该能在 docs 表中看到已加载的文档及其嵌入。

现在我们创建一个 ConversationBufferMemory 来存储用户和 AI 的聊天消息。

from uuid import uuid4

from langchain.memory import ConversationBufferMemory

chat_memory = XataChatMessageHistory(
session_id=str(uuid4()), # needs to be unique per user session
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")

现在,让我们向代理询问一些关于 Xata 的问题:

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?")