Skip to main content

Zep

Zep的检索器示例 - 用于LLM应用程序的长期存储

此处为代码示例,用于演示如何使用Zep作为LLM应用程序的长期存储。

## Retriever Example for [Zep](https://docs.getzep.com/) - A long-term memory store for LLM applications.

关于Zep的更多信息 (More on Zep):

Zep存储、汇总、嵌入、索引和丰富了对话式AI聊天历史记录,并通过简单、低延迟的API公开它们。

主要特点 (Key Features):

  • 快速! Zep的异步提取器独立于您的聊天循环运行,确保用户体验流畅。
  • 长期记忆持久性,可以访问历史消息,无论您的汇总策略如何。
  • 自动汇总基于可配置的消息窗口对记忆消息进行汇总。一系列摘要被存储,为未来的汇总策略提供了灵活性。
  • 混合搜索记忆和元数据,消息在创建时自动嵌入。
  • 实体提取器自动从消息中提取命名实体,并将它们存储在消息元数据中。
  • 自动记忆和摘要的令牌计数,允许更精细地控制提示的组装。
  • Python和JavaScript SDK。

Zep项目: https://github.com/getzep/zep 文档: https://docs.getzep.com/

检索器示例 (Retriever Example)

本笔记本演示了如何使用Zep长期存储搜索历史聊天消息记录。

我们将演示以下内容:

  1. 将对话历史添加到Zep存储中。
  2. 在对话历史中进行向量搜索。
from langchain.memory.chat_message_histories import ZepChatMessageHistory
from langchain.schema import HumanMessage, AIMessage
from uuid import uuid4
import getpass

# 将此设置为您的Zep服务器URL
ZEP_API_URL = "http://localhost:8000"

初始化Zep Chat Message History类并将聊天消息历史添加到内存存储

注意:与其他检索器不同,Zep检索器返回的内容是会话/用户特定的。在实例化检索器时需要提供session_id

# 提供您的Zep API密钥。请注意,这是可选的。请参阅https://docs.getzep.com/deployment/auth

zep_api_key = getpass.getpass()
     ········
session_id = str(uuid4())  # 这是用户/会话的唯一标识符

# 设置Zep Chat History。我们将使用它将聊天历史添加到内存存储
zep_chat_history = ZepChatMessageHistory(
session_id=session_id, url=ZEP_API_URL, api_key=zep_api_key
)
# 预加载一些消息到内存中。默认的消息窗口是12条消息。我们想要超过这个数量以演示自动摘要。
test_history = [
{"role": "human", "content": "Octavia Butler是谁?"},
{
"role": "ai",
"content": (
"Octavia Estelle Butler(1947年6月22日 - 2006年2月24日)是一位美国"
"科幻作家。"
),
},
{"role": "human", "content": "她的哪些书被改编成电影了?"},
{
"role": "ai",
"content": (
"Octavia Butler的作品最著名的改编是FX系列"
"《Kindred》,改编自她的同名小说。"
),
},
{"role": "human", "content": "她的同时代人有谁?"},
{
"role": "ai",
"content": (
"Octavia Butler的同时代人包括Ursula K. Le Guin,Samuel R."
" Delany和Joanna Russ。"
),
},
{"role": "human", "content": "她赢得了哪些奖项?"},
{
"role": "ai",
"content": (
"Octavia Butler赢得了雨果奖、星云奖和麦克阿瑟"
"奖学金。"
),
},
{
"role": "human",
"content": "我可能想读哪些其他女性科幻作家的作品?",
},
{
"role": "ai",
"content": "您可能想读Ursula K. Le Guin或Joanna Russ的作品。",
},
{
"role": "human",
"content": (
"写一篇关于Butler的书《播种者的寓言》的简短概要。它是关于什么的?"
),
},
{
"role": "ai",
"content": (
"《播种者的寓言》是Octavia Butler的一部科幻小说,"
"于1993年出版。它讲述了Lauren Olamina的故事,她是一个年轻女性,"
"生活在一个由环境灾难、贫困和暴力导致社会崩溃的未来世界中。"
),
},
]

for msg in test_history:
zep_chat_history.add_message(
HumanMessage(content=msg["content"])
if msg["role"] == "human"
else AIMessage(content=msg["content"])
)

使用Zep Retriever在Zep内存中进行向量搜索

Zep提供了对历史对话内存的本地向量搜索。嵌入是自动完成的。

注意:消息的嵌入是异步进行的,因此第一个查询可能不会返回结果。随着嵌入的生成,后续查询将返回结果。

from langchain.retrievers import ZepRetriever

zep_retriever = ZepRetriever(
session_id=session_id, # 实例化Retriever时,请确保提供session_id
url=ZEP_API_URL,
top_k=5,
api_key=zep_api_key,
)

await zep_retriever.aget_relevant_documents("谁写了《播种者的寓言》?")
    [Document(page_content='《播种者的寓言》是Octavia Butler于1993年出版的一部科幻小说。它讲述了Lauren Olamina的故事,她是一个年轻女子,生活在一个由环境灾难、贫困和暴力导致社会崩溃的末世未来。', metadata={'score': 0.8897116216176073, 'uuid': 'db60ff57-f259-4ec4-8a81-178ed4c6e54f', 'created_at': '2023-06-26T23:40:22.816214Z', 'role': 'ai', 'metadata': {'system': {'entities': [{'Label': 'GPE', 'Matches': [{'End': 20, 'Start': 15, 'Text': 'Sower'}], 'Name': 'Sower'}, {'Label': 'PERSON', 'Matches': [{'End': 65, 'Start': 51, 'Text': 'Octavia Butler'}], 'Name': 'Octavia Butler'}, {'Label': 'DATE', 'Matches': [{'End': 84, 'Start': 80, 'Text': '1993'}], 'Name': '1993'}, {'Label': 'PERSON', 'Matches': [{'End': 124, 'Start': 110, 'Text': 'Lauren Olamina'}], 'Name': 'Lauren Olamina'}]}}, 'token_count': 56}),
Document(page_content="写一篇关于Butler的书《播种者的寓言》的简短概述。它是关于什么的?", metadata={'score': 0.8856661080361157, 'uuid': 'f1a5981a-8f6d-4168-a548-6e9c32f35fa1', 'created_at': '2023-06-26T23:40:22.809621Z', 'role': 'human', 'metadata': {'system': {'entities': [{'Label': 'ORG', 'Matches': [{'End': 32, 'Start': 26, 'Text': 'Butler'}], 'Name': 'Butler'}, {'Label': 'WORK_OF_ART', 'Matches': [{'End': 61, 'Start': 41, 'Text': 'Parable of the Sower'}], 'Name': 'Parable of the Sower'}]}}, 'token_count': 23}),
Document(page_content='Octavia Butler是谁?', metadata={'score': 0.7757595298492976, 'uuid': '361d0043-1009-4e13-a7f0-8aea8b1ee869', 'created_at': '2023-06-26T23:40:22.709886Z', 'role': 'human', 'metadata': {'system': {'entities': [{'Label': 'PERSON', 'Matches': [{'End': 22, 'Start': 8, 'Text': 'Octavia Butler'}], 'Name': 'Octavia Butler'}], 'intent': '该主题想了解名为Octavia Butler的个人的身份或背景。'}}, 'token_count': 8}),
Document(page_content="Octavia Butler的同时代人包括Ursula K. Le Guin、Samuel R. Delany和Joanna Russ。", metadata={'score': 0.7601242516059306, 'uuid': '56c45e8a-0f65-45f0-bc46-d9e65164b563', 'created_at': '2023-06-26T23:40:22.778836Z', 'role': 'ai', 'metadata': {'system': {'entities': [{'Label': 'PERSON', 'Matches': [{'End': 16, 'Start': 0, 'Text': "Octavia Butler's"}], 'Name': "Octavia Butler's"}, {'Label': 'ORG', 'Matches': [{'End': 58, 'Start': 41, 'Text': 'Ursula K. Le Guin'}], 'Name': 'Ursula K. Le Guin'}, {'Label': 'PERSON', 'Matches': [{'End': 76, 'Start': 60, 'Text': 'Samuel R. Delany'}], 'Name': 'Samuel R. Delany'}, {'Label': 'PERSON', 'Matches': [{'End': 93, 'Start': 82, 'Text': 'Joanna Russ'}], 'Name': 'Joanna Russ'}], 'intent': '该主题提供了关于Octavia Butler的同时代人的信息。'}}, 'token_count': 27}),
Document(page_content='你可能想读Ursula K. Le Guin或Joanna Russ。', metadata={'score': 0.7594731095320668, 'uuid': '6951f2fd-dfa4-4e05-9380-f322ef8f72f8', 'created_at': '2023-06-26T23:40:22.80464Z', 'role': 'ai', 'metadata': {'system': {'entities': [{'Label': 'ORG', 'Matches': [{'End': 40, 'Start': 23, 'Text': 'Ursula K. Le Guin'}], 'Name': 'Ursula K. Le Guin'}, {'Label': 'PERSON', 'Matches': [{'End': 55, 'Start': 44, 'Text': 'Joanna Russ'}], 'Name': 'Joanna Russ'}]}}, 'token_count': 18})]

我们还可以使用Zep同步API来检索结果:

zep_retriever.get_relevant_documents("谁写了《播种者的寓言》?")
    [Document(page_content='《播种者的寓言》是Octavia Butler于1993年出版的一部科幻小说。它讲述了Lauren Olamina的故事,她是一个年轻女子,生活在一个由环境灾难、贫困和暴力导致社会崩溃的末世未来。', metadata={'score': 0.889661105796371, 'uuid': 'db60ff57-f259-4ec4-8a81-178ed4c6e54f', 'created_at': '2023-06-26T23:40:22.816214Z', 'role': 'ai', 'metadata': {'system': {'entities': [{'Label': 'GPE', 'Matches': [{'End': 20, 'Start': 15, 'Text': 'Sower'}], 'Name': 'Sower'}, {'Label': 'PERSON', 'Matches': [{'End': 65, 'Start': 51, 'Text': 'Octavia Butler'}], 'Name': 'Octavia Butler'}, {'Label': 'DATE', 'Matches': [{'End': 84, 'Start': 80, 'Text': '1993'}], 'Name': '1993'}, {'Label': 'PERSON', 'Matches': [{'End': 124, 'Start': 110, 'Text': 'Lauren Olamina'}], 'Name': 'Lauren Olamina'}]}}, 'token_count': 56}),
Document(page_content="写一篇关于Butler的书《播种者的寓言》的简短概述。它是关于什么的?", metadata={'score': 0.885754241595424, 'uuid': 'f1a5981a-8f6d-4168-a548-6e9c32f35fa1', 'created_at': '2023-06-26T23:40:22.809621Z', 'role': 'human', 'metadata': {'system': {'entities': [{'Label': 'ORG', 'Matches': [{'End': 32, 'Start': 26, 'Text': 'Butler'}], 'Name': 'Butler'}, {'Label': 'WORK_OF_ART', 'Matches': [{'End': 61, 'Start': 41, 'Text': 'Parable of the Sower'}], 'Name': 'Parable of the Sower'}]}}, 'token_count': 23}),
Document(page_content='Octavia Butler是谁?', metadata={'score': 0.7758688965570713, 'uuid': '361d0043-1009-4e13-a7f0-8aea8b1ee869', 'created_at': '2023-06-26T23:40:22.709886Z', 'role': 'human', 'metadata': {'system': {'entities': [{'Label': 'PERSON', 'Matches': [{'End': 22, 'Start': 8, 'Text': 'Octavia Butler'}], 'Name': 'Octavia Butler'}], 'intent': '该主题想了解名为Octavia Butler的个人的身份或背景。'}}, 'token_count': 8}),
Document(page_content="Octavia Butler的同时代人包括Ursula K. Le Guin、Samuel R. Delany和Joanna Russ。", metadata={'score': 0.7602672137411663, 'uuid': '56c45e8a-0f65-45f0-bc46-d9e65164b563', 'created_at': '2023-06-26T23:40:22.778836Z', 'role': 'ai', 'metadata': {'system': {'entities': [{'Label': 'PERSON', 'Matches': [{'End': 16, 'Start': 0, 'Text': "Octavia Butler's"}], 'Name': "Octavia Butler's"}, {'Label': 'ORG', 'Matches': [{'End': 58, 'Start': 41, 'Text': 'Ursula K. Le Guin'}], 'Name': 'Ursula K. Le Guin'}, {'Label': 'PERSON', 'Matches': [{'End': 76, 'Start': 60, 'Text': 'Samuel R. Delany'}], 'Name': 'Samuel R. Delany'}, {'Label': 'PERSON', 'Matches': [{'End': 93, 'Start': 82, 'Text': 'Joanna Russ'}], 'Name': 'Joanna Russ'}], 'intent': '该主题提供了关于Octavia Butler的同时代人的信息。'}}, 'token_count': 27}),
Document(page_content='你可能想读Ursula K. Le Guin或Joanna Russ。', metadata={'score': 0.7596040989115522, 'uuid': '6951f2fd-dfa4-4e05-9380-f322ef8f72f8', 'created_at': '2023-06-26T23:40:22.80464Z', 'role': 'ai', 'metadata': {'system': {'entities': [{'Label': 'ORG', 'Matches': [{'End': 40, 'Start': 23, 'Text': 'Ursula K. Le Guin'}], 'Name': 'Ursula K. Le Guin'}, {'Label': 'PERSON', 'Matches': [{'End': 55, 'Start': 44, 'Text': 'Joanna Russ'}], 'Name': 'Joanna Russ'}]}}, 'token_count': 18})]