mirror of
				https://github.com/hwchase17/langchain.git
				synced 2025-10-31 16:08:59 +00:00 
			
		
		
		
	zep-python's sync methods no longer need an asyncio wrapper. This was causing issues with FastAPI deployment. Zep also now supports putting and getting of arbitrary message metadata. Bump zep-python version to v0.30 Remove nest-asyncio from Zep example notebooks. Modify tests to include metadata. --------- Co-authored-by: Daniel Chalef <daniel.chalef@private.org> Co-authored-by: Daniel Chalef <131175+danielchalef@users.noreply.github.com>
		
			
				
	
	
		
			388 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			388 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| {
 | ||
|  "cells": [
 | ||
|   {
 | ||
|    "attachments": {},
 | ||
|    "cell_type": "markdown",
 | ||
|    "metadata": {},
 | ||
|    "source": [
 | ||
|     "# Zep Memory\n",
 | ||
|     "\n",
 | ||
|     "## REACT Agent Chat Message History Example\n",
 | ||
|     "\n",
 | ||
|     "This notebook demonstrates how to use the [Zep Long-term Memory Store](https://getzep.github.io/) as memory for your chatbot.\n",
 | ||
|     "\n",
 | ||
|     "We'll demonstrate:\n",
 | ||
|     "\n",
 | ||
|     "1. Adding conversation history to the Zep memory store.\n",
 | ||
|     "2. Running an agent and having message automatically added to the store.\n",
 | ||
|     "3. Viewing the enriched messages.\n",
 | ||
|     "4. 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 project: [https://github.com/getzep/zep](https://github.com/getzep/zep)\n",
 | ||
|     "Docs: [https://getzep.github.io](https://getzep.github.io/)\n"
 | ||
|    ]
 | ||
|   },
 | ||
|   {
 | ||
|    "cell_type": "code",
 | ||
|    "execution_count": 1,
 | ||
|    "metadata": {
 | ||
|     "ExecuteTime": {
 | ||
|      "end_time": "2023-05-25T15:09:41.754535Z",
 | ||
|      "start_time": "2023-05-25T15:09:40.897232Z"
 | ||
|     }
 | ||
|    },
 | ||
|    "outputs": [],
 | ||
|    "source": [
 | ||
|     "from langchain.memory.chat_message_histories import ZepChatMessageHistory\n",
 | ||
|     "from langchain.memory import ConversationBufferMemory\n",
 | ||
|     "from langchain import OpenAI\n",
 | ||
|     "from langchain.schema import HumanMessage, AIMessage\n",
 | ||
|     "from langchain.tools import DuckDuckGoSearchRun\n",
 | ||
|     "from langchain.agents import initialize_agent, AgentType\n",
 | ||
|     "from uuid import uuid4\n",
 | ||
|     "\n",
 | ||
|     "\n",
 | ||
|     "# Set this to your Zep server URL\n",
 | ||
|     "ZEP_API_URL = \"http://localhost:8000\"\n",
 | ||
|     "\n",
 | ||
|     "session_id = str(uuid4())  # This is a unique identifier for the user\n"
 | ||
|    ]
 | ||
|   },
 | ||
|   {
 | ||
|    "cell_type": "code",
 | ||
|    "execution_count": 2,
 | ||
|    "metadata": {
 | ||
|     "ExecuteTime": {
 | ||
|      "end_time": "2023-05-25T15:09:41.762056Z",
 | ||
|      "start_time": "2023-05-25T15:09:41.755238Z"
 | ||
|     }
 | ||
|    },
 | ||
|    "outputs": [
 | ||
|     {
 | ||
|      "data": {
 | ||
|       "text/plain": "True"
 | ||
|      },
 | ||
|      "execution_count": 2,
 | ||
|      "metadata": {},
 | ||
|      "output_type": "execute_result"
 | ||
|     }
 | ||
|    ],
 | ||
|    "source": [
 | ||
|     "# Load your OpenAI key from a .env file\n",
 | ||
|     "from dotenv import load_dotenv\n",
 | ||
|     "\n",
 | ||
|     "load_dotenv()"
 | ||
|    ]
 | ||
|   },
 | ||
|   {
 | ||
|    "attachments": {},
 | ||
|    "cell_type": "markdown",
 | ||
|    "metadata": {},
 | ||
|    "source": [
 | ||
|     "### Initialize the Zep Chat Message History Class and initialize the Agent\n"
 | ||
|    ]
 | ||
|   },
 | ||
|   {
 | ||
|    "cell_type": "code",
 | ||
|    "execution_count": 3,
 | ||
|    "metadata": {
 | ||
|     "ExecuteTime": {
 | ||
|      "end_time": "2023-05-25T15:09:41.840440Z",
 | ||
|      "start_time": "2023-05-25T15:09:41.762277Z"
 | ||
|     }
 | ||
|    },
 | ||
|    "outputs": [],
 | ||
|    "source": [
 | ||
|     "ddg = DuckDuckGoSearchRun()\n",
 | ||
|     "tools = [ddg]\n",
 | ||
|     "\n",
 | ||
|     "# Set up Zep Chat History\n",
 | ||
|     "zep_chat_history = ZepChatMessageHistory(\n",
 | ||
|     "    session_id=session_id,\n",
 | ||
|     "    url=ZEP_API_URL,\n",
 | ||
|     ")\n",
 | ||
|     "\n",
 | ||
|     "# Use a standard ConversationBufferMemory to encapsulate the Zep chat history\n",
 | ||
|     "memory = ConversationBufferMemory(\n",
 | ||
|     "    memory_key=\"chat_history\", chat_memory=zep_chat_history\n",
 | ||
|     ")\n",
 | ||
|     "\n",
 | ||
|     "# Initialize the agent\n",
 | ||
|     "llm = OpenAI(temperature=0)\n",
 | ||
|     "agent_chain = initialize_agent(\n",
 | ||
|     "    tools,\n",
 | ||
|     "    llm,\n",
 | ||
|     "    agent=AgentType.CONVERSATIONAL_REACT_DESCRIPTION,\n",
 | ||
|     "    verbose=True,\n",
 | ||
|     "    memory=memory,\n",
 | ||
|     ")\n"
 | ||
|    ]
 | ||
|   },
 | ||
|   {
 | ||
|    "attachments": {},
 | ||
|    "cell_type": "markdown",
 | ||
|    "metadata": {},
 | ||
|    "source": [
 | ||
|     "### Add some history data\n"
 | ||
|    ]
 | ||
|   },
 | ||
|   {
 | ||
|    "cell_type": "code",
 | ||
|    "execution_count": 4,
 | ||
|    "metadata": {
 | ||
|     "ExecuteTime": {
 | ||
|      "end_time": "2023-05-25T15:09:41.960661Z",
 | ||
|      "start_time": "2023-05-25T15:09:41.842656Z"
 | ||
|     }
 | ||
|    },
 | ||
|    "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"
 | ||
|    ]
 | ||
|   },
 | ||
|   {
 | ||
|    "attachments": {},
 | ||
|    "cell_type": "markdown",
 | ||
|    "metadata": {},
 | ||
|    "source": [
 | ||
|     "### Run the agent\n",
 | ||
|     "\n",
 | ||
|     "Doing so will automatically add the input and response to the Zep memory.\n"
 | ||
|    ]
 | ||
|   },
 | ||
|   {
 | ||
|    "cell_type": "code",
 | ||
|    "execution_count": 5,
 | ||
|    "metadata": {
 | ||
|     "ExecuteTime": {
 | ||
|      "end_time": "2023-05-25T15:09:50.485377Z",
 | ||
|      "start_time": "2023-05-25T15:09:41.962287Z"
 | ||
|     }
 | ||
|    },
 | ||
|    "outputs": [
 | ||
|     {
 | ||
|      "name": "stdout",
 | ||
|      "output_type": "stream",
 | ||
|      "text": [
 | ||
|       "\n",
 | ||
|       "\n",
 | ||
|       "\u001B[1m> Entering new AgentExecutor chain...\u001B[0m\n",
 | ||
|       "\u001B[32;1m\u001B[1;3mThought: Do I need to use a tool? No\n",
 | ||
|       "AI: Parable of the Sower is a prescient novel that speaks to the challenges facing contemporary society, such as climate change, economic inequality, and the rise of authoritarianism. It is a cautionary tale that warns of the dangers of ignoring these issues and the importance of taking action to address them.\u001B[0m\n",
 | ||
|       "\n",
 | ||
|       "\u001B[1m> Finished chain.\u001B[0m\n"
 | ||
|      ]
 | ||
|     },
 | ||
|     {
 | ||
|      "data": {
 | ||
|       "text/plain": "'Parable of the Sower is a prescient novel that speaks to the challenges facing contemporary society, such as climate change, economic inequality, and the rise of authoritarianism. It is a cautionary tale that warns of the dangers of ignoring these issues and the importance of taking action to address them.'"
 | ||
|      },
 | ||
|      "execution_count": 5,
 | ||
|      "metadata": {},
 | ||
|      "output_type": "execute_result"
 | ||
|     }
 | ||
|    ],
 | ||
|    "source": [
 | ||
|     "agent_chain.run(\n",
 | ||
|     "    input=\"WWhat is the book's relevance to the challenges facing contemporary society?\"\n",
 | ||
|     ")\n"
 | ||
|    ]
 | ||
|   },
 | ||
|   {
 | ||
|    "attachments": {},
 | ||
|    "cell_type": "markdown",
 | ||
|    "metadata": {},
 | ||
|    "source": [
 | ||
|     "### Inspect the Zep memory\n",
 | ||
|     "\n",
 | ||
|     "Note the summary, and that the history has been enriched with token counts, UUIDs, and timestamps.\n",
 | ||
|     "\n",
 | ||
|     "Summaries are biased towards the most recent messages.\n"
 | ||
|    ]
 | ||
|   },
 | ||
|   {
 | ||
|    "cell_type": "code",
 | ||
|    "execution_count": 6,
 | ||
|    "metadata": {
 | ||
|     "ExecuteTime": {
 | ||
|      "end_time": "2023-05-25T15:09:50.493438Z",
 | ||
|      "start_time": "2023-05-25T15:09:50.479230Z"
 | ||
|     }
 | ||
|    },
 | ||
|    "outputs": [
 | ||
|     {
 | ||
|      "name": "stdout",
 | ||
|      "output_type": "stream",
 | ||
|      "text": [
 | ||
|       "The conversation is about Octavia Butler. The AI describes her as an American science fiction author and mentions the\n",
 | ||
|       "FX series Kindred as a well-known adaptation of her work. The human then asks about her contemporaries, and the AI lists \n",
 | ||
|       "Ursula K. Le Guin, Samuel R. Delany, and Joanna Russ.\n",
 | ||
|       "\n",
 | ||
|       "\n",
 | ||
|       "{'role': 'human', 'content': 'What awards did she win?', 'uuid': '9fa75c3c-edae-41e3-b9bc-9fcf16b523c9', 'created_at': '2023-05-25T15:09:41.91662Z', 'token_count': 8}\n",
 | ||
|       "{'role': 'ai', 'content': 'Octavia Butler won the Hugo Award, the Nebula Award, and the MacArthur Fellowship.', 'uuid': 'def4636c-32cb-49ed-b671-32035a034712', 'created_at': '2023-05-25T15:09:41.919874Z', 'token_count': 21}\n",
 | ||
|       "{'role': 'human', 'content': 'Which other women sci-fi writers might I want to read?', 'uuid': '6e87bd4a-bc23-451e-ae36-05a140415270', 'created_at': '2023-05-25T15:09:41.923771Z', 'token_count': 14}\n",
 | ||
|       "{'role': 'ai', 'content': 'You might want to read Ursula K. Le Guin or Joanna Russ.', 'uuid': 'f65d8dde-9ee8-4983-9da6-ba789b7e8aa4', 'created_at': '2023-05-25T15:09:41.935254Z', 'token_count': 18}\n",
 | ||
|       "{'role': 'human', 'content': \"Write a short synopsis of Butler's book, Parable of the Sower. What is it about?\", 'uuid': '5678d056-7f05-4e70-b8e5-f85efa56db01', 'created_at': '2023-05-25T15:09:41.938974Z', 'token_count': 23}\n",
 | ||
|       "{'role': 'ai', 'content': 'Parable of the Sower is a science fiction novel by Octavia Butler, published in 1993. It follows the story of Lauren Olamina, a young woman living in a dystopian future where society has collapsed due to environmental disasters, poverty, and violence.', 'uuid': '50d64946-9239-4327-83e6-71dcbdd16198', 'created_at': '2023-05-25T15:09:41.957437Z', 'token_count': 56}\n",
 | ||
|       "{'role': 'human', 'content': \"WWhat is the book's relevance to the challenges facing contemporary society?\", 'uuid': 'a39cfc07-8858-480a-9026-fc47a8ef7001', 'created_at': '2023-05-25T15:09:50.469533Z', 'token_count': 16}\n",
 | ||
|       "{'role': 'ai', 'content': 'Parable of the Sower is a prescient novel that speaks to the challenges facing contemporary society, such as climate change, economic inequality, and the rise of authoritarianism. It is a cautionary tale that warns of the dangers of ignoring these issues and the importance of taking action to address them.', 'uuid': 'a4ecf0fe-fdd0-4aad-b72b-efde2e6830cc', 'created_at': '2023-05-25T15:09:50.473793Z', 'token_count': 62}\n"
 | ||
|      ]
 | ||
|     }
 | ||
|    ],
 | ||
|    "source": [
 | ||
|     "def print_messages(messages):\n",
 | ||
|     "    for m in messages:\n",
 | ||
|     "        print(m.to_dict())\n",
 | ||
|     "\n",
 | ||
|     "\n",
 | ||
|     "print(zep_chat_history.zep_summary)\n",
 | ||
|     "print(\"\\n\")\n",
 | ||
|     "print_messages(zep_chat_history.zep_messages)"
 | ||
|    ]
 | ||
|   },
 | ||
|   {
 | ||
|    "attachments": {},
 | ||
|    "cell_type": "markdown",
 | ||
|    "metadata": {},
 | ||
|    "source": [
 | ||
|     "### Vector search over the Zep memory\n",
 | ||
|     "\n",
 | ||
|     "Zep provides native vector search over historical conversation memory. Embedding happens automatically.\n"
 | ||
|    ]
 | ||
|   },
 | ||
|   {
 | ||
|    "cell_type": "code",
 | ||
|    "execution_count": 7,
 | ||
|    "metadata": {
 | ||
|     "ExecuteTime": {
 | ||
|      "end_time": "2023-05-25T15:09:50.751203Z",
 | ||
|      "start_time": "2023-05-25T15:09:50.495050Z"
 | ||
|     }
 | ||
|    },
 | ||
|    "outputs": [
 | ||
|     {
 | ||
|      "name": "stdout",
 | ||
|      "output_type": "stream",
 | ||
|      "text": [
 | ||
|       "{'uuid': '6e87bd4a-bc23-451e-ae36-05a140415270', 'created_at': '2023-05-25T15:09:41.923771Z', 'role': 'human', 'content': 'Which other women sci-fi writers might I want to read?', 'token_count': 14} 0.9118298949424545\n",
 | ||
|       "{'uuid': 'f65d8dde-9ee8-4983-9da6-ba789b7e8aa4', 'created_at': '2023-05-25T15:09:41.935254Z', 'role': 'ai', 'content': 'You might want to read Ursula K. Le Guin or Joanna Russ.', 'token_count': 18} 0.8533024416448016\n",
 | ||
|       "{'uuid': '52cfe3e8-b800-4dd8-a7dd-8e9e4764dfc8', 'created_at': '2023-05-25T15:09:41.913856Z', 'role': 'ai', 'content': \"Octavia Butler's contemporaries included Ursula K. Le Guin, Samuel R. Delany, and Joanna Russ.\", 'token_count': 27} 0.852352466457884\n",
 | ||
|       "{'uuid': 'd40da612-0867-4a43-92ec-778b86490a39', 'created_at': '2023-05-25T15:09:41.858543Z', 'role': 'human', 'content': 'Who was Octavia Butler?', 'token_count': 8} 0.8235468913583194\n",
 | ||
|       "{'uuid': '4fcfbce4-7bfa-44bd-879a-8cbf265bdcf9', 'created_at': '2023-05-25T15:09:41.893848Z', 'role': 'ai', 'content': 'Octavia Estelle Butler (June 22, 1947 – February 24, 2006) was an American science fiction author.', 'token_count': 31} 0.8204317130595353\n",
 | ||
|       "{'uuid': 'def4636c-32cb-49ed-b671-32035a034712', 'created_at': '2023-05-25T15:09:41.919874Z', 'role': 'ai', 'content': 'Octavia Butler won the Hugo Award, the Nebula Award, and the MacArthur Fellowship.', 'token_count': 21} 0.8196714827228725\n",
 | ||
|       "{'uuid': '862107de-8f6f-43c0-91fa-4441f01b2b3a', 'created_at': '2023-05-25T15:09:41.898149Z', 'role': 'human', 'content': 'Which books of hers were made into movies?', 'token_count': 11} 0.7954322970428519\n",
 | ||
|       "{'uuid': '97164506-90fe-4c71-9539-69ebcd1d90a2', 'created_at': '2023-05-25T15:09:41.90887Z', 'role': 'human', 'content': 'Who were her contemporaries?', 'token_count': 8} 0.7942531405021976\n",
 | ||
|       "{'uuid': '50d64946-9239-4327-83e6-71dcbdd16198', 'created_at': '2023-05-25T15:09:41.957437Z', 'role': 'ai', 'content': 'Parable of the Sower is a science fiction novel by Octavia Butler, published in 1993. It follows the story of Lauren Olamina, a young woman living in a dystopian future where society has collapsed due to environmental disasters, poverty, and violence.', 'token_count': 56} 0.78144769172694\n",
 | ||
|       "{'uuid': 'c460ffd4-0715-4c69-b793-1092054973e6', 'created_at': '2023-05-25T15:09:41.903082Z', 'role': 'ai', 'content': \"The most well-known adaptation of Octavia Butler's work is the FX series Kindred, based on her novel of the same name.\", 'token_count': 29} 0.7811962820699464\n"
 | ||
|      ]
 | ||
|     }
 | ||
|    ],
 | ||
|    "source": [
 | ||
|     "search_results = zep_chat_history.search(\"who are some famous women sci-fi authors?\")\n",
 | ||
|     "for r in search_results:\n",
 | ||
|     "    print(r.message, r.dist)"
 | ||
|    ]
 | ||
|   }
 | ||
|  ],
 | ||
|  "metadata": {
 | ||
|   "kernelspec": {
 | ||
|    "display_name": ".venv",
 | ||
|    "language": "python",
 | ||
|    "name": "python3"
 | ||
|   },
 | ||
|   "language_info": {
 | ||
|    "codemirror_mode": {
 | ||
|     "name": "ipython",
 | ||
|     "version": 3
 | ||
|    },
 | ||
|    "file_extension": ".py",
 | ||
|    "mimetype": "text/x-python",
 | ||
|    "name": "python",
 | ||
|    "nbconvert_exporter": "python",
 | ||
|    "pygments_lexer": "ipython3",
 | ||
|    "version": "3.11.3"
 | ||
|   },
 | ||
|   "orig_nbformat": 4
 | ||
|  },
 | ||
|  "nbformat": 4,
 | ||
|  "nbformat_minor": 2
 | ||
| }
 |