跳到主要內容
Open In ColabOpen on GitHub

Xata

Xata 是一個無伺服器數據平台,基於 PostgreSQLElasticsearch。它提供用於與資料庫互動的 Python SDK,以及用於管理資料的 UI。透過 XataChatMessageHistory 類別,您可以將 Xata 資料庫用於聊天工作階段的長期持久性。

本筆記本涵蓋

  • 一個簡單的範例,展示 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 Vector Store 整合和 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。使用您計劃使用的模型所使用的維度。在本筆記本中,我們使用 OpenAI 嵌入,它具有 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"
)

執行上述命令後,如果您前往 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?")

此頁面是否對您有幫助?