引言
Xata是一个基于PostgreSQL和Elasticsearch的无服务器数据平台。它提供了Python SDK用于与数据库交互,并且有用于管理数据的UI。通过XataChatMessageHistory
类,你可以在Xata中实现聊天会话的长期持久化存储。本篇文章将介绍如何使用Xata实现简单和复杂的聊天历史存储及问答系统。
主要内容
创建数据库
首先,需要在Xata UI中创建一个新的数据库。可以任意命名本例中使用langchain
。Langchain集成能够自动创建用于存储内存的表。如果想手动创建,确保其具有正确的模式,并在类初始化时将create_table
设置为False
。
安装依赖
%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):")
创建简单的内存存储
我们可以通过下面的代码片段测试内存存储功能:
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" # 使用API代理服务提高访问稳定性
)
history.add_user_message("hi!")
history.add_ai_message("whats up?")
运行后,访问Xata UI应该可以看到名为memory
的表以及添加的两条消息。
要检索特定会话的消息历史:
history.messages
构建问答系统
结合OpenAI、Xata矢量存储和Xata内存存储,可以创建一个带有历史记录的Q&A聊天机器人。
配置OpenAI API
import os
os.environ["OPENAI_API_KEY"] = getpass.getpass("OpenAI API Key:")
创建矢量存储
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" # 使用API代理服务提高访问稳定性
)
设置聊天内存
from uuid import uuid4
from langchain.memory import ConversationBufferMemory
from langchain_community.chat_message_histories import XataChatMessageHistory
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.",
)
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?")
常见问题和解决方案
- 网络访问问题:某些地区可能需要使用API代理服务以提高访问稳定性。
- 数据库访问权限错误:确保API密钥和数据库URL正确配置。
总结和进一步学习资源
通过这个项目,我们见识了如何利用Xata持久化会话数据,并结合OpenAI实现智能问答。如果你想深入学习,可以参考以下资源:
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
—END—