From e1ea1912377ca7c013e89fac4c1d26c0cb836009 Mon Sep 17 00:00:00 2001 From: Matt Wells Date: Wed, 6 Dec 2023 04:08:50 +0000 Subject: [PATCH] Demonstrate use of get_buffer_string (#13013) **Description** The docs for creating a RAG chain with Memory [currently use a manual lambda](https://python.langchain.com/docs/expression_language/cookbook/retrieval#with-memory-and-returning-source-documents) to format chat history messages. [There exists a helper method within the codebase](https://github.com/langchain-ai/langchain/blob/master/libs/langchain/langchain/schema/messages.py#L14C15-L14C15) to perform this task so I've updated the documentation to demonstrate its usage Also worth noting that the current documented method of using the included `_format_chat_history ` function actually results in an error: ``` TypeError: 'HumanMessage' object is not subscriptable ``` --------- Co-authored-by: Harrison Chase --- .../cookbook/retrieval.ipynb | 134 ++++++++++-------- 1 file changed, 73 insertions(+), 61 deletions(-) diff --git a/docs/docs/expression_language/cookbook/retrieval.ipynb b/docs/docs/expression_language/cookbook/retrieval.ipynb index 2740ef626a..aef5c1fb63 100644 --- a/docs/docs/expression_language/cookbook/retrieval.ipynb +++ b/docs/docs/expression_language/cookbook/retrieval.ipynb @@ -31,7 +31,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 1, "id": "33be32af", "metadata": {}, "outputs": [], @@ -48,7 +48,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 2, "id": "bfc47ec1", "metadata": {}, "outputs": [], @@ -70,7 +70,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 3, "id": "eae31755", "metadata": {}, "outputs": [], @@ -85,7 +85,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 4, "id": "f3040b0c", "metadata": {}, "outputs": [ @@ -95,7 +95,7 @@ "'Harrison worked at Kensho.'" ] }, - "execution_count": 5, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } @@ -106,7 +106,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 5, "id": "e1d20c7c", "metadata": {}, "outputs": [], @@ -134,7 +134,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 6, "id": "7ee8b2d4", "metadata": {}, "outputs": [ @@ -144,7 +144,7 @@ "'Harrison ha lavorato a Kensho.'" ] }, - "execution_count": 7, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } @@ -165,18 +165,20 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 21, "id": "3f30c348", "metadata": {}, "outputs": [], "source": [ "from langchain.schema import format_document\n", - "from langchain.schema.runnable import RunnableParallel" + "from langchain.schema.messages import get_buffer_string\n", + "from langchain.schema.runnable import RunnableParallel\n", + "from langchain_core.messages import AIMessage, HumanMessage" ] }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 8, "id": "64ab1dbf", "metadata": {}, "outputs": [], @@ -194,7 +196,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 9, "id": "7d628c97", "metadata": {}, "outputs": [], @@ -209,7 +211,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 10, "id": "f60a5d0f", "metadata": {}, "outputs": [], @@ -226,39 +228,14 @@ }, { "cell_type": "code", - "execution_count": 12, - "id": "7d007db6", - "metadata": {}, - "outputs": [], - "source": [ - "from typing import List, Tuple\n", - "\n", - "\n", - "def _format_chat_history(chat_history: List[Tuple[str, str]]) -> str:\n", - " # chat history is of format:\n", - " # [\n", - " # (human_message_str, ai_message_str),\n", - " # ...\n", - " # ]\n", - " # see below for an example of how it's invoked\n", - " buffer = \"\"\n", - " for dialogue_turn in chat_history:\n", - " human = \"Human: \" + dialogue_turn[0]\n", - " ai = \"Assistant: \" + dialogue_turn[1]\n", - " buffer += \"\\n\" + \"\\n\".join([human, ai])\n", - " return buffer" - ] - }, - { - "cell_type": "code", - "execution_count": 13, + "execution_count": 11, "id": "5c32cc89", "metadata": {}, "outputs": [], "source": [ "_inputs = RunnableParallel(\n", " standalone_question=RunnablePassthrough.assign(\n", - " chat_history=lambda x: _format_chat_history(x[\"chat_history\"])\n", + " chat_history=lambda x: get_buffer_string(x[\"chat_history\"])\n", " )\n", " | CONDENSE_QUESTION_PROMPT\n", " | ChatOpenAI(temperature=0)\n", @@ -273,17 +250,17 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 12, "id": "135c8205", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "AIMessage(content='Harrison was employed at Kensho.', additional_kwargs={}, example=False)" + "AIMessage(content='Harrison was employed at Kensho.')" ] }, - "execution_count": 14, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } @@ -299,17 +276,17 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 22, "id": "424e7e7a", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "AIMessage(content='Harrison worked at Kensho.', additional_kwargs={}, example=False)" + "AIMessage(content='Harrison worked at Kensho.')" ] }, - "execution_count": 15, + "execution_count": 22, "metadata": {}, "output_type": "execute_result" } @@ -318,7 +295,10 @@ "conversational_qa_chain.invoke(\n", " {\n", " \"question\": \"where did he work?\",\n", - " \"chat_history\": [(\"Who wrote this notebook?\", \"Harrison\")],\n", + " \"chat_history\": [\n", + " HumanMessage(content=\"Who wrote this notebook?\"),\n", + " AIMessage(content=\"Harrison\"),\n", + " ],\n", " }\n", ")" ] @@ -335,7 +315,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 14, "id": "e31dd17c", "metadata": {}, "outputs": [], @@ -347,7 +327,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 15, "id": "d4bffe94", "metadata": {}, "outputs": [], @@ -359,7 +339,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 16, "id": "733be985", "metadata": {}, "outputs": [], @@ -373,7 +353,7 @@ "standalone_question = {\n", " \"standalone_question\": {\n", " \"question\": lambda x: x[\"question\"],\n", - " \"chat_history\": lambda x: _format_chat_history(x[\"chat_history\"]),\n", + " \"chat_history\": lambda x: get_buffer_string(x[\"chat_history\"]),\n", " }\n", " | CONDENSE_QUESTION_PROMPT\n", " | ChatOpenAI(temperature=0)\n", @@ -400,18 +380,18 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 17, "id": "806e390c", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "{'answer': AIMessage(content='Harrison was employed at Kensho.', additional_kwargs={}, example=False),\n", - " 'docs': [Document(page_content='harrison worked at kensho', metadata={})]}" + "{'answer': AIMessage(content='Harrison was employed at Kensho.'),\n", + " 'docs': [Document(page_content='harrison worked at kensho')]}" ] }, - "execution_count": 19, + "execution_count": 17, "metadata": {}, "output_type": "execute_result" } @@ -424,7 +404,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 18, "id": "977399fd", "metadata": {}, "outputs": [], @@ -437,18 +417,18 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 19, "id": "f94f7de4", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "{'history': [HumanMessage(content='where did harrison work?', additional_kwargs={}, example=False),\n", - " AIMessage(content='Harrison was employed at Kensho.', additional_kwargs={}, example=False)]}" + "{'history': [HumanMessage(content='where did harrison work?'),\n", + " AIMessage(content='Harrison was employed at Kensho.')]}" ] }, - "execution_count": 21, + "execution_count": 19, "metadata": {}, "output_type": "execute_result" } @@ -456,6 +436,38 @@ "source": [ "memory.load_memory_variables({})" ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "88f2b7cd", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'answer': AIMessage(content='Harrison actually worked at Kensho.'),\n", + " 'docs': [Document(page_content='harrison worked at kensho')]}" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "inputs = {\"question\": \"but where did he really work?\"}\n", + "result = final_chain.invoke(inputs)\n", + "result" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "207a2782", + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { @@ -474,7 +486,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.1" + "version": "3.10.1" } }, "nbformat": 4,