【RAG】【vector_stores097】Timescale Vector Store 演示分析
2026/4/25 18:13:40 网站建设 项目流程

1. 案例目标

本案例演示如何使用Timescale Vector作为LlamaIndex的向量存储后端,实现高效的向量相似性搜索和时间过滤功能。主要目标包括:

  • 展示Timescale Vector与LlamaIndex的集成方法
  • 演示基础向量相似性搜索功能
  • 实现基于时间范围的向量过滤查询
  • 创建和管理不同类型的向量索引(DiskANN、HNSW、IVFFLAT)
  • 将Timescale Vector作为检索器和查询引擎使用

Timescale Vector简介:Timescale Vector是TimescaleDB的扩展,专为AI应用优化的PostgreSQL向量数据库。它提供了增强的pgvector功能,包括DiskANN索引算法、时间分区索引等特性,特别适合处理带时间戳的向量数据。

2. 技术栈与核心依赖

  • LlamaIndex:用于构建向量索引和查询引擎的核心框架
  • Timescale Vector:基于PostgreSQL的向量数据库扩展,提供高效的向量存储和检索功能
  • OpenAI Embeddings:用于生成文本向量嵌入
  • pandas:用于数据处理和分析
  • python-dotenv:用于环境变量管理

核心依赖安装:

pip install llama-index-embeddings-openai pip install llama-index-vector-stores-timescalevector

3. 环境配置

3.1 OpenAI API配置

需要设置OpenAI API密钥,可以通过环境变量或直接配置:

import os os.environ["OPENAI_API_KEY"] = "sk-..."

3.2 Timescale数据库连接

配置Timescale数据库服务URL:

import os from dotenv import load_dotenv load_dotenv() TIMESCALE_SERVICE_URL = os.environ.get("TIMESCALE_SERVICE_URL")

获取Timescale服务URL:可以通过Timescale控制台或环境变量获取服务URL,格式通常为:postgresql://username:password@host:port/database

4. 案例实现

4.1 数据准备

首先下载Paul Graham的文章集作为示例数据:

!mkdir -p 'data/paul_graham/' !wget 'https://raw.githubusercontent.com/run-llama/llama_index/main/docs/examples/data/paul_graham/paul_graham_essay.txt' -O 'data/paul_graham/paul_graham_essay.txt'

4.2 向量存储初始化

创建TimescaleVectorStore实例并配置基本参数:

from llama_index.vector_stores.timescalevector import TimescaleVectorStore from llama_index.core import SimpleDirectoryReader, StorageContext, VectorStoreIndex # 加载文档 documents = SimpleDirectoryReader("./data/paul_graham").load_data() # 初始化向量存储 ts_vector_store = TimescaleVectorStore.from_params( service_url=TIMESCALE_SERVICE_URL, table_name="paul_graham_essay", ) # 创建存储上下文 storage_context = StorageContext.from_defaults(vector_store=ts_vector_store) # 创建向量索引 index = VectorStoreIndex.from_documents( documents, storage_context=storage_context )

4.3 基础向量相似性搜索

实现基本的向量相似性搜索功能:

from llama_index.core.vector_stores import VectorStoreQuery # 创建查询引擎 query_engine = index.as_query_engine() # 执行查询 response = query_engine.query("Did the author work at YC?") print(str(response))

4.4 索引管理

Timescale Vector支持多种索引类型,可以创建和管理不同的索引:

# 创建DiskANN索引(默认) ts_vector_store.create_index() # 创建HNSW索引 ts_vector_store.create_index("hnsw", max_alpha=1.0, num_neighbors=30) # 创建IVFFLAT索引 ts_vector_store.create_index( "ivfflat", num_lists=100, m=100 )

4.5 时间过滤向量搜索

Timescale Vector的一个强大功能是基于时间范围的向量过滤:

import datetime import uuid import pandas as pd # 加载Git日志数据 df = pd.read_csv("commit_history.csv") df = df.head(1000) # 取前1000条记录 # 创建辅助函数 def create_uuid(date_string): date_obj = datetime.datetime.strptime(date_string, "%Y-%m-%d %H:%M:%S%z") return uuid.uuid1(node=0x0123456789ABCDEF, clock_seq_hi=0x80, clock_seq_lo=0x00, time=int(date_obj.timestamp() * 1e9)) def split_name(name): parts = name.split() if len(parts) > 1: return parts[0], parts[-1] return name, "" def create_date(date_string): date_obj = datetime.datetime.strptime(date_string, "%Y-%m-%d %H:%M:%S%z") return date_obj # 创建文本节点 nodes = [] for _, row in df.iterrows(): first_name, last_name = split_name(row["author"]) date = create_date(row["date"]) uuid_obj = create_uuid(row["date"]) node = TextNode( text=row["message"], metadata={ "commit": row["commit"], "author": row["author"], "date": date.strftime("%Y-%m-%d %H:%M:%S%z") }, id_=str(uuid_obj) ) nodes.append(node) # 生成嵌入向量 from llama_index.embeddings.openai import OpenAIEmbedding embedding_model = OpenAIEmbedding(model="text-embedding-ada-002") for node in nodes: node_embedding = embedding_model.get_text_embedding( node.get_content(metadata_mode="all") ) node.embedding = node_embedding # 添加节点到向量存储 ts_vector_store.add(nodes)

4.6 时间范围过滤查询

实现三种不同的时间范围过滤查询方法:

from datetime import datetime, timedelta # 方法1:从开始日期和时间增量查询 start_dt = datetime(2023, 8, 1) td = timedelta(days=7) query_embedding = embedding_model.get_text_embedding( "What changes were made to TimescaleDB functions?" ) vector_store_query = VectorStoreQuery( query_embedding=query_embedding, similarity_top_k=5 ) # 从开始日期和时间增量查询 query_result = ts_vector_store.query( vector_store_query, start_date=start_dt, time_delta=td ) # 方法2:从结束日期和时间增量查询 end_dt = datetime(2023, 8, 31) query_result = ts_vector_store.query( vector_store_query, end_date=end_dt, time_delta=td ) # 方法3:在结束日期和时间增量之间查询 query_result = ts_vector_store.query( vector_store_query, end_date=end_dt, time_delta=td )

4.7 作为检索器和查询引擎使用

将Timescale Vector作为LlamaIndex的检索器和查询引擎使用:

from llama_index.core import VectorStoreIndex # 创建索引 index = VectorStoreIndex.from_vector_store(ts_vector_store) # 作为检索器使用 retriever = index.as_retriever( vector_store_kwargs=({"start_date": start_dt, "time_delta": td}) ) results = retriever.retrieve("What's new with TimescaleDB functions?") # 作为查询引擎使用 query_engine = index.as_query_engine( vector_store_kwargs=({"start_date": start_dt, "end_date": end_dt}) ) response = query_engine.query( "What's new with TimescaleDB functions? When were these changes made and by whom?" ) print(str(response))

5. 案例效果

  • 高效向量存储:成功将文档转换为向量并存储在Timescale Vector中
  • 精确相似性搜索:能够根据查询向量返回最相似的文档内容
  • 灵活时间过滤:支持多种时间范围过滤方式,包括开始日期+时间增量、结束日期+时间增量等
  • 多种索引支持:支持DiskANN、HNSW和IVFFLAT等不同类型的向量索引
  • 无缝集成:与LlamaIndex框架无缝集成,可作为检索器和查询引擎使用

时间过滤优势:Timescale Vector的时间过滤功能特别适合处理具有时间属性的向量数据,如日志记录、新闻文章、社交媒体帖子等。通过时间分区,查询效率显著提高,只需搜索相关分区而非整个数据集。

6. 案例实现思路

本案例的实现思路如下:

  1. 环境准备:安装必要的依赖库,配置OpenAI API和Timescale数据库连接
  2. 数据加载:使用SimpleDirectoryReader加载文档数据,或使用pandas加载结构化数据
  3. 向量存储初始化:创建TimescaleVectorStore实例,配置表名和连接参数
  4. 向量索引构建:将文档转换为向量并存储在Timescale Vector中,创建适当的索引
  5. 查询实现:实现基础向量查询和时间过滤查询功能
  6. 高级功能:将向量存储作为检索器和查询引擎集成到LlamaIndex工作流中

时间过滤实现原理:Timescale Vector通过将向量数据按时间分区存储,实现高效的时间范围过滤。每个分区包含特定时间范围内的向量,查询时只需搜索相关分区,大幅提高查询效率。

7. 扩展建议

  • 多模态数据支持:扩展支持图像、音频等多模态数据的向量存储和检索
  • 自定义索引参数:根据数据特性调整索引参数,如DiskANN的max_alpha、HNSW的m和ef_construction等
  • 批量操作优化:实现更高效的批量数据插入和更新操作
  • 分布式部署:探索Timescale Vector在分布式环境下的部署和扩展方案
  • 实时数据流处理:集成实时数据流处理框架,实现动态向量更新和查询
  • 高级过滤功能:结合元数据和时间过滤,实现更复杂的查询条件组合
  • 性能监控:添加查询性能监控和分析功能,优化索引策略

8. 总结

本案例详细展示了如何使用Timescale Vector作为LlamaIndex的向量存储后端,实现了高效的向量相似性搜索和时间过滤功能。Timescale Vector基于PostgreSQL构建,提供了增强的向量存储和检索能力,特别适合处理具有时间属性的向量数据。

通过本案例,我们学习了:

  • Timescale Vector的基本概念和特性
  • 如何初始化和配置TimescaleVectorStore
  • 基础向量相似性搜索的实现方法
  • 时间范围过滤查询的多种实现方式
  • 不同类型向量索引的创建和管理
  • 如何将Timescale Vector集成到LlamaIndex工作流中

Timescale Vector的时间过滤功能是其独特优势,特别适合处理日志记录、新闻文章、社交媒体帖子等具有时间属性的数据。通过时间分区,查询效率显著提高,只需搜索相关分区而非整个数据集。

该案例为构建基于时间感知的向量搜索应用提供了完整的解决方案,可作为开发类似应用的基础参考。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询