使用Timescale Vector进行AI向量搜索实战

随着AI应用的普及,向量数据库的需求也日益增长。在这篇文章中,我将向大家介绍如何使用Timescale Vector,基于PostgreSQL的++向量数据库,来实现高效的向量存储和查询。主要涵盖语义搜索、时间向量搜索、自查询以及如何创建索引来加速查询等功能。

什么是Timescale Vector?

老铁们,Timescale Vector其实是一个增强版的PostgreSQL,能够高效地存储和查询数百万个向量嵌入。它通过DiskANN算法的索引机制,提升了pgvector的相似度搜索速度和准确性。对于时间相关的向量搜索,它还能自动进行时间分区和索引,这波操作可以说是相当丝滑。

Timescale Vector通过一个熟悉的SQL接口来查询向量嵌入和关系数据,这对于从POC到生产的AI应用来说相当方便。因为它基于牢靠的PostgreSQL基础,您可以享受到企业级的功能,例如流备份、复制、高可用性以及行级安全。

如何访问Timescale Vector

Timescale Vector目前可通过Timescale云平台进行访问。LangChain用户更是可以享受长达90天的免费试用。要开始使用,请注册Timescale并创建一个新数据库。

实战步骤

环境设置

确保安装所需的Python包:

%pip install --upgrade --quiet  timescale-vector
%pip install --upgrade --quiet  langchain-openai langchain-community
%pip install --upgrade --quiet  tiktoken

接下来我们来看看如何进行相似度搜索。

相似度搜索实例

首先,我们来看一个相似度搜索的简单例子,使用欧几里得距离作为相似度度量。

from langchain_community.document_loaders import TextLoader
from langchain_community.vectorstores.timescalevector import TimescaleVector
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import CharacterTextSplitter

# 加载文本并分块
loader = TextLoader("your_text_file.txt")
documents = loader.load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
docs = text_splitter.split_documents(documents)

embeddings = OpenAIEmbeddings()

# 连接到Timescale数据库
SERVICE_URL = "Your_Timescale_Service_URL"

# 创建Timescale Vector实例
COLLECTION_NAME = "your_collection_name"
db = TimescaleVector.from_documents(
    embedding=embeddings,
    documents=docs,
    collection_name=COLLECTION_NAME,
    service_url=SERVICE_URL,
)

# 执行相似度搜索
query = "你的查询语句"
docs_with_score = db.similarity_search_with_score(query)

for doc, score in docs_with_score:
    print("-" * 80)
    print("Score: ", score)
    print(doc.page_content)
    print("-" * 80)

时间过滤的相似度搜索

Timescale Vector还支持时间过滤的相似度搜索,这对于需要根据时间范围进行查询的应用场景非常有用,比如聊天历史、最新消息的查询等。

from datetime import timedelta

# 定义时间范围
start_dt = datetime(2023, 8, 1, 22, 10, 35)
end_dt = datetime(2023, 8, 30, 22, 10, 35)
td = timedelta(days=7)

# 执行带时间过滤的相似度搜索
docs_with_score = db.similarity_search_with_score(
    query, start_date=start_dt, end_date=end_dt
)

for doc, score in docs_with_score:
    print("-" * 80)
    print("Score: ", score)
    print("Date: ", doc.metadata["date"])
    print(doc.page_content)
    print("-" * 80)

加速查询的索引

为了加速向量的相似度查询,你可以为嵌入列创建索引。建议默认使用timescale_vector或HNSW索引。

db.create_index()

自查询检索

通过Timescale Vector还可以实现自查询功能,利用自然语言查询生成SQL查询,进行自我检索。

from langchain_openai import OpenAI
from langchain.retrievers.self_query.base import SelfQueryRetriever

# 设置自查询检索器
llm = OpenAI(temperature=0)
retriever = SelfQueryRetriever.from_llm(
    llm,
    vectorstore=db,
    document_content_description="描述文档内容",
    metadata_field_info=[...],  # 元数据字段信息
    enable_limit=True,
    verbose=True,
)

# 自查询示例
response = retriever.invoke("你的自然语言查询")
print(response)

总结

通过以上示例,你应该学会了如何使用Timescale Vector进行高效的向量检索。无论是基于相似度或时间的查询,还是利用索引加速查询,均可为AI应用提供坚实的向量处理功能。

今天的技术分享就到这里,希望对大家有帮助。开发过程中遇到问题也可以在评论区交流~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值