SingleStore向量存储
SingleStore 是一个强大且高性能的分布式 SQL 数据库解决方案,专为在 云 环境和本地环境中卓越运行而设计。它具备多样化的功能,提供无缝的部署选项,同时实现无与伦比的性能。
SingleStore 的一个突出特点是其对向量存储和操作的高级支持,使其成为需要复杂 AI 功能(例如文本相似性匹配)的应用程序的理想选择。凭借内置的向量函数,如 dot_product 和 euclidean_distance,SingleStore 使开发者能够高效地实现复杂的算法。
对于希望在 SingleStore 中利用向量数据的开发者,我们提供了一个全面的教程,指导他们深入了解处理向量数据的细节。本教程深入探讨了 SingleStoreDB 中的向量存储,展示了其基于向量相似性进行搜索的能力。通过利用向量索引,查询可以以极快的速度执行,从而快速检索到相关数据。
此外,SingleStore 的向量存储与基于 Lucene 的全文索引无缝集成,支持强大的文本相似性搜索。用户可以根据文档元数据对象的选定字段过滤搜索结果,从而提高查询精度。
SingleStore 的独特之处在于它能够以多种方式结合向量搜索和全文搜索,提供灵活性和多功能性。无论是通过文本或向量相似性进行预过滤并选择最相关的数据,还是采用加权求和的方法来计算最终的相似性得分,开发者都可以拥有多种选择。
本质上,SingleStore 提供了一种全面的解决方案,用于管理和查询向量数据,为人工智能驱动的应用程序提供了无与伦比的性能和灵活性。
| Class | 包 | JS支持 |
|---|---|---|
| SingleStoreVectorStore | langchain_singlestore | ✅ |
对于 langchain-community 版本 SingleStoreDB(已弃用),请参阅 v0.2 文档。
设置
要访问 SingleStore 向量存储,您需要安装 langchain-singlestore 集成包。 %pip install -qU \"langchain-singlestore\"
初始化
要初始化 SingleStoreVectorStore,您需要一个 Embeddings 对象以及用于 SingleStore 数据库的连接参数。
所需参数:
- 嵌入模型 (
Embeddings): 一种文本嵌入模型。
可选参数:
-
distance_strategy (
DistanceStrategy): 计算向量距离的策略。默认值为DOT_PRODUCT。选项:DOT_PRODUCT:计算两个向量的标量积。EUCLIDEAN_DISTANCE:计算两个向量之间的欧几里得距离。
-
table_name (
str):表的名称。默认为embeddings。 -
content_field (
str):用于存储内容的字段。默认值为content。 -
metadata_field (
str): 用于存储元数据的字段。默认值为metadata。 -
vector_field (
str): 用于存储向量的字段。默认为vector。 -
id_field (
str):用于存储ID的字段。默认值为id。 -
use_vector_index (
bool): 启用向量索引(需要 SingleStore 8.5 及以上版本)。默认值为False。 -
vector_index_name (
str): 向量索引的名称。如果use_vector_index为False,则忽略此参数。 -
vector_index_options (
dict): 向量索引的选项。如果use_vector_index为False,则忽略此选项。 -
vector_size (
int): 向量的大小。如果use_vector_index是True,则必须指定。 -
use_full_text_search (
bool): 在内容上启用全文索引。默认值为False。
连接池参数:
- pool_size (
int): 连接池中的活跃连接数量。默认值为5。 - max_overflow (
int): 超过pool_size的最大连接数。默认值为10。 - 超时 (
float): 连接超时秒数。默认值为30。
数据库连接参数:
- 主机 (
str): 数据库的主机名、IP 或 URL。 - user (
str): 数据库用户名。 - 密码 (
str):数据库密码。 - 端口 (
int): 数据库端口。默认为3306。 - 数据库 (
str):数据库名称。
Additional Options:
- pure_python
(bool): 启用纯Python模式。 - local_infile (
bool): 允许上传本地文件。 - 字符集 (
str): 字符串的字符集。 - ssl_key, ssl_cert, ssl_ca (
str): 路径到SSL文件。 - ssl_disabled (
bool): 禁用SSL。 - ssl_verify_cert (
bool): 验证服务器的证书。 - ssl_verify_identity (
bool): 验证服务器的身份。 - autocommit (
bool): 启用自动提交。 - 结果类型 (
str): 查询结果的结构(例如,tuples,dicts)。
import os
from langchain_singlestore.vectorstores import SingleStoreVectorStore
os.environ["SINGLESTOREDB_URL"] = "root:pass@localhost:3306/db"
vector_store = SingleStoreVectorStore(embeddings=embeddings)
管理向量存储
SingleStoreVectorStore 假设文档的 ID 是一个整数。以下是管理向量存储的示例。
添加项到向量存储
您可以按如下方式将文档添加到向量存储中:
%pip install -qU langchain-core
from langchain_core.documents import Document
docs = [
Document(
page_content="""In the parched desert, a sudden rainstorm brought relief,
as the droplets danced upon the thirsty earth, rejuvenating the landscape
with the sweet scent of petrichor.""",
metadata={"category": "rain"},
),
Document(
page_content="""Amidst the bustling cityscape, the rain fell relentlessly,
creating a symphony of pitter-patter on the pavement, while umbrellas
bloomed like colorful flowers in a sea of gray.""",
metadata={"category": "rain"},
),
Document(
page_content="""High in the mountains, the rain transformed into a delicate
mist, enveloping the peaks in a mystical veil, where each droplet seemed to
whisper secrets to the ancient rocks below.""",
metadata={"category": "rain"},
),
Document(
page_content="""Blanketing the countryside in a soft, pristine layer, the
snowfall painted a serene tableau, muffling the world in a tranquil hush
as delicate flakes settled upon the branches of trees like nature's own
lacework.""",
metadata={"category": "snow"},
),
Document(
page_content="""In the urban landscape, snow descended, transforming
bustling streets into a winter wonderland, where the laughter of
children echoed amidst the flurry of snowballs and the twinkle of
holiday lights.""",
metadata={"category": "snow"},
),
Document(
page_content="""Atop the rugged peaks, snow fell with an unyielding
intensity, sculpting the landscape into a pristine alpine paradise,
where the frozen crystals shimmered under the moonlight, casting a
spell of enchantment over the wilderness below.""",
metadata={"category": "snow"},
),
]
vector_store.add_documents(docs)
更新向量存储中的项
要更新向量存储中的现有文档,请使用以下代码:
updated_document = Document(
page_content="qux", metadata={"source": "https://another-example.com"}
)
vector_store.update_documents(document_id="1", document=updated_document)
删除向量存储中的项
要从向量存储中删除文档,请使用以下代码:
vector_store.delete(ids=["3"])
查询向量存储
一旦您的向量存储已经创建并添加了相关文档,您很可能在运行链或代理的过程中希望对其进行查询。
查询直接
简单进行相似性搜索可以按照以下方式进行:
results = vector_store.similarity_search(query="trees in the snow", k=1)
for doc in results:
print(f"* {doc.page_content} [{doc.metadata}]")
如果您想要执行相似性搜索并接收相应的评分,可以运行:
- TODO: 编辑然后运行代码单元以生成输出
results = vector_store.similarity_search_with_score(query="trees in the snow", k=1)
for doc, score in results:
print(f"* [SIM={score:3f}] {doc.page_content} [{doc.metadata}]")
元数据过滤
SingleStoreDB 通过基于元数据字段的预过滤来提升搜索功能,使用户能够增强和优化搜索结果。此功能使开发者和数据分析师能够精细调整查询,确保搜索结果精确符合其需求。通过使用特定的元数据属性过滤搜索结果,用户可以缩小查询范围,仅聚焦于相关的数据子集。
query = "trees branches"
docs = vector_store.similarity_search(
query, filter={"category": "snow"}
) # Find documents that correspond to the query and has category "snow"
print(docs[0].page_content)
向量索引
通过利用 ANN 向量索引,在 SingleStore DB 8.5 或更高版本中提升您的搜索效率。在创建向量存储对象时设置 use_vector_index=True 即可启用此功能。此外,如果您的向量维度与默认的 OpenAI 嵌入大小(1536)不同,请确保相应地指定 vector_size 参数。
搜索策略
SingleStoreDB 提供了多种搜索策略,每种策略都经过精心设计,以满足特定的使用场景和用户偏好。 默认的 VECTOR_ONLY 策略利用向量运算(如 dot_product 或 euclidean_distance)直接在向量之间计算相似性得分,而 TEXT_ONLY 则采用基于 Lucene 的全文搜索,对于以文本为中心的应用尤其有利。 对于寻求平衡方法的用户,FILTER_BY_TEXT 首先根据文本相似性优化结果,然后进行向量比较;而 FILTER_BY_VECTOR 则优先考虑向量相似性,在评估文本相似性以获得最佳匹配之前先对结果进行过滤。 显著的是,FILTER_BY_TEXT 和 FILTER_BY_VECTOR 都需要全文索引来运行。 此外,WEIGHTED_SUM 是一种复杂的策略,通过加权向量相似性和文本相似性来计算最终的相似性得分,尽管它仅使用点积(dot_product)距离计算,并且还需要一个全文索引。 这些灵活的策略使用户能够根据自身独特需求微调搜索,从而实现高效且精确的数据检索与分析。 此外,SingleStoreDB 的混合方法,以 FILTER_BY_TEXT、FILTER_BY_VECTOR 和 WEIGHTED_SUM 策略为代表,无缝结合了向量搜索和基于文本的搜索,以最大化效率和准确性,确保用户能够充分利该平台的功能,应用于各种广泛的应用场景。
from langchain_singlestore.vectorstores import DistanceStrategy
docsearch = SingleStoreVectorStore.from_documents(
docs,
embeddings,
distance_strategy=DistanceStrategy.DOT_PRODUCT, # Use dot product for similarity search
use_vector_index=True, # Use vector index for faster search
use_full_text_search=True, # Use full text index
)
vectorResults = docsearch.similarity_search(
"rainstorm in parched desert, rain",
k=1,
search_strategy=SingleStoreVectorStore.SearchStrategy.VECTOR_ONLY,
filter={"category": "rain"},
)
print(vectorResults[0].page_content)
textResults = docsearch.similarity_search(
"rainstorm in parched desert, rain",
k=1,
search_strategy=SingleStoreVectorStore.SearchStrategy.TEXT_ONLY,
)
print(textResults[0].page_content)
filteredByTextResults = docsearch.similarity_search(
"rainstorm in parched desert, rain",
k=1,
search_strategy=SingleStoreVectorStore.SearchStrategy.FILTER_BY_TEXT,
filter_threshold=0.1,
)
print(filteredByTextResults[0].page_content)
filteredByVectorResults = docsearch.similarity_search(
"rainstorm in parched desert, rain",
k=1,
search_strategy=SingleStoreVectorStore.SearchStrategy.FILTER_BY_VECTOR,
filter_threshold=0.1,
)
print(filteredByVectorResults[0].page_content)
weightedSumResults = docsearch.similarity_search(
"rainstorm in parched desert, rain",
k=1,
search_strategy=SingleStoreVectorStore.SearchStrategy.WEIGHTED_SUM,
text_weight=0.2,
vector_weight=0.8,
)
print(weightedSumResults[0].page_content)
查询通过转换为检索器
您也可以将向量存储转换为检索器,以便在链条中更方便地使用。
retriever = vector_store.as_retriever(search_kwargs={"k": 1})
retriever.invoke("trees in the snow")
多模态示例:利用 CLIP 和 OpenClip 嵌入
在多模态数据分析领域,整合图像和文本等不同类型的信息正变得愈发重要。其中一个实现此类整合的强大工具是CLIP,这是一种前沿模型,能够将图像和文本嵌入到一个共享的语义空间中。通过这种方式,CLIP 能够借助相似性搜索实现跨不同模态的相关内容检索。
为了说明这一点,让我们考虑一个旨在有效分析多模态数据的应用场景。在此示例中,我们利用了OpenClip 多模态嵌入的功能,该功能基于 CLIP 框架。借助 OpenClip,我们可以无缝地将文本描述与对应的图像进行嵌入,从而实现全面的分析和检索任务。无论是根据文本查询识别视觉上相似的图像,还是查找与特定视觉内容相关的文本段落,OpenClip 都能够帮助用户以极高的效率和准确性探索并提取多模态数据中的洞察。
%pip install -U langchain openai lanchain-singlestore langchain-experimental
import os
from langchain_experimental.open_clip import OpenCLIPEmbeddings
from langchain_singlestore.vectorstores import SingleStoreVectorStore
os.environ["SINGLESTOREDB_URL"] = "root:pass@localhost:3306/db"
TEST_IMAGES_DIR = "../../modules/images"
docsearch = SingleStoreVectorStore(OpenCLIPEmbeddings())
image_uris = sorted(
[
os.path.join(TEST_IMAGES_DIR, image_name)
for image_name in os.listdir(TEST_IMAGES_DIR)
if image_name.endswith(".jpg")
]
)
# Add images
docsearch.add_images(uris=image_uris)
使用检索增强生成
对于如何使用此向量存储进行检索增强生成(RAG)的指南,请参见以下部分:
API 参考
详细介绍了所有SingleStore Document Loader功能和配置的文档,请访问github页面: https://github.com/singlestore-labs/langchain-singlestore/