Zep: AI助手的长期记忆。
从聊天记录中回忆、理解和提取数据。为个性化AI体验提供动力。
快速开始 |
文档 |
LangChain 和
LlamaIndex 支持 |
Discord
www.getzep.com
什么是Zep? 💬
Zep是一个AI助手应用的长期记忆服务。通过Zep,你可以赋予AI助手回忆过往对话的能力,不论这些对话多么遥远,同时还能减少幻觉、降低延迟和成本。
Zep如何工作
Zep会持续和回忆聊天记录,并自动生成这些聊天记录的总结和其他辅助信息。它还会嵌入消息和总结,允许你在Zep中搜索过去对话中的相关上下文。Zep的所有操作都是异步进行,确保这些操作不会影响用户的聊天体验。数据存储在数据库中,允许你在需要增长时扩展。
Zep还提供了一种简单易用的文档矢量搜索抽象,称为文档集合。这是为了补充Zep的核心内存功能,但并不设计为通用矢量数据库。
Zep使你在构建提示时更加有意图:
- 自动添加最近的一些消息,数量可根据你的应用定制;
- 最近对话的总结,在上述消息之前;
- 从整个聊天会话中提取的内容相关的总结或消息;
- 以及从Zep文档集合中提取的相关业务数据。
什么是Zep云? ⚡️
Zep云是一个以Zep开源为核心的托管服务。除了Zep开源的内存管理功能外,Zep云还提供:
- 事实提取: 自动从对话中构建事实表,而无需预先定义数据模式。
- 对话分类: 即时准确地分类聊天对话。理解用户意图和情感,细分用户等。基于语义上下文路由链并触发事件。
- 结构化数据提取: 使用你定义的模式从聊天对话中快速提取业务数据。理解你的助手下一步应该问什么,以完成任务。
为什么使用Zep来进行长期记忆?
为什么不直接在提示中包括整个聊天记录?
随着LLM上下文长度的增加,可能会倾向于在提示中包括整个聊天记录,以及RAG结果和其他指令。不幸的是,我们发现这会导致回忆不佳、产生幻觉、推理缓慢且昂贵。
为什么不使用Redis、Postgres、矢量数据库或...来持久化聊天记录?
我们的目标是提升内存管理的抽象层级。我们认为,通过设计良好的抽象,开发者的生产力能够得到最好地发挥,而不是从头开始构建持久化、总结、提取、嵌入管理和搜索。
Zep是一个矢量数据库吗?
不是。Zep在其底层使用嵌入和矢量数据库功能来支持许多其功能,但并不设计为通用矢量数据库。
Zep是为助手应用专门构建的
用户、会话和聊天消息是Zep中的一等抽象。这允许简单灵活地管理聊天内存,包括用单API调用执行被遗忘权请求和其他隐私合规相关任务。
Zep的语言支持和生态系统
Zep支持Python和TypeScript吗?
是的,Zep提供了Python和TypeScript/JS SDK,方便与你的助手应用集成。我们还有使用Zep与流行框架集成的示例 - 请参阅下文。
我可以将Zep与LangChain、LlamaIndex、Vercel AI、n8n、FlowWise等一起使用吗?
是的,Zep团队和社区贡献者已经构建了与Zep的集成,例如,可以简单地将Zep的内存组件应用到LangChain应用中。请参阅 Zep文档 和你喜欢的框架的文档了解更多。
Zep开源LLM服务依赖项
Zep开源依赖于外部LLM API服务才能运行。支持OpenAI、Azure OpenAI、Anthropic和OpenAI兼容的API。
了解更多
- 🏎️ 快速开始指南:Docker部署和编码,在5分钟内完成。
- 📚 Zep示例:通过示例学习如何使用Zep。
- 🦙 使用LlamaIndex构建应用
- 🦜⛓️ 使用LangChain构建应用
- 🛠️ 使用TypeScript/JS或Python起步
示例
创建用户、聊天会话和聊天信息 (Zep Python SDK)
user_request = CreateUserRequest(
user_id=user_id,
email="user@example.com",
first_name="Jane",
last_name="Smith",
metadata={"foo": "bar"},
)
new_user = client.user.add(user_request)
# 创建一个聊天会话
session_id = uuid.uuid4().hex # 一个新的会话标识符
session = Session(
session_id=session_id,
user_id=user_id,
metadata={"foo" : "bar"}
)
client.memory.add_session(session)
# 向会话中添加一条聊天消息
history = [
{ role: "human", content: "谁是奥克塔维亚·巴特勒?" },
]
messages = [Message(role=m.role, content=m.content) for m in history]
memory = Memory(messages=messages)
client.memory.add_memory(session_id, memory)
# 获取user_id的所有会话
sessions = client.user.getSessions(user_id)
使用LangChain.js持久化聊天记录(Zep TypeScript SDK)
const memory = new ZepMemory({
sessionId,
baseURL: zepApiURL,
apiKey: zepApiKey,
});
const chain = new ConversationChain({ llm: model, memory });
const response = await chain.run(
{
input="这本书与当代社会面临的挑战有何关系?"
},
);
通过文本输入和JSONPath筛选器进行文档集合的混合相似性搜索(TypeScript)
const query = "奥克塔维亚·巴特勒是谁?";
const searchResults = await collection.search({ text: query }, 3);
// 使用文本和元数据搜索文档
const metadataQuery = {
where: { jsonpath: '$[*] ? (@.genre == "scifi")' },
};
const newSearchResults = await collection.search(
{
text: query,
metadata: metadataQuery,
},
3
);
使用Zep作为VectorStore创建LlamaIndex索引(Python)
from llama_index import VectorStoreIndex, SimpleDirectoryReader
from llama_index.vector_stores import ZepVectorStore
from llama_index.storage.storage_context import StorageContext
vector_store = ZepVectorStore(
api_url=zep_api_url,
api_key=zep_api_key,
collection_name=collection_name
)
documents = SimpleDirectoryReader("documents/").load_data()
storage_context = StorageContext.from_defaults(vector_store=vector_store)
index = VectorStoreIndex.from_documents(
documents,
storage_context=storage_context
)
使用嵌入搜索(Zep Python SDK)
# 通过嵌入向量搜索,而不是文本查询
# embedding是一个浮点数列表
results = collection.search(
embedding=embedding, limit=5
)
入门
安装服务器
请参阅 Zep快速开始指南 以获取重要的配置信息。
docker compose up
寻找其他部署选项?
安装SDK
请参阅Zep 开发指南 了解重要的beta信息和使用说明。
pip install zep-python
或
npm i @getzep/zep-js