SingleStoreDB
SingleStoreDB 是一款功能强大的高性能分布式 SQL 数据库解决方案,旨在在 云 和本地环境中表现出色。它拥有功能丰富的功能集,提供无缝的部署选项,同时提供无与伦比的性能。
SingleStoreDB 的一个突出特点是它对向量存储和操作的先进支持,使其成为需要复杂 AI 功能(如文本相似度匹配)的应用程序的理想选择。借助 dot_product 和 euclidean_distance 等内置向量函数,SingleStoreDB 使开发人员能够高效地实现复杂的算法。
对于希望在 SingleStoreDB 中利用向量数据的开发人员,提供了全面的教程,指导他们了解 处理向量数据 的复杂性。本教程深入探讨了 SingleStoreDB 中的向量存储,展示了其基于向量相似度进行搜索的能力。利用向量索引,查询可以以极快的速度执行,从而能够快速检索相关数据。
此外,SingleStoreDB 的向量存储与 基于 Lucene 的全文索引 无缝集成,能够执行强大的文本相似度搜索。用户可以根据文档元数据对象的选定字段过滤搜索结果,提高查询精度。
SingleStoreDB 的独特之处在于它能够以多种方式组合向量搜索和全文搜索,提供灵活性和多功能性。无论是根据文本或向量相似度进行预筛选并选择最相关的数据,还是采用加权总和方法来计算最终的相似度得分,开发人员都拥有多种选择。
本质上,SingleStoreDB 为管理和查询向量数据提供了一个全面的解决方案,为 AI 驱动的应用程序提供了无与伦比的性能和灵活性。
您需要使用 pip install -qU langchain-community
安装 langchain-community
才能使用此集成。
# Establishing a connection to the database is facilitated through the singlestoredb Python connector.
# Please ensure that this connector is installed in your working environment.
%pip install --upgrade --quiet singlestoredb
import getpass
import os
# We want to use OpenAIEmbeddings so we have to get the OpenAI API Key.
if "OPENAI_API_KEY" not in os.environ:
os.environ["OPENAI_API_KEY"] = getpass.getpass("OpenAI API Key:")
from langchain_community.vectorstores import SingleStoreDB
from langchain_community.vectorstores.utils import DistanceStrategy
from langchain_core.documents import Document
from langchain_openai import OpenAIEmbeddings
# loading docs
# we will use some artificial data for this example
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"},
),
]
embeddings = OpenAIEmbeddings()
有几种方法可以建立与数据库的 连接。您可以设置环境变量或将命名参数传递给 SingleStoreDB 构造函数
。或者,您也可以将这些参数提供给 from_documents
和 from_texts
方法。
# Setup connection url as environment variable
os.environ["SINGLESTOREDB_URL"] = "root:pass@localhost:3306/db"
# Load documents to the store
docsearch = SingleStoreDB.from_documents(
docs,
embeddings,
table_name="notebook", # use table with a custom name
)
query = "trees in the snow"
docs = docsearch.similarity_search(query) # Find documents that correspond to the query
print(docs[0].page_content)
SingleStoreDB 通过允许用户通过基于元数据字段的预筛选来增强和细化搜索结果,从而提升了搜索功能。此功能使开发人员和数据分析师能够微调查询,确保搜索结果完全符合他们的要求。通过使用特定元数据属性过滤搜索结果,用户可以缩小查询范围,仅关注相关数据子集。
query = "trees branches"
docs = docsearch.similarity_search(
query, filter={"category": "snow"}
) # Find documents that correspond to the query and has category "snow"
print(docs[0].page_content)
通过利用 SingleStore DB 8.5 或更高版本中的 ANN 向量索引,提高您的搜索效率。通过在创建向量存储对象期间设置 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
策略)将向量和基于文本的搜索无缝地融合在一起,以最大限度地提高效率和准确性,确保用户可以充分利用平台的功能来满足各种应用场景。
docsearch = SingleStoreDB.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=SingleStoreDB.SearchStrategy.VECTOR_ONLY,
filter={"category": "rain"},
)
print(vectorResults[0].page_content)
textResults = docsearch.similarity_search(
"rainstorm in parched desert, rain",
k=1,
search_strategy=SingleStoreDB.SearchStrategy.TEXT_ONLY,
)
print(textResults[0].page_content)
filteredByTextResults = docsearch.similarity_search(
"rainstorm in parched desert, rain",
k=1,
search_strategy=SingleStoreDB.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=SingleStoreDB.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=SingleStoreDB.SearchStrategy.WEIGHTED_SUM,
text_weight=0.2,
vector_weight=0.8,
)
print(weightedSumResults[0].page_content)
多模式示例:利用 CLIP 和 OpenClip 嵌入
在多模式数据分析领域,整合图像和文本等不同类型的信息变得越来越重要。一种促进这种整合的强大工具是 CLIP,这是一个能够将图像和文本都嵌入到共享语义空间中的尖端模型。通过这样做,CLIP 使得通过相似度搜索跨不同模式检索相关内容成为可能。
为了说明,让我们考虑一个旨在有效分析多模式数据的应用程序场景。在本例中,我们利用了 OpenClip 多模式嵌入 的功能,该功能利用了 CLIP 的框架。借助 OpenClip,我们可以将文本描述与相应的图像无缝嵌入,从而能够进行全面的分析和检索任务。无论是根据文本查询识别视觉上相似的图像,还是查找与特定视觉内容相关的相关文本段落,OpenClip 都能使用户以非凡的效率和准确性探索和提取多模式数据的见解。
%pip install -U langchain openai singlestoredb langchain-experimental # (newest versions required for multi-modal)
import os
from langchain_community.vectorstores import SingleStoreDB
from langchain_experimental.open_clip import OpenCLIPEmbeddings
os.environ["SINGLESTOREDB_URL"] = "root:pass@localhost:3306/db"
TEST_IMAGES_DIR = "../../modules/images"
docsearch = SingleStoreDB(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)