Xata
Xata 是一個無伺服器數據平台,基於
PostgreSQL
和Elasticsearch
。它提供用於與資料庫互動的 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?")