随着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应用提供坚实的向量处理功能。
今天的技术分享就到这里,希望对大家有帮助。开发过程中遇到问题也可以在评论区交流~