SingleStore
SingleStoreDB 是一款强大的高性能分布式 SQL 数据库解决方案,旨在在 云 和本地环境中脱颖而出。它拥有多功能的功能集,提供无缝的部署选项,同时提供无与伦比的性能。
SingleStoreDB 的一个突出特点是它对向量存储和操作的先进支持,使其成为需要复杂 AI 功能(如文本相似性匹配)的应用程序的理想选择。借助内置的向量函数,如 dot_product 和 euclidean_distance,SingleStoreDB 使开发人员能够有效地实现复杂的算法。
对于热衷于在 SingleStoreDB 中利用向量数据的开发人员来说,有一个全面的教程可以帮助他们了解 向量数据处理 的复杂性。本教程深入探讨了 SingleStoreDB 中的向量存储,展示了它根据向量相似性进行搜索的能力。利用向量索引,查询可以以极快的速度执行,从而能够快速检索相关数据。
此外,SingleStoreDB 的向量存储与 基于 Lucene 的全文索引 无缝集成,能够进行强大的文本相似性搜索。用户可以根据文档元数据对象的选定字段过滤搜索结果,从而提高查询精度。
SingleStoreDB 的独特之处在于它能够以各种方式将向量搜索和全文搜索结合起来,从而提供灵活性和多功能性。无论预先通过文本或向量相似性进行过滤并选择最相关的数据,还是采用加权求和方法来计算最终相似度分数,开发人员都拥有多种选择。
本质上,SingleStoreDB 为管理和查询向量数据提供了一个全面的解决方案,为 AI 驱动的应用程序提供无与伦比的性能和灵活性。
仅在 Node.js 上可用。
LangChain.js 需要 mysql2
库才能创建到 SingleStoreDB 实例的连接。
设置
- npm
- Yarn
- pnpm
npm install -S mysql2
yarn add mysql2
pnpm add mysql2
使用
SingleStoreVectorStore
管理连接池。建议在终止应用程序之前调用 await store.end();
以确保所有连接都已正确关闭,并防止任何可能的资源泄漏。
标准使用
- npm
- Yarn
- pnpm
npm install @langchain/openai @langchain/community
yarn add @langchain/openai @langchain/community
pnpm add @langchain/openai @langchain/community
以下是一个简单的示例,展示了如何导入相关模块并使用 SingleStoreVectorStore
执行基本相似性搜索
import { SingleStoreVectorStore } from "@langchain/community/vectorstores/singlestore";
import { OpenAIEmbeddings } from "@langchain/openai";
export const run = async () => {
const vectorStore = await SingleStoreVectorStore.fromTexts(
["Hello world", "Bye bye", "hello nice world"],
[{ id: 2 }, { id: 1 }, { id: 3 }],
new OpenAIEmbeddings(),
{
connectionOptions: {
host: process.env.SINGLESTORE_HOST,
port: Number(process.env.SINGLESTORE_PORT),
user: process.env.SINGLESTORE_USERNAME,
password: process.env.SINGLESTORE_PASSWORD,
database: process.env.SINGLESTORE_DATABASE,
},
}
);
const resultOne = await vectorStore.similaritySearch("hello world", 1);
console.log(resultOne);
await vectorStore.end();
};
API 参考
- SingleStoreVectorStore 来自
@langchain/community/vectorstores/singlestore
- OpenAIEmbeddings 来自
@langchain/openai
元数据过滤
如果需要根据特定元数据字段过滤结果,您可以传递一个过滤器参数,将搜索范围缩小到与过滤器对象中所有指定字段匹配的文档
import { SingleStoreVectorStore } from "@langchain/community/vectorstores/singlestore";
import { OpenAIEmbeddings } from "@langchain/openai";
export const run = async () => {
const vectorStore = await SingleStoreVectorStore.fromTexts(
["Good afternoon", "Bye bye", "Boa tarde!", "Até logo!"],
[
{ id: 1, language: "English" },
{ id: 2, language: "English" },
{ id: 3, language: "Portugese" },
{ id: 4, language: "Portugese" },
],
new OpenAIEmbeddings(),
{
connectionOptions: {
host: process.env.SINGLESTORE_HOST,
port: Number(process.env.SINGLESTORE_PORT),
user: process.env.SINGLESTORE_USERNAME,
password: process.env.SINGLESTORE_PASSWORD,
database: process.env.SINGLESTORE_DATABASE,
},
distanceMetric: "EUCLIDEAN_DISTANCE",
}
);
const resultOne = await vectorStore.similaritySearch("greetings", 1, {
language: "Portugese",
});
console.log(resultOne);
await vectorStore.end();
};
API 参考
- SingleStoreVectorStore 来自
@langchain/community/vectorstores/singlestore
- OpenAIEmbeddings 来自
@langchain/openai
向量索引
通过利用 SingleStore DB 8.5 或更高版本中的 ANN 向量索引 来提高搜索效率。通过在创建向量存储对象时设置 useVectorIndex: true
,您可以激活此功能。此外,如果您的向量的维度与 OpenAI 嵌入的默认大小 1536 不同,请确保相应地指定 vectorSize
参数。
混合搜索
SingleStoreDB 提供了多种搜索策略,每种策略都经过精心设计,以满足特定用例和用户偏好。默认的 VECTOR_ONLY
策略使用向量运算(如 DOT_PRODUCT
或 EUCLIDEAN_DISTANCE
)直接计算向量之间的相似度分数,而 TEXT_ONLY
则采用基于 Lucene 的全文搜索,特别适合文本密集型应用。对于寻求平衡方法的用户,FILTER_BY_TEXT
首先根据文本相似度筛选结果,然后进行向量比较,而 FILTER_BY_VECTOR
则优先考虑向量相似度,在评估文本相似度以获得最佳匹配之前筛选结果。值得注意的是,FILTER_BY_TEXT
和 FILTER_BY_VECTOR
都需要全文索引才能运行。此外,WEIGHTED_SUM
是一种复杂的策略,通过对向量和文本相似度进行加权来计算最终相似度分数,但它只使用点积距离计算,也需要全文索引。这些灵活的策略使用户能够根据自己的独特需求微调搜索,从而实现高效精确的数据检索和分析。此外,SingleStoreDB 的混合方法(例如 FILTER_BY_TEXT
、FILTER_BY_VECTOR
和 WEIGHTED_SUM
策略)无缝地将基于向量和基于文本的搜索结合起来,以最大限度地提高效率和准确性,确保用户能够充分利用平台的功能,满足各种应用的需求。
import { SingleStoreVectorStore } from "@langchain/community/vectorstores/singlestore";
import { OpenAIEmbeddings } from "@langchain/openai";
export const run = async () => {
const vectorStore = await SingleStoreVectorStore.fromTexts(
[
"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.",
"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.",
"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.",
"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.",
"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.",
"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.",
],
[
{ category: "rain" },
{ category: "rain" },
{ category: "rain" },
{ category: "snow" },
{ category: "snow" },
{ category: "snow" },
],
new OpenAIEmbeddings(),
{
connectionOptions: {
host: process.env.SINGLESTORE_HOST,
port: Number(process.env.SINGLESTORE_PORT),
user: process.env.SINGLESTORE_USERNAME,
password: process.env.SINGLESTORE_PASSWORD,
database: process.env.SINGLESTORE_DATABASE,
},
distanceMetric: "DOT_PRODUCT",
useVectorIndex: true,
useFullTextIndex: true,
}
);
const resultOne = await vectorStore.similaritySearch(
"rainstorm in parched desert, rain",
1,
{ category: "rain" }
);
console.log(resultOne[0].pageContent);
await vectorStore.setSearchConfig({
searchStrategy: "TEXT_ONLY",
});
const resultTwo = await vectorStore.similaritySearch(
"rainstorm in parched desert, rain",
1
);
console.log(resultTwo[0].pageContent);
await vectorStore.setSearchConfig({
searchStrategy: "FILTER_BY_TEXT",
filterThreshold: 0.1,
});
const resultThree = await vectorStore.similaritySearch(
"rainstorm in parched desert, rain",
1
);
console.log(resultThree[0].pageContent);
await vectorStore.setSearchConfig({
searchStrategy: "FILTER_BY_VECTOR",
filterThreshold: 0.1,
});
const resultFour = await vectorStore.similaritySearch(
"rainstorm in parched desert, rain",
1
);
console.log(resultFour[0].pageContent);
await vectorStore.setSearchConfig({
searchStrategy: "WEIGHTED_SUM",
textWeight: 0.2,
vectorWeight: 0.8,
vectorselectCountMultiplier: 10,
});
const resultFive = await vectorStore.similaritySearch(
"rainstorm in parched desert, rain",
1
);
console.log(resultFive[0].pageContent);
await vectorStore.end();
};
API 参考
- SingleStoreVectorStore 来自
@langchain/community/vectorstores/singlestore
- OpenAIEmbeddings 来自
@langchain/openai