Skip to main content

Zep 开源项目

Zep 是一个为 AI 助手应用提供的长期记忆服务。 使用 Zep,你可以让 AI 助手具备回忆过去对话的能力,无论这些对话多么久远, 同时还能减少幻觉、降低延迟和成本。

对 Zep Cloud 感兴趣?请参阅 Zep Cloud 安装指南

注意: ZepVectorStoreDocuments 一起工作,用于作为 Retriever 使用。 它与 Zep 的 ZepMemory 类提供不同的功能,后者用于持久化、丰富和搜索用户的聊天历史。

为什么选择 Zep 的 VectorStore?🤖🚀

Zep 使用部署在 Zep 服务器本地的低延迟模型,自动对添加到 Zep Vector Store 的文档进行嵌入。 Zep 的 TypeScript/JavaScript 客户端可以在非 Node 的边缘环境中使用。 这两者结合 Zep 的聊天记忆功能,使 Zep 成为构建对延迟和性能要求较高的对话式 LLM 应用的理想选择。

支持的搜索类型

Zep 支持相似性搜索和最大边界相关性(MMR)搜索。MMR 搜索在检索增强生成(RAG)应用中特别有用,因为它会对结果重新排序,以确保返回的文档具有多样性。

安装

请参考 Zep 开源快速入门指南,了解如何安装和开始使用 Zep。

使用方法

你需要提供 Zep API 的 URL,以及可选的 API 密钥,以使用 Zep VectorStore。更多信息请参见 Zep 文档

在下面的示例中,我们使用了 Zep 的自动嵌入功能,它会使用 Zep 服务器上的低延迟嵌入模型自动对文档进行嵌入。由于 LangChain 需要传入一个 Embeddings 实例,我们传入了 FakeEmbeddings

注意: 如果你传入的 Embeddings 实例不是 FakeEmbeddings,则该类将用于对文档进行嵌入。 你还必须将文档集合的 isAutoEmbedded 设置为 false。请参见下面的 OpenAIEmbeddings 示例。

示例:从文档创建 ZepVectorStore 并进行查询

:::提示 请参阅安装集成包的一般说明部分。 :::

npm install @langchain/openai @langchain/community @langchain/core
import { ZepVectorStore } from "@langchain/community/vectorstores/zep";
import { FakeEmbeddings } from "@langchain/core/utils/testing";
import { TextLoader } from "langchain/document_loaders/fs/text";
import { randomUUID } from "crypto";

const loader = new TextLoader("src/document_loaders/example_data/example.txt");
const docs = await loader.load();
export const run = async () => {
const collectionName = `collection${randomUUID().split("-")[0]}`;

const zepConfig = {
apiUrl: "http://localhost:8000", // this should be the URL of your Zep implementation
collectionName,
embeddingDimensions: 1536, // this much match the width of the embeddings you're using
isAutoEmbedded: true, // If true, the vector store will automatically embed documents when they are added
};

const embeddings = new FakeEmbeddings();

const vectorStore = await ZepVectorStore.fromDocuments(
docs,
embeddings,
zepConfig
);

// Wait for the documents to be embedded
// eslint-disable-next-line no-constant-condition
while (true) {
const c = await vectorStore.client.document.getCollection(collectionName);
console.log(
`Embedding status: ${c.document_embedded_count}/${c.document_count} documents embedded`
);
// eslint-disable-next-line no-promise-executor-return
await new Promise((resolve) => setTimeout(resolve, 1000));
if (c.status === "ready") {
break;
}
}

const results = await vectorStore.similaritySearchWithScore("bar", 3);

console.log("Similarity Results:");
console.log(JSON.stringify(results));

const results2 = await vectorStore.maxMarginalRelevanceSearch("bar", {
k: 3,
});

console.log("MMR Results:");
console.log(JSON.stringify(results2));
};

API Reference:

示例:使用元数据过滤器查询 ZepVectorStore

import { ZepVectorStore } from "@langchain/community/vectorstores/zep";
import { FakeEmbeddings } from "@langchain/core/utils/testing";
import { randomUUID } from "crypto";
import { Document } from "@langchain/core/documents";

const docs = [
new Document({
metadata: { album: "Led Zeppelin IV", year: 1971 },
pageContent:
"Stairway to Heaven is one of the most iconic songs by Led Zeppelin.",
}),
new Document({
metadata: { album: "Led Zeppelin I", year: 1969 },
pageContent:
"Dazed and Confused was a standout track on Led Zeppelin's debut album.",
}),
new Document({
metadata: { album: "Physical Graffiti", year: 1975 },
pageContent:
"Kashmir, from Physical Graffiti, showcases Led Zeppelin's unique blend of rock and world music.",
}),
new Document({
metadata: { album: "Houses of the Holy", year: 1973 },
pageContent:
"The Rain Song is a beautiful, melancholic piece from Houses of the Holy.",
}),
new Document({
metadata: { band: "Black Sabbath", album: "Paranoid", year: 1970 },
pageContent:
"Paranoid is Black Sabbath's second studio album and includes some of their most notable songs.",
}),
new Document({
metadata: {
band: "Iron Maiden",
album: "The Number of the Beast",
year: 1982,
},
pageContent:
"The Number of the Beast is often considered Iron Maiden's best album.",
}),
new Document({
metadata: { band: "Metallica", album: "Master of Puppets", year: 1986 },
pageContent:
"Master of Puppets is widely regarded as Metallica's finest work.",
}),
new Document({
metadata: { band: "Megadeth", album: "Rust in Peace", year: 1990 },
pageContent:
"Rust in Peace is Megadeth's fourth studio album and features intricate guitar work.",
}),
];

export const run = async () => {
const collectionName = `collection${randomUUID().split("-")[0]}`;

const zepConfig = {
apiUrl: "http://localhost:8000", // this should be the URL of your Zep implementation
collectionName,
embeddingDimensions: 1536, // this much match the width of the embeddings you're using
isAutoEmbedded: true, // If true, the vector store will automatically embed documents when they are added
};

const embeddings = new FakeEmbeddings();

const vectorStore = await ZepVectorStore.fromDocuments(
docs,
embeddings,
zepConfig
);

// Wait for the documents to be embedded
// eslint-disable-next-line no-constant-condition
while (true) {
const c = await vectorStore.client.document.getCollection(collectionName);
console.log(
`Embedding status: ${c.document_embedded_count}/${c.document_count} documents embedded`
);
// eslint-disable-next-line no-promise-executor-return
await new Promise((resolve) => setTimeout(resolve, 1000));
if (c.status === "ready") {
break;
}
}

vectorStore
.similaritySearchWithScore("sad music", 3, {
where: { jsonpath: "$[*] ? (@.year == 1973)" }, // We should see a single result: The Rain Song
})
.then((results) => {
console.log(`\n\nSimilarity Results:\n${JSON.stringify(results)}`);
})
.catch((e) => {
if (e.name === "NotFoundError") {
console.log("No results found");
} else {
throw e;
}
});

// We're not filtering here, but rather demonstrating MMR at work.
// We could also add a filter to the MMR search, as we did with the similarity search above.
vectorStore
.maxMarginalRelevanceSearch("sad music", {
k: 3,
})
.then((results) => {
console.log(`\n\nMMR Results:\n${JSON.stringify(results)}`);
})
.catch((e) => {
if (e.name === "NotFoundError") {
console.log("No results found");
} else {
throw e;
}
});
};

API Reference:

示例:使用 LangChain 的嵌入类,例如 OpenAIEmbeddings

import { ZepVectorStore } from "@langchain/community/vectorstores/zep";
import { OpenAIEmbeddings } from "@langchain/openai";
import { TextLoader } from "langchain/document_loaders/fs/text";
import { randomUUID } from "crypto";

const loader = new TextLoader("src/document_loaders/example_data/example.txt");
const docs = await loader.load();
export const run = async () => {
const collectionName = `collection${randomUUID().split("-")[0]}`;

const zepConfig = {
apiUrl: "http://localhost:8000", // this should be the URL of your Zep implementation
collectionName,
embeddingDimensions: 1536, // this much match the width of the embeddings you're using
isAutoEmbedded: false, // set to false to disable auto-embedding
};

const embeddings = new OpenAIEmbeddings();

const vectorStore = await ZepVectorStore.fromDocuments(
docs,
embeddings,
zepConfig
);

const results = await vectorStore.similaritySearchWithScore("bar", 3);

console.log("Similarity Results:");
console.log(JSON.stringify(results));

const results2 = await vectorStore.maxMarginalRelevanceSearch("bar", {
k: 3,
});

console.log("MMR Results:");
console.log(JSON.stringify(results2));
};

API Reference:

相关内容


Was this page helpful?


You can also leave detailed feedback on GitHub.