From dd87275dde16d7b013cc82498d0c3cda4aa077fc Mon Sep 17 00:00:00 2001 From: William FH <13333726+hinthornw@users.noreply.github.com> Date: Tue, 25 Jul 2023 15:20:32 -0700 Subject: [PATCH] Add LLMChain example of memory with chat models (#8250) --- .../extras/modules/memory/adding_memory.ipynb | 195 ++++++++++++++++-- 1 file changed, 175 insertions(+), 20 deletions(-) diff --git a/docs/extras/modules/memory/adding_memory.ipynb b/docs/extras/modules/memory/adding_memory.ipynb index cbbe73bb92..e13d4c7031 100644 --- a/docs/extras/modules/memory/adding_memory.ipynb +++ b/docs/extras/modules/memory/adding_memory.ipynb @@ -3,22 +3,28 @@ { "cell_type": "markdown", "id": "00695447", - "metadata": {}, + "metadata": { + "tags": [] + }, "source": [ "# How to add Memory to an LLMChain\n", "\n", - "This notebook goes over how to use the Memory class with an LLMChain. For the purposes of this walkthrough, we will add the `ConversationBufferMemory` class, although this can be any memory class." + "This notebook goes over how to use the Memory class with an LLMChain. For the purposes of this walkthrough, we will add the [ConversationBufferMemory](https://api.python.langchain.com/en/latest/memory/langchain.memory.buffer.ConversationBufferMemory.html#langchain.memory.buffer.ConversationBufferMemory) class, although this can be any memory class." ] }, { "cell_type": "code", "execution_count": 1, "id": "9f1aaf47", - "metadata": {}, + "metadata": { + "tags": [] + }, "outputs": [], "source": [ + "from langchain.chains import LLMChain\n", + "from langchain.llms import OpenAI\n", "from langchain.memory import ConversationBufferMemory\n", - "from langchain import OpenAI, LLMChain, PromptTemplate" + "from langchain.prompts import PromptTemplate" ] }, { @@ -33,7 +39,9 @@ "cell_type": "code", "execution_count": 2, "id": "e5501eda", - "metadata": {}, + "metadata": { + "tags": [] + }, "outputs": [], "source": [ "template = \"\"\"You are a chatbot having a conversation with a human.\n", @@ -52,11 +60,14 @@ "cell_type": "code", "execution_count": 3, "id": "f6566275", - "metadata": {}, + "metadata": { + "tags": [] + }, "outputs": [], "source": [ + "llm = OpenAI()\n", "llm_chain = LLMChain(\n", - " llm=OpenAI(),\n", + " llm=llm,\n", " prompt=prompt,\n", " verbose=True,\n", " memory=memory,\n", @@ -67,7 +78,9 @@ "cell_type": "code", "execution_count": 4, "id": "e2b189dc", - "metadata": {}, + "metadata": { + "tags": [] + }, "outputs": [ { "name": "stdout", @@ -83,13 +96,13 @@ "Human: Hi there my friend\n", "Chatbot:\u001b[0m\n", "\n", - "\u001b[1m> Finished LLMChain chain.\u001b[0m\n" + "\u001b[1m> Finished chain.\u001b[0m\n" ] }, { "data": { "text/plain": [ - "' Hi there, how are you doing today?'" + "' Hi there! How can I help you today?'" ] }, "execution_count": 4, @@ -105,7 +118,9 @@ "cell_type": "code", "execution_count": 5, "id": "a902729f", - "metadata": {}, + "metadata": { + "tags": [] + }, "outputs": [ { "name": "stdout", @@ -117,19 +132,18 @@ "Prompt after formatting:\n", "\u001b[32;1m\u001b[1;3mYou are a chatbot having a conversation with a human.\n", "\n", - "\n", "Human: Hi there my friend\n", - "AI: Hi there, how are you doing today?\n", + "AI: Hi there! How can I help you today?\n", "Human: Not too bad - how are you?\n", "Chatbot:\u001b[0m\n", "\n", - "\u001b[1m> Finished LLMChain chain.\u001b[0m\n" + "\u001b[1m> Finished chain.\u001b[0m\n" ] }, { "data": { "text/plain": [ - "\" I'm doing great, thank you for asking!\"" + "\" I'm doing great, thanks for asking! How are you doing?\"" ] }, "execution_count": 5, @@ -142,12 +156,153 @@ ] }, { - "cell_type": "code", - "execution_count": null, - "id": "ae5309bb", + "cell_type": "markdown", + "id": "33978824-0048-4e75-9431-1b2c02c169b0", "metadata": {}, + "source": [ + "## Adding Memory to a Chat Model-based LLMChain\n", + "\n", + "The above works for completion-style `LLM`s, but if you are using a chat model, you will likely get better performance using structured chat messages. Below is an example." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "ae5309bb", + "metadata": { + "tags": [] + }, "outputs": [], - "source": [] + "source": [ + "from langchain.chat_models import ChatOpenAI\n", + "from langchain.schema import SystemMessage\n", + "from langchain.prompts import ChatPromptTemplate, HumanMessagePromptTemplate, MessagesPlaceholder" + ] + }, + { + "cell_type": "markdown", + "id": "a237bbb8-e448-4238-8420-004e046ef84e", + "metadata": {}, + "source": [ + "We will use the [ChatPromptTemplate](https://api.python.langchain.com/en/latest/prompts/langchain.prompts.chat.ChatPromptTemplate.html) class to set up the chat prompt.\n", + "\n", + "The [from_messages](https://api.python.langchain.com/en/latest/prompts/langchain.prompts.chat.ChatPromptTemplate.html#langchain.prompts.chat.ChatPromptTemplate.from_messages) method creates a ChatPromptTemplate from a list of messages (e.g., SystemMessage, HumanMessage, AIMessage, ChatMessage, etc.) or message templates, such as the [MessagesPlaceholder](https://api.python.langchain.com/en/latest/prompts/langchain.prompts.chat.MessagesPlaceholder.html#langchain.prompts.chat.MessagesPlaceholder) below.\n", + "\n", + "The configuration below makes it so the memory will be injected to the middle of the chat prompt, in the \"chat_history\" key, and the user's inputs will be added in a human/user message to the end of the chat prompt." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "9bb8cde1-67c2-4133-b453-5c34fb36ff74", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "prompt = ChatPromptTemplate.from_messages([\n", + " SystemMessage(content=\"You are a chatbot having a conversation with a human.\"), # The persistent system prompt\n", + " MessagesPlaceholder(variable_name=\"chat_history\"), # Where the memory will be stored.\n", + " HumanMessagePromptTemplate.from_template(\"{human_input}\"), # Where the human input will injectd\n", + "])\n", + " \n", + "memory = ConversationBufferMemory(memory_key=\"chat_history\", return_messages=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "9f77e466-a1a3-4c69-a001-ac5b7a40e219", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "llm = ChatOpenAI()\n", + "\n", + "chat_llm_chain = LLMChain(\n", + " llm=llm,\n", + " prompt=prompt,\n", + " verbose=True,\n", + " memory=memory,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "f9709647-be82-43d5-b076-2a7da344ce8a", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "\u001b[1m> Entering new LLMChain chain...\u001b[0m\n", + "Prompt after formatting:\n", + "\u001b[32;1m\u001b[1;3mSystem: You are a chatbot having a conversation with a human.\n", + "Human: Hi there my friend\u001b[0m\n", + "\n", + "\u001b[1m> Finished chain.\u001b[0m\n" + ] + }, + { + "data": { + "text/plain": [ + "'Hello! How can I assist you today, my friend?'" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "chat_llm_chain.predict(human_input=\"Hi there my friend\")" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "bdf04ebe-525a-4156-a3a7-65fd2df8d6fc", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "\u001b[1m> Entering new LLMChain chain...\u001b[0m\n", + "Prompt after formatting:\n", + "\u001b[32;1m\u001b[1;3mSystem: You are a chatbot having a conversation with a human.\n", + "Human: Hi there my friend\n", + "AI: Hello! How can I assist you today, my friend?\n", + "Human: Not too bad - how are you?\u001b[0m\n", + "\n", + "\u001b[1m> Finished chain.\u001b[0m\n" + ] + }, + { + "data": { + "text/plain": [ + "\"I'm an AI chatbot, so I don't have feelings, but I'm here to help and chat with you! Is there something specific you would like to talk about or any questions I can assist you with?\"" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "chat_llm_chain.predict(human_input=\"Not too bad - how are you?\")" + ] } ], "metadata": { @@ -166,7 +321,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.1" + "version": "3.11.2" } }, "nbformat": 4,