{ "cells": [ { "cell_type": "markdown", "source": [ "# Zep Memory\n", "\n", "## Retriever Example\n", "\n", "This notebook demonstrates how to search historical chat message histories using the [Zep Long-term Memory Store](https://getzep.github.io/).\n", "\n", "We'll demonstrate:\n", "\n", "1. Adding conversation history to the Zep memory store.\n", "2. Vector search over the conversation history.\n", "\n", "More on Zep:\n", "\n", "Zep stores, summarizes, embeds, indexes, and enriches conversational AI chat histories, and exposes them via simple, low-latency APIs.\n", "\n", "Key Features:\n", "\n", "- Long-term memory persistence, with access to historical messages irrespective of your summarization strategy.\n", "- Auto-summarization of memory messages based on a configurable message window. A series of summaries are stored, providing flexibility for future summarization strategies.\n", "- Vector search over memories, with messages automatically embedded on creation.\n", "- Auto-token counting of memories and summaries, allowing finer-grained control over prompt assembly.\n", "- Python and JavaScript SDKs.\n", "\n", "Zep's Go Extractor model is easily extensible, with a simple, clean interface available to build new enrichment functionality, such as summarizers, entity extractors, embedders, and more.\n", "\n", "Zep project: [https://github.com/getzep/zep](https://github.com/getzep/zep)\n" ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 1, "outputs": [], "source": [ "from langchain.memory.chat_message_histories import ZepChatMessageHistory\n", "from langchain.schema import HumanMessage, AIMessage\n", "from uuid import uuid4\n", "\n", "# Set this to your Zep server URL\n", "ZEP_API_URL = \"http://localhost:8000\"\n", "\n", "# Zep is async-first. Our sync APIs use an asyncio wrapper to run outside an app's event loop.\n", "# This interferes with Jupyter's event loop, so we need to install nest_asyncio to run the\n", "# Zep client in a notebook.\n", "\n", "# !pip install nest_asyncio # Uncomment to install nest_asyncio\n", "import nest_asyncio\n", "\n", "nest_asyncio.apply()" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2023-05-18T20:09:20.355017Z", "start_time": "2023-05-18T20:09:19.526069Z" } } }, { "cell_type": "markdown", "source": [ "### Initialize the Zep Chat Message History Class and add a chat message history to the memory store\n", "\n", "**NOTE:** Unlike other Retrievers, the content returned by the Zep Retriever is session/user specific. A `session_id` is required when instantiating the Retriever." ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 2, "outputs": [], "source": [ "session_id = str(uuid4()) # This is a unique identifier for the user/session\n", "\n", "# Set up Zep Chat History. We'll use this to add chat histories to the memory store\n", "zep_chat_history = ZepChatMessageHistory(\n", " session_id=session_id,\n", " url=ZEP_API_URL,\n", ")" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2023-05-18T20:09:20.424764Z", "start_time": "2023-05-18T20:09:20.355626Z" } } }, { "cell_type": "code", "execution_count": 3, "outputs": [], "source": [ "# Preload some messages into the memory. The default message window is 12 messages. We want to push beyond this to demonstrate auto-summarization.\n", "test_history = [\n", " {\"role\": \"human\", \"content\": \"Who was Octavia Butler?\"},\n", " {\n", " \"role\": \"ai\",\n", " \"content\": (\n", " \"Octavia Estelle Butler (June 22, 1947 – February 24, 2006) was an American\"\n", " \" science fiction author.\"\n", " ),\n", " },\n", " {\"role\": \"human\", \"content\": \"Which books of hers were made into movies?\"},\n", " {\n", " \"role\": \"ai\",\n", " \"content\": (\n", " \"The most well-known adaptation of Octavia Butler's work is the FX series\"\n", " \" Kindred, based on her novel of the same name.\"\n", " ),\n", " },\n", " {\"role\": \"human\", \"content\": \"Who were her contemporaries?\"},\n", " {\n", " \"role\": \"ai\",\n", " \"content\": (\n", " \"Octavia Butler's contemporaries included Ursula K. Le Guin, Samuel R.\"\n", " \" Delany, and Joanna Russ.\"\n", " ),\n", " },\n", " {\"role\": \"human\", \"content\": \"What awards did she win?\"},\n", " {\n", " \"role\": \"ai\",\n", " \"content\": (\n", " \"Octavia Butler won the Hugo Award, the Nebula Award, and the MacArthur\"\n", " \" Fellowship.\"\n", " ),\n", " },\n", " {\n", " \"role\": \"human\",\n", " \"content\": \"Which other women sci-fi writers might I want to read?\",\n", " },\n", " {\n", " \"role\": \"ai\",\n", " \"content\": \"You might want to read Ursula K. Le Guin or Joanna Russ.\",\n", " },\n", " {\n", " \"role\": \"human\",\n", " \"content\": (\n", " \"Write a short synopsis of Butler's book, Parable of the Sower. What is it\"\n", " \" about?\"\n", " ),\n", " },\n", " {\n", " \"role\": \"ai\",\n", " \"content\": (\n", " \"Parable of the Sower is a science fiction novel by Octavia Butler,\"\n", " \" published in 1993. It follows the story of Lauren Olamina, a young woman\"\n", " \" living in a dystopian future where society has collapsed due to\"\n", " \" environmental disasters, poverty, and violence.\"\n", " ),\n", " },\n", "]\n", "\n", "for msg in test_history:\n", " zep_chat_history.append(\n", " HumanMessage(content=msg[\"content\"])\n", " if msg[\"role\"] == \"human\"\n", " else AIMessage(content=msg[\"content\"])\n", " )\n" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2023-05-18T20:09:20.603865Z", "start_time": "2023-05-18T20:09:20.427041Z" } } }, { "cell_type": "markdown", "source": [ "### Use the Zep Retriever to vector search over the Zep memory\n", "\n", "Zep provides native vector search over historical conversation memory. Embedding happens automatically.\n", "\n", "NOTE: Embedding of messages occurs asynchronously, so the first query may not return results. Subsequent queries will return results as the embeddings are generated." ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 4, "outputs": [ { "data": { "text/plain": "[Document(page_content='Who was Octavia Butler?', metadata={'score': 0.7759001673780126, 'uuid': '3bedb2bf-aeaf-4849-924b-40a6d91e54b9', 'created_at': '2023-05-18T20:09:20.47556Z', 'role': 'human', 'token_count': 8})]" }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from langchain.retrievers import ZepRetriever\n", "\n", "zep_retriever = ZepRetriever(\n", " session_id=session_id, # Ensure that you provide the session_id when instantiating the Retriever\n", " url=ZEP_API_URL,\n", " top_k=5,\n", ")\n", "\n", "await zep_retriever.aget_relevant_documents(\"Who wrote Parable of the Sower?\")" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2023-05-18T20:09:20.979411Z", "start_time": "2023-05-18T20:09:20.604147Z" } } }, { "cell_type": "markdown", "source": [ "We can also use the Zep sync API to retrieve results:" ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 5, "outputs": [ { "data": { "text/plain": "[Document(page_content='Who was Octavia Butler?', metadata={'score': 0.7759001673780126, 'uuid': '3bedb2bf-aeaf-4849-924b-40a6d91e54b9', 'created_at': '2023-05-18T20:09:20.47556Z', 'role': 'human', 'token_count': 8}),\n Document(page_content='Octavia Estelle Butler (June 22, 1947 – February 24, 2006) was an American science fiction author.', metadata={'score': 0.7545887969667749, 'uuid': 'b32c0644-2dcb-4c1d-a445-6622e7ba82e5', 'created_at': '2023-05-18T20:09:20.512044Z', 'role': 'ai', 'token_count': 31})]" }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "zep_retriever.get_relevant_documents(\"Who wrote Parable of the Sower?\")" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2023-05-18T20:09:21.296699Z", "start_time": "2023-05-18T20:09:20.983624Z" } } }, { "cell_type": "code", "execution_count": 5, "outputs": [], "source": [], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2023-05-18T20:09:21.298710Z", "start_time": "2023-05-18T20:09:21.297169Z" } } } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.6" } }, "nbformat": 4, "nbformat_minor": 0 }