[深入探索Timescale Vector:在PostgreSQL中存储和查询向量嵌入的利器]

77 阅读3分钟
# 引言

在AI应用的潮流中,向量化数据的存储和查询成为了一项至关重要的需求。Timescale Vector作为PostgreSQL++,提供了一种高效的方式来存储和查询数十亿向量嵌入。本文旨在介绍如何使用Timescale Vector,结合示例代码,演示如何在PostgreSQL中进行自查询。

# 主要内容

## 什么是Timescale Vector?

Timescale Vector是为AI应用设计的PostgreSQL++。它扩展了`pgvector`,通过DiskANN算法提高了在十亿级向量上的相似性搜索性能,并支持基于时间的自动分区与索引。这使得开发者可以在一个数据库中存储关系数据、向量嵌入和时间序列数据。

### Timescale Vector的优势

- **高效的存储与查询**:支持数千亿向量嵌入的快速存储和查询。
- **内置SQL接口**:提供与关系型数据无缝集成的SQL查询接口。
- **企业级安全和高可用性**:基于PostgreSQL的坚实基础,支持企业级别的备份与复制、安全性和合规性。

## Timescale Vector的获取与安装

Timescale Vector目前在Timescale的云平台上可用,并为LangChain用户提供了90天的免费试用。

1. **注册并创建数据库**:在[Timescale网站](https://www.timescale.com)注册并创建一个新的Timescale Vector数据库。
2. **安装所需软件包**    ```shell
    %pip install --upgrade --quiet lark
    %pip install --upgrade --quiet timescale-vector
    ```

3. **获取服务URL**:使用以下代码从`.env`文件中读取Timescale服务URL。

    ```python
    import os
    from dotenv import find_dotenv, load_dotenv

    _ = load_dotenv(find_dotenv())
    TIMESCALE_SERVICE_URL = os.environ["TIMESCALE_SERVICE_URL"]
    ```

## 创建Timescale Vector向量存储

创建一个向量存储并用数据初始化。以下是一些示例电影数据:

```python
from langchain_community.vectorstores.timescalevector import TimescaleVector
from langchain_core.documents import Document
from langchain_openai import OpenAIEmbeddings

documents = [
    Document(page_content="A bunch of scientists bring back dinosaurs and mayhem breaks loose", metadata={"year": 1993, "genre": "science fiction", "rating": 7.7}),
    # 更多的文档...
]

embeddings = OpenAIEmbeddings()  # OpenAI嵌入
vectorstore = TimescaleVector.from_documents(
    embedding=embeddings,
    documents=documents,
    collection_name="langchain_self_query_demo",
    service_url=TIMESCALE_SERVICE_URL  # 使用API代理服务提高访问稳定性
)

实现自查询检索器

通过以下代码实现一个自查询检索器:

from langchain.chains.query_constructor.base import AttributeInfo
from langchain.retrievers.self_query.base import SelfQueryRetriever
from langchain_openai import OpenAI

metadata_field_info = [
    AttributeInfo(name="genre", description="The genre of the movie", type="string or list[string]"),
    AttributeInfo(name="year", description="The year the movie was released", type="integer"),
    # 更多的字段...
]

llm = OpenAI(temperature=0)
retriever = SelfQueryRetriever.from_llm(
    llm, vectorstore, "Brief summary of a movie", metadata_field_info, verbose=True
)

代码示例

运行以下代码以实际使用检索器进行查询:

results = retriever.invoke("What are some movies about dinosaurs")
for doc in results:
    print(doc.page_content)

常见问题和解决方案

  • 访问受限问题:由于某些地区的网络限制,建议使用API代理服务来提高访问的稳定性。
  • 性能问题:确保数据库配置和索引设置优化以处理大量数据。

总结和进一步学习资源

Timescale Vector通过PostgreSQL中的向量化存储和查询,为AI应用提供了一种强大而高效的解决方案。若想深入了解,可以参阅以下资源:

  1. Timescale Vector官方文档
  2. LangChain文档
  3. PostgreSQL官方指南

参考资料

  1. Timescale Vector博客
  2. LangChain开源项目

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

---END---