探索Xata: 利用Langchain打造智能对话机器人

60 阅读3分钟

引言

在如今以数据为驱动力的时代,如何有效地管理和操作数据成为开发者关注的焦点。Xata是一个基于PostgreSQL和Elasticsearch的无服务器数据平台,提供了强大的Python SDK和直观的UI,帮助开发者轻松管理数据。本文的目的是介绍如何利用Xata的特性,结合Langchain、OpenAI等工具,创建一个具备长期会话记忆和文档检索功能的对话机器人。

主要内容

XataChatMessageHistory简单示例

XataChatMessageHistory类允许我们将聊天记录持久化在Xata数据库中。以下是一个简单的示例,演示如何使用该类存储聊天记录。

创建数据库

首先,您需要在Xata UI中创建一个新数据库。在本示例中,数据库命名为langchain。确保数据库中有一个名为memory的表来存储会话历史。

安装依赖

使用以下命令安装所需的Python包:

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

设置API访问

获取Xata的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"
)

history.add_user_message("hi!")
history.add_ai_message("whats up?")

复杂示例:结合文档检索和会话记忆

接下来,我们将展示如何创建一个更复杂的应用程序,使用OpenAI和Xata Vector Store集成,构建一个能够详细回答问题的聊天机器人。

配置OpenAI API

设置OpenAI API密钥:

import os

os.environ["OPENAI_API_KEY"] = getpass.getpass("OpenAI API Key:")

创建和填充文档表

将文档存储在Xata中,以便于对话机器人进行检索:

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

创建会话记忆和Agent

from uuid import uuid4
from langchain.memory import ConversationBufferMemory
from langchain.agents import AgentType, initialize_agent
from langchain.agents.agent_toolkits import create_retriever_tool
from langchain_openai import ChatOpenAI

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
)

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

# Tell the agent our name
agent.run(input="My name is bob")

# Ask about Xata
agent.run(input="What is xata?")

# Ask a follow-up question
agent.run(input="Does it support similarity search?")

# Test its memory
agent.run(input="Did I tell you my name? What is it?")

常见问题和解决方案

  • 访问问题:由于某些地区的网络限制,使用API时可能会遇到访问问题。建议使用API代理服务,以提高访问的稳定性。
  • 表结构不匹配:确保在Xata中预创建的表具有正确的模式,否则会导致错误。

总结和进一步学习资源

Xata提供了一种高效的数据和会话管理方式,结合Langchain和OpenAI,可以创建强大且智能的聊天应用。通过这些工具,开发者可以轻松管理聊天记录和文档检索的复杂性。

进一步学习资源

参考资料

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