Semantic Cache:基于语义相似性而非字面相等的模糊键值存储工具

文摘   2024-10-23 08:31   湖北  

项目简介

Semantic Cache 是一种基于语义相似度来缓存自然文本的工具。它非常适合任何涉及根据含义查询或检索信息的任务,例如自然语言分类或缓存人工智能响应。两段文本可以相似但不相同(例如,“西班牙值得游览的好地方”与“西班牙值得游览的最佳地点”)。传统的缓存无法识别这种语义相似性,并且错过了重用的机会。


语义缓存允许您:

  • 轻松将自然文本分类为预定义类别

  • 通过缓存 AI 响应来避免冗余的LLM工作

  • 通过使用已缓存的值响应类似查询来减少 API 延迟


亮点

  • 使用语义相似性:按含义存储缓存条目,而不仅仅是字面字符

  • 处理同义词:识别并处理同义词

  • 多语言支持:跨不同语言工作(如果配置了多语言矢量模型)

  • 复杂查询支持:理解长查询和嵌套用户查询

  • 轻松集成:用于 Node.js 应用程序的简单 API

  • 可定制:设置自定义接近阈值以过滤掉不太相关的结果


入门

先决条件

  • Upstash Vector 数据库(在此处创建一个)


安装

安装包:

npm install @upstash/semantic-cache @upstash/vector

设置

首先,在此处创建一个 Upstash Vector 数据库。您将需要urltoken凭据来连接语义缓存。重要提示:创建数据库时选择任何预制的嵌入模型。

注意

不同的嵌入模型适用于不同的用例。例如,如果优先考虑低延迟,请选择尺寸较小的模型,例如bge-small-en-v1.5 。如果准确性很重要,请选择具有更多维度的模型。

在项目的根目录中创建一个.env文件并添加 Upstash Vector URL 和令牌:

UPSTASH_VECTOR_REST_URL=https://example.upstash.ioUPSTASH_VECTOR_REST_TOKEN=your_secret_token_here

使用语义缓存

以下是在 Node.js 应用程序中使用语义缓存的方法:

import { SemanticCache } from "@upstash/semantic-cache";import { Index } from "@upstash/vector";
// 👇 your vector databaseconst index = new Index();
// 👇 your semantic cacheconst semanticCache = new SemanticCache({ index, minProximity: 0.95 });
async function runDemo() { await semanticCache.set("Capital of Turkey", "Ankara"); await delay(1000);
// 👇 outputs: "Ankara" const result = await semanticCache.get("What is Turkey's capital?"); console.log(result);}
function delay(ms: number) { return new Promise((resolve) => setTimeout(resolve, ms));}
runDemo();

minProximity参数

minProximity参数范围从01 。它允许您定义最小相关性分数来确定缓存命中。该数字越高,您的用户输入必须与缓存内容越相似才能命中。实际上,0.95 的分数表示相似度非常高,而 0.75 的分数则表示相似度较低。例如,值 1.00(可能的最高值)将仅接受用户查询和缓存内容的精确匹配作为缓存命中。


命名空间支持

您可以使用命名空间将数据分成多个分区。

import { SemanticCache } from "@upstash/semantic-cache";import { Index } from "@upstash/vector";
// 👇 your vector databaseconst index = new Index();
// 👇 your semantic cacheconst semanticCache = new SemanticCache({ index, minProximity: 0.95, namespace: "user1" });
await semanticCache.set("Capital of Turkey", "Ankara");

例子

以下示例演示了如何在各种用例中利用语义缓存:

注意

我们在设置数据后添加 1 秒的延迟,以便有时间更新向量索引。这种延迟对于确保数据可用于检索是必要的。

基本语义检索

await semanticCache.set("Capital of France", "Paris");await delay(1000);
// 👇 outputs "Paris"const result = await semanticCache.get("What's the capital of France?");

处理同义词

await semanticCache.set("largest city in USA by population", "New York");await delay(1000);
// 👇 outputs "New York"const result = await semanticCache.get("which is the most populated city in the USA?");

多语言查询

注意:您的嵌入模型需要支持您打算使用的语言。

await semanticCache.set("German Chancellor", "Olaf Scholz");await delay(1000);
// 👇 "Who is the chancellor of Germany?" -> outputs "Olaf Scholz"const result = await semanticCache.get("Wer ist der Bundeskanzler von Deutschland?");

复杂查询

await semanticCache.set("year in which the Berlin wall fell", "1989");await delay(1000);
// 👇 outputs "1989"const result = await semanticCache.get("what's the year the Berlin wall destroyed?");

不同的背景

await semanticCache.set("the chemical formula for water", "H2O");await semanticCache.set("the healthiest drink on a hot day", "water");
await delay(1000);
// 👇 outputs "water"const result = await semanticCache.get("what should i drink when it's hot outside?");
// 👇 outputs "H2O"const result = await semanticCache.get("tell me water's chemical formula");

项目链接

https://github.com/upstash/semantic-cache

扫码加入技术交流群,备注开发语言-城市-昵称

合作请注明


 

关注「GitHubStore」公众号


GitHubStore
分享有意思的开源项目
 最新文章