diff --git a/cookbook/basic_critique_revise.ipynb b/cookbook/basic_critique_revise.ipynb index c166890a89d0..65d26ec4ef63 100644 --- a/cookbook/basic_critique_revise.ipynb +++ b/cookbook/basic_critique_revise.ipynb @@ -1,321 +1,321 @@ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Basic Critique-Revise\n", - "\n", - "You can also run this notebook online [on Noteable.io](https://app.noteable.io/published/41cf4f55-bd8c-4b7f-b3d4-547d5e601960/basic_critique_revise).\n", - "\n", - "This is an basic example of correcting an LLM's output using a pattern called critique-revise, where we highlight what part of the output is wrong and re-query the LLM for a correction.\n", - "\n", - "In the below example, we define a Zod schema to match an array of tasks we want the LLM to compose for a given input. Take note that we expect the output tasks to match one of a defined set of types:" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "Deno.env.set(\"OPENAI_API_KEY\", \"\");\n", - "Deno.env.set(\"LANGCHAIN_API_KEY\", \"\");\n", - "Deno.env.set(\"LANGCHAIN_TRACING_V2\", \"true\");\n", - "\n", - "import { z } from \"npm:zod\";\n", - "\n", - "const zodSchema = z\n", - " .object({\n", - " tasks: z\n", - " .array(\n", - " z.object({\n", - " title: z\n", - " .string()\n", - " .describe(\"The title of the tasks, reminders and alerts\"),\n", - " due_date: z\n", - " .string()\n", - " .describe(\"Due date. Must be a valid ISO date string with timezone\"),\n", - " task_type: z\n", - " .enum([\n", - " \"Call\",\n", - " \"Message\",\n", - " \"Todo\",\n", - " \"In-Person Meeting\",\n", - " \"Email\",\n", - " \"Mail\",\n", - " \"Text\",\n", - " \"Open House\",\n", - " ])\n", - " .describe(\"The type of task\"),\n", - " })\n", - " )\n", - " .describe(\"The JSON for task, reminder or alert to create\"),\n", - " })\n", - " .describe(\"JSON definition for creating tasks, reminders and alerts\");\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We convert this Zod schema to JSON schema and bind it to an OpenAI model as a function. We also set the `function_call` argument so that the function will always be called and the LLM will always attempt to match its output to the provided schema, regardless of input:" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "import { zodToJsonSchema } from \"npm:zod-to-json-schema\";\n", - "\n", - "import { JsonOutputFunctionsParser } from \"npm:langchain@0.0.173/output_parsers\";\n", - "import { ChatOpenAI } from \"npm:langchain@0.0.173/chat_models/openai\";\n", - "import { PromptTemplate } from \"npm:langchain@0.0.173/prompts\";\n", - "\n", - "const functionSchema = {\n", - " name: \"task-scheduler\",\n", - " description: \"Schedules tasks\",\n", - " parameters: zodToJsonSchema(zodSchema)\n", - "};\n", - "\n", - "const template = `Respond to the following user query to the best of your ability:\n", - "\n", - "{query}`;\n", - "\n", - "const generatePrompt = PromptTemplate.fromTemplate(template);\n", - "\n", - "const taskFunctionCallModel = new ChatOpenAI({\n", - " temperature: 0,\n", - " modelName: \"gpt-3.5-turbo\",\n", - "}).bind({\n", - " functions: [functionSchema],\n", - " function_call: { name: \"task-scheduler\" },\n", - "});\n", - "\n", - "const generateChain = generatePrompt\n", - " .pipe(taskFunctionCallModel)\n", - " .pipe(new JsonOutputFunctionsParser()) \n", - " .withConfig({ runName: \"GenerateChain\" });" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Next, we invoke the chain on an input. We can see that despite the passed function schema, the model was influenced by the particular user input, and the the outputted task type does not match one of the defined types, and is instead `\"reminder\"`:" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ + "cells": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "{\n", - " tasks: [\n", - " {\n", - " title: \"Renew online property ads\",\n", - " due_date: \"next week\",\n", - " task_type: \"Reminder\"\n", - " }\n", - " ]\n", - "}\n" - ] - } - ], - "source": [ - "import { TraceGroup } from \"npm:langchain@0.0.173/callbacks\";\n", - "\n", - "const traceGroup = new TraceGroup(\"CritiqueReviseChain\");\n", - "const groupManager = await traceGroup.start();\n", - "\n", - "const userQuery = `Set a reminder to renew our online property ads next week.`;\n", - "\n", - "let result = await generateChain.invoke({\n", - " query: userQuery,\n", - "}, { callbacks: groupManager });\n", - "\n", - "console.log(result);" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We use our original Zod schema's `safeParse` method as a convenient validator to show this. It includes an error object summarizing the problem:" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Basic Critique-Revise\n", + "\n", + "You can also run this notebook online [on Noteable.io](https://app.noteable.io/published/41cf4f55-bd8c-4b7f-b3d4-547d5e601960/basic_critique_revise).\n", + "\n", + "This is an basic example of correcting an LLM's output using a pattern called critique-revise, where we highlight what part of the output is wrong and re-query the LLM for a correction.\n", + "\n", + "In the below example, we define a Zod schema to match an array of tasks we want the LLM to compose for a given input. Take note that we expect the output tasks to match one of a defined set of types:" + ] + }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "{\n", - " \"success\": false,\n", - " \"error\": {\n", - " \"issues\": [\n", - " {\n", - " \"received\": \"Reminder\",\n", - " \"code\": \"invalid_enum_value\",\n", - " \"options\": [\n", - " \"Call\",\n", - " \"Message\",\n", - " \"Todo\",\n", - " \"In-Person Meeting\",\n", - " \"Email\",\n", - " \"Mail\",\n", - " \"Text\",\n", - " \"Open House\"\n", - " ],\n", - " \"path\": [\n", - " \"tasks\",\n", - " 0,\n", - " \"task_type\"\n", - " ],\n", - " \"message\": \"Invalid enum value. Expected 'Call' | 'Message' | 'Todo' | 'In-Person Meeting' | 'Email' | 'Mail' | 'Text' | 'Open House', received 'Reminder'\"\n", - " }\n", - " ],\n", - " \"name\": \"ZodError\"\n", - " }\n", - "}\n" - ] - } - ], - "source": [ - "const outputValidator = (output: unknown) => zodSchema.safeParse(output);\n", - "\n", - "let validatorResult = outputValidator(result);\n", - "\n", - "console.log(JSON.stringify(validatorResult, null, 2));" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now, we define a revise chain that will attempt to fix the problem. We reuse the previously defined model with the bound function call arguments:" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "const reviseTemplate = `Original prompt:\n", - "--------------\n", - "{original_prompt}\n", - "--------------\n", - "\n", - "Completion:\n", - "--------------\n", - "{completion}\n", - "--------------\n", - "\n", - "Above, the completion did not satisfy the constraints given by the original prompt and provided schema.\n", - "\n", - "Error:\n", - "--------------\n", - "{error}\n", - "--------------\n", - "\n", - "Try again. Only respond with an answer that satisfies the constraints laid out in the original prompt and provided schema:`;\n", - "\n", - "const revisePrompt = PromptTemplate.fromTemplate(reviseTemplate);\n", - "\n", - "const reviseChain = revisePrompt\n", - " .pipe(taskFunctionCallModel)\n", - " .pipe(new JsonOutputFunctionsParser())\n", - " .withConfig({ runName: \"ReviseChain\" });" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And finally, we rerun the erroneous output with the original prompt, completion, and error message until it passes the validation successfully:" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "Deno.env.set(\"OPENAI_API_KEY\", \"\");\n", + "Deno.env.set(\"LANGCHAIN_API_KEY\", \"\");\n", + "Deno.env.set(\"LANGCHAIN_TRACING_V2\", \"true\");\n", + "\n", + "import { z } from \"npm:zod\";\n", + "\n", + "const zodSchema = z\n", + " .object({\n", + " tasks: z\n", + " .array(\n", + " z.object({\n", + " title: z\n", + " .string()\n", + " .describe(\"The title of the tasks, reminders and alerts\"),\n", + " due_date: z\n", + " .string()\n", + " .describe(\"Due date. Must be a valid ISO date string with timezone\"),\n", + " task_type: z\n", + " .enum([\n", + " \"Call\",\n", + " \"Message\",\n", + " \"Todo\",\n", + " \"In-Person Meeting\",\n", + " \"Email\",\n", + " \"Mail\",\n", + " \"Text\",\n", + " \"Open House\",\n", + " ])\n", + " .describe(\"The type of task\"),\n", + " })\n", + " )\n", + " .describe(\"The JSON for task, reminder or alert to create\"),\n", + " })\n", + " .describe(\"JSON definition for creating tasks, reminders and alerts\");\n" + ] + }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "{\n", - " \"success\": true,\n", - " \"data\": {\n", - " \"tasks\": [\n", - " {\n", - " \"title\": \"Renew online property ads\",\n", - " \"due_date\": \"next week\",\n", - " \"task_type\": \"Todo\"\n", - " }\n", - " ]\n", - " }\n", - "}\n" - ] + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We convert this Zod schema to JSON schema and bind it to an OpenAI model as a function. We also set the `function_call` argument so that the function will always be called and the LLM will always attempt to match its output to the provided schema, regardless of input:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "import { zodToJsonSchema } from \"npm:zod-to-json-schema\";\n", + "\n", + "import { JsonOutputFunctionsParser } from \"npm:langchain@0.0.173/output_parsers\";\n", + "import { ChatOpenAI } from \"npm:langchain@0.0.173/chat_models/openai\";\n", + "import { PromptTemplate } from \"npm:langchain@0.0.173/prompts\";\n", + "\n", + "const functionSchema = {\n", + " name: \"task-scheduler\",\n", + " description: \"Schedules tasks\",\n", + " parameters: zodToJsonSchema(zodSchema)\n", + "};\n", + "\n", + "const template = `Respond to the following user query to the best of your ability:\n", + "\n", + "{query}`;\n", + "\n", + "const generatePrompt = PromptTemplate.fromTemplate(template);\n", + "\n", + "const taskFunctionCallModel = new ChatOpenAI({\n", + " temperature: 0,\n", + " model: \"gpt-3.5-turbo\",\n", + "}).bind({\n", + " functions: [functionSchema],\n", + " function_call: { name: \"task-scheduler\" },\n", + "});\n", + "\n", + "const generateChain = generatePrompt\n", + " .pipe(taskFunctionCallModel)\n", + " .pipe(new JsonOutputFunctionsParser()) \n", + " .withConfig({ runName: \"GenerateChain\" });" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we invoke the chain on an input. We can see that despite the passed function schema, the model was influenced by the particular user input, and the the outputted task type does not match one of the defined types, and is instead `\"reminder\"`:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{\n", + " tasks: [\n", + " {\n", + " title: \"Renew online property ads\",\n", + " due_date: \"next week\",\n", + " task_type: \"Reminder\"\n", + " }\n", + " ]\n", + "}\n" + ] + } + ], + "source": [ + "import { TraceGroup } from \"npm:langchain@0.0.173/callbacks\";\n", + "\n", + "const traceGroup = new TraceGroup(\"CritiqueReviseChain\");\n", + "const groupManager = await traceGroup.start();\n", + "\n", + "const userQuery = `Set a reminder to renew our online property ads next week.`;\n", + "\n", + "let result = await generateChain.invoke({\n", + " query: userQuery,\n", + "}, { callbacks: groupManager });\n", + "\n", + "console.log(result);" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We use our original Zod schema's `safeParse` method as a convenient validator to show this. It includes an error object summarizing the problem:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{\n", + " \"success\": false,\n", + " \"error\": {\n", + " \"issues\": [\n", + " {\n", + " \"received\": \"Reminder\",\n", + " \"code\": \"invalid_enum_value\",\n", + " \"options\": [\n", + " \"Call\",\n", + " \"Message\",\n", + " \"Todo\",\n", + " \"In-Person Meeting\",\n", + " \"Email\",\n", + " \"Mail\",\n", + " \"Text\",\n", + " \"Open House\"\n", + " ],\n", + " \"path\": [\n", + " \"tasks\",\n", + " 0,\n", + " \"task_type\"\n", + " ],\n", + " \"message\": \"Invalid enum value. Expected 'Call' | 'Message' | 'Todo' | 'In-Person Meeting' | 'Email' | 'Mail' | 'Text' | 'Open House', received 'Reminder'\"\n", + " }\n", + " ],\n", + " \"name\": \"ZodError\"\n", + " }\n", + "}\n" + ] + } + ], + "source": [ + "const outputValidator = (output: unknown) => zodSchema.safeParse(output);\n", + "\n", + "let validatorResult = outputValidator(result);\n", + "\n", + "console.log(JSON.stringify(validatorResult, null, 2));" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now, we define a revise chain that will attempt to fix the problem. We reuse the previously defined model with the bound function call arguments:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "const reviseTemplate = `Original prompt:\n", + "--------------\n", + "{original_prompt}\n", + "--------------\n", + "\n", + "Completion:\n", + "--------------\n", + "{completion}\n", + "--------------\n", + "\n", + "Above, the completion did not satisfy the constraints given by the original prompt and provided schema.\n", + "\n", + "Error:\n", + "--------------\n", + "{error}\n", + "--------------\n", + "\n", + "Try again. Only respond with an answer that satisfies the constraints laid out in the original prompt and provided schema:`;\n", + "\n", + "const revisePrompt = PromptTemplate.fromTemplate(reviseTemplate);\n", + "\n", + "const reviseChain = revisePrompt\n", + " .pipe(taskFunctionCallModel)\n", + " .pipe(new JsonOutputFunctionsParser())\n", + " .withConfig({ runName: \"ReviseChain\" });" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And finally, we rerun the erroneous output with the original prompt, completion, and error message until it passes the validation successfully:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{\n", + " \"success\": true,\n", + " \"data\": {\n", + " \"tasks\": [\n", + " {\n", + " \"title\": \"Renew online property ads\",\n", + " \"due_date\": \"next week\",\n", + " \"task_type\": \"Todo\"\n", + " }\n", + " ]\n", + " }\n", + "}\n" + ] + } + ], + "source": [ + "let fixCount = 0;\n", + "\n", + "const formattedOriginalPrompt = await generatePrompt.format({\n", + " query: userQuery\n", + "});\n", + "\n", + "try {\n", + " while (!validatorResult.success && fixCount < 5) {\n", + " result = await reviseChain.invoke({\n", + " original_prompt: formattedOriginalPrompt,\n", + " completion: JSON.stringify(result),\n", + " error: JSON.stringify(validatorResult.error),\n", + " }, { callbacks: groupManager });\n", + " validatorResult = outputValidator(result);\n", + " fixCount++;\n", + " }\n", + "} finally {\n", + " await traceGroup.end();\n", + "}\n", + "\n", + "console.log(JSON.stringify(validatorResult, null, 2));" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can see an example LangSmith trace of the full chain here: https://smith.langchain.com/public/967974dd-ac6c-42a2-8796-da84589d06a5/r" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Deno", + "language": "typescript", + "name": "deno" + }, + "language_info": { + "file_extension": ".ts", + "mimetype": "text/x.typescript", + "name": "typescript", + "nb_converter": "script", + "pygments_lexer": "typescript", + "version": "5.2.2" } - ], - "source": [ - "let fixCount = 0;\n", - "\n", - "const formattedOriginalPrompt = await generatePrompt.format({\n", - " query: userQuery\n", - "});\n", - "\n", - "try {\n", - " while (!validatorResult.success && fixCount < 5) {\n", - " result = await reviseChain.invoke({\n", - " original_prompt: formattedOriginalPrompt,\n", - " completion: JSON.stringify(result),\n", - " error: JSON.stringify(validatorResult.error),\n", - " }, { callbacks: groupManager });\n", - " validatorResult = outputValidator(result);\n", - " fixCount++;\n", - " }\n", - "} finally {\n", - " await traceGroup.end();\n", - "}\n", - "\n", - "console.log(JSON.stringify(validatorResult, null, 2));" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "You can see an example LangSmith trace of the full chain here: https://smith.langchain.com/public/967974dd-ac6c-42a2-8796-da84589d06a5/r" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Deno", - "language": "typescript", - "name": "deno" }, - "language_info": { - "file_extension": ".ts", - "mimetype": "text/x.typescript", - "name": "typescript", - "nb_converter": "script", - "pygments_lexer": "typescript", - "version": "5.2.2" - } - }, - "nbformat": 4, - "nbformat_minor": 2 + "nbformat": 4, + "nbformat_minor": 2 } diff --git a/cookbook/function_calling_fireworks.ipynb b/cookbook/function_calling_fireworks.ipynb index cc176b83edf2..5d3a78a0a10f 100644 --- a/cookbook/function_calling_fireworks.ipynb +++ b/cookbook/function_calling_fireworks.ipynb @@ -1,425 +1,425 @@ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Fireworks and LangChain tools\n", - "\n", - "We want to build some basic agents that ties a bunch of tools defined in LangChain together. We will use a Fireworks open source model, `firefunction-v1`, to power this tutorial. We will now define some LangChain tools and use them with `ChatFireworks`.\n", - "\n", - "You'll also need to set an environment variable in the project root called `FIREWORKS_API_KEY` with your Fireworks key." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import { ChatFireworks } from \"@langchain/community/chat_models/fireworks\";" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "/** Define the chat model */\n", - "const llm = new ChatFireworks({\n", - " modelName: \"accounts/fireworks/models/firefunction-v1\",\n", - " temperature: 0,\n", - "});" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We'll define two tools to start:\n", - "\n", - "- `search_answer`, whenever we are not sure if the bot should answer the question or not\n", - "- `get_stock_price`, whenever we are feeling lucky and want to check what the stock price is\n", - "\n", - "These will be stubbed out, and are just for defining output schemas for the models." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "import { z } from \"zod\";\n", - "import { StructuredTool } from \"@langchain/core/tools\";\n", - "import { formatToOpenAITool } from \"@langchain/openai\";\n", - "\n", - "class SearchAnswer extends StructuredTool {\n", - " name = \"search_answer\";\n", - " \n", - " description = \"Search online for an answer only when you are not confident with the answer.\";\n", - "\n", - " schema = z.object({\n", - " query: z.string().describe(\"Query to use for the search engine.\"),\n", - " });\n", - "\n", - " constructor() {\n", - " super();\n", - " }\n", - "\n", - " _call(input: z.infer): Promise {\n", - " return Promise.resolve(JSON.stringify(input, null, 2));\n", - " }\n", - "}\n", - "\n", - "class GetStockPrice extends StructuredTool {\n", - " name = \"get_stock_price\";\n", - " \n", - " description = \"Get the stock price for a company.\";\n", - "\n", - " schema = z.object({\n", - " ticker: z.string().describe(\"Ticker for the company we are interested in.\"),\n", - " });\n", - "\n", - " constructor() {\n", - " super();\n", - " }\n", - "\n", - " _call(input: z.infer): Promise {\n", - " return Promise.resolve(JSON.stringify(input, null, 2));\n", - " }\n", - "}\n", - "\n", - "const searchTool = formatToOpenAITool(new SearchAnswer());\n", - "const stockTool = formatToOpenAITool(new GetStockPrice());\n", - "const tools1 = [searchTool, stockTool];" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "First, we will just ask some basic question for the model, and see if it knows to give an answer on the spot or not" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ + "cells": [ { - "data": { - "text/plain": [ - "AIMessage {\n", - " lc_serializable: \u001b[33mtrue\u001b[39m,\n", - " lc_kwargs: {\n", - " content: \u001b[32m\"Yosemite is a national park located in California, United States. It is known for its stunning natur\"\u001b[39m... 65 more characters,\n", - " additional_kwargs: { function_call: \u001b[90mundefined\u001b[39m, tool_calls: \u001b[90mundefined\u001b[39m }\n", - " },\n", - " lc_namespace: [ \u001b[32m\"langchain_core\"\u001b[39m, \u001b[32m\"messages\"\u001b[39m ],\n", - " content: \u001b[32m\"Yosemite is a national park located in California, United States. It is known for its stunning natur\"\u001b[39m... 65 more characters,\n", - " name: \u001b[90mundefined\u001b[39m,\n", - " additional_kwargs: { function_call: \u001b[90mundefined\u001b[39m, tool_calls: \u001b[90mundefined\u001b[39m }\n", - "}" + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Fireworks and LangChain tools\n", + "\n", + "We want to build some basic agents that ties a bunch of tools defined in LangChain together. We will use a Fireworks open source model, `firefunction-v1`, to power this tutorial. We will now define some LangChain tools and use them with `ChatFireworks`.\n", + "\n", + "You'll also need to set an environment variable in the project root called `FIREWORKS_API_KEY` with your Fireworks key." ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "const llmWithTool1 = llm.bind({\n", - " tools: tools1,\n", - "});\n", - "\n", - "const exampleQ = `What's Yosemite?`;\n", - "\n", - "await llmWithTool1.invoke(exampleQ);" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "So for an easy question, the model just gave a reply on the spot.\n", - "\n", - "Now let's ask the model something it definitely doesn't know. We just had the superbowl a few days ago, does the model knows to go to the search engine instead of hallucinate some random answer?" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ + }, { - "data": { - "text/plain": [ - "AIMessage {\n", - " lc_serializable: \u001b[33mtrue\u001b[39m,\n", - " lc_kwargs: {\n", - " content: \u001b[32m\"I don't have the information about the Superbowl winner for 2024. Let me search online for the answe\"\u001b[39m... 3 more characters,\n", - " additional_kwargs: {\n", - " function_call: \u001b[90mundefined\u001b[39m,\n", - " tool_calls: [\n", - " {\n", - " index: \u001b[33m0\u001b[39m,\n", - " id: \u001b[32m\"call_UhF6svmfhptOyzGhtpl9naZM\"\u001b[39m,\n", - " type: \u001b[32m\"function\"\u001b[39m,\n", - " function: \u001b[36m[Object]\u001b[39m\n", - " }\n", - " ]\n", - " }\n", - " },\n", - " lc_namespace: [ \u001b[32m\"langchain_core\"\u001b[39m, \u001b[32m\"messages\"\u001b[39m ],\n", - " content: \u001b[32m\"I don't have the information about the Superbowl winner for 2024. Let me search online for the answe\"\u001b[39m... 3 more characters,\n", - " name: \u001b[90mundefined\u001b[39m,\n", - " additional_kwargs: {\n", - " function_call: \u001b[90mundefined\u001b[39m,\n", - " tool_calls: [\n", - " {\n", - " index: \u001b[33m0\u001b[39m,\n", - " id: \u001b[32m\"call_UhF6svmfhptOyzGhtpl9naZM\"\u001b[39m,\n", - " type: \u001b[32m\"function\"\u001b[39m,\n", - " function: {\n", - " name: \u001b[32m\"search_answer\"\u001b[39m,\n", - " arguments: \u001b[32m'{\"query\": \"Superbowl winner 2024\"}'\u001b[39m\n", - " }\n", - " }\n", - " ]\n", - " }\n", - "}" + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import { ChatFireworks } from \"@langchain/community/chat_models/fireworks\";" ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "const llmWithTool1 = llm.bind({\n", - " tools: tools1,\n", - "});\n", - "\n", - "const exampleQ = `Which team won the superbowl in 2024?`;\n", - "\n", - "await llmWithTool1.invoke(exampleQ);" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The model didn't hallucinate and went for the search engine instead! Pretty cool right?\n", - "\n", - "Now we are feeling lucky, let's see if the model can give us some price movements for Nvidia." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ + }, { - "data": { - "text/plain": [ - "AIMessage {\n", - " lc_serializable: \u001b[33mtrue\u001b[39m,\n", - " lc_kwargs: {\n", - " content: \u001b[32m\"\"\u001b[39m,\n", - " additional_kwargs: {\n", - " function_call: \u001b[90mundefined\u001b[39m,\n", - " tool_calls: [\n", - " {\n", - " index: \u001b[33m0\u001b[39m,\n", - " id: \u001b[32m\"call_prIjt4RVmTRuApUChJfJG6eI\"\u001b[39m,\n", - " type: \u001b[32m\"function\"\u001b[39m,\n", - " function: \u001b[36m[Object]\u001b[39m\n", - " }\n", - " ]\n", - " }\n", - " },\n", - " lc_namespace: [ \u001b[32m\"langchain_core\"\u001b[39m, \u001b[32m\"messages\"\u001b[39m ],\n", - " content: \u001b[32m\"\"\u001b[39m,\n", - " name: \u001b[90mundefined\u001b[39m,\n", - " additional_kwargs: {\n", - " function_call: \u001b[90mundefined\u001b[39m,\n", - " tool_calls: [\n", - " {\n", - " index: \u001b[33m0\u001b[39m,\n", - " id: \u001b[32m\"call_prIjt4RVmTRuApUChJfJG6eI\"\u001b[39m,\n", - " type: \u001b[32m\"function\"\u001b[39m,\n", - " function: { name: \u001b[32m\"get_stock_price\"\u001b[39m, arguments: \u001b[32m'{\"ticker\": \"NVDA\"}'\u001b[39m }\n", - " }\n", - " ]\n", - " }\n", - "}" + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "/** Define the chat model */\n", + "const llm = new ChatFireworks({\n", + " model: \"accounts/fireworks/models/firefunction-v1\",\n", + " temperature: 0,\n", + "});" ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "const llmWithTool1 = llm.bind({\n", - " tools: tools1,\n", - "});\n", - "\n", - "const exampleQ = `What is the price of Nvidia shares now?`;\n", - "\n", - "await llmWithTool1.invoke(exampleQ);" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Looks like the model knows Nvidia's ticker is NVDA, and also understand the concept of the ticker.\n", - "\n", - "Now the final experiment, we want to make some doodles that are LangChain and Fireworks related.\n", - "\n", - "We can force the LLM to call our image tool, then create a chain that invokes the tool we declared. Let's see how that goes:" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "function _arrayBufferToBase64(buffer) {\n", - " let binary = '';\n", - " let bytes = new Uint8Array(buffer);\n", - " let len = bytes.byteLength;\n", - " for (let i = 0; i < len; i++) {\n", - " binary += String.fromCharCode( bytes[ i ] );\n", - " }\n", - " return window.btoa(binary);\n", - "}\n", - "\n", - "class GenerateImage extends StructuredTool {\n", - " name = \"generate_image\";\n", - " \n", - " description = \"Pass an image description to an AI to generate an image.\";\n", - "\n", - " schema = z.object({\n", - " detailed_description: z.string().describe(\"A very detailed description for the image.\"),\n", - " });\n", - "\n", - " constructor() {\n", - " super();\n", - " }\n", - "\n", - " async _call(input: z.infer): Promise {\n", - " const response = await fetch(\n", - " \"https://api.fireworks.ai/inference/v1/image_generation/accounts/fireworks/models/stable-diffusion-xl-1024-v1-0\",\n", - " {\n", - " headers: {\n", - " \"Authorization\": `Bearer ${process.env.FIREWORKS_API_KEY}`,\n", - " \"Accept\": \"image/jpeg\",\n", - " \"Content-Type\": \"application/json\",\n", - " },\n", - " method: \"POST\",\n", - " body: JSON.stringify({ prompt: input.detailed_description })\n", - " }\n", - " );\n", - " // Buffer is not available in Deno, otherwise this would be easier\n", - " const buffer = await response.arrayBuffer();\n", - " return _arrayBufferToBase64(buffer);\n", - " }\n", - "}" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "import { JsonOutputToolsParser } from \"langchain/output_parsers\";\n", - "import { RunnableSequence } from \"@langchain/core/runnables\";\n", - "\n", - "const generateImageTool = new GenerateImage();\n", - "\n", - "const llmWithTool1 = llm.bind({\n", - " tools: [formatToOpenAITool(generateImageTool)],\n", - " tool_choice: {\n", - " type: \"function\",\n", - " name: \"generate_image\",\n", - " }\n", - "});\n", - "\n", - "const exampleQ = `Give me an image with a bird with fireworks in the background?`;\n", - "\n", - "// We can pipe the called tool into a chain to generate an image with the result\n", - "const toolChain = RunnableSequence.from([\n", - " llmWithTool1,\n", - " new JsonOutputToolsParser(),\n", - " (toolInvocation) => toolInvocation[0].args,\n", - " generateImageTool,\n", - "]);\n", - "\n", - "const imageBase64 = await toolChain.invoke(exampleQ);\n", - "\n", - "console.log(\"Generated image!\");" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And here is the generated image with Fireworks SDXL API based on the query generated by the tool!" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We'll define two tools to start:\n", + "\n", + "- `search_answer`, whenever we are not sure if the bot should answer the question or not\n", + "- `get_stock_price`, whenever we are feeling lucky and want to check what the stock price is\n", + "\n", + "These will be stubbed out, and are just for defining output schemas for the models." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "import { z } from \"zod\";\n", + "import { StructuredTool } from \"@langchain/core/tools\";\n", + "import { formatToOpenAITool } from \"@langchain/openai\";\n", + "\n", + "class SearchAnswer extends StructuredTool {\n", + " name = \"search_answer\";\n", + " \n", + " description = \"Search online for an answer only when you are not confident with the answer.\";\n", + "\n", + " schema = z.object({\n", + " query: z.string().describe(\"Query to use for the search engine.\"),\n", + " });\n", + "\n", + " constructor() {\n", + " super();\n", + " }\n", + "\n", + " _call(input: z.infer): Promise {\n", + " return Promise.resolve(JSON.stringify(input, null, 2));\n", + " }\n", + "}\n", + "\n", + "class GetStockPrice extends StructuredTool {\n", + " name = \"get_stock_price\";\n", + " \n", + " description = \"Get the stock price for a company.\";\n", + "\n", + " schema = z.object({\n", + " ticker: z.string().describe(\"Ticker for the company we are interested in.\"),\n", + " });\n", + "\n", + " constructor() {\n", + " super();\n", + " }\n", + "\n", + " _call(input: z.infer): Promise {\n", + " return Promise.resolve(JSON.stringify(input, null, 2));\n", + " }\n", + "}\n", + "\n", + "const searchTool = formatToOpenAITool(new SearchAnswer());\n", + "const stockTool = formatToOpenAITool(new GetStockPrice());\n", + "const tools1 = [searchTool, stockTool];" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "First, we will just ask some basic question for the model, and see if it knows to give an answer on the spot or not" + ] + }, { - "data": { - "image/jpeg": "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" - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "AIMessage {\n", + " lc_serializable: \u001b[33mtrue\u001b[39m,\n", + " lc_kwargs: {\n", + " content: \u001b[32m\"Yosemite is a national park located in California, United States. It is known for its stunning natur\"\u001b[39m... 65 more characters,\n", + " additional_kwargs: { function_call: \u001b[90mundefined\u001b[39m, tool_calls: \u001b[90mundefined\u001b[39m }\n", + " },\n", + " lc_namespace: [ \u001b[32m\"langchain_core\"\u001b[39m, \u001b[32m\"messages\"\u001b[39m ],\n", + " content: \u001b[32m\"Yosemite is a national park located in California, United States. It is known for its stunning natur\"\u001b[39m... 65 more characters,\n", + " name: \u001b[90mundefined\u001b[39m,\n", + " additional_kwargs: { function_call: \u001b[90mundefined\u001b[39m, tool_calls: \u001b[90mundefined\u001b[39m }\n", + "}" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "const llmWithTool1 = llm.bind({\n", + " tools: tools1,\n", + "});\n", + "\n", + "const exampleQ = `What's Yosemite?`;\n", + "\n", + "await llmWithTool1.invoke(exampleQ);" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "So for an easy question, the model just gave a reply on the spot.\n", + "\n", + "Now let's ask the model something it definitely doesn't know. We just had the superbowl a few days ago, does the model knows to go to the search engine instead of hallucinate some random answer?" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "AIMessage {\n", + " lc_serializable: \u001b[33mtrue\u001b[39m,\n", + " lc_kwargs: {\n", + " content: \u001b[32m\"I don't have the information about the Superbowl winner for 2024. Let me search online for the answe\"\u001b[39m... 3 more characters,\n", + " additional_kwargs: {\n", + " function_call: \u001b[90mundefined\u001b[39m,\n", + " tool_calls: [\n", + " {\n", + " index: \u001b[33m0\u001b[39m,\n", + " id: \u001b[32m\"call_UhF6svmfhptOyzGhtpl9naZM\"\u001b[39m,\n", + " type: \u001b[32m\"function\"\u001b[39m,\n", + " function: \u001b[36m[Object]\u001b[39m\n", + " }\n", + " ]\n", + " }\n", + " },\n", + " lc_namespace: [ \u001b[32m\"langchain_core\"\u001b[39m, \u001b[32m\"messages\"\u001b[39m ],\n", + " content: \u001b[32m\"I don't have the information about the Superbowl winner for 2024. Let me search online for the answe\"\u001b[39m... 3 more characters,\n", + " name: \u001b[90mundefined\u001b[39m,\n", + " additional_kwargs: {\n", + " function_call: \u001b[90mundefined\u001b[39m,\n", + " tool_calls: [\n", + " {\n", + " index: \u001b[33m0\u001b[39m,\n", + " id: \u001b[32m\"call_UhF6svmfhptOyzGhtpl9naZM\"\u001b[39m,\n", + " type: \u001b[32m\"function\"\u001b[39m,\n", + " function: {\n", + " name: \u001b[32m\"search_answer\"\u001b[39m,\n", + " arguments: \u001b[32m'{\"query\": \"Superbowl winner 2024\"}'\u001b[39m\n", + " }\n", + " }\n", + " ]\n", + " }\n", + "}" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "const llmWithTool1 = llm.bind({\n", + " tools: tools1,\n", + "});\n", + "\n", + "const exampleQ = `Which team won the superbowl in 2024?`;\n", + "\n", + "await llmWithTool1.invoke(exampleQ);" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The model didn't hallucinate and went for the search engine instead! Pretty cool right?\n", + "\n", + "Now we are feeling lucky, let's see if the model can give us some price movements for Nvidia." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "AIMessage {\n", + " lc_serializable: \u001b[33mtrue\u001b[39m,\n", + " lc_kwargs: {\n", + " content: \u001b[32m\"\"\u001b[39m,\n", + " additional_kwargs: {\n", + " function_call: \u001b[90mundefined\u001b[39m,\n", + " tool_calls: [\n", + " {\n", + " index: \u001b[33m0\u001b[39m,\n", + " id: \u001b[32m\"call_prIjt4RVmTRuApUChJfJG6eI\"\u001b[39m,\n", + " type: \u001b[32m\"function\"\u001b[39m,\n", + " function: \u001b[36m[Object]\u001b[39m\n", + " }\n", + " ]\n", + " }\n", + " },\n", + " lc_namespace: [ \u001b[32m\"langchain_core\"\u001b[39m, \u001b[32m\"messages\"\u001b[39m ],\n", + " content: \u001b[32m\"\"\u001b[39m,\n", + " name: \u001b[90mundefined\u001b[39m,\n", + " additional_kwargs: {\n", + " function_call: \u001b[90mundefined\u001b[39m,\n", + " tool_calls: [\n", + " {\n", + " index: \u001b[33m0\u001b[39m,\n", + " id: \u001b[32m\"call_prIjt4RVmTRuApUChJfJG6eI\"\u001b[39m,\n", + " type: \u001b[32m\"function\"\u001b[39m,\n", + " function: { name: \u001b[32m\"get_stock_price\"\u001b[39m, arguments: \u001b[32m'{\"ticker\": \"NVDA\"}'\u001b[39m }\n", + " }\n", + " ]\n", + " }\n", + "}" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "const llmWithTool1 = llm.bind({\n", + " tools: tools1,\n", + "});\n", + "\n", + "const exampleQ = `What is the price of Nvidia shares now?`;\n", + "\n", + "await llmWithTool1.invoke(exampleQ);" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Looks like the model knows Nvidia's ticker is NVDA, and also understand the concept of the ticker.\n", + "\n", + "Now the final experiment, we want to make some doodles that are LangChain and Fireworks related.\n", + "\n", + "We can force the LLM to call our image tool, then create a chain that invokes the tool we declared. Let's see how that goes:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "function _arrayBufferToBase64(buffer) {\n", + " let binary = '';\n", + " let bytes = new Uint8Array(buffer);\n", + " let len = bytes.byteLength;\n", + " for (let i = 0; i < len; i++) {\n", + " binary += String.fromCharCode( bytes[ i ] );\n", + " }\n", + " return window.btoa(binary);\n", + "}\n", + "\n", + "class GenerateImage extends StructuredTool {\n", + " name = \"generate_image\";\n", + " \n", + " description = \"Pass an image description to an AI to generate an image.\";\n", + "\n", + " schema = z.object({\n", + " detailed_description: z.string().describe(\"A very detailed description for the image.\"),\n", + " });\n", + "\n", + " constructor() {\n", + " super();\n", + " }\n", + "\n", + " async _call(input: z.infer): Promise {\n", + " const response = await fetch(\n", + " \"https://api.fireworks.ai/inference/v1/image_generation/accounts/fireworks/models/stable-diffusion-xl-1024-v1-0\",\n", + " {\n", + " headers: {\n", + " \"Authorization\": `Bearer ${process.env.FIREWORKS_API_KEY}`,\n", + " \"Accept\": \"image/jpeg\",\n", + " \"Content-Type\": \"application/json\",\n", + " },\n", + " method: \"POST\",\n", + " body: JSON.stringify({ prompt: input.detailed_description })\n", + " }\n", + " );\n", + " // Buffer is not available in Deno, otherwise this would be easier\n", + " const buffer = await response.arrayBuffer();\n", + " return _arrayBufferToBase64(buffer);\n", + " }\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "import { JsonOutputToolsParser } from \"langchain/output_parsers\";\n", + "import { RunnableSequence } from \"@langchain/core/runnables\";\n", + "\n", + "const generateImageTool = new GenerateImage();\n", + "\n", + "const llmWithTool1 = llm.bind({\n", + " tools: [formatToOpenAITool(generateImageTool)],\n", + " tool_choice: {\n", + " type: \"function\",\n", + " name: \"generate_image\",\n", + " }\n", + "});\n", + "\n", + "const exampleQ = `Give me an image with a bird with fireworks in the background?`;\n", + "\n", + "// We can pipe the called tool into a chain to generate an image with the result\n", + "const toolChain = RunnableSequence.from([\n", + " llmWithTool1,\n", + " new JsonOutputToolsParser(),\n", + " (toolInvocation) => toolInvocation[0].args,\n", + " generateImageTool,\n", + "]);\n", + "\n", + "const imageBase64 = await toolChain.invoke(exampleQ);\n", + "\n", + "console.log(\"Generated image!\");" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And here is the generated image with Fireworks SDXL API based on the query generated by the tool!" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "image/jpeg": "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" + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "{\n", + " [Symbol.for(\"Jupyter.display\")]() {\n", + " return {\n", + " \"image/jpeg\": imageBase64\n", + " }\n", + " }\n", + "}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We would love to hear your feedback if you run into any issues with the model, or any integration issues with Fireworks and LangChain, so check out https://fireworks.ai, and ping us on Discord if you find any issues." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Deno", + "language": "typescript", + "name": "deno" + }, + "language_info": { + "file_extension": ".ts", + "mimetype": "text/x.typescript", + "name": "typescript", + "nb_converter": "script", + "pygments_lexer": "typescript", + "version": "5.3.3" } - ], - "source": [ - "{\n", - " [Symbol.for(\"Jupyter.display\")]() {\n", - " return {\n", - " \"image/jpeg\": imageBase64\n", - " }\n", - " }\n", - "}" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We would love to hear your feedback if you run into any issues with the model, or any integration issues with Fireworks and LangChain, so check out https://fireworks.ai, and ping us on Discord if you find any issues." - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Deno", - "language": "typescript", - "name": "deno" }, - "language_info": { - "file_extension": ".ts", - "mimetype": "text/x.typescript", - "name": "typescript", - "nb_converter": "script", - "pygments_lexer": "typescript", - "version": "5.3.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 + "nbformat": 4, + "nbformat_minor": 2 } diff --git a/cookbook/openai_vision_multimodal.ipynb b/cookbook/openai_vision_multimodal.ipynb index b38df91b38d4..8958fc1cc6a8 100644 --- a/cookbook/openai_vision_multimodal.ipynb +++ b/cookbook/openai_vision_multimodal.ipynb @@ -1,182 +1,182 @@ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Multimodal Messages with OpenAI Vision\n", - "\n", - "**Note:** This feature is currently in preview and only available on `rc` branches, starting with `0.0.182-rc.0`. The message schema may change in future releases.\n", - "\n", - "OpenAI supports interleaving images with text in input messages with their `gpt-4-vision-preview`. Here's an example of how this looks:" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ + "cells": [ { - "data": { - "text/plain": [ - "AIMessage {\n", - " lc_serializable: \u001b[33mtrue\u001b[39m,\n", - " lc_kwargs: {\n", - " content: \u001b[32m'The image says \"LangChain\". It includes a graphic of a parrot on the left, two interlinked rings (or'\u001b[39m... 105 more characters,\n", - " additional_kwargs: { function_call: \u001b[90mundefined\u001b[39m, tool_calls: \u001b[90mundefined\u001b[39m }\n", - " },\n", - " lc_namespace: [ \u001b[32m\"langchain\"\u001b[39m, \u001b[32m\"schema\"\u001b[39m ],\n", - " content: \u001b[32m'The image says \"LangChain\". It includes a graphic of a parrot on the left, two interlinked rings (or'\u001b[39m... 105 more characters,\n", - " name: \u001b[90mundefined\u001b[39m,\n", - " additional_kwargs: { function_call: \u001b[90mundefined\u001b[39m, tool_calls: \u001b[90mundefined\u001b[39m }\n", - "}" + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Multimodal Messages with OpenAI Vision\n", + "\n", + "**Note:** This feature is currently in preview and only available on `rc` branches, starting with `0.0.182-rc.0`. The message schema may change in future releases.\n", + "\n", + "OpenAI supports interleaving images with text in input messages with their `gpt-4-vision-preview`. Here's an example of how this looks:" ] - }, - "execution_count": 1, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "// Deno.env.set(\"OPENAI_API_KEY\", \"\");\n", - "\n", - "import { ChatOpenAI } from \"npm:langchain@0.0.185/chat_models/openai\";\n", - "import { HumanMessage } from \"npm:langchain@0.0.185/schema\";\n", - "\n", - "const chat = new ChatOpenAI({\n", - " modelName: \"gpt-4-vision-preview\",\n", - " maxTokens: 1024,\n", - "});\n", - "\n", - "// Messages can now take an array of content in addition to a string\n", - "const hostedImageMessage = new HumanMessage({\n", - " content: [\n", - " {\n", - " type: \"text\",\n", - " text: \"What does this image say?\",\n", - " },\n", - " {\n", - " type: \"image_url\",\n", - " image_url:\n", - " \"https://www.freecodecamp.org/news/content/images/2023/05/Screenshot-2023-05-29-at-5.40.38-PM.png\",\n", - " },\n", - " ],\n", - "});\n", - "\n", - "await chat.invoke([hostedImageMessage]);" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "You can also construct `ChatPromptTemplate`s with these multimodal messages to create chains:" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ + }, { - "data": { - "text/plain": [ - "\u001b[32m`Arrr, matey! The image be showin' the text \"LangChain,\" with a colorful parrot on the port side and `\u001b[39m... 52 more characters" + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "AIMessage {\n", + " lc_serializable: \u001b[33mtrue\u001b[39m,\n", + " lc_kwargs: {\n", + " content: \u001b[32m'The image says \"LangChain\". It includes a graphic of a parrot on the left, two interlinked rings (or'\u001b[39m... 105 more characters,\n", + " additional_kwargs: { function_call: \u001b[90mundefined\u001b[39m, tool_calls: \u001b[90mundefined\u001b[39m }\n", + " },\n", + " lc_namespace: [ \u001b[32m\"langchain\"\u001b[39m, \u001b[32m\"schema\"\u001b[39m ],\n", + " content: \u001b[32m'The image says \"LangChain\". It includes a graphic of a parrot on the left, two interlinked rings (or'\u001b[39m... 105 more characters,\n", + " name: \u001b[90mundefined\u001b[39m,\n", + " additional_kwargs: { function_call: \u001b[90mundefined\u001b[39m, tool_calls: \u001b[90mundefined\u001b[39m }\n", + "}" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "// Deno.env.set(\"OPENAI_API_KEY\", \"\");\n", + "\n", + "import { ChatOpenAI } from \"npm:langchain@0.0.185/chat_models/openai\";\n", + "import { HumanMessage } from \"npm:langchain@0.0.185/schema\";\n", + "\n", + "const chat = new ChatOpenAI({\n", + " model: \"gpt-4-vision-preview\",\n", + " maxTokens: 1024,\n", + "});\n", + "\n", + "// Messages can now take an array of content in addition to a string\n", + "const hostedImageMessage = new HumanMessage({\n", + " content: [\n", + " {\n", + " type: \"text\",\n", + " text: \"What does this image say?\",\n", + " },\n", + " {\n", + " type: \"image_url\",\n", + " image_url:\n", + " \"https://www.freecodecamp.org/news/content/images/2023/05/Screenshot-2023-05-29-at-5.40.38-PM.png\",\n", + " },\n", + " ],\n", + "});\n", + "\n", + "await chat.invoke([hostedImageMessage]);" ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import { ChatPromptTemplate, MessagesPlaceholder } from \"npm:langchain@0.0.185/prompts\";\n", - "import { StringOutputParser } from \"npm:langchain@0.0.185/schema/output_parser\";\n", - "\n", - "const prompt = ChatPromptTemplate.fromMessages([\n", - " [\"system\", \"Answer all questions like a pirate.\"],\n", - " new MessagesPlaceholder(\"input\"),\n", - "]);\n", - "\n", - "const chain = prompt.pipe(chat).pipe(new StringOutputParser());\n", - "\n", - "await chain.invoke({\n", - " input: [\n", - " hostedImageMessage,\n", - " ],\n", - "});" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "You can also pass in a base64 encoded data URL, convenient when reading from fetched images or from the filesystem:" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ + }, { - "data": { - "text/plain": [ - "\u001b[32m\"Arrr, matey! What ye be starin' at is a fine image of a hot dog, perched in a soft bun, ready to be \"\u001b[39m... 182 more characters" + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can also construct `ChatPromptTemplate`s with these multimodal messages to create chains:" ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "\u001b[32m`Arrr, matey! The image be showin' the text \"LangChain,\" with a colorful parrot on the port side and `\u001b[39m... 52 more characters" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import { ChatPromptTemplate, MessagesPlaceholder } from \"npm:langchain@0.0.185/prompts\";\n", + "import { StringOutputParser } from \"npm:langchain@0.0.185/schema/output_parser\";\n", + "\n", + "const prompt = ChatPromptTemplate.fromMessages([\n", + " [\"system\", \"Answer all questions like a pirate.\"],\n", + " new MessagesPlaceholder(\"input\"),\n", + "]);\n", + "\n", + "const chain = prompt.pipe(chat).pipe(new StringOutputParser());\n", + "\n", + "await chain.invoke({\n", + " input: [\n", + " hostedImageMessage,\n", + " ],\n", + "});" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can also pass in a base64 encoded data URL, convenient when reading from fetched images or from the filesystem:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "\u001b[32m\"Arrr, matey! What ye be starin' at is a fine image of a hot dog, perched in a soft bun, ready to be \"\u001b[39m... 182 more characters" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "// const imageData = await fs.readFile(path.join(__dirname, \"/data/hotdog.jpg\"));\n", + "// const imageBase64 = imageData.toString(\"base64\");\n", + "const imageBase64 = \"/9j/4AAQSkZJRgABAQEBLAEsAAD/4QBWRXhpZgAATU0AKgAAAAgABAEaAAUAAAABAAAAPgEbAAUAAAABAAAARgEoAAMAAAABAAIAAAITAAMAAAABAAEAAAAAAAAAAAEsAAAAAQAAASwAAAAB/+0ALFBob3Rvc2hvcCAzLjAAOEJJTQQEAAAAAAAPHAFaAAMbJUccAQAAAgAEAP/hDIFodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvADw/eHBhY2tldCBiZWdpbj0n77u/JyBpZD0nVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkJz8+Cjx4OnhtcG1ldGEgeG1sbnM6eD0nYWRvYmU6bnM6bWV0YS8nIHg6eG1wdGs9J0ltYWdlOjpFeGlmVG9vbCAxMC4xMCc+CjxyZGY6UkRGIHhtbG5zOnJkZj0naHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyc+CgogPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9JycKICB4bWxuczp0aWZmPSdodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyc+CiAgPHRpZmY6UmVzb2x1dGlvblVuaXQ+MjwvdGlmZjpSZXNvbHV0aW9uVW5pdD4KICA8dGlmZjpYUmVzb2x1dGlvbj4zMDAvMTwvdGlmZjpYUmVzb2x1dGlvbj4KICA8dGlmZjpZUmVzb2x1dGlvbj4zMDAvMTwvdGlmZjpZUmVzb2x1dGlvbj4KIDwvcmRmOkRlc2NyaXB0aW9uPgoKIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PScnCiAgeG1sbnM6eG1wTU09J2h0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8nPgogIDx4bXBNTTpEb2N1bWVudElEPmFkb2JlOmRvY2lkOnN0b2NrOjdlNWJlOGE1LWQwMmQtNDFiMS1hMWM5LWRjYzJlNTcyZTNmNzwveG1wTU06RG9jdW1lbnRJRD4KICA8eG1wTU06SW5zdGFuY2VJRD54bXAuaWlkOjBkMDgwOTI4LWY2YzMtNDQyNy05ZGI5LWEwZjdiYTI2YWNhYTwveG1wTU06SW5zdGFuY2VJRD4KIDwvcmRmOkRlc2NyaXB0aW9uPgo8L3JkZjpSREY+CjwveDp4bXBtZXRhPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAo8P3hwYWNrZXQgZW5kPSd3Jz8+/9sAQwAFAwQEBAMFBAQEBQUFBgcMCAcHBwcPCwsJDBEPEhIRDxERExYcFxMUGhURERghGBodHR8fHxMXIiQiHiQcHh8e/9sAQwEFBQUHBgcOCAgOHhQRFB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e/8AAEQgBaAIcAwERAAIRAQMRAf/EAB0AAQACAwEBAQEAAAAAAAAAAAADBAIFBgcBCAn/xAA8EAABBAEDAgUCBAQGAgICAwABAAIDEQQFEiExQQYTIlFhB3EygZGhFCNCsQhSwdHh8BViM3Ik8UOCkv/EABsBAQACAwEBAAAAAAAAAAAAAAACAwEEBQYH/8QANhEBAAICAgICAQIEBQQCAQUAAAECAxEEIRIxBUFREyIyYYGRBkJxodEUI8HwseE0FTNykvH/2gAMAwEAAhEDEQA/AP2WgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgqZeoY2Nw99n2C1snKx4+pldjwXv6a6bxAxt7ISfuVp3+Sj/ACw2q8CfuVCbxTK08Qx/mVTb5S0fS6Pjq/lLpnigT5bIMiJrQ80HA9FZx/kv1L+NoQzfH+FfKsumXXcwQCQBZKDkPFP1G8LeH3uhyM7+IyG9YscbyPuegWjn+QwYepnc/wAnY4XwXM5cbrXUfmenm+vfXfKc50ejaPFEO0mQ8vP6CguZk+ameqV/u9Jx/wDB9KxvNk3/AKOdf9avGjbeH4Jrnb/DilnH8nmtPel+T/DXCrHUT/dsvCv+I+F+azE8QaTQc7b52NYPz6T1/VdOnKtr90OFn+CxzMxhv3+J/wCXunh3XtK8QYIzNKzI8iI9aNOafYjqFtUvF43DgcjjZePbxyRps1NQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIMJZY4m29wChfJWkbtKVaTb01+TqzGWImbj7laN+dH+WG3ThzP8AFLXT6vOXi3jb3DVp5OZlmfbapxKa9NFqmfumcQei0sl5nbbxYvGIat+eCTZK1cV9zMy2Jxqb8nzPS53qtU5Z8+o9ra18e0ONqJxs9m8Ajd1UONmnDljySyYf1KTp6/p2THl4UU8ZBa5o6L3WO8XrFoeRyUmlprLlvGn1E0Dw218T5xl5jf8A+CFwNH/2PQLT5PyOHB1M7n8Ov8f8Fyub+6I8a/mf/D8/fUb6veJdYc7Hx3DGxD1ihcQK+T1K4mT5C/Kma71H4h7Li/BcfgRF/Hyn8y87wtcOdkGCcmObqWnv8j3WtfjWr+73DtYeXjt1HtvMaNu3p+axWsQsm+0k0TdvH6hZiNSjMRMOa1zSHSy+bC/Y/rXYrew8jxjVnNz8SLTuOna/S3xJqfh7UYsjGmeHAgPYfwvb3B+Fs05XjaJhqcrgU5GKaXh+s9A1vD1fSoc+F4YHttzXdWnuF2IzUmvlt88z8a+HJOOY9NhHLHJ+CRrvsVmuStv4ZUzW1fcM1NEQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBBi97WN3OIA+VG1orG5ZiJmdQoZeoANPlkNaP6iufl5u/4G3j435c7qmqY7S5xeXOHclcnLmr7mXTw4LenOT+Irt7WGlox8h9xDfjh66lp83xDO6tnpddge4VNuZefXTYrxax7RS6k/Id5pBa6lK2ack+RXDFI8VWWceZvElOPNEqqa97iVkV61phmZZcGuY4Ajn7qWWdzFo9mOmupa7UdREbd8pa09eD1Wte1pnuG7x+LOTqrVap9QdZZgvwMPOkghPBDHUT+a3K/IZ4x/pxbp0+P8DxovGS9dz/Nw+TkTZDi9zjz7qitJtPbtxFaRqETIYnOt7QXDutmlfHtTkmZ6UNV0JuQ9mTjEwysNgjoSuji5ERGrOVl4f7vKs6bjBLhCBKPXXIC1ra3026biNSlkfTDRH5rCW1WMPyJBGxu4uNUAmplC9oiNy9v+mX03w9Pwo9V8Qwb8p3qixn9GD3cO5+FtxSMdd39vIfJfLXyX/S489fc/8PR97WsDImhjB0DRQUZyTb04sU73PtXMjmO3McR9uErM1ncSn4xPUr2HrM0VNm/mt/cLfw821er9w1cvDrbuvTf408eREJYnW0rrUvF43Vzb0mk6lIpoiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgEgCysTOhRytRijBETg53vfC0c/OpTqnctrHxrW/iaLP1hotzpA4j3PAXIy8q1p3aXSxcTX05rUNadI4gSWfZaOTkb9S6OPjxWPTSvmdLK4PdYPYrWiJvOp+2zMeMdKc9kFrXCvcpGP6hKLfctdPG2i5oNjsSsTSNdLYtJ5vlhtMNnqfdT9a6Y1varmygRue9hBaeCT1Ub+tyuxUm06q0mp695cBYNoHz1VNsu407PG+MjflZxWsatLqG6Jr3gHiwqa3/c7UcWMdemoc3IxJYy97qPUOPX7FdGuCs9xDRnkXxzqe4bfEkZLGC2lZ+n4+04y+XcJiGtNg0mu0vLpnv9Bs8KekJnas+YNfx17FNITOmzwvD2uahG2bE03LmY9u8ObESCLqx+alFJ/DVy8zDjnU2iHsX0v+l7dJkh1jxDtOUynxYwNhh7Fx7n47Lcx4op+63t5X5P5qc0Tiwevuf+Ho2W6NziepVOXV5lx8cTEKb5A1u0WoxMQuiNyge8dSVncJaRl4PdPJnS5omouw8sNkf/ACXmnD2+VtcTkzivqfUqOTx/1abj27EEEWOQvQOGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIK2VmwwAgu3O9gtXNy8eL37XY8F8npzWsa+GvLHkgdmjp/yvP8v5K158Z6h2eNwOvKHL5+sTPNNcDt5C5V+Rbbq049YhqnTy5BcHyEWffoqom+WNTK3UU9MNjIQTRd7FX0wxRC15srTuJ4a6ndQs2jXpKv5lBO5/kgubVHqO4U534bmGYiN9ImgNApwIroeoWa1SlodY1iDGBjbMC8dXXwFTkyRXp0+L8ffLPlaNQ5TVPERlFMmLu1g8LVvlmXoePwseP1DQ5Bky3EkvIHXlYpjnJLe8oxxpPFBGyJtCndTa6GPFWsdNW2SZljkReYza+nA9lsRPi171i7HFhbFwzhLX2rrTwTmWm0SsJzpVdlEPLObPRZRl1P068F6l4u1TyYR5WOwbpp3tO1g9vkn2VmLHOSenL+S+Rx8PH5W9/h+ntE0+DRNHxdPjldMMeIRNkeBZA+y6NrxWIj8Pn2bJbkZJvMa32xyJ91kG1p2vMraY9KMkllVtiIV5HX1WJ7ThC8kO62357LGk4hC9xDuvCxvtOIRyO54KxafwzWHaeE83+L0trHH+ZD6HfbsV6H47N+piiJ9w4XOxfp5dx6lt1vtIQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQR5E8UDN8jgB2HcqvLlpijdpTpjtedVaDV9aLWUJBAzuOrz/ALLg8z5S2tVnUf7urxeDEz63P+zkNT117gWRelg6hp5P3K4WXlTPp28XErXufbR5U807g4vJP9lrW8rdy2oiK9EePKB5kjwR2V9MGTXlb0qtkr6hhK5oJLQSTwTSzMVidwxG59jITI0Bxc3i7C2KYptERLE3is7YSxx7q324d/ZXThr+e2IvLX6lm42JG4zSRgD+kjqo2mKe2zgwZM0xFYcLrviJ7t4jk8qI9r5K5982/T0/D+LrTU2jcuTy8t2Z/LDXOB6noqImbS604vGGpkw8jFex43iMHp2P3XSrji9e47cjLfJituJ6bbTMlj29BfQtKl+jFPS2nI/VhdkogFvT2PZSiViEltE2pTLMzpE+U1fRwWZjpCZhWnyT+Ijn4UZtFUNO/wDor4CPjDUJc7MnkxsLDc0ksb6nuu6BPTp1WxxsU5f3TOohw/mflI4VIrWNzL9LsjxcGN0eLCyPcdz9rQNzvc/K38mSI6h4T9+Wd3lTyZrJ6rVtLYpVTe6z3ChqIWxCAuJ70FHtZqEEzgBVWozCdVaR3FXR91G1ltYV5ptv4yqb5Ij2srVG6axwozkmUoo23g3UDj6y2En+XP6D9+y6PxnI8M3jPqemj8jg8sXl9w9AXp3nRAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEFDO1OGC2M/mSew6D7rn8n5DHh6juW1h4tsnc9Q5HVtaaxxe97pXE9zQC8zyOZN58rTt38HC61HTl9Q1J+RuAa1oPcLnWvN49OlTHFFCNskzqIA4pMeObJXtEJI3bC1g6jg2Fbi/bMQqv3uX1xlM59QAPa6V8VvN0P2+LAZPlWKa5xJpXY58fbFqeSjkZ0kVOLgAByCOifqzGtLq4Yt057WvE0UIP8O8b+heT6f8AlUZeVEevbrcT4q1u8npxuo6w7Jlc8zGR7v6iVoXzTae3pOPxqYq6rGoamWN8sgLg51i1muPynttfqRDOJrIx6aFcLex44r6UXvMk7mPYRd+4WxXprXr5e1JmP5MvmM/q7XwrJnbXjHFZXmSksA3VXUKrXa3eleaYBT3pjcy+aU0ahq+NgHIigE0rWGWV21jAT1J7BQi3naKwpzX/AE6Wvren6O0H6KeEoIPMypJ9R3hpDzIAAOvp2+66UcLHX328NyP8R8m06rHi9BijxNPxxjYUEWPC3oyNgaOnws2vrqHH/dknyvO5UsnJP3VU2X1ormTi/dRm0aWRG+kUjt3CjvacRpWmk28FQtbSysbVjLuv2VUX2u8dK80oNi9pVVrxPSytdKeRI0N2FwJ7Fa2S8R+3a+lZ9qwL2tJc4EfdVxForuZTmImdRDGDMkgyY5W0NrgQfkKeLNalotBkxRes1l7NjSibHjmb0e0OH5hfQKW8qxb8vEXr42mPwkUkRAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEGMsjImF73BrR3KhfJWkeVp6SrWbTqHN63r8bGujgeD8A8n7+y89zflJmPHG6/E+Ome7w4nV9dnl/A7Y3ptB6LzuXlWt/J38HEpRomumlkLnOdR91r462m223a1YrpmI9jhduJ6gqzU1mIV+UTCxOWtYKafst21Y8WvWZ2jfkROZTWgP6BWTNPGNe2IrO/wCSGd9uYZHdq47LMzvW2axremm1PVsXBc4TOcZBy0NItU2yVrP7vbocbhZeR/D6cZr/AIikyZT5j9jT0jZ/qtTLyJtPb03D+Lphjrufy5PUjJqFxjfXx0CxgmZtvTaz4/GmttVF5mLNVPDRw4dj8hdKcNbxtyY5N8NtW9N7i5LHxhze/ZYjH4t2MsXgk3Nsjkeyn4pTZE5/s0BS0x5QwkktvX7JCNleTKDRtHX7qF8kVVx23Hg/wd4l8ZSTN0XCMzYa8x7nhjW30FlRpiy5/wCFp8z5Dj8OI/VnW3vvgP6L+G9Dhx87XWnUdQDWufG938lj+4AH4hfuunj4eLFG7dy8bzf8QcjkTNcP7a/n7/8Ap6NPlMiiEWOxrWNG0NaAAFZfN1qrjUwzM7s1+RIXDmjarbFYhTlsjrShau4W1RuIBHNqm0rIRSzFvWlib6hOtFWZ5I6j7qq25XViFaR4Y27slVTPjCyIm0oJZG9a697Vd7196WVrLX5Dy2bcbr2JWjedW22aRuulTJlBfVBjR1NKPlEra16/KhlSO3BwALB3DuE+1taxp7Z4GyTleFNPlLrPlbT+Rr/RfQPjr+fGpP8AJ4X5Gnhybx/NulvNIQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEFfMzcfFaTLI0H2ta2flY8P8UrsWC+Wf2w4TxP4gdlPMcMpawe3ReQ5/yN+RfxienpeDwK4Y8rR25DIy3Pc7aS73XItPe4daK/lWLHOaHnp7BPHVYmGfLvSb+JhiZb2U5y2qXpjru32pmlrz0wfMXkmN1kqyJ33VjWvb4ZpC073tHPJJ5V9ZtaO0fGsSqZs+PEBJNMGNbyT7rFqx1Mysx0vedVjcuX1zxK57HQ4ZLI+7z1P2Wrl5P1V3+F8TET5Ze5/DjM/OMjjchJ6lxPVanl5dPQ48cUjqGt2F8hcSaPU+6ux8byntZbNqOlmNuzpQHYLoUxxWNQ1b38kWZE2dnqq1fWddOfmwxdT06KaJ0gmk324lp6UPZTvMShhpNOl9zjVn2VemyrvfQIPKzEwjadKhdJLMIcdjpJHkNa1osk+wHuqJvMzqEbWiI3L2j6U/RSfMgyM3xthux4JoR/DQiXbMx24HcQOnAqj79FvYODuN5oeT+U/wAQ1paKcSdzE9/h7npGnaN4d01mn6Rhw4eOzoyMdT7uPUn5K3ZtTHXVenlMmTPyr+eWdyjyMx0i1rZZsupiiqm55ceeFD2u1pDLJXVTiSIVnTUTwOvVVXvqF1aInnjdZAWv77WR+EEr6bbisWnxjtOsd9K0szbLSeO491TbJETpbWkz2qyFo53EUqZmvva6IlVyHtLLDvuqMlomPa6kSpzPcW+5byqphZXTXZeQ4kt/UX1Vc7bWOsRG2ujI84wF1m+CDwR7K7HXcp5Oq+T3H6YG/B2JQ4DngfbcV7r4n/8AFr/V4T5b/wDKt/R066TmiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIMJpY4YzJK8NaOSSoZMlccbtOoSrS151WHM6n4qh3GLEaTxy53C8/yPmvO3hhj+vp2MHxMxHlllw+sa3lSTuHnlwP6WvNZ+Tlm89vQYOLjrXqGjcZsgktdZHytSa2t/D7bcTWvtYZGyEG27jX3W5jxxWO+5a9rzb0rumeHgsb+qqm3jbqE4rGtTJmDeA6TgdeOy2MlP1JibI47ePUKz5g2MSRtJ29/dWViNRMfTOp3qWh1PW2RyOq5HntfAVeTNEOpxfjL5IiZ6hyWr61JO4tknBLejAbDVq3yzb3L0XH4NMMfthx+dqGqfxJ2SM8sf0k9QtrDhx3p3vavPyLYbeulvT8mHLiEkdk3/V2Up4s4ynMjIuyFobQs2tisdblPzRlzebqlbCM9w+eY0dE+0ZjcIyQSa4SVXUMZpg1vVYteKx2x3PS34W8O674u1MYGhYEmRJx5jxwyMe7nHgBV0pkz21SGty+Zh4lPPLbUf8Avp+nvpl9MtB8E40eVK1mdrG315bxww+0YP4R89T8LsYePj48b9z+Xz/5L5jPz7TWvVPx/wAuxyMgE/jUrZN/bn0xaa6d293JWreNtqvSN749pDeVj9vqEtSpzuLBwo9wnGpUpZjfPP8AooWvpdWjCN1u7qqLbWa1A+Wm0SseWoIruVGaYm2urg9vZUXyb9r6113CpJIQ123j2Wt5TG9LohVdKAPUbVXlGl3j+FSWZhO4P2gGueihMxK2KzCvLk9Qwij1pY39Qsin5aqZ+2QuA9J6/dJjbYr3GmLY2lltoPPO4e6upHSF7zv+T3P6YNcPBGnl9bnNcT//AKK9z8ZGuLR4X5WYnl31/wC9OlXQc4QEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQfHuawW4gBRtetY3MsxEz6ajUdcx8fcA8Aj3XI5Hyla7ivTfw8C99TpyHiHWzOOJhIKtoHRcPmcn9SNzbbt8Tixj+tOSflTyvdvND3C4tb5LWny9OvNK1iNI8eBkspG4kt5Knhx1yX8Yn0xkyTWu/ygiyG42VI4xnaeFTjtGLLa8wnek3pERKV0nnxlwJ2k8Bb/wD+5XdfTX8fGe0D8lzHujouZ8t5UYtO/GY6WeG9WVtS1HDZEZMiYMoVsA5cfsrrZKRG5Wcfi5clvGkbcXq2tufubCfKZ97JWjbLP16en4vxlcepv3LltR1GV4LIz5f+Y9SVVufp2aY6w14he5hoANIsNvqr8eCZjcsXyx6hk9jBAYZAXNI9l0cM/p9OZycf6kdtXjt/hMxzmBrWOdzXf5W3fVq9S5eKJxX03cWQJG7COvxytb1LoVtuH2VgYCD1U43MM7VieCDxShvomVd021xs3yq5vpGXc/Sf6aar46zBlzF+HosT6lySOZPdkfufnoP2V/G4tuRPlP8AC4vyvzOLgV8Y7vPqP/Mv1F4e0TRfCukt0zRcKPFx28nby57v8zndSV2P2Yq+NI1DwGfPn5mT9TNO5/8AfT7l5Ida1r22sx0018koPAP7KlsRDF0nHwpT6YiEL5OOoVazStPISeOVi19LK1VaBsuP5rV/i7lsR0wMoY3qSsecV9s6mVXKyKaSbB9lVkyTEbWUp9Kc0oLaH6+6ovby6W1rqVObIZtIJ/L3VMzEwvrWdtfO5sj2gSUO9lVa3LYrusdwqZElNLbDj/ZJ6hbWN9qE2QRfJb8gpWO10VYMkaNu+TcflX1iIlG0TPqEcWR/PYzkA80rafiUb06mX6J8DR+X4S0xtAXAHcfPP+q93wq+PHpH8nz3nzvk3/1bpbTUEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAJrqm9ClmahDA1x3iwLPP/AG1z+Rz6Y4nXbYxca95cn4g8RSNsYxsVy40vN875LJPde3d4fx1f87kczLEjbm3Oc/krk6867v8Abr1jxnVfpQbc9DlrWrFaecREfSfl4I5WGGTi3d+fhYnHNLaZi0WhIzMa14bGwMLhZ7LapetbarGtqrY5mNzKjqUrGMLn+on2VGekRO1+GJnqEcuW2Bjd5LWV1oUPurvKaxH4KYpyT17c/rPiUwBzcOQur+vsqsmfXVXa4nxHl+7N/Z53qPiwT5krJS5zh+N56fqoxx8to8/y7FcnHwfsidaQx5jcqjHIHAngjuqpw2i2pbVc1bRuGbWk3Yse/utimLUozk2B7rALeO1LbpGupU2szkcQ0mj9lZtVbuFKaES2SwCjwQrd9dNaYmZ7ZNcAQb5Cr9sx0+STCuXKPlpKZ/CLDhzdSzo8DTsWbKyZnbY4omlznE+wCj3aYrXuVV8lcdZvedRD3P6XfQ4wzDVvHTI3AAGPTmybufeRw4//AKg/c9lvYODFP3Zv7f8ALyXyX+I/KP0uJ/8A2/4/5e3edBiY7MXEiiggjG1kcbQ1rR7ADotvJn1Gq9PMVxTefK87mVHIyNw4JWvN9titNSpPkruSoRK7SGWXmkmUoqjMwoD2WPKNaZ8JQvk9W0nqo2vEdJxT7RyU00ep+VRknS2sbQSPBaW9lTNutLIjtTyZgPz4+ypyW+1tKtdlzjvx7fK1smRsUpMtVlZZBawG2gdFrze3UNzHi+0U8xfE6iWk82sxuY6ZisRLXyylpIkJIFG6WIhsRG/SuXNfJYlon1cqfilvUa0i8wND9xsjse6tisk96U5ZGPJuxfIBCzEfae9JsB3nTsjby8uDAB7nhbWKu9Q1837YmX6k02AYun4+MBXlRNZ+gAXvsdfGsV/D5pkt53m35WFNAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQV8zMhxmF0jhx2tavI5ePDG5W4sN8k6hzmqa+4R7mkNHsvP8r5O9436dfj/AB8b1Lkda1wuc4sJHza4ufl7np2cHFisaclqWdlPeGQvq+pHVaVtz96l0KVrH0sY5kMcb5ATfp91bSZ6n2haI3MQlfNHA94JeHE2K5CviK45navVrxCOfJD5WOp3yFO1oteJYrSYiYVMp8ZnBB2VYscqN6xN9rKbiumj1PV4YIfKe7e9vQDqqfLVdT7dTjfH3zW8vUOU1fXpJZWxyyFwqwy+GhVWvNvb0PF4FMMfthz+oai6Q0H18AKvufpu/pxWGl1THeIHTuBLXj+Y3bd/cLtcOJ8YiXnfkcczMzCjok7ceRsRcxxNOaGuPA+xWzyMM2jya3B5Wp8NupY8Pj3NbQPZaGpdmt4lGZSxxGwkK2sMTaH0z7u36rOtsb6QvkuxuUolTayo+UCwTwozeIY1vtvvAfgjxD461EwaNj//AI8TgMjJkNRwg+57mr4FlSw4Mmef2+mjz/kcHBp5ZJ7+o+5fqv6deB9F8AaOcPTy7IypTuyMuVoD5D7cfhaOwH7rsUpTjV8af3fPuf8AIZvkcnlfqI9R/wC/bd5WVxwFr5MqnHi0100l2LPKomdtusfasXDmvzKxER9JIJXUsT0nEK8jzZsLHl+U4hiHN2kKO40lpE+Ta3dyfhV2vqNrK03KrkyOJ3A810JWpkt5W2urWIjSnJN1Fm/uqZybmdLoorZE/FdOVG9tpUq1mW+5N7nW0DgfK17fmW3T1qGtd6ZTK5x+VCtZ3tsb3GoV8rIJa5zK5crPc7SrXXUqsmQI6JdfHQqXpZFPJR8/dIJfgtq1mO4W+MR0OkLgbcDuHVSiEVN7jtHa1bWO2Jl0/wBLtPdqfjPT8d43MbL5r/lrBf8AoF1PjsX6nIrDl/K5/wBLi3n79f3fpcdF7N8+EBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQfHODRyoXvFI3LMRMtXquqx4rSC5od3F9FyeXz/HqOm7x+JOSduJ1jVS97n8yPbyOeF5vl8itZ8vcw9DxuNqNeoc3k6jLK8XYJ/RaFc83nyt03/0Yr1ClIx8waTxZ6DlQ1N9aW7im0csUTGlxokcUR1Uv0K+5Iy2nqEeRZcNrxE2uK/dW2x/UdQVmNbmNqkU7jC87d5YTZPcLGLc1nfad6xFoUszU9oa552Vw4f7BJy9w2MPDtedV7c/q+uyHd5bnMZVU08lQvlm07h3OL8bSkR5dy5jMz5HXXF/Kpm34dilIq1WQ90gonlZrWU5vEPuLE1rg40Xe63cWKK9tXJk8uoSSxscObJPQLarOmjlp5RqXLargZGFmDIja57SfSf8ALzyF0seWL18Zci3FmmTzq6LAm3Y7SbDlzskas6eOemcsrjYbQJ6KOpWTaEMko2kk8/Czv8sTKTSMPI1nV8XSsKSBmRlSCOMzyCNln3ceijSLXtFYUZ8tMOOclvUfjuXqmhf4ePEOVrTG65qWNjaaxodJLjne95oWxoPSjY3H2ul0KfGX3u89PNZ/8U4K4/8AtVmbfif/AJl+h9E0vS/D+lM07R8KHDx2C9jGhu41Rca6k1yVveUUr406eOy5cnJyfqZZ3KHLySXVY4WjkyTMtnHjiIUHyFxsmq+VVE7ntseMRCFzwR8rPSWpQOcQOKvuo7S0hkfXKjM6WRCB8gJ6qucicVQyuqyCRSqtb7WRCpLJXNfNArWtbS6I+lWaZxBAta9rzPpdWsKnmgk+7uqhj97TtH01+VkjzPKDhZ/ssWvudL6Yv2+TW5uVtmjj5IJ7qNp7iGzjp+2ZV8mYvitwIN0VmUqV1KmXCyLoDqrIqmq5DH5XrD9rRXwSsxWZT8op0qywsYW1uA78qcRr0ecywbIC+hXCnFetwTLB1l24c+pXY4/Ku0vWf8OmmPdnajqsreIoxCw/+zjZ/YD9V6L4bFu1sn9Hl/8AEOf9lMcffb2pegeVEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBBHNMyJpL3AUL5Kpy56447SrSbT05jVvEDBGfJDr72vO8jnTaNuxx+BO/3OQ1LVjku/+Xj47lcjLyov6l2cXH8PpqZpn7dwvnqK6rUtM1ruPbarETOlDGfI5+7aCHHklUcfzvO9NjLFaxpI6drWlsTdjru/n2W9WK1ifDqVGpmf3NdmSvkjJe889WqnLNrV7lsY4iJ6hhDIx2KyV26gas9B91OmppElqz5zWGi1HW2Y7pY8ZzX2fxdh9lVOTxmYq7HG+Mm8RbL1/JxPiPX5oY3yhzS7/M7oFHFSc1/GHXn9Pj4966hy8HiKV7miaTdK/s3nb91s5fjrRuY9KcXymPJPjrTaYcgyZdrnAEtJafcrVpj71LdnN+3cM/LonaDx15W3SlYjSi15lixnq6nqrOmItPtI6iDySQm5RntWyHbmlrvVXxwrYn7UWjtBFbb2uoV0UvKJ9o60xkma08m+FCZiDtc0Xwx4n8R482ToWiZudBC/bJJEy2tdV1fvXb7KVcOTJHlWNtXPzePx5iuS8RMvafpZ9A8XI0rF1jxscpk73b//ABrTs2srhsh6h180D0oe66PH+OpFYvln+jy3yX+JbRecfF1//L/h73jnF07FiwseIRwQsDI2g/haBQHK3rciK18NdPKTS+W03me5a7NyN59PQrmZcnl1DcxY9e2rfKCacTfta1d99tuK69IJ5QLI6j2SbRCda7ReZYBdX5KXlv2z4o5JAB/ssWtpKsK8kzXAtvoqZvE9LorrtXleLsOKrtb8JxE/atNLTTyFRey2tVR84aHBooqny1vS2K7U3ZbeRwTRsKqLx9rf05U35AcwvaQKH6LETEx0t8NTqVDIIe4zRubuDeCTazWsb2ujcR4yoicSTG2l9X14WaREyutXxqryytLmsDyRZv8A4VkRtmI12qySXIW+oX1Hws+046jaF8o8zYL7UbUo0a2hml622uVKJ0aVmA73OJPJ/RW1jpGZZxjc8AO4BJApX1jfSm1tdv0v9I9JOk+CMNsjNs2TeRID1G7oP0pev4GH9LBEfnt4P5XP+tybTHqOv7OuW65wgICAgICAgICAgICAgICAgICAgICAgICD44gCyaCxa0VjcmttbqOrQ40TnNc0kfK5nI+QisT4NzDxLXntwmta47Klfvc5vwCei8xyuZ+raYvL0XG4cY6xpzc2bJO9ztx47ey5GPPfPMzMulOKMeoQMcXPax7m1yevP3V1a7mKSTPU2hkZdsJp49PJvqtitZ8db9K9bt6anIySyTeZCXE2Gts/mtfc1t5TLbinlGohHHkSzB5a0tPXdfVXUvNtsWxxXUK+XqGJixh0rg+U9Gt6/mozMRG7e2zg4mXPOq9R+XLa5rUk4LTJ5UXaNp4P3VGS8z/KHpOH8fjw9xG5/LmM3P8A/YuBP5Kjcy6Xhpps54yGuiZte6jQ/wD2tnBE1tEw1OREWr243X8TNixnDGaXTCywiQtO0CzQ6f7r1HGvTJ3Lw/NxZMEz4f0dB4RznZeFDJNJUrGbHtPY/wDbXP5fHrjvOnd4XKnLiid/6unhDjHuBF9geq14iPpv+U69I5XN3WTZWdQx5SifLd7TRrlZ8WJlXe6hRJNLPpGZ+1GeYUadxdFQtO2O4dj9K/p54h8Xa1puUNIyJNCOU0ZOU4hjNg5cBf4ulcA+3C2+Nxb5rROv2uT8l8rh4mO1Zt+/XUfb9g6Domi+G9PODo2nY2Bjby8xws2guPUn3K7U1ph6iNPnGbkZuVfzyWmZZ52WdvodVfC1M2eZ9Snhw99tTkZRdzv/ADWjbJNvct2mPStLPYq/zWN/hZFVLIeCSbpV5O52up6VpXO3A7qo8mu3sq569rIiJ9Iy+zQNJ5RM9MxHSN7wBfdRtaISiFSacD8+61bZIX1pKtLkkX6u3buoTln8rIopSZYf1BbXS1rzk8l8Y9Kr59xsOAHX7rETuVsU17anNyi55jDhuHcKvcTLarj1G0TJNuMWuk69RdkKVK6jTNtzb0pCTyYS0O6mgb5VlY6Wz3O1YPIZW54u746rOtMzG5UppSHAbiT3s1Ssr0yibLYaCSG8GyEJnbHIe0zEh18KyIhHfTBr/wCZ6jYIKspHSNp1KPzf5hHv29lbWqub9uk+nWgS+IPE2LgtafKvdM4f0Rjlx/0+5XQ4WCcuWIc75DlRx8M3+/p+pY2NjjbGxoa1oAaB2AXrngpnfbJAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEEWRPHAzc9wHstfPyKYo3KdMdrzqHPeItbZBigtf6ncbR1AXD53O1Te3T4nDm1+4cDn6nO+Qjkg89V5TLz7zfxiOnpsfFrFdy1z5DI8g2b6qu0fqW8fqfa3+GNoZnNdG7ynMDh/TdWtjwia/wDbYrMxP7lGXJlYwRPLXGyRxVfmseVqViLdrox1tO4Vy+2mV8u53QN91mKz/FtP1+3SHMyscwNZvfHsPUhW3is1160nixXm/Ub20ur6s023GDmsFG3e/wBuypvk+quzxPjdfuy+3NZue71PLuvU31VE33Lt0x1rGoaHMyjINxNkdr6pFZlb5eLUziWWQANcCeAFs1prpGcvSXFxKqVz3tduG0H9/wAldWP5NTLffT5qmAzIx3u9TXNNja4rdw5ppZyOTx65I1Ln/CrP4fLmgbGWgu3ck2f1W9ypi9Ys1eHh/R3XTr2veIgAa91yopG3Ti8oZiW0WkD3V0dQjvcoXSNjj9gVi19kQaViajrmpxaXo+LLmZs5Iihjq3EAk9TXQFQrjtktFax7V5s2PDScmSdRD9FfTX6BadpmTp+teIc52fKId02nS4rPJDnMosduu9pJ5FcgHhdvD8dXHq953/J4f5D/ABJfLFsWGuu/e537/wDL2bAgwNI07H07Agjx8bHjEcMbG01jR0ACvtnpSIpV5236ma83vO5n2pZmYdxF/YWuflzzMtvFg6a2bIcSb/Vas2mfbarSFGWavt1VczEL4rtF53HVSi3RpA+Tm/dQtdOIV5JKNBx47Kq9/wALIqhkeWNabsnqozPjqftKI2rT5Acyz1aVVkyRau1laanSjkTAOBPI/sta1obFKyqyT0ar09yCob7WxRRlmDXk9/a7u1VrS+K7hTdlPBeXWCe1cBSiZ+1/hE+msyHulkLt4DWnoOhUdbbMfthE5/ls5LXBrb3e5V0V1GkfcqzZS425xsD8lmKpTOoV5ppNrWi3H4VkMTr2gP8AM3FpaQ49vb2Uvc9MdxHbF1b6aenT2+yzPtH6ROdUjg0myRQ/urIiPpjfaOd7WRNI9QaT0V1IVXnSDCc6eZpYL3mgB1KvpTc9KbW13L9RfSTwzH4d8PMMzG/x+UA+d3dvsz8v7r1nD40YMcRPufbxPyXMnk5ev4Y9O1W25wgICAgICAgICAgICAgICAgICAgICAgIK2dlNgjJs38C1ocrl/pxqq7Fim8uY13Pc1m5ro93UhxJP244C4efJaY8vv8An7dbi4Y3qXG6hmvyXmQsY2+zTxa4efNOT1Ht28OKKRqZaufOJDNjQd3HPC1Lcj1FI22q4Pe5a7IzAA2Ki2vxFv8AZPKNeGtflbXF/mVZZhJukogsrcOgP2Vkfv7/AAnFdar+VbNlsMLGksLCRzyrLx6nXSeOvvvtrHaq9jKcbI4F9AoY81nRx/HfqTueoch4z8UPw8cvdI6x0ofsKU8VL57+MOlNMXEx+UQ4zC8cOmm8hzHR7zw5zuT91s5/jL0ruJ2jx/ksWadT1LZ5GY+Zpc5xvvRBAXOrSYnTpRkj6YNcHxAWTXSls1x69qr5PtJuIf6qDQPZX1ptRN5C/fxH0+PdT1r2hM/b7IQxl2TazWJlC/ai+KMTeYxga7uQr48vHUqtREpnzEAeruoePZuFfIymgEX8LHkNl4O8L+IfGupvwPD+J/EyRMD5SXhjY23Vkk/t1U8OC+a2qw1ObzsPDpF8s6h+lfpP9F9A8Madh6j4hxIc/X45ROJS8lkDx0ayiA4Ai7IvldnDxsWCsWv3aHh/kvnc/KvamGdUnr/X/V6bmZzQKDqVXI5W57lycXHlqcrLsGifgLn2zeTeph0oSzbuXOulX5b9tiK66hVlnJPf7qHntOKaQSSc+w+Em0JxCvPMIyR14tRveKs1pMq7sjdTuD9lTN96lZFNdMWyAi+LPssReNMzEoZn3ySav34VVr79p1hUndVHn7BVz1CyqjkvvkOok+yrtO2xjj+TX5E5aS1poUe9qvbZrT7lRnmDgBz+KuCsxG11azDV5k7y99n0iwLHVZmstikREKcMz45S27DW2L9ys1jSdtTBPNua0AEkficrtbVdxKs5zjFtugbrnqkQz0x8xz+bLQ3ir9/lTiJYnphGfNa91FgbVD4WYjbEzpE+Zm1wNgVf3U4rM9oTOkHnbgD37q2Ko7fcgB2BQ49Vfkr8cdKr27dl9HPD38ZqjNTyI7xsZ1x2OHv7fou78XxPO36lvUOD8vzPCv6dfcv0dpTyWC137PKS2igwICAgICAgICAgICAgICAgICAgICAgIIcmdkTCXOoBaXK5MUiYWY8c2npz2bmOneXQRO2t6yno37Lg2zedt1j+rqY8MUjVp/o43Wcjyi4uN7uouvzXJ5eX9OszP9na4+Py1ENHJkxytc1lew7LnVzVzxMVb36c45iZazLkc2LfEAdt3YVcVmKRNY9Niuptq32oTubNCDbQ7rXcqya+cRv2tr+yZ/DX6pMWsja6X0M49iVLLWeoj6bPFxTkmfGO5aXO1cwxlgdTfvyfum/Gupl28Hx9InymNy5vM1bzHlpfde3ZQteZjUOlXDEduc15rc7HMTn2OoJ/pWxxLzjv5NLmUi9ZrLhtSw48SLb5kocGkh5oEAda/wC9l6vHfz708JnpOC2t/wBW+8J5n8bA1rLEcVbiRdj5K5HL4vhfcvT8PmRlxRMOrYzdbw0Cz0vstTxn23vOIYTMjDy8CndCQrce9aRmUVhpOw8qyazPtjyfBK2RlE8rE112xZFMAARuFg+/VT8tK1Jz279sbSXPdwBySenCrmZljevbd+G/p54z8Ua07StO0XKjkY0OldksMMcIPdxd0+3Uq7DxsmS3jWGjyfk+Nxsfne8a+td7fsvwJ4R0TwRoUeBpeLCyVzGfxWQ1lOnkDQC8+3c10Fn3XbmcfHp40/rL5xy+Zm52TyvPX1H4XM/NNkB1cdAuXm5G51ErMOBqpsgusl/7rTtff23q49fSjPPZ4JPwqZuvrRXfMKPP6JN40l4oDJuI6gHpajFkpjTF8npPPTopzdHSnkSlx7V7qi+TylbWuoUyQxxoAE8n57KmOlnt9ErhbSACf2Ty11J4sTJZIsE0o72zrSrkybSwg116dysWtO4W0ruGrzph0LqoXx1VU7bWKrV5GSNzQ1riT1+fZZ69NulOu2tny3CUEAbr7/3UoiYWxWFfKk3Da0eg2bPZZmJ1pKsqrZSA11H1OJJ9/j9lKI6Yt1OpRTzVKRZa6uhPdWepR9qz53PkaADtaOWjhZj0wy/iC8EscQ3dXxSlDEsmZTXeg+lpHAAulKNekJ3HarKwOsO5+LU4jXTE27YHhgb3J6e6srEq5lvPDWjyavIzGa4iMu3SP/yt/wByupweJPIvr6c/ncqOPTyn29z8K6bDh4sOLjRhkcYpoC9dSlcdYrX1DxebJbLabW9y77TYtkYUbSoXlEEBAQEBAQEBAQEBAQEBAQEBAQEBAQYSv2N4FuPQLXz5fCNR7lKtdtTqLImM/ic+Tc1p4YOB/wArh8jHWv8A3M07/l/77b2C1pnwxR/VoNX1YSRufAx5gBA2jgcdOFoZuVF48qRPi6ODi+E6tPbiNXzvMyX7mhxdxS4PJ5HleYmN7d3Bh1WNS02S4RW2JpDjbq7rWjHGP9tYbdZ8+7NZqOSJI5GCT1ggizyCr7zFqzG+1mLHNbROumtzdR2RseGFjw2r3WVZWdxvWnT4/wAfN53eenMavqsj3l5PqJI3OPKTft3cHHrjr41jUOYzMx73klxojnlV6mzc6rCi6c7idwdfNEK7wjSqbyqTyBzyNwp3HurscePbVy9tN4pw8rN06sU+W8AE+9D4+y7XCzVx2/c838pw7Zq6rOpUfp/DPjMmY5zwZHXZFH7UtvnzW0RMNP4fFfFWYu7zGDY20XO491x7zuXeqyc+wBwB7qMV0ntC51XR5+6siUe9q0ku02B36BYmetMtp4K8N6j4x8UYmh6c14kmf/Mk27mwxD8T3fb+9LODHbNeKQ0+by6cTDbLf1H+8/h+lvDv0A8D6ZkYmRntyNUkgh2SMmdtimfZPmOaDwaNVdcWuxXh4aTEz3r/AHeGz/4k5eSsxT9u/wC8R+HpWTlsxYRDCA0MAaNxJ4HH3PCr5HNmP2uTjwTknylp8zUHEuAeSVycnImZ9uli48RDWTZJPU9eVrTafttxjhXkmvv9li0pxVXlf1pxH+6jaUoRF4rkrETGjSB8wJIb0HysecfTMV/KN09GyefZY8/uWfFXfICD14q6Cr3tOI0q5MnqDTbhV+1KNphZWv2r+cGgA9Cq5ss8fw+Okf6XA0DfU9k3PtmKwpzzCr3uoWG89b68JMrq0auacubfpaQOR8LMeumzWsR7a/JlNEh3qaTYPUj4UohdER9tVPkN8zzCb2nkAcH4WYmFnjPpBNM534yRu6Ae6T6I99McyfzaZCdkQIA/7+SthVP81GSSSbKBptu5PKfxWZj9sM2hzXW+hfFdaU4/LEztk/h72tFENulKIQ2hMgc9jI20T+33VkV2jM9PjJGve5xJDeinqJ9IbmPZG0zuDWAkn0trqVdjpNp8Y+1V7xXuXr3gDRjgYLGObcr/AFPPz7L2fB43/T4or9vH/I8r9fJuPUPVvD+FTWuIWzaXLmXSxNDWhVos0BAQEBAQEBAQEBAQEBAQEBAQEBAQEnoQTPaxpleaaFz8l/eSVlazM+MOd1iT+Nb5z2uELWnaP832XF5U/r/ut6dTjR+l+2PbkdXmGPF5UUPlMcDYc63H5XEyzOKPGtdR/u7OGPOd2ncuRzCzzt4ftce1crj2x18/LenXpM+OtNZnZb2uawOcQDwfYK7VvKKx22cOD9TcxDmtZ1VkUz3PIDj/AJutK60RWd29u9xODWlXK6nq0kjr81ztvI56FQm82dSlK1hpsjILgXOd1s8KdabLXiGufM5/DgQD1BWxXHpXa6OME2C0hx/RWxVTayaLH38kWR0CnWNKbXWJIwYduyiTx3pXVn8Na/ati4rITbG7X9CtmbbU+He1pjjyT2Vek/TETN7iuEtGmYlUkym2SCVXafoncOz8BfS3xj40DMrCwxh6eXV/G5TtjD/9R+J35BW4uPfJG49flyud8vxuH+287t+I9/8A0/UX008J6X4B8Mx6fAYcnOfbsvLEe10zif1DRwAPj5W/jy4+Lj8a+/uXiOfys3yObzt1X6j8f/bbZuqOc4lpAB6crRy8y1p2xi4kRHbT5eY9zuXWT1taGTLaZdDHhiIUZsk3xddFTbJpfFIROnHvZWYyQeKtNJ3B6fKrtKcQiM4ugVH9Tvo8UD5SCQ42Csef0zEIt9OLr69gkTpn3GkUkwDuoB68rE27Tim0DsinfJHusRbtP9PapkTucfwtFCjz0Kjadra00ryytaASSb7hYlOtdvmRMWtBLgG179VmYZpWJnSlPPGW05xdXNblmYiVta2hqJpgXOjDi2+L91KsR6bMR9oXBvkbjueWHmzVfPyp1jrbMz3pqJJHxitoZ6qHVNM7Vnvp/ntPQUOO57hI67Zn1pGyS4r6js7/AHU6+tq5liJGtcWV6+tXwB/upRolm57XObIRW00OVOI32hLEucHW9xLn8HngKcaR3+HwOFihd/upVli0dPjnNDzE38TuthX1rKm1nb+BdAPntzZ2c9ImnsPdel+N4PhH6l47ec+T53l/26T/AKvYfDOmn0ktXZmXn7W27zCgEUYACrmVa0sAgICAgICAgICAgICAgICAgICAgICDCZwYwk9FTnvFabSrG5ajUJHZUseLEeHm3O7ADuuLkvOe0Uj7buKv6dZvZq/FrvLxsfyNp2Agc9h8LX+SrPhWcf02eB3a3l9uF1vYYHSiQb6t3v8AsvPcqsTWZie3f48z5RDlNUzRFC52+hfTutKsWt1DtcXjTlvpx+q6nK+Nxa5zW9Lv9lOZ8K6q9Pg41McahwPifMlbjOkaXucOl9VdxaRe/wC5ZnvNa6q0Om6jJlQkhzzRr1dVu5+NXHKjDnnJXctqzbtDtoc4jndyFrRHaVrIm7CRu4+eysrEozZLGB5jQGenqSfZW66QmVgbBRAorMRKu0j3AvLeK60r6x1tV37Rv9Lrb/V1tTmNo+W0L37HECyCozZnW2Wjafm67rmPpOntY/KyXbYw5waLruSo1i15isKs2WmCk5L+ofpX6LfSDTfDJbrWvPh1DVCHNZG0B8EYI5FEep3UX09l0uPhri/fbuXi/l/mcnJ/7WHqv5+//wDHqWXmiNojYGsY0U1reAAqM/JmZcfFx99y0+XmW4tHWlzb5dzp0ceGI7a2efiute61r31GmzFVOWax+L/la8339rIjSu+dxNWo+cpeMInT0AN1m1mLzEaZiu5Q+dZd8e5UYne2Zj0rGf8Am8Hj+yxv93Sfj0xmldY9XJ7KUzLEVhG+bod1c9Qs70lFFaaQggBwICjMLKwjmyABQ9q+yzP4hOtFOeR22rDQOTzdpaJXViEBnZRFeq+eOQU0l4TKvLmjYGH5oN6JHftOMep3DXZWY1zAWnnoaHRS6XRXSm542WwinA3z/dSisRDPcqpnlbE9zqr+kDqBSltnUKoe/Kf6S4+4PssxG0d6V855ZPFjV0aXAV1vr+ynHUdoz2xd/Tbr29GDqD2Uo9IfaN4axx3OLnEkk9FKI6Z32+wAv3bg48WL7KcVlG1oMqRu4sHpoCyFLxQizHENuPPUe6uiqF7/AJdN4M0V2dk/xc7D5YPpB6H/AIXd+M4XnP6l/X04XyXN8I/TpPcvZPDOjk7fQvRTOnmbW29F0rBbDGOFXMqdtoBQWAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQQ5ZAjBPS1p8z+CP8AVZj9tFreRJE0NxwGvfQ3dSB2C4nJyTT+B0ONji3dmvzDH/CtblSeZK1tBregS1t0iLz2tpE+f7Y6chr2ThRabOCdjGgnlq5uatL0msO1w8WTJliIeT6nmTZk/wDLadhIDW1S5lv2R41e/wCNgpgppyupSOe5zQ6ufdaepmXSiYiNtHqLBJHsNEdLV+PdZ21ck7aQ4gxpWmKPl3ueAt79WckTEyqiIhcj6Et6FKwhaWfoaLcfnlXVpMq5tMQxDnXwfT2C2IiFXklMnQf1dlnwiUd67PPaW2b9hSx6YV5sg3VcdlGbwl4qr5nlxu/y7rXjRL9X/Qb6Yad4axMTxVLkHJzc3Bjc3c2hCXC3BoI7iuTyKPuu3xsFcNYyfcw8F818tfkWtx4jURP93pOdK1oLjIQVrcjLE97czFT600GVkA+reHD3XKvaPe3QpXXWmrllPmbrH5ladr97bUR1pTyMnYdrnVuNWOVTN/ysrXarLNzfH6qqbalZEIpJvd1c8Ad1nylmKoTLR5d+ilCXijdLxRJPW64WYlnxRFwFu49wpaiGe0bpQ8FpBHyVj37Z8dK5yC1+wNO0C7rhPJZ4bhBkyEkvkebBuulJMb7lZWNRqEM+QZYxtJsCyVLuUq08Z7UcmR/NOLr5A4NrOpX10qHIoFx9Lj1P+6ztPx+lWd7W0G8kAcV3/wBUisQzEyjlmc51M2f+1Vx7qepmeiZ/KnKdsIdZ5FBrT+XRIidMzMIXvkYNkrQXUDZ/ZT1qdI7ifSPHmdG988jDsaCCGkA83wraddq7/hr3SvkldK5oc/mueFj+KSI0yhEZfxJRu77ke6zEMzLMMLiOgsbqLuatTrXU7VzLIOIjc+rc7ge4A6BWxG+0J1HTXlz/ADAN/qu+FZWkyja0Oo8NaDNqLmmRrmxEi6HX4C6/C4E5pi1vTkc7nxhjxr7eyeFdADGRsbGGtaAAAOgXpaxFI1Dy2TJN53L0nR9OZAxvp5pYmVEztuWtDRQUWH1AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQQZ7C/GdQst5r3WrzKzbFOvpZinVmoy4QWNe0CwK+wXItjiYiYbdMk71LndTieJGvslvcEcdVo5KWifJ0MV4mNPOPFUuVr+rnS8Om42P/wDM8fhLu/6Ki/ld7D4zHThYf1sn8VvTiPEOTHpviQ4mIGSjCxS6YkWN7xtHXrV2ubO62m2vX/l3sEzm4/lfrynr/SO3DZuQ4uIulq0p9y38mSI6VHz7IzYtXRRR5bnSo6SOUl7SXX+itrSaoTPTAlzRua3i6Pta3MdYmNqMltdMXNtlPHqK2IjXpVNmTXANNdlnW0ZlC6UN3AO5ri1mbaJnaN01jk1S17WnaUSryy8muigTZ6n/AIbPAR8Y+KBq+a0N0nTHNlcHMtuQ++GAkURxz+Xut3h8Xzvu3qHB+b+UjjYfGn8Vv9v5/wDD9a6pMWMIbQAHbilucvLPbxHHpv25rMyzyOCuJlvp1KUajInJNe59+FoXyTLbrChLMHnng9uVq3v5Lq10pZM3a7Huq5n6W1qpSTEE82FHa2KwF+1t2eeitiNQx7V5Z3drq+UmZTisI5ZAW07nsbWdbSrCLz2gEbiFJLw2gyMpu0lpsgdPdZmYlKuOdqks5tzywt6AAd1mI2tisR0jM9N9XJvhZ0n469K5fI0my5tCi4dz8LPjr0l0qzSuIDyBZNH7rKWkE8oLXNJJcasAcUPYKUQypFz3R7ZLNkmieE7+2dwifIdgBd5bXctHPI9/2UohiZZPnY7cWn0mgK6BSj+SM7j2rSuc6QPIsg0Pn7KcflhXy3tdcA20w7i0dCe5/wBFLfWoQne9qe9zHGO207g1/qeyzWGZY+YQ4Sk3I47bFbQB0CnPbH8mUTD5gaRvJ5NH4/srKx1pGZ12su9UZaRRIoV7K6tdzqFEzpv/AAn4adkzNnnitp/C2uq7nA+O/wA+SP6OHz/kdfsxz/V7H4U8O0GXHQHQUu9ERWNQ87fJMvSdI0xkDB6eViZUTO23a0NFBRYfUBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQDyFiY2NPqMRa4xm3NJvk9vhcbPhmszX6beO325rxPL/Km8tw2tZ6fv0H7lat6/q5IpDo8Ku7ViXCeN9b0Pwt4cLMGSHJnewume13D3g0RY+QVP5TJgwYoxYu5l6j47jcnnZ/LLExEev9HhOmapNlaVnarkSbsnUMt3qI/paAOPzLlxcmLw49Y+5l6vLqM8Y6+qR/8tPkS7Xsk3US7aBX91q0x7L5NqL8nH1DUBiwh7MaEXkyA309vueAtmMXjHlKqck1jr2hyclold5LBFGT6WA/hHsoxXy9rYiYjv2+w5X8oMJtbNK6hr3mNvs2RcfpBJCurVTNkYlDSd73UeQBzzXRZv6VxbtWyJ3Fw2jn2VErYn8oXzU1wJDSFGa7Yi0L3gjCh17xno2lZAyHwZmXHDL/AA7dz9hcLLR70rsWLdorLX5WeceG96/UTPb+g+madp+g6Nj6ZpeLHjYWLGI4YoxQa0f96912skRjjUPmFsl895vee5anU53OaR2K4ue8y6GGsQ5fUpiA8078lxOTeY26eGrVyzv3cuIC1P1JX+MKOW/1W2qCqt73C+kdaU3SuN2TfYBY3Mwt8UEjyKN8qUR2lEbYPyLbYHq+FPsiqq+YNHqk56dKWYjpZFZ+oVRll2+3Hkdb6KUdrZx60FwMTXknn36KXhBEzvT4KcLbexpBJHVZ8I+mdyrTyloLGtNEXbj/AHWfXScREztUPBadwN/haOb/AFTx/CzyRyvppLbaDzyeilEMf6qT5RMLoV7df3WZ1ZLekWQ8tcKeHWPTRoAe33U9MbVJnPmk2RSGwOfVfHU/kkVmSbRCKdhfFsMjyeaPypREseWmAmDQRJ6eAGiuLtZiOme0cszWSGRp4NtafZ1dVLWpRnuNKTwLZ2cTQo+yzFfwxtHJxPtaWhvIFe/upkdQya0xii1zA0D1EWTXsrK12hayxgxyPcHuFvPt1K2aYpmdR7a+TJEQ7Twr4cfO5kk8duuwCOi9Fwvj4pq147eb53yM3maUnp674V8N0GlzF1vTiXu9E0vTo8dg9I4UZlVM7bNoAFBYYfUBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBBXzscTxVQ3DoVr8jD+pXr2sx38Zed/VEDS/AuqZovzmMG0k1RLguNkrGKlr/AG9D8J/3udjp9Py14s112R4Ow4XSN83a7cB1onqVxbT50pH2+pUwxjz3mPTRzubB4T0yPzQ0uhL3D/7OJ/tS2OVTukfiGpS+8mS/8/8A46aGT/yGW/GwcVpflZv/AMIJqmc24+woE37BXYeJuYaefkxWJluZ4IdK09unYkokY075ZT1mkrl/wPYdh+a0+RkjJf8Ab6hbxcc687+2nypaJJ4CzSq+1lIZoY4mr+Vt1p00sl1mLIdI1tGuO3RSjpTM7hlLKdoaTdlRt2xXpBLMGu2jgqrx+0/LXSpkZAt2/pSlFJ+kbZIiH6a/wO6XjS6RrWvlsckv8U3HYSbLNrd3QigfV1BuiQV0eNXwnbyPz/Im3jSJ/L9HahOQDQ4pZz5JntwMNHM6pJTndlxeRPbqYoc7mTG+lFcfLadt+kRENXkTEH1V+Xdak2bNatZkZD9wN0KVflqWzWkKb5h5dhxPHUnkqfuNpxHeld+S57RyC4i+qnEzKfhESjEw5AcABzyOintnx7VJ5/M9DQL7G+P/ANLPtbFdItway7a/iibUku9sP4kscA/cdwsfAT/Vma79PrcqqFEhwJv4U4mWJqryyM8rZt9IPUf6LKUflXEkhdYJIHAs/wDeyR3LM6iFeeQSek0WfeuilPYgpgG4saCG3dnkLNawTaVVz3TAvLQAeOvf9fhTiJljekDvLjhNtdQoAker9Fn32z3t8jkeGuLra6vTZ4aPlSiGJVxukk8iMuL6s2LAHcn4U667liZ1D64tklcGxlrI27YwT2Hc/PdYnSO5hSla0S7pCSN3UHivj4Uqm9+n2y0hwBf/AJW9Cb6KzUaQ22GLgyZE27b6nO4YOgW3x8Fr21EdtbPnrSu5nqHfeE/C7nPa97LceenRen4nCrhjc9y8vzefbNOo9PXfC/hlsbWlzP2W96cq13d4OFHAwANCxtUugUsAgICAgICAgICAgICAgICAgICAgICAgICAgICAg5n6j6G7XPCWpYMIBlmhPlg9N45b+4AXN+R436uK2vt0/ieZ/wBLyqZJ9RP+32/B/iSJ8WK7HlDmOjJbtdwbv/deSw+VbRt9ppaLzMw1Gp5Lv4WHHc+o4Yg3p2HddCm75O3Mv+yk2/Lo9DYNOwZsrIF6tnxAOaTzi49DbF8EgAu+KHutvl5v06fpx7n3/KPw5XHxTmyec/wx6/nP5aHUNRe/JLMdoc4cOe8elv8Ayufiwft3LpXy6nxhS1HIZ5bWNrc38Tj1cVbTH2pyZGlmfTjuNX0AWzENK+Tvtbwshwoh1f8AqSsWr+SuTfps3ysbGKHKq8ZSm8RCrlPdt3Gga5WIr2ja7RajlOja8HoAtvFii0tHkcjwiX7a/wAI2j53h/6TYUOosycfJzZX5boZnNPltfRZVdAW0aPPKzOWJvMVl5Tmz523L1rLc8dXAnvSpyTP2ox6aLUXGiTfTpS5+eeu27jj8Oazn8u5pcPNO5dHHDSZMhdu788LVn8N2kNXlOeQbcL9uqrmstiuleQ0wA2KP3V8ViI7Sj8q0zgGl20Weg/73VvjHtKJ+kW+M2XvcD+E8KcRGme2E+2Eg+Y0ihRabBBWdaZid/SDIyC1rmgjrwSPUpTKdY+2L3k/zdwDm0SL5+yxr7Z/kpvyn24ij2vtV+yzEztLUMfNLxusFw9NjonsiNMHkeWSQ4mrIab7/ClEMTbtr5C4gW63O6i7P2PZZ10zthnTPczgkG9t33r3U+5YiFcnbs2uArncTdrMTP0y+vmLnX+JrOeRVn2v9VLSMwq5c+9o62XVQ7cqWtz0zHT4wnHhkIeBM8+sc1Q6NUpQn9zEv9DnU4uqqpIhi2kDHbw0bXOf0AHAH/CtrTcoTaYbjRdKmyZWNbucR1Pt+a6PG4ds09NDlc2mKJmXqHhHwnZafLs+9L0nH4tMMdPMcrmWzT29b8OeHY8djSWAV8LZc+1nW4+OyJoACwrTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgHokxv2Py9/ia+mGZBqA8R6FhvnxMiYyZLI2l3kvqyaH9Jon4NrzPyXE/Rt+pSP2z/s+kf4Y+brkxTx806tEdfzj/AJh+ff8Ax+V55yp4XWHF7GObYAB4JH7/AJBaOHlUpO4ehzYZtHg1uXqMj8h0McxLiSZJLv789z8rYph8o87NTJmjH+yv0gzNQxYIWudJGxtd+BatphvadaamTl48cbtLR5GsmW/4LGkmvjeRTf1K268eK/xzpzMnyNsnWKsz/P6Vooc3ImD8iUAXexnAWZvSI1WEKY817byT/SG+woWwtDmst1dVqz26FY8Y6Xqock/H3UdJTKhn7qLu3flKQqyTOmPgDSMHxN4+wNH1DMZjY7yZHWQPNLeRGL7u6fqtq3ljwzavtx82StskVmX9A/C0rZNOgNBjg0WB/Zc3H3WJcnkdWltMl57vpZyT/NTRqdQfyTZIPUFaeaW3jcvqLrc4h1fJC42Wdzt0sUdNJJKKd7X9lRHctyI9NZIdzjbqAN2BxSRSGxE6hWkyA70VQJuwro1PTPjrtTmm6eYeaoff/RZ1+U6x+FeVzjNbSQ49jfRWeKUdI8l+xlFti+hd0/Tqk6SiWDHR7bfd9j7LEMztg54qndzZ5Utbgme0Uk0ZcYy8M28Hni/a1nrbPbFj2ueGinOAHFcmulLMRuWJlWlySHu2u2UBR72sxvZMIcjKY4Oc0U1x4YewUpsxFVaJoNOc9obV0T0HdTrHW2Z/CIODZgWML/v0CR0zPbDJc0PLBbW3Zbf9lPXaMTKFjQ2Y+c+yfwcqWp3pG1uunyN1u6ndd2eyz49ozbpi97nktiaaPcHn55V1KzKq1te3QeHPD82XM17muo965K7PD+Nmf3X6cjmfJRWPGncvXfB3hINDP5VD7LvUx1pGoedzZrXncy9U0PRYsaNvoH6KxqTbbfxxtYKAWEWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg+OAIo8goPAv8SXgLRnYw1TB8vEzMx581h9Mcm1o6V0Peu68t8xxcWHLTJXqbT/AE6/8ve/4Y+Sz5a2w5O61jr89/8Ah+Qte0eaHJex8shY2wWRSMjB/WyVnjcisx/N2uZxpmdx1DWfwscDgMfTMUOIsSTS+a8frwP0WzOSbfxTLnRxK1nqIYtxst8pc8x2oTauvS2MN972vxRltbi3kdgobWzGoWYomNNk8g8crHtDUbWX0W7RXPZR9MtVqIpruort7qdFGWdQv/RXR8nO8dS6pDO6FuBGdu1oO97uNvParv8AJbPJv44YrHuXB1vP5T6h+4PAxlbpkW57KIsBpulzcFJivvpqcmYm7eZkliiOiry2V0hptQkFF3X7Lm57Rpu4o7c5qLy+2tBK5t++odDHGvbS5D6kcCTY4pRiG1EdNXkzEF200e9qS+tY621r5w5pLQAWnkHopVjcLdaVnHkivkduVZHQPeTbgTQFk38KTKIbXMcXOJaDZIHKxEMzI+cOe1kdji97qA+ArOmP5oJSDtc1lu/+v7prXpmEcj7rZG1vFfn26rOvxB2jyHOhBcOX1yOt8rPj9sbiVQEPiL3PLHVuc3d0SsJSwfMHQlwa6w228Dm+5U2NaRNfFstzRvoUewHdZiN9syifLY3tYY91knvSlFe2P5MbiZcjy5zj1APIH3VkREe1drTPpVYXytLyHB3Nd1KK77QtaI6S4mPLM4RxAu7H/ZbfG4t8s6rDWz8qmON2l2vhTwpJK9r5WlxJ7hei4vBphjfuXnuXz75eo6h7D4S8JNYGOdH+y6Gocm+R6PpemRYzAA0cIomdtm0BooIw+oCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIND488NYnizw1laPlHY6RtwygcxSD8Lh+fX3FrT53DpzMM4rf0/lLofGfIX+P5Nc1Pr3H5j7h+FvG+j6no2tZmlazhVlYry2RoH6OHuCOQe4XkKUvgvOK3uH12uTFyMVc+Kf229f+/U/lxs8GmvcC4vid83S36XtrqWjlp33DFkOJG7fHMHe3q4Vm7T7a0xWJ3DCfJgadu8E/dTrSVFrQzwyJ5GvYHuoV8V9lmeulcRudtiMdvBFuI5PKglbUI3YEuXJsETnWOQB2+U6q1cuSIjt6Z9HNKxcfTc7yopGyx5G54Y3ca2inEda6i/hQtk84242a0efT9B+C6Zp4HBNWCOihj6iWpnndm2ypiAehWnmuzjq1OTLbSSaJtc29ttylWkzpHXYocdlq2buOGgy5XGUcODgavos6ltUr01WZMGOLjGHBp9TTfP6LOmzWGqsPlkldbGHn7LNI3O1lp6iGPmiqBAde3pwpsa6VyZi920kgdbWKxKXTIENIc9m3kA0Df2Uo9o6fXzRg+VuLQ3jaAP0Vka9I9wgllcfRv9R6NPP/SpamfTHXs81zWg7dpHBJKz6gVHPlIuw5wHBArj3TtKdMGshZH5ssgLwOCW8k+32U/GIjtjymZ6QZLyY2kxGOM8gX15WdahmsdqrH07zHN6njjm/spxUmdsZHHdRIG4HgnoPlS8dK5vCEu8xtb3OocBX4sNrzqsbUZM1aRuza6LouTllrQ14Z912uP8X95P7OPyfk/rH/d6X4R8Gk7P5X7Ls48daRqIcPLnm07mXrnhvwvHAxpdGOPhWNW19uyxMSOBgAaEVbWkBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEHnX1k+l2nePsFkzJG4OsQNqDKA4c3/I+uSPY9Qubzvj68rVonVo+/wDl3/hfncnxszS0eWOfcf8AmP8A3t+RPH/098VeE9Sdjapp7iwOtsobujkHu1w6hcO2HJhnxyR29zg5/G5dPPDb+n3DlHDCZ6crCcw9OizXf5St5fSLydHcfU3vYtlqyLWhRas/cN1o+FFluDMWN5+Azr9qWImZnSnJfwjcut0zwPmTESZY/h2HkN6vr7dvzUZtr05mbn1jqvbs9E0vTdOxv4aLT8cOdwXPFuefcnus1v8AUuRmyXyTuZWRpL8DIdmaRkMhne2idgsC+nPULPjr+FX5+Uas9A8CyzyaaDkvY+XkPc1tAm+wHRR1raNpidNxmybmkjo7sVy+TaPr7bOKummypCI9zqANrm3/AC3aV7002TMSC/ih7quJ2261j01E8rZPVtPPT5WatmK66UMskRh4aCOhocK2IlOuvTWSHfbdhBJ/L7KW/pNi/cCdrGXXbm1PuRBJO6txcGnqABVJs0reaao9AeCeK+UjXuWUTrY0vMjSd1FxPI/L/VT8Y9seW50ryuymMDjGGtcPxX/T7qXjaK7k3WZ9pDMXNFhoa0W4+/tSlMIxCJkkg9d7O1E8/NJqfonU9I3yxMfT+GEbrHP/AEKcV1LG9wqvk3M3OYQO19T8j2Uq0Z3r7VJJmGURMc2PdxZJofK28PGvk6rDVzcmlI3aUuFhZWY8hjHNYT+a62D4v7yf2cnN8nPqn93a+GvB8kr2udGTddV18WGtI1WNORlz2tO7Tt6v4V8GtYGkxD9FfEaalsj0nRtDhxmCmAV8Iom228jjawUAiLNAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEFLWdOx9Sw3Y88McgPRr2gg/qqORh/Vr/NZiyTjtuJeTa/9PfB8+Q/+J0eGOW+dtsC4F/CszW3Uu3i+Q5MR1bcNJJ4A8G4210GiYgcBRLzvtVZL011Oln/Xcm292lHJhafhHZjY0UAA5EUVAD9FqWzRvUSxvJfu0qEshJDWtbFHyA4ttxKlXJNiaRX33KjkBkMgo75T3d0AVvlqf5o6mYUs+ZzWW0249x1Vm5iNkREt79K9cY7KyNGnpjzc0N8bq/EPv0P6p5T4ztG9e9w7XML3NdR9a4mfczLcxxEa/DS5Uh5Dm39ui0be+29SPw1WVLxy2rN/isKXU/S+tZ21GXI2OtxJs+kcUs1jTYisy1U8jnEtawu57O4/4VkbW9R7Vv5pAd5e5vUgEUpTE6YiYhC6aSOtvB3cNItK/wAidfavIWuA4dvuiAK5UogjpEfxFpLWNPU0VnxZ3qFaVw3O2sa7uON3Pa/9lKKm/wAmT58sm7Ilf+EAgAAcd1dMzadyrrqvUKbnMiaWNjffS3mz+ijEaWTMyhdJUgPA3Agk1YU2OvaKV7Wlxe6x/SObK2cPGvltqsNfNyKYq7tOmDcTO1B4a0OjiPYdSu7x/jqUjd+5cLkfI3v1TqHU+H/B0krml0ZJPWwulWkR1Dm3yTM7mXpvhfwPt2l0X7K2Ia1sj0vQfC8OO1pMY/RSUWu6vEw44WgBoRWtgAdEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQazWdIh1Bu4UyUDh1cH7rS5XDrn7+12LNOP/RxuqaJNjSEy4pIu7Atp/NcLNwbY53arfpyIt6lz2owMdLJIxtDtfH5LXyUrMzZdS0xEQ0eowyFwpn5+yqteZ6qsrEe5aDODccvkf1/UlX4sdp7iErWjXtyet6y6JpbBjl7x0ceAFs/pX+0Nw452oa1FqUWoQZMkM8Mgkjczja4dPupfpTMds+T3nwb4sg8T6QZgxsObE0DJgv8J/zN/wDU9vbouLzcF8U7+pbWC0WWcx1WS4g91zbOhWGmy3RjqB0u7WK1bFdtVkyMLXMI/O/9FOI+l8RPtQyCwnaHNa6+hCs0l2qSua17RHf4ed3AJ+6nEa9MW79sH5JjZwz+YDtLgb/O1ZEozCq3Y+LzZHEc9Sdov/VK16JlXc2R9VJE0G/xGlKINwrukmNtZGzaejt1cf3WawzMx7lXlmfZG1paRVO5r7fCn4TMkTCFxllcdvHFcCv1V2PBbJOqwrvnpjjdpWMTSsib0xsdRrml1+P8V95P7OTyPlPrH/d0ui+DZZnNc+Nzie5C7OPFWkarGnFy5pvO7Tt6H4c8CVtLov2V0Va9sr0TQ/CcEAaTGL+yk15yOrwtNhgaKaEQmdr7WtaKARh9QEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEHwiwVgajVdNxZ2nfjROPvsC18nHx3/AIqwlGS9fUuO1XQW0QyOgtb/AKDFE+l8cm35cjqvht7y70FXRhiOoSjLty+p+EnkkiM/ooWwra5XP5nhV7b/AJf7Kr9NZGVQh0jO07Lbl4UkuPOz8L2Gj9vkfChkw1vXxtG4Trl1O4dZh+JXSx+XqUDoJenmxC4z929R+Vrhcn4aY7wz/R0cHPj1dLkZMGRtMUjHB3+V4/subfi5adWrLqYc2O38NoVJWMDdr2t69T1KhFPpseW+4Up4mEueWAOaTQ7UrP02fPpQmxWyNDgy3XfJ6qX6R+orz4c5tsdNbXZ3KnGKfR+rWO5UpcQxW9zmSk8cOsAfZSjFMdsTm316QRxSbg5jAPY3f7K3Hx8l56hXfPjpHcs49PypiA1jjfUlb2L4zLb301MnyWKvrttMPwtl5LgXMIHsF0sXxlKzu3bnZfk7T1Xp1ei+BHvLS6In8l0qYq1jURpzMnIm07tLu9D8CMZtLov2VsVa9srtdK8L48AH8scfCkpm8y6HF0+GEABoRHa41oaOAjD6gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIPjmh3VBXlxI39QFjQqzaTA/qwJpnajkeH8d4/AP0WPFnylqc3wnC8GmD9FCaJRklz+f4Mabpg/RVzjTjK0mX4LNmo/2UJonGVr5fBTyf8A4v2WP02f1UY8GzN/CHt96Krtx6W/ihZXk3r6l9PhHK4NE18Kqfj8E/5V8fIZo/zMJPB+S49HD7cLMcDFH+Vn/wDUM0/5kL/BErzyxxU68PFHqqM83JP+ZJD4Ac4UYf2VtePSPUK55Np9y2mF9PhxcX7K6KaVzm23+neA4m1ujH6KcVVTldLp3hLGhAuNv6KUQrnJLfYmj48IFMH6KSG5X44I2DhoRhKAB0QEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBB8LQeyCN8DHdQFjQgfgRO/pCxoRnTIT/SFjxZ2+f+Lh/wAoTxNn/i4P8oWfE2f+Kg/yD9E8Wdvo0uAf0BNMeUpG6fA3+gLOjcpWYsTejQs6YStjYOgQZUEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBB//Z\"\n", + "const chat = new ChatOpenAI({\n", + " model: \"gpt-4-vision-preview\",\n", + " maxTokens: 1024,\n", + "});\n", + "\n", + "const dataUrlMessage = new HumanMessage({\n", + " content: [\n", + " {\n", + " type: \"text\",\n", + " text: \"What does this image contain?\",\n", + " },\n", + " {\n", + " type: \"image_url\",\n", + " image_url: {\n", + " url: `data:image/jpeg;base64,${imageBase64}`,\n", + " },\n", + " },\n", + " ],\n", + "});\n", + "\n", + "await chain.invoke({\n", + " input: [\n", + " dataUrlMessage,\n", + " ],\n", + "});" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Deno", + "language": "typescript", + "name": "deno" + }, + "language_info": { + "file_extension": ".ts", + "mimetype": "text/x.typescript", + "name": "typescript", + "nb_converter": "script", + "pygments_lexer": "typescript", + "version": "5.2.2" } - ], - "source": [ - "// const imageData = await fs.readFile(path.join(__dirname, \"/data/hotdog.jpg\"));\n", - "// const imageBase64 = imageData.toString(\"base64\");\n", - "const imageBase64 = \"/9j/4AAQSkZJRgABAQEBLAEsAAD/4QBWRXhpZgAATU0AKgAAAAgABAEaAAUAAAABAAAAPgEbAAUAAAABAAAARgEoAAMAAAABAAIAAAITAAMAAAABAAEAAAAAAAAAAAEsAAAAAQAAASwAAAAB/+0ALFBob3Rvc2hvcCAzLjAAOEJJTQQEAAAAAAAPHAFaAAMbJUccAQAAAgAEAP/hDIFodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvADw/eHBhY2tldCBiZWdpbj0n77u/JyBpZD0nVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkJz8+Cjx4OnhtcG1ldGEgeG1sbnM6eD0nYWRvYmU6bnM6bWV0YS8nIHg6eG1wdGs9J0ltYWdlOjpFeGlmVG9vbCAxMC4xMCc+CjxyZGY6UkRGIHhtbG5zOnJkZj0naHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyc+CgogPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9JycKICB4bWxuczp0aWZmPSdodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyc+CiAgPHRpZmY6UmVzb2x1dGlvblVuaXQ+MjwvdGlmZjpSZXNvbHV0aW9uVW5pdD4KICA8dGlmZjpYUmVzb2x1dGlvbj4zMDAvMTwvdGlmZjpYUmVzb2x1dGlvbj4KICA8dGlmZjpZUmVzb2x1dGlvbj4zMDAvMTwvdGlmZjpZUmVzb2x1dGlvbj4KIDwvcmRmOkRlc2NyaXB0aW9uPgoKIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PScnCiAgeG1sbnM6eG1wTU09J2h0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8nPgogIDx4bXBNTTpEb2N1bWVudElEPmFkb2JlOmRvY2lkOnN0b2NrOjdlNWJlOGE1LWQwMmQtNDFiMS1hMWM5LWRjYzJlNTcyZTNmNzwveG1wTU06RG9jdW1lbnRJRD4KICA8eG1wTU06SW5zdGFuY2VJRD54bXAuaWlkOjBkMDgwOTI4LWY2YzMtNDQyNy05ZGI5LWEwZjdiYTI2YWNhYTwveG1wTU06SW5zdGFuY2VJRD4KIDwvcmRmOkRlc2NyaXB0aW9uPgo8L3JkZjpSREY+CjwveDp4bXBtZXRhPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAo8P3hwYWNrZXQgZW5kPSd3Jz8+/9sAQwAFAwQEBAMFBAQEBQUFBgcMCAcHBwcPCwsJDBEPEhIRDxERExYcFxMUGhURERghGBodHR8fHxMXIiQiHiQcHh8e/9sAQwEFBQUHBgcOCAgOHhQRFB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e/8AAEQgBaAIcAwERAAIRAQMRAf/EAB0AAQACAwEBAQEAAAAAAAAAAAADBAIFBgcBCAn/xAA8EAABBAEDAgUCBAQGAgICAwABAAIDEQQFEiExQQYTIlFhB3EygZGhFCNCsQhSwdHh8BViM3Ik8UOCkv/EABsBAQACAwEBAAAAAAAAAAAAAAACAwEEBQYH/8QANhEBAAICAgICAQIEBQQCAQUAAAECAxEEIRIxBUFREyIyYYGRBkJxodEUI8HwseE0FTNykvH/2gAMAwEAAhEDEQA/AP2WgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgqZeoY2Nw99n2C1snKx4+pldjwXv6a6bxAxt7ISfuVp3+Sj/ACw2q8CfuVCbxTK08Qx/mVTb5S0fS6Pjq/lLpnigT5bIMiJrQ80HA9FZx/kv1L+NoQzfH+FfKsumXXcwQCQBZKDkPFP1G8LeH3uhyM7+IyG9YscbyPuegWjn+QwYepnc/wAnY4XwXM5cbrXUfmenm+vfXfKc50ejaPFEO0mQ8vP6CguZk+ameqV/u9Jx/wDB9KxvNk3/AKOdf9avGjbeH4Jrnb/DilnH8nmtPel+T/DXCrHUT/dsvCv+I+F+azE8QaTQc7b52NYPz6T1/VdOnKtr90OFn+CxzMxhv3+J/wCXunh3XtK8QYIzNKzI8iI9aNOafYjqFtUvF43DgcjjZePbxyRps1NQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIMJZY4m29wChfJWkbtKVaTb01+TqzGWImbj7laN+dH+WG3ThzP8AFLXT6vOXi3jb3DVp5OZlmfbapxKa9NFq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QEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEHwiwVgajVdNxZ2nfjROPvsC18nHx3/AIqwlGS9fUuO1XQW0QyOgtb/AKDFE+l8cm35cjqvht7y70FXRhiOoSjLty+p+EnkkiM/ooWwra5XP5nhV7b/AJf7Kr9NZGVQh0jO07Lbl4UkuPOz8L2Gj9vkfChkw1vXxtG4Trl1O4dZh+JXSx+XqUDoJenmxC4z929R+Vrhcn4aY7wz/R0cHPj1dLkZMGRtMUjHB3+V4/subfi5adWrLqYc2O38NoVJWMDdr2t69T1KhFPpseW+4Up4mEueWAOaTQ7UrP02fPpQmxWyNDgy3XfJ6qX6R+orz4c5tsdNbXZ3KnGKfR+rWO5UpcQxW9zmSk8cOsAfZSjFMdsTm316QRxSbg5jAPY3f7K3Hx8l56hXfPjpHcs49PypiA1jjfUlb2L4zLb301MnyWKvrttMPwtl5LgXMIHsF0sXxlKzu3bnZfk7T1Xp1ei+BHvLS6In8l0qYq1jURpzMnIm07tLu9D8CMZtLov2VsVa9srtdK8L48AH8scfCkpm8y6HF0+GEABoRHa41oaOAjD6gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIPjmh3VBXlxI39QFjQqzaTA/qwJpnajkeH8d4/AP0WPFnylqc3wnC8GmD9FCaJRklz+f4Mabpg/RVzjTjK0mX4LNmo/2UJonGVr5fBTyf8A4v2WP02f1UY8GzN/CHt96Krtx6W/ihZXk3r6l9PhHK4NE18Kqfj8E/5V8fIZo/zMJPB+S49HD7cLMcDFH+Vn/wDUM0/5kL/BErzyxxU68PFHqqM83JP+ZJD4Ac4UYf2VtePSPUK55Np9y2mF9PhxcX7K6KaVzm23+neA4m1ujH6KcVVTldLp3hLGhAuNv6KUQrnJLfYmj48IFMH6KSG5X44I2DhoRhKAB0QEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBB8LQeyCN8DHdQFjQgfgRO/pCxoRnTIT/SFjxZ2+f+Lh/wAoTxNn/i4P8oWfE2f+Kg/yD9E8Wdvo0uAf0BNMeUpG6fA3+gLOjcpWYsTejQs6YStjYOgQZUEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBB//Z\"\n", - "const chat = new ChatOpenAI({\n", - " modelName: \"gpt-4-vision-preview\",\n", - " maxTokens: 1024,\n", - "});\n", - "\n", - "const dataUrlMessage = new HumanMessage({\n", - " content: [\n", - " {\n", - " type: \"text\",\n", - " text: \"What does this image contain?\",\n", - " },\n", - " {\n", - " type: \"image_url\",\n", - " image_url: {\n", - " url: `data:image/jpeg;base64,${imageBase64}`,\n", - " },\n", - " },\n", - " ],\n", - "});\n", - "\n", - "await chain.invoke({\n", - " input: [\n", - " dataUrlMessage,\n", - " ],\n", - "});" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Deno", - "language": "typescript", - "name": "deno" }, - "language_info": { - "file_extension": ".ts", - "mimetype": "text/x.typescript", - "name": "typescript", - "nb_converter": "script", - "pygments_lexer": "typescript", - "version": "5.2.2" - } - }, - "nbformat": 4, - "nbformat_minor": 2 + "nbformat": 4, + "nbformat_minor": 2 } diff --git a/docs/core_docs/docs/expression_language/how_to/message_history.mdx b/docs/core_docs/docs/expression_language/how_to/message_history.mdx index 584a0f189e77..dc6672f8e3b2 100644 --- a/docs/core_docs/docs/expression_language/how_to/message_history.mdx +++ b/docs/core_docs/docs/expression_language/how_to/message_history.mdx @@ -61,7 +61,7 @@ const prompt = ChatPromptTemplate.fromMessages([ ]); const chain = prompt.pipe( - new ChatAnthropic({ modelName: "claude-3-sonnet-20240229" }) + new ChatAnthropic({ model: "claude-3-sonnet-20240229" }) ); ``` diff --git a/docs/core_docs/docs/get_started/quickstart.mdx b/docs/core_docs/docs/get_started/quickstart.mdx index 57f2a2b490da..7860b0c0317f 100644 --- a/docs/core_docs/docs/get_started/quickstart.mdx +++ b/docs/core_docs/docs/get_started/quickstart.mdx @@ -71,13 +71,13 @@ Accessing the API requires an API key, which you can get by creating an account OPENAI_API_KEY="..." ``` -If you'd prefer not to set an environment variable you can pass the key in directly via the `openAIApiKey` named parameter when initiating the OpenAI Chat Model class: +If you'd prefer not to set an environment variable you can pass the key in directly via the `apiKey` named parameter when initiating the OpenAI Chat Model class: ```typescript import { ChatOpenAI } from "@langchain/openai"; const chatModel = new ChatOpenAI({ - openAIApiKey: "...", + apiKey: "...", }); ``` @@ -135,13 +135,13 @@ Accessing the API requires an API key, which you can get by creating an account ANTHROPIC_API_KEY="..." ``` -If you'd prefer not to set an environment variable you can pass the key in directly via the `anthropicApiKey` named parameter when initiating the Anthropic Chat Model class: +If you'd prefer not to set an environment variable you can pass the key in directly via the `apiKey` named parameter when initiating the Anthropic Chat Model class: ```typescript import { ChatAnthropic } from "@langchain/anthropic"; const chatModel = new ChatAnthropic({ - anthropicApiKey: "...", + apiKey: "...", }); ``` @@ -602,7 +602,7 @@ const agentPrompt = await pull( ); const agentModel = new ChatOpenAI({ - modelName: "gpt-3.5-turbo-1106", + model: "gpt-3.5-turbo-1106", temperature: 0, }); diff --git a/docs/core_docs/docs/guides/langsmith_evaluation.mdx b/docs/core_docs/docs/guides/langsmith_evaluation.mdx index 93193b6cf252..6e672c332064 100644 --- a/docs/core_docs/docs/guides/langsmith_evaluation.mdx +++ b/docs/core_docs/docs/guides/langsmith_evaluation.mdx @@ -73,7 +73,7 @@ const prompt = await pull( ); const llm = new ChatOpenAI({ - modelName: "gpt-3.5-turbo-1106", + model: "gpt-3.5-turbo-1106", temperature: 0, }); diff --git a/docs/core_docs/docs/integrations/chat/anthropic_tools.mdx b/docs/core_docs/docs/integrations/chat/anthropic_tools.mdx index 0188971ec339..5ba7a86f4da2 100644 --- a/docs/core_docs/docs/integrations/chat/anthropic_tools.mdx +++ b/docs/core_docs/docs/integrations/chat/anthropic_tools.mdx @@ -32,8 +32,8 @@ import { ChatAnthropicTools } from "@langchain/anthropic/experimental"; const model = new ChatAnthropicTools({ temperature: 0.1, - modelName: "claude-3-sonnet-20240229", - anthropicApiKey: "YOUR-API-KEY", // In Node.js defaults to process.env.ANTHROPIC_API_KEY + model: "claude-3-sonnet-20240229", + apiKey: "YOUR-API-KEY", // In Node.js defaults to process.env.ANTHROPIC_API_KEY }); ``` diff --git a/docs/core_docs/docs/integrations/chat/azure.mdx b/docs/core_docs/docs/integrations/chat/azure.mdx index 631fa05e76ef..443ffe756a47 100644 --- a/docs/core_docs/docs/integrations/chat/azure.mdx +++ b/docs/core_docs/docs/integrations/chat/azure.mdx @@ -67,9 +67,9 @@ import { AzureChatOpenAI } from "@langchain/azure-openai"; const model = new AzureChatOpenAI({ azureOpenAIEndpoint: "", - azureOpenAIApiKey: "", + apiKey: "", azureOpenAIApiDeploymentName: "", + model: "", }); ``` @@ -85,7 +85,7 @@ const model = new AzureChatOpenAI({ credentials, azureOpenAIEndpoint: "", azureOpenAIApiDeploymentName: "", + model: "", }); ``` diff --git a/docs/core_docs/docs/integrations/llms/azure.mdx b/docs/core_docs/docs/integrations/llms/azure.mdx index eeb34320814d..7ef87ba44433 100644 --- a/docs/core_docs/docs/integrations/llms/azure.mdx +++ b/docs/core_docs/docs/integrations/llms/azure.mdx @@ -35,7 +35,7 @@ import { AzureOpenAI } from "@langchain/azure-openai"; const model = new AzureOpenAI({ azureOpenAIEndpoint: "", - azureOpenAIApiKey: "", + apiKey: "", azureOpenAIApiDeploymentName: "", azureOpenAIApiDeploymentName: "", + model: "", }); ``` @@ -103,7 +103,7 @@ import { OpenAI } from "@langchain/openai"; const model = new OpenAI({ temperature: 0.9, - azureOpenAIApiKey: "YOUR-API-KEY", + apiKey: "YOUR-API-KEY", azureOpenAIApiVersion: "YOUR-API-VERSION", azureOpenAIApiInstanceName: "{MY_INSTANCE_NAME}", azureOpenAIApiDeploymentName: "{DEPLOYMENT_NAME}", @@ -122,7 +122,7 @@ import { OpenAI } from "@langchain/openai"; const model = new OpenAI({ temperature: 0.9, - azureOpenAIApiKey: "YOUR-API-KEY", + apiKey: "YOUR-API-KEY", azureOpenAIApiVersion: "YOUR-API-VERSION", azureOpenAIApiDeploymentName: "{DEPLOYMENT_NAME}", azureOpenAIBasePath: diff --git a/docs/core_docs/docs/integrations/llms/openai.mdx b/docs/core_docs/docs/integrations/llms/openai.mdx index c66490f9be10..d880162a725a 100644 --- a/docs/core_docs/docs/integrations/llms/openai.mdx +++ b/docs/core_docs/docs/integrations/llms/openai.mdx @@ -14,9 +14,9 @@ npm install @langchain/openai import { OpenAI } from "@langchain/openai"; const model = new OpenAI({ - modelName: "gpt-3.5-turbo-instruct", // Defaults to "gpt-3.5-turbo-instruct" if no model provided. + model: "gpt-3.5-turbo-instruct", // Defaults to "gpt-3.5-turbo-instruct" if no model provided. temperature: 0.9, - openAIApiKey: "YOUR-API-KEY", // In Node.js defaults to process.env.OPENAI_API_KEY + apiKey: "YOUR-API-KEY", // In Node.js defaults to process.env.OPENAI_API_KEY }); const res = await model.invoke( "What would be a good company name a company that makes colorful socks?" diff --git a/docs/core_docs/docs/integrations/llms/prompt_layer_openai.mdx b/docs/core_docs/docs/integrations/llms/prompt_layer_openai.mdx index 15853f21cba4..8fc30e4de86b 100644 --- a/docs/core_docs/docs/integrations/llms/prompt_layer_openai.mdx +++ b/docs/core_docs/docs/integrations/llms/prompt_layer_openai.mdx @@ -10,7 +10,7 @@ import { PromptLayerOpenAI } from "langchain/llms/openai"; const model = new PromptLayerOpenAI({ temperature: 0.9, - openAIApiKey: "YOUR-API-KEY", // In Node.js defaults to process.env.OPENAI_API_KEY + apiKey: "YOUR-API-KEY", // In Node.js defaults to process.env.OPENAI_API_KEY promptLayerApiKey: "YOUR-API-KEY", // In Node.js defaults to process.env.PROMPTLAYER_API_KEY }); const res = await model.invoke( diff --git a/docs/core_docs/docs/integrations/platforms/google.mdx b/docs/core_docs/docs/integrations/platforms/google.mdx index 39bd077e2ead..21a2f37eaebc 100644 --- a/docs/core_docs/docs/integrations/platforms/google.mdx +++ b/docs/core_docs/docs/integrations/platforms/google.mdx @@ -35,7 +35,7 @@ export GOOGLE_API_KEY=your-api-key import { ChatGoogleGenerativeAI } from "@langchain/google-genai"; const model = new ChatGoogleGenerativeAI({ - modelName: "gemini-pro", + model: "gemini-pro", maxOutputTokens: 2048, }); @@ -52,7 +52,7 @@ Gemini vision models support image inputs when providing a single human message. ```typescript const visionModel = new ChatGoogleGenerativeAI({ - modelName: "gemini-pro-vision", + model: "gemini-pro-vision", maxOutputTokens: 2048, }); const image = fs.readFileSync("./hotdog.jpg").toString("base64"); @@ -105,7 +105,7 @@ import { ChatVertexAI } from "@langchain/google-vertexai"; // import { ChatVertexAI } from "@langchain/google-vertexai-web"; const model = new ChatVertexAI({ - modelName: "gemini-1.0-pro", + model: "gemini-1.0-pro", maxOutputTokens: 2048, }); @@ -122,7 +122,7 @@ Gemini vision models support image inputs when providing a single human message. ```typescript const visionModel = new ChatVertexAI({ - modelName: "gemini-pro-vision", + model: "gemini-pro-vision", maxOutputTokens: 2048, }); const image = fs.readFileSync("./hotdog.png").toString("base64"); diff --git a/docs/core_docs/docs/integrations/text_embedding/azure_openai.mdx b/docs/core_docs/docs/integrations/text_embedding/azure_openai.mdx index 04de92f656b5..5fc0ea731c32 100644 --- a/docs/core_docs/docs/integrations/text_embedding/azure_openai.mdx +++ b/docs/core_docs/docs/integrations/text_embedding/azure_openai.mdx @@ -41,7 +41,7 @@ import { AzureOpenAI } from "@langchain/azure-openai"; const model = new AzureOpenAI({ azureOpenAIEndpoint: "", - azureOpenAIApiKey: "", + apiKey: "", azureOpenAIApiDeploymentName: "( ); const llm = new ChatOpenAI({ - modelName: "gpt-3.5-turbo-1106", + model: "gpt-3.5-turbo-1106", temperature: 0, }); diff --git a/docs/core_docs/docs/modules/agents/agent_types/openai_tools_agent.mdx b/docs/core_docs/docs/modules/agents/agent_types/openai_tools_agent.mdx index 464bcd3a9d48..ca1be5c98cd3 100644 --- a/docs/core_docs/docs/modules/agents/agent_types/openai_tools_agent.mdx +++ b/docs/core_docs/docs/modules/agents/agent_types/openai_tools_agent.mdx @@ -54,7 +54,7 @@ import type { ChatPromptTemplate } from "@langchain/core/prompts"; const prompt = await pull("hwchase17/openai-tools-agent"); const llm = new ChatOpenAI({ - modelName: "gpt-3.5-turbo-1106", + model: "gpt-3.5-turbo-1106", temperature: 0, }); diff --git a/docs/core_docs/docs/modules/agents/agent_types/react.mdx b/docs/core_docs/docs/modules/agents/agent_types/react.mdx index f917ac3680d6..04c99480e1ff 100644 --- a/docs/core_docs/docs/modules/agents/agent_types/react.mdx +++ b/docs/core_docs/docs/modules/agents/agent_types/react.mdx @@ -42,7 +42,7 @@ import type { PromptTemplate } from "@langchain/core/prompts"; const prompt = await pull("hwchase17/react"); const llm = new OpenAI({ - modelName: "gpt-3.5-turbo-instruct", + model: "gpt-3.5-turbo-instruct", temperature: 0, }); diff --git a/docs/core_docs/docs/modules/agents/agent_types/structured_chat.mdx b/docs/core_docs/docs/modules/agents/agent_types/structured_chat.mdx index f8f4302dc08f..c0b1eac4cda0 100644 --- a/docs/core_docs/docs/modules/agents/agent_types/structured_chat.mdx +++ b/docs/core_docs/docs/modules/agents/agent_types/structured_chat.mdx @@ -51,7 +51,7 @@ const prompt = await pull( ); const llm = new ChatOpenAI({ - modelName: "gpt-3.5-turbo-1106", + model: "gpt-3.5-turbo-1106", temperature: 0, }); diff --git a/docs/core_docs/docs/modules/agents/how_to/agent_structured.mdx b/docs/core_docs/docs/modules/agents/how_to/agent_structured.mdx index 7708b1ab55f8..b756eb2f034a 100644 --- a/docs/core_docs/docs/modules/agents/how_to/agent_structured.mdx +++ b/docs/core_docs/docs/modules/agents/how_to/agent_structured.mdx @@ -37,7 +37,7 @@ Next, we initialize an LLM and a search tool that wraps our web search retriever ```typescript const llm = new ChatOpenAI({ - modelName: "gpt-4-1106-preview", + model: "gpt-4-1106-preview", }); const searchTool = new DynamicTool({ diff --git a/docs/core_docs/docs/modules/agents/how_to/custom_agent.mdx b/docs/core_docs/docs/modules/agents/how_to/custom_agent.mdx index 0cf1e1c5ef9a..5c8f2acc08e8 100644 --- a/docs/core_docs/docs/modules/agents/how_to/custom_agent.mdx +++ b/docs/core_docs/docs/modules/agents/how_to/custom_agent.mdx @@ -23,7 +23,7 @@ import { ChatOpenAI } from "@langchain/openai"; * Define your chat model to use. */ const model = new ChatOpenAI({ - modelName: "gpt-3.5-turbo", + model: "gpt-3.5-turbo", temperature: 0, }); ``` diff --git a/docs/core_docs/docs/modules/agents/how_to/max_iterations.mdx b/docs/core_docs/docs/modules/agents/how_to/max_iterations.mdx index 999e63314974..3aaf6b38ce55 100644 --- a/docs/core_docs/docs/modules/agents/how_to/max_iterations.mdx +++ b/docs/core_docs/docs/modules/agents/how_to/max_iterations.mdx @@ -16,7 +16,7 @@ import { AgentExecutor, createReactAgent } from "langchain/agents"; const tools = [new Calculator()]; const llm = new ChatOpenAI({ - modelName: "gpt-3.5-turbo", + model: "gpt-3.5-turbo", temperature: 0, }); diff --git a/docs/core_docs/docs/modules/agents/quick_start.mdx b/docs/core_docs/docs/modules/agents/quick_start.mdx index 09d77ef8be2b..6e1251c06947 100644 --- a/docs/core_docs/docs/modules/agents/quick_start.mdx +++ b/docs/core_docs/docs/modules/agents/quick_start.mdx @@ -117,7 +117,7 @@ First, we choose the LLM we want to be guiding the agent. import { ChatOpenAI } from "@langchain/openai"; const llm = new ChatOpenAI({ - modelName: "gpt-3.5-turbo", + model: "gpt-3.5-turbo", temperature: 0, }); ``` diff --git a/docs/core_docs/docs/modules/model_io/chat/caching.mdx b/docs/core_docs/docs/modules/model_io/chat/caching.mdx index 8d41db152617..0f4cd2fa5f4f 100644 --- a/docs/core_docs/docs/modules/model_io/chat/caching.mdx +++ b/docs/core_docs/docs/modules/model_io/chat/caching.mdx @@ -16,7 +16,7 @@ import { ChatOpenAI } from "@langchain/openai"; // To make the caching really obvious, lets use a slower model. const model = new ChatOpenAI({ - modelName: "gpt-4", + model: "gpt-4", cache: true, }); ``` diff --git a/docs/core_docs/docs/modules/model_io/chat/function_calling.ipynb b/docs/core_docs/docs/modules/model_io/chat/function_calling.ipynb index dbe833e2b508..f8371ac4def6 100644 --- a/docs/core_docs/docs/modules/model_io/chat/function_calling.ipynb +++ b/docs/core_docs/docs/modules/model_io/chat/function_calling.ipynb @@ -1,763 +1,763 @@ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Function calling\n", - "\n", - "A growing number of chat models, like [OpenAI](/docs/integrations/chat/openai#tool-calling), [Mistral](/docs/integrations/chat/mistral#tool-calling), etc., have a function-calling\n", - "API that lets you describe functions and their arguments, and have the model return a JSON object with a function to invoke and the inputs to that function.\n", - "Function-calling is extremely useful for building [tool-using chains and agents](/docs/use_cases/tool_use/), and for getting structured outputs from models more generally.\n", - "\n", - "LangChain comes with a number of utilities to make function-calling easy. Namely, it comes with:\n", - "\n", - "- simple syntax for binding functions to models\n", - "- converters for formatting various types of objects to the expected function schemas\n", - "- output parsers for extracting the function invocations from API responses\n", - "- chains for getting structured outputs from a model, built on top of function calling\n", - "\n", - "We'll focus here on the first two points. For a detailed guide on output parsing check out the [OpenAI Tools output parsers](/docs/modules/model_io/output_parsers/types/openai_tools) and to\n", - "see the structured output chains check out the Structured output guide ([OpenAI](/docs/integrations/chat/openai#withstructuredoutput--), [Mistral](/docs/integrations/chat/mistral#withstructuredoutput--)).\n", - "\n", - "Before getting started make sure you have `@langchain/core` installed." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "```{=mdx}\n", - "import IntegrationInstallTooltip from \"@mdx_components/integration_install_tooltip.mdx\";\n", - "import Npm2Yarn from \"@theme/Npm2Yarn\";\n", - "\n", - "\n", - "\n", - "\n", - " @langchain/core\n", - "\n", - "```\n", - "\n", - "We'll also use `zod-to-json-schema` frequently throughout this doc for converting Zod schemas to JSON schemas. Make sure you have it installed:\n", - "\n", - "```{=mdx}\n", - "\n", - " zod-to-json-schema\n", - "\n", - "```" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "A number of models implement helper methods that will take care of formatting and binding different function-like objects to the model.\n", - "Let's take a look at how we might take the following Zod function schema and get different models to invoke it:" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import { z } from \"zod\";\n", - "\n", - "/**\n", - " * Note that the descriptions here are crucial, as they will be passed along\n", - " * to the model along with the class name.\n", - " */\n", - "const calculatorSchema = z.object({\n", - " operation: z\n", - " .enum([\"add\", \"subtract\", \"multiply\", \"divide\"])\n", - " .describe(\"The type of operation to execute.\"),\n", - " number1: z.number().describe(\"The first number to operate on.\"),\n", - " number2: z.number().describe(\"The second number to operate on.\"),\n", - "});" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "\n", - "\n", - " \n", - "\n", - "Set up dependencies and API keys:\n", - "\n", - "```bash\n", - "npm install @langchain/openai\n", - "```\n", - "\n", - "```bash\n", - "OPENAI_API_KEY=your-api-key\n", - "```\n", - "\n", - "We can use the `ChatOpenAI.bind()` method to handle converting `calculatorSchema` to an OpenAI function and binding it to the model (i.e., passing it in each time the model is invoked)." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ + "cells": [ { - "data": { - "text/plain": [ - "AIMessage {\n", - " lc_serializable: \u001b[33mtrue\u001b[39m,\n", - " lc_kwargs: {\n", - " content: \u001b[32m\"\"\u001b[39m,\n", - " additional_kwargs: {\n", - " function_call: \u001b[90mundefined\u001b[39m,\n", - " tool_calls: [\n", - " {\n", - " id: \u001b[32m\"call_cLBi7NjrehSEPoXr21i08NER\"\u001b[39m,\n", - " type: \u001b[32m\"function\"\u001b[39m,\n", - " function: \u001b[36m[Object]\u001b[39m\n", - " }\n", - " ]\n", - " }\n", - " },\n", - " lc_namespace: [ \u001b[32m\"langchain_core\"\u001b[39m, \u001b[32m\"messages\"\u001b[39m ],\n", - " content: \u001b[32m\"\"\u001b[39m,\n", - " name: \u001b[90mundefined\u001b[39m,\n", - " additional_kwargs: {\n", - " function_call: \u001b[90mundefined\u001b[39m,\n", - " tool_calls: [\n", - " {\n", - " id: \u001b[32m\"call_cLBi7NjrehSEPoXr21i08NER\"\u001b[39m,\n", - " type: \u001b[32m\"function\"\u001b[39m,\n", - " function: {\n", - " name: \u001b[32m\"calculator\"\u001b[39m,\n", - " arguments: \u001b[32m'{\"operation\":\"multiply\",\"number1\":3,\"number2\":12}'\u001b[39m\n", - " }\n", - " }\n", - " ]\n", - " }\n", - "}" + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Function calling\n", + "\n", + "A growing number of chat models, like [OpenAI](/docs/integrations/chat/openai#tool-calling), [Mistral](/docs/integrations/chat/mistral#tool-calling), etc., have a function-calling\n", + "API that lets you describe functions and their arguments, and have the model return a JSON object with a function to invoke and the inputs to that function.\n", + "Function-calling is extremely useful for building [tool-using chains and agents](/docs/use_cases/tool_use/), and for getting structured outputs from models more generally.\n", + "\n", + "LangChain comes with a number of utilities to make function-calling easy. Namely, it comes with:\n", + "\n", + "- simple syntax for binding functions to models\n", + "- converters for formatting various types of objects to the expected function schemas\n", + "- output parsers for extracting the function invocations from API responses\n", + "- chains for getting structured outputs from a model, built on top of function calling\n", + "\n", + "We'll focus here on the first two points. For a detailed guide on output parsing check out the [OpenAI Tools output parsers](/docs/modules/model_io/output_parsers/types/openai_tools) and to\n", + "see the structured output chains check out the Structured output guide ([OpenAI](/docs/integrations/chat/openai#withstructuredoutput--), [Mistral](/docs/integrations/chat/mistral#withstructuredoutput--)).\n", + "\n", + "Before getting started make sure you have `@langchain/core` installed." ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import { ChatOpenAI } from \"@langchain/openai\";\n", - "import { zodToJsonSchema } from \"zod-to-json-schema\";\n", - "\n", - "const llm = new ChatOpenAI({\n", - " modelName: \"gpt-3.5-turbo-0125\",\n", - " temperature: 0,\n", - "});\n", - "const llmWithTools = llm.bind({\n", - " tools: [\n", - " {\n", - " type: \"function\" as const,\n", - " function: {\n", - " name: \"calculator\",\n", - " description: \"A simple calculator tool\",\n", - " parameters: zodToJsonSchema(calculatorSchema),\n", - " },\n", - " },\n", - " ],\n", - "});\n", - "await llmWithTools.invoke(\"What is 3 * 12\");" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "> #### See the LangSmith trace [here](https://smith.langchain.com/public/cb36c6e5-e478-463c-801a-0c1b09ace04d/r).\n", - "\n", - "We can add a tool parser to extract the tool calls from the generated message to JSON:" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ + }, { - "data": { - "text/plain": [ - "[\n", - " {\n", - " type: \u001b[32m\"calculator\"\u001b[39m,\n", - " args: { operation: \u001b[32m\"multiply\"\u001b[39m, number1: \u001b[33m3\u001b[39m, number2: \u001b[33m12\u001b[39m }\n", - " }\n", - "]" + "cell_type": "markdown", + "metadata": {}, + "source": [ + "```{=mdx}\n", + "import IntegrationInstallTooltip from \"@mdx_components/integration_install_tooltip.mdx\";\n", + "import Npm2Yarn from \"@theme/Npm2Yarn\";\n", + "\n", + "\n", + "\n", + "\n", + " @langchain/core\n", + "\n", + "```\n", + "\n", + "We'll also use `zod-to-json-schema` frequently throughout this doc for converting Zod schemas to JSON schemas. Make sure you have it installed:\n", + "\n", + "```{=mdx}\n", + "\n", + " zod-to-json-schema\n", + "\n", + "```" ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import { JsonOutputToolsParser } from \"@langchain/core/output_parsers/openai_tools\";\n", - "\n", - "const toolChain = llmWithTools.pipe(new JsonOutputToolsParser());\n", - "await toolChain.invoke(\"What is 3 * 12\");" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "> #### See the LangSmith trace [here](https://smith.langchain.com/public/e2a3f796-0c8a-404b-8d90-e8a626242a24/r).\n", - "\n", - "\n", - "If we wanted to force that a tool is used (and that it is used only once), we can set the `tool_choice` argument:" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ + }, { - "data": { - "text/plain": [ - "AIMessage {\n", - " lc_serializable: \u001b[33mtrue\u001b[39m,\n", - " lc_kwargs: {\n", - " content: \u001b[32m\"\"\u001b[39m,\n", - " additional_kwargs: {\n", - " function_call: \u001b[90mundefined\u001b[39m,\n", - " tool_calls: [\n", - " {\n", - " id: \u001b[32m\"call_6Zh6rnj4W8pvfrOxzc4720Pw\"\u001b[39m,\n", - " type: \u001b[32m\"function\"\u001b[39m,\n", - " function: \u001b[36m[Object]\u001b[39m\n", - " }\n", - " ]\n", - " }\n", - " },\n", - " lc_namespace: [ \u001b[32m\"langchain_core\"\u001b[39m, \u001b[32m\"messages\"\u001b[39m ],\n", - " content: \u001b[32m\"\"\u001b[39m,\n", - " name: \u001b[90mundefined\u001b[39m,\n", - " additional_kwargs: {\n", - " function_call: \u001b[90mundefined\u001b[39m,\n", - " tool_calls: [\n", - " {\n", - " id: \u001b[32m\"call_6Zh6rnj4W8pvfrOxzc4720Pw\"\u001b[39m,\n", - " type: \u001b[32m\"function\"\u001b[39m,\n", - " function: {\n", - " name: \u001b[32m\"calculator\"\u001b[39m,\n", - " arguments: \u001b[32m'{\"operation\":\"multiply\",\"number1\":3,\"number2\":12}'\u001b[39m\n", - " }\n", - " }\n", - " ]\n", - " }\n", - "}" + "cell_type": "markdown", + "metadata": {}, + "source": [ + "A number of models implement helper methods that will take care of formatting and binding different function-like objects to the model.\n", + "Let's take a look at how we might take the following Zod function schema and get different models to invoke it:" ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "const llmWithMultiply = llm.bind({\n", - " tools: [\n", - " {\n", - " type: \"function\" as const,\n", - " function: {\n", - " name: \"calculator\",\n", - " description: \"A simple calculator tool\",\n", - " parameters: zodToJsonSchema(calculatorSchema),\n", - " },\n", - " },\n", - " ],\n", - " tool_choice: {\n", - " type: \"function\" as const,\n", - " function: {\n", - " name: \"calculator\",\n", - " },\n", - " },\n", - "});\n", - "await llmWithMultiply.invoke(\"What is 3 * 12\");" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - " \n", - "\n", - "Set up dependencies and API keys:\n", - "\n", - "```bash\n", - "npm install @langchain/mistralai\n", - "```\n", - "\n", - "```bash\n", - "MISTRAL_API_KEY=your-api-key\n", - "```\n", - "\n", - "We can use the `ChatMistralAI.bind()` method to handle converting `calculatorSchema` to a function and binding it to the model (i.e., passing it in each time the model is invoked)." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ + }, { - "data": { - "text/plain": [ - "AIMessage {\n", - " lc_serializable: \u001b[33mtrue\u001b[39m,\n", - " lc_kwargs: {\n", - " content: \u001b[32m\"\"\u001b[39m,\n", - " additional_kwargs: {\n", - " tool_calls: [ { id: \u001b[32m\"null\"\u001b[39m, type: \u001b[32m\"function\"\u001b[39m, function: \u001b[36m[Object]\u001b[39m } ]\n", - " }\n", - " },\n", - " lc_namespace: [ \u001b[32m\"langchain_core\"\u001b[39m, \u001b[32m\"messages\"\u001b[39m ],\n", - " content: \u001b[32m\"\"\u001b[39m,\n", - " name: \u001b[90mundefined\u001b[39m,\n", - " additional_kwargs: {\n", - " tool_calls: [\n", - " {\n", - " id: \u001b[32m\"null\"\u001b[39m,\n", - " type: \u001b[32m\"function\"\u001b[39m,\n", - " function: {\n", - " name: \u001b[32m\"calculator\"\u001b[39m,\n", - " arguments: \u001b[32m'{\"operation\": \"multiply\", \"number1\": 3, \"number2\": 12}'\u001b[39m\n", - " }\n", - " }\n", - " ]\n", - " }\n", - "}" + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import { z } from \"zod\";\n", + "\n", + "/**\n", + " * Note that the descriptions here are crucial, as they will be passed along\n", + " * to the model along with the class name.\n", + " */\n", + "const calculatorSchema = z.object({\n", + " operation: z\n", + " .enum([\"add\", \"subtract\", \"multiply\", \"divide\"])\n", + " .describe(\"The type of operation to execute.\"),\n", + " number1: z.number().describe(\"The first number to operate on.\"),\n", + " number2: z.number().describe(\"The second number to operate on.\"),\n", + "});" ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import { ChatMistralAI } from \"@langchain/mistralai\";\n", - "import { zodToJsonSchema } from \"zod-to-json-schema\";\n", - "\n", - "const llm = new ChatMistralAI({\n", - " modelName: \"mistral-large-latest\",\n", - " temperature: 0,\n", - "});\n", - "const llmWithTools = llm.bind({\n", - " tools: [\n", - " {\n", - " type: \"function\" as const,\n", - " function: {\n", - " name: \"calculator\",\n", - " description: \"A simple calculator tool\",\n", - " parameters: zodToJsonSchema(calculatorSchema),\n", - " },\n", - " },\n", - " ],\n", - "});\n", - "await llmWithTools.invoke(\"What is 3 * 12\");" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "\n", - "> #### See the LangSmith trace [here](https://smith.langchain.com/public/ea36cd94-ff85-4972-a087-e5ac6d927141/r).\n", - "\n", - "We can add a tool parser to extract the tool calls from the generated message to JSON:" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ + }, { - "data": { - "text/plain": [ - "[\n", - " {\n", - " type: \u001b[32m\"calculator\"\u001b[39m,\n", - " args: { operation: \u001b[32m\"multiply\"\u001b[39m, number1: \u001b[33m3\u001b[39m, number2: \u001b[33m12\u001b[39m }\n", - " }\n", - "]" + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "\n", + "\n", + " \n", + "\n", + "Set up dependencies and API keys:\n", + "\n", + "```bash\n", + "npm install @langchain/openai\n", + "```\n", + "\n", + "```bash\n", + "OPENAI_API_KEY=your-api-key\n", + "```\n", + "\n", + "We can use the `ChatOpenAI.bind()` method to handle converting `calculatorSchema` to an OpenAI function and binding it to the model (i.e., passing it in each time the model is invoked)." ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import { JsonOutputToolsParser } from \"@langchain/core/output_parsers/openai_tools\";\n", - "\n", - "const toolChain = llmWithTools.pipe(new JsonOutputToolsParser());\n", - "await toolChain.invoke(\"What is 3 * 12\");" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "\n", - "> #### See the LangSmith trace [here](https://smith.langchain.com/public/05893756-0689-4d38-933f-529920f86dbb/r).\n", - "\n", - "\n", - "\n", - " \n", - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - " \n", - "\n", - "Set up dependencies and API keys:\n", - "\n", - "```bash\n", - "npm install @langchain/community\n", - "```\n", - "\n", - "```bash\n", - "TOGETHER_AI_API_KEY=your-api-key\n", - "```\n", - "\n", - "We can use the `ChatTogetherAI.bind()` method to handle converting `calculatorSchema` to a function and binding it to the model (i.e., passing it in each time the model is invoked).\n" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ + }, { - "data": { - "text/plain": [ - "AIMessage {\n", - " lc_serializable: \u001b[33mtrue\u001b[39m,\n", - " lc_kwargs: {\n", - " content: \u001b[32m\"\"\u001b[39m,\n", - " additional_kwargs: {\n", - " function_call: \u001b[90mundefined\u001b[39m,\n", - " tool_calls: [\n", - " {\n", - " id: \u001b[32m\"call_97uau7pkgam7n25q19fq4htp\"\u001b[39m,\n", - " type: \u001b[32m\"function\"\u001b[39m,\n", - " function: \u001b[36m[Object]\u001b[39m\n", - " }\n", - " ]\n", - " }\n", - " },\n", - " lc_namespace: [ \u001b[32m\"langchain_core\"\u001b[39m, \u001b[32m\"messages\"\u001b[39m ],\n", - " content: \u001b[32m\"\"\u001b[39m,\n", - " name: \u001b[90mundefined\u001b[39m,\n", - " additional_kwargs: {\n", - " function_call: \u001b[90mundefined\u001b[39m,\n", - " tool_calls: [\n", - " {\n", - " id: \u001b[32m\"call_97uau7pkgam7n25q19fq4htp\"\u001b[39m,\n", - " type: \u001b[32m\"function\"\u001b[39m,\n", - " function: {\n", - " name: \u001b[32m\"calculator\"\u001b[39m,\n", - " arguments: \u001b[32m'{\"operation\":\"multiply\",\"number1\":3,\"number2\":12}'\u001b[39m\n", - " }\n", - " }\n", - " ]\n", - " }\n", - "}" + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "AIMessage {\n", + " lc_serializable: \u001b[33mtrue\u001b[39m,\n", + " lc_kwargs: {\n", + " content: \u001b[32m\"\"\u001b[39m,\n", + " additional_kwargs: {\n", + " function_call: \u001b[90mundefined\u001b[39m,\n", + " tool_calls: [\n", + " {\n", + " id: \u001b[32m\"call_cLBi7NjrehSEPoXr21i08NER\"\u001b[39m,\n", + " type: \u001b[32m\"function\"\u001b[39m,\n", + " function: \u001b[36m[Object]\u001b[39m\n", + " }\n", + " ]\n", + " }\n", + " },\n", + " lc_namespace: [ \u001b[32m\"langchain_core\"\u001b[39m, \u001b[32m\"messages\"\u001b[39m ],\n", + " content: \u001b[32m\"\"\u001b[39m,\n", + " name: \u001b[90mundefined\u001b[39m,\n", + " additional_kwargs: {\n", + " function_call: \u001b[90mundefined\u001b[39m,\n", + " tool_calls: [\n", + " {\n", + " id: \u001b[32m\"call_cLBi7NjrehSEPoXr21i08NER\"\u001b[39m,\n", + " type: \u001b[32m\"function\"\u001b[39m,\n", + " function: {\n", + " name: \u001b[32m\"calculator\"\u001b[39m,\n", + " arguments: \u001b[32m'{\"operation\":\"multiply\",\"number1\":3,\"number2\":12}'\u001b[39m\n", + " }\n", + " }\n", + " ]\n", + " }\n", + "}" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import { ChatOpenAI } from \"@langchain/openai\";\n", + "import { zodToJsonSchema } from \"zod-to-json-schema\";\n", + "\n", + "const llm = new ChatOpenAI({\n", + " model: \"gpt-3.5-turbo-0125\",\n", + " temperature: 0,\n", + "});\n", + "const llmWithTools = llm.bind({\n", + " tools: [\n", + " {\n", + " type: \"function\" as const,\n", + " function: {\n", + " name: \"calculator\",\n", + " description: \"A simple calculator tool\",\n", + " parameters: zodToJsonSchema(calculatorSchema),\n", + " },\n", + " },\n", + " ],\n", + "});\n", + "await llmWithTools.invoke(\"What is 3 * 12\");" ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import { ChatTogetherAI } from \"@langchain/community/chat_models/togetherai\";\n", - "import { zodToJsonSchema } from \"zod-to-json-schema\";\n", - "\n", - "const llm = new ChatTogetherAI({\n", - " modelName: \"mistralai/Mixtral-8x7B-Instruct-v0.1\",\n", - " temperature: 0,\n", - "});\n", - "const llmWithTools = llm.bind({\n", - " tools: [\n", - " {\n", - " type: \"function\" as const,\n", - " function: {\n", - " name: \"calculator\",\n", - " description: \"A simple calculator tool\",\n", - " parameters: zodToJsonSchema(calculatorSchema),\n", - " },\n", - " },\n", - " ],\n", - "});\n", - "await llmWithTools.invoke(\"What is 3 * 12\");" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "\n", - "> #### See the LangSmith trace [here](https://smith.langchain.com/public/bf416507-a583-41e9-b262-cef219f3c803/r).\n", - "\n", - "\n", - "We can add a tool parser to extract the tool calls from the generated message to JSON:" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ + }, { - "data": { - "text/plain": [ - "[\n", - " {\n", - " type: \u001b[32m\"calculator\"\u001b[39m,\n", - " args: { operation: \u001b[32m\"multiply\"\u001b[39m, number1: \u001b[33m3\u001b[39m, number2: \u001b[33m12\u001b[39m }\n", - " }\n", - "]" + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "> #### See the LangSmith trace [here](https://smith.langchain.com/public/cb36c6e5-e478-463c-801a-0c1b09ace04d/r).\n", + "\n", + "We can add a tool parser to extract the tool calls from the generated message to JSON:" ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import { JsonOutputToolsParser } from \"@langchain/core/output_parsers/openai_tools\";\n", - "\n", - "const toolChain = llmWithTools.pipe(new JsonOutputToolsParser());\n", - "await toolChain.invoke(\"What is 3 * 12\");" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "\n", - "> #### See the LangSmith trace [here](https://smith.langchain.com/public/79ff4cf0-2a72-440e-a020-cec9213d5839/r).\n", - "\n", - "\n", - "If we wanted to force that a tool is used (and that it is used only once), we can set the `tool_choice` argument:" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ + }, { - "data": { - "text/plain": [ - "AIMessage {\n", - " lc_serializable: \u001b[33mtrue\u001b[39m,\n", - " lc_kwargs: {\n", - " content: \u001b[32m\"\"\u001b[39m,\n", - " additional_kwargs: {\n", - " function_call: \u001b[90mundefined\u001b[39m,\n", - " tool_calls: [\n", - " {\n", - " id: \u001b[32m\"call_vcc7nar0r2doz26jnnsojlls\"\u001b[39m,\n", - " type: \u001b[32m\"function\"\u001b[39m,\n", - " function: \u001b[36m[Object]\u001b[39m\n", - " }\n", - " ]\n", - " }\n", - " },\n", - " lc_namespace: [ \u001b[32m\"langchain_core\"\u001b[39m, \u001b[32m\"messages\"\u001b[39m ],\n", - " content: \u001b[32m\"\"\u001b[39m,\n", - " name: \u001b[90mundefined\u001b[39m,\n", - " additional_kwargs: {\n", - " function_call: \u001b[90mundefined\u001b[39m,\n", - " tool_calls: [\n", - " {\n", - " id: \u001b[32m\"call_vcc7nar0r2doz26jnnsojlls\"\u001b[39m,\n", - " type: \u001b[32m\"function\"\u001b[39m,\n", - " function: {\n", - " name: \u001b[32m\"calculator\"\u001b[39m,\n", - " arguments: \u001b[32m'{\"operation\":\"multiply\",\"number1\":3,\"number2\":12}'\u001b[39m\n", - " }\n", - " }\n", - " ]\n", - " }\n", - "}" + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[\n", + " {\n", + " type: \u001b[32m\"calculator\"\u001b[39m,\n", + " args: { operation: \u001b[32m\"multiply\"\u001b[39m, number1: \u001b[33m3\u001b[39m, number2: \u001b[33m12\u001b[39m }\n", + " }\n", + "]" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import { JsonOutputToolsParser } from \"@langchain/core/output_parsers/openai_tools\";\n", + "\n", + "const toolChain = llmWithTools.pipe(new JsonOutputToolsParser());\n", + "await toolChain.invoke(\"What is 3 * 12\");" ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "const llmWithMultiply = llm.bind({\n", - " tools: [\n", - " {\n", - " type: \"function\" as const,\n", - " function: {\n", - " name: \"calculator\",\n", - " description: \"A simple calculator tool\",\n", - " parameters: zodToJsonSchema(calculatorSchema),\n", - " },\n", - " },\n", - " ],\n", - " tool_choice: {\n", - " type: \"function\" as const,\n", - " function: {\n", - " name: \"calculator\",\n", - " },\n", - " },\n", - "});\n", - "await llmWithMultiply.invoke(\"What is 3 * 12\");" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - " \n", - "\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Defining functions schemas\n", - "\n", - "In case you need to access function schemas directly, LangChain has a built-in converter that can turn Zod schemas with LangChain tools into the OpenAI format JSON schema:" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "> #### See the LangSmith trace [here](https://smith.langchain.com/public/e2a3f796-0c8a-404b-8d90-e8a626242a24/r).\n", + "\n", + "\n", + "If we wanted to force that a tool is used (and that it is used only once), we can set the `tool_choice` argument:" + ] + }, { - "data": { - "text/plain": [ - "{\n", - " type: \u001b[32m\"function\"\u001b[39m,\n", - " function: {\n", - " name: \u001b[32m\"calculator\"\u001b[39m,\n", - " description: \u001b[32m\"A simple calculator tool\"\u001b[39m,\n", - " parameters: {\n", - " type: \u001b[32m\"object\"\u001b[39m,\n", - " properties: {\n", - " operation: {\n", - " type: \u001b[32m\"string\"\u001b[39m,\n", - " enum: \u001b[36m[Array]\u001b[39m,\n", - " description: \u001b[32m\"The type of operation to execute.\"\u001b[39m\n", - " },\n", - " number1: {\n", - " type: \u001b[32m\"number\"\u001b[39m,\n", - " description: \u001b[32m\"The first number to operate on.\"\u001b[39m\n", - " },\n", - " number2: {\n", - " type: \u001b[32m\"number\"\u001b[39m,\n", - " description: \u001b[32m\"The second number to operate on.\"\u001b[39m\n", - " }\n", - " },\n", - " required: [ \u001b[32m\"operation\"\u001b[39m, \u001b[32m\"number1\"\u001b[39m, \u001b[32m\"number2\"\u001b[39m ],\n", - " additionalProperties: \u001b[33mfalse\u001b[39m,\n", - " \u001b[32m\"$schema\"\u001b[39m: \u001b[32m\"http://json-schema.org/draft-07/schema#\"\u001b[39m\n", - " }\n", - " }\n", - "}" + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "AIMessage {\n", + " lc_serializable: \u001b[33mtrue\u001b[39m,\n", + " lc_kwargs: {\n", + " content: \u001b[32m\"\"\u001b[39m,\n", + " additional_kwargs: {\n", + " function_call: \u001b[90mundefined\u001b[39m,\n", + " tool_calls: [\n", + " {\n", + " id: \u001b[32m\"call_6Zh6rnj4W8pvfrOxzc4720Pw\"\u001b[39m,\n", + " type: \u001b[32m\"function\"\u001b[39m,\n", + " function: \u001b[36m[Object]\u001b[39m\n", + " }\n", + " ]\n", + " }\n", + " },\n", + " lc_namespace: [ \u001b[32m\"langchain_core\"\u001b[39m, \u001b[32m\"messages\"\u001b[39m ],\n", + " content: \u001b[32m\"\"\u001b[39m,\n", + " name: \u001b[90mundefined\u001b[39m,\n", + " additional_kwargs: {\n", + " function_call: \u001b[90mundefined\u001b[39m,\n", + " tool_calls: [\n", + " {\n", + " id: \u001b[32m\"call_6Zh6rnj4W8pvfrOxzc4720Pw\"\u001b[39m,\n", + " type: \u001b[32m\"function\"\u001b[39m,\n", + " function: {\n", + " name: \u001b[32m\"calculator\"\u001b[39m,\n", + " arguments: \u001b[32m'{\"operation\":\"multiply\",\"number1\":3,\"number2\":12}'\u001b[39m\n", + " }\n", + " }\n", + " ]\n", + " }\n", + "}" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "const llmWithMultiply = llm.bind({\n", + " tools: [\n", + " {\n", + " type: \"function\" as const,\n", + " function: {\n", + " name: \"calculator\",\n", + " description: \"A simple calculator tool\",\n", + " parameters: zodToJsonSchema(calculatorSchema),\n", + " },\n", + " },\n", + " ],\n", + " tool_choice: {\n", + " type: \"function\" as const,\n", + " function: {\n", + " name: \"calculator\",\n", + " },\n", + " },\n", + "});\n", + "await llmWithMultiply.invoke(\"What is 3 * 12\");" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + " \n", + "\n", + "Set up dependencies and API keys:\n", + "\n", + "```bash\n", + "npm install @langchain/mistralai\n", + "```\n", + "\n", + "```bash\n", + "MISTRAL_API_KEY=your-api-key\n", + "```\n", + "\n", + "We can use the `ChatMistralAI.bind()` method to handle converting `calculatorSchema` to a function and binding it to the model (i.e., passing it in each time the model is invoked)." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "AIMessage {\n", + " lc_serializable: \u001b[33mtrue\u001b[39m,\n", + " lc_kwargs: {\n", + " content: \u001b[32m\"\"\u001b[39m,\n", + " additional_kwargs: {\n", + " tool_calls: [ { id: \u001b[32m\"null\"\u001b[39m, type: \u001b[32m\"function\"\u001b[39m, function: \u001b[36m[Object]\u001b[39m } ]\n", + " }\n", + " },\n", + " lc_namespace: [ \u001b[32m\"langchain_core\"\u001b[39m, \u001b[32m\"messages\"\u001b[39m ],\n", + " content: \u001b[32m\"\"\u001b[39m,\n", + " name: \u001b[90mundefined\u001b[39m,\n", + " additional_kwargs: {\n", + " tool_calls: [\n", + " {\n", + " id: \u001b[32m\"null\"\u001b[39m,\n", + " type: \u001b[32m\"function\"\u001b[39m,\n", + " function: {\n", + " name: \u001b[32m\"calculator\"\u001b[39m,\n", + " arguments: \u001b[32m'{\"operation\": \"multiply\", \"number1\": 3, \"number2\": 12}'\u001b[39m\n", + " }\n", + " }\n", + " ]\n", + " }\n", + "}" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import { ChatMistralAI } from \"@langchain/mistralai\";\n", + "import { zodToJsonSchema } from \"zod-to-json-schema\";\n", + "\n", + "const llm = new ChatMistralAI({\n", + " model: \"mistral-large-latest\",\n", + " temperature: 0,\n", + "});\n", + "const llmWithTools = llm.bind({\n", + " tools: [\n", + " {\n", + " type: \"function\" as const,\n", + " function: {\n", + " name: \"calculator\",\n", + " description: \"A simple calculator tool\",\n", + " parameters: zodToJsonSchema(calculatorSchema),\n", + " },\n", + " },\n", + " ],\n", + "});\n", + "await llmWithTools.invoke(\"What is 3 * 12\");" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "\n", + "> #### See the LangSmith trace [here](https://smith.langchain.com/public/ea36cd94-ff85-4972-a087-e5ac6d927141/r).\n", + "\n", + "We can add a tool parser to extract the tool calls from the generated message to JSON:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[\n", + " {\n", + " type: \u001b[32m\"calculator\"\u001b[39m,\n", + " args: { operation: \u001b[32m\"multiply\"\u001b[39m, number1: \u001b[33m3\u001b[39m, number2: \u001b[33m12\u001b[39m }\n", + " }\n", + "]" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import { JsonOutputToolsParser } from \"@langchain/core/output_parsers/openai_tools\";\n", + "\n", + "const toolChain = llmWithTools.pipe(new JsonOutputToolsParser());\n", + "await toolChain.invoke(\"What is 3 * 12\");" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "\n", + "> #### See the LangSmith trace [here](https://smith.langchain.com/public/05893756-0689-4d38-933f-529920f86dbb/r).\n", + "\n", + "\n", + "\n", + " \n", + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + " \n", + "\n", + "Set up dependencies and API keys:\n", + "\n", + "```bash\n", + "npm install @langchain/community\n", + "```\n", + "\n", + "```bash\n", + "TOGETHER_AI_API_KEY=your-api-key\n", + "```\n", + "\n", + "We can use the `ChatTogetherAI.bind()` method to handle converting `calculatorSchema` to a function and binding it to the model (i.e., passing it in each time the model is invoked).\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "AIMessage {\n", + " lc_serializable: \u001b[33mtrue\u001b[39m,\n", + " lc_kwargs: {\n", + " content: \u001b[32m\"\"\u001b[39m,\n", + " additional_kwargs: {\n", + " function_call: \u001b[90mundefined\u001b[39m,\n", + " tool_calls: [\n", + " {\n", + " id: \u001b[32m\"call_97uau7pkgam7n25q19fq4htp\"\u001b[39m,\n", + " type: \u001b[32m\"function\"\u001b[39m,\n", + " function: \u001b[36m[Object]\u001b[39m\n", + " }\n", + " ]\n", + " }\n", + " },\n", + " lc_namespace: [ \u001b[32m\"langchain_core\"\u001b[39m, \u001b[32m\"messages\"\u001b[39m ],\n", + " content: \u001b[32m\"\"\u001b[39m,\n", + " name: \u001b[90mundefined\u001b[39m,\n", + " additional_kwargs: {\n", + " function_call: \u001b[90mundefined\u001b[39m,\n", + " tool_calls: [\n", + " {\n", + " id: \u001b[32m\"call_97uau7pkgam7n25q19fq4htp\"\u001b[39m,\n", + " type: \u001b[32m\"function\"\u001b[39m,\n", + " function: {\n", + " name: \u001b[32m\"calculator\"\u001b[39m,\n", + " arguments: \u001b[32m'{\"operation\":\"multiply\",\"number1\":3,\"number2\":12}'\u001b[39m\n", + " }\n", + " }\n", + " ]\n", + " }\n", + "}" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import { ChatTogetherAI } from \"@langchain/community/chat_models/togetherai\";\n", + "import { zodToJsonSchema } from \"zod-to-json-schema\";\n", + "\n", + "const llm = new ChatTogetherAI({\n", + " model: \"mistralai/Mixtral-8x7B-Instruct-v0.1\",\n", + " temperature: 0,\n", + "});\n", + "const llmWithTools = llm.bind({\n", + " tools: [\n", + " {\n", + " type: \"function\" as const,\n", + " function: {\n", + " name: \"calculator\",\n", + " description: \"A simple calculator tool\",\n", + " parameters: zodToJsonSchema(calculatorSchema),\n", + " },\n", + " },\n", + " ],\n", + "});\n", + "await llmWithTools.invoke(\"What is 3 * 12\");" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "\n", + "> #### See the LangSmith trace [here](https://smith.langchain.com/public/bf416507-a583-41e9-b262-cef219f3c803/r).\n", + "\n", + "\n", + "We can add a tool parser to extract the tool calls from the generated message to JSON:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[\n", + " {\n", + " type: \u001b[32m\"calculator\"\u001b[39m,\n", + " args: { operation: \u001b[32m\"multiply\"\u001b[39m, number1: \u001b[33m3\u001b[39m, number2: \u001b[33m12\u001b[39m }\n", + " }\n", + "]" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import { JsonOutputToolsParser } from \"@langchain/core/output_parsers/openai_tools\";\n", + "\n", + "const toolChain = llmWithTools.pipe(new JsonOutputToolsParser());\n", + "await toolChain.invoke(\"What is 3 * 12\");" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "\n", + "> #### See the LangSmith trace [here](https://smith.langchain.com/public/79ff4cf0-2a72-440e-a020-cec9213d5839/r).\n", + "\n", + "\n", + "If we wanted to force that a tool is used (and that it is used only once), we can set the `tool_choice` argument:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "AIMessage {\n", + " lc_serializable: \u001b[33mtrue\u001b[39m,\n", + " lc_kwargs: {\n", + " content: \u001b[32m\"\"\u001b[39m,\n", + " additional_kwargs: {\n", + " function_call: \u001b[90mundefined\u001b[39m,\n", + " tool_calls: [\n", + " {\n", + " id: \u001b[32m\"call_vcc7nar0r2doz26jnnsojlls\"\u001b[39m,\n", + " type: \u001b[32m\"function\"\u001b[39m,\n", + " function: \u001b[36m[Object]\u001b[39m\n", + " }\n", + " ]\n", + " }\n", + " },\n", + " lc_namespace: [ \u001b[32m\"langchain_core\"\u001b[39m, \u001b[32m\"messages\"\u001b[39m ],\n", + " content: \u001b[32m\"\"\u001b[39m,\n", + " name: \u001b[90mundefined\u001b[39m,\n", + " additional_kwargs: {\n", + " function_call: \u001b[90mundefined\u001b[39m,\n", + " tool_calls: [\n", + " {\n", + " id: \u001b[32m\"call_vcc7nar0r2doz26jnnsojlls\"\u001b[39m,\n", + " type: \u001b[32m\"function\"\u001b[39m,\n", + " function: {\n", + " name: \u001b[32m\"calculator\"\u001b[39m,\n", + " arguments: \u001b[32m'{\"operation\":\"multiply\",\"number1\":3,\"number2\":12}'\u001b[39m\n", + " }\n", + " }\n", + " ]\n", + " }\n", + "}" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "const llmWithMultiply = llm.bind({\n", + " tools: [\n", + " {\n", + " type: \"function\" as const,\n", + " function: {\n", + " name: \"calculator\",\n", + " description: \"A simple calculator tool\",\n", + " parameters: zodToJsonSchema(calculatorSchema),\n", + " },\n", + " },\n", + " ],\n", + " tool_choice: {\n", + " type: \"function\" as const,\n", + " function: {\n", + " name: \"calculator\",\n", + " },\n", + " },\n", + "});\n", + "await llmWithMultiply.invoke(\"What is 3 * 12\");" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + " \n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Defining functions schemas\n", + "\n", + "In case you need to access function schemas directly, LangChain has a built-in converter that can turn Zod schemas with LangChain tools into the OpenAI format JSON schema:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{\n", + " type: \u001b[32m\"function\"\u001b[39m,\n", + " function: {\n", + " name: \u001b[32m\"calculator\"\u001b[39m,\n", + " description: \u001b[32m\"A simple calculator tool\"\u001b[39m,\n", + " parameters: {\n", + " type: \u001b[32m\"object\"\u001b[39m,\n", + " properties: {\n", + " operation: {\n", + " type: \u001b[32m\"string\"\u001b[39m,\n", + " enum: \u001b[36m[Array]\u001b[39m,\n", + " description: \u001b[32m\"The type of operation to execute.\"\u001b[39m\n", + " },\n", + " number1: {\n", + " type: \u001b[32m\"number\"\u001b[39m,\n", + " description: \u001b[32m\"The first number to operate on.\"\u001b[39m\n", + " },\n", + " number2: {\n", + " type: \u001b[32m\"number\"\u001b[39m,\n", + " description: \u001b[32m\"The second number to operate on.\"\u001b[39m\n", + " }\n", + " },\n", + " required: [ \u001b[32m\"operation\"\u001b[39m, \u001b[32m\"number1\"\u001b[39m, \u001b[32m\"number2\"\u001b[39m ],\n", + " additionalProperties: \u001b[33mfalse\u001b[39m,\n", + " \u001b[32m\"$schema\"\u001b[39m: \u001b[32m\"http://json-schema.org/draft-07/schema#\"\u001b[39m\n", + " }\n", + " }\n", + "}" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import { StructuredTool } from \"@langchain/core/tools\";\n", + "import { convertToOpenAITool } from \"@langchain/core/utils/function_calling\";\n", + "import { z } from \"zod\";\n", + "\n", + "const calculatorSchema = z.object({\n", + " operation: z\n", + " .enum([\"add\", \"subtract\", \"multiply\", \"divide\"])\n", + " .describe(\"The type of operation to execute.\"),\n", + " number1: z.number().describe(\"The first number to operate on.\"),\n", + " number2: z.number().describe(\"The second number to operate on.\"),\n", + "});\n", + "\n", + "class CalculatorTool extends StructuredTool {\n", + " schema = calculatorSchema;\n", + "\n", + " name = \"calculator\";\n", + "\n", + " description = \"A simple calculator tool\";\n", + "\n", + " async _call(params: z.infer) {\n", + " return \"The answer\";\n", + " }\n", + "}\n", + "\n", + "const asOpenAITool = convertToOpenAITool(new CalculatorTool());\n", + "\n", + "asOpenAITool;" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Next steps\n", + "\n", + "- **Output parsing**: See [OpenAI Tools output parsers](/docs/modules/model_io/output_parsers/types/openai_tools) to learn about extracting the function calling API responses into various formats.\n", + "- **Structured output chains**: Some models have constructors that handle creating a structured output chain for you ([OpenAI](/docs/integrations/chat/openai#withstructuredoutput--), [Mistral](/docs/integrations/chat/mistral#withstructuredoutput--)).\n", + "- **Tool use**: See how to construct chains and agents that actually call the invoked tools in [these guides](/docs/use_cases/tool_use/).\n" ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" } - ], - "source": [ - "import { StructuredTool } from \"@langchain/core/tools\";\n", - "import { convertToOpenAITool } from \"@langchain/core/utils/function_calling\";\n", - "import { z } from \"zod\";\n", - "\n", - "const calculatorSchema = z.object({\n", - " operation: z\n", - " .enum([\"add\", \"subtract\", \"multiply\", \"divide\"])\n", - " .describe(\"The type of operation to execute.\"),\n", - " number1: z.number().describe(\"The first number to operate on.\"),\n", - " number2: z.number().describe(\"The second number to operate on.\"),\n", - "});\n", - "\n", - "class CalculatorTool extends StructuredTool {\n", - " schema = calculatorSchema;\n", - "\n", - " name = \"calculator\";\n", - "\n", - " description = \"A simple calculator tool\";\n", - "\n", - " async _call(params: z.infer) {\n", - " return \"The answer\";\n", - " }\n", - "}\n", - "\n", - "const asOpenAITool = convertToOpenAITool(new CalculatorTool());\n", - "\n", - "asOpenAITool;" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Next steps\n", - "\n", - "- **Output parsing**: See [OpenAI Tools output parsers](/docs/modules/model_io/output_parsers/types/openai_tools) to learn about extracting the function calling API responses into various formats.\n", - "- **Structured output chains**: Some models have constructors that handle creating a structured output chain for you ([OpenAI](/docs/integrations/chat/openai#withstructuredoutput--), [Mistral](/docs/integrations/chat/mistral#withstructuredoutput--)).\n", - "- **Tool use**: See how to construct chains and agents that actually call the invoked tools in [these guides](/docs/use_cases/tool_use/).\n" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Deno", - "language": "typescript", - "name": "deno" + ], + "metadata": { + "kernelspec": { + "display_name": "Deno", + "language": "typescript", + "name": "deno" + }, + "language_info": { + "file_extension": ".ts", + "mimetype": "text/x.typescript", + "name": "typescript", + "nb_converter": "script", + "pygments_lexer": "typescript", + "version": "5.3.3" + } }, - "language_info": { - "file_extension": ".ts", - "mimetype": "text/x.typescript", - "name": "typescript", - "nb_converter": "script", - "pygments_lexer": "typescript", - "version": "5.3.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 + "nbformat": 4, + "nbformat_minor": 2 } diff --git a/docs/core_docs/docs/modules/model_io/chat/quick_start.mdx b/docs/core_docs/docs/modules/model_io/chat/quick_start.mdx index 08ed04b4936d..33b578f87ad2 100644 --- a/docs/core_docs/docs/modules/model_io/chat/quick_start.mdx +++ b/docs/core_docs/docs/modules/model_io/chat/quick_start.mdx @@ -31,13 +31,13 @@ Accessing the API requires an API key, which you can get by creating an account OPENAI_API_KEY="..." ``` -If you'd prefer not to set an environment variable you can pass the key in directly via the `openAIApiKey` named parameter when initiating the OpenAI Chat Model class: +If you'd prefer not to set an environment variable you can pass the key in directly via the `apiKey` named parameter when initiating the OpenAI Chat Model class: ```typescript import { ChatOpenAI } from "@langchain/openai"; const chatModel = new ChatOpenAI({ - openAIApiKey: "...", + apiKey: "...", }); ``` @@ -95,13 +95,13 @@ Accessing the API requires an API key, which you can get by creating an account ANTHROPIC_API_KEY="..." ``` -If you'd prefer not to set an environment variable you can pass the key in directly via the `anthropicApiKey` named parameter when initiating the `ChatAnthropic` class: +If you'd prefer not to set an environment variable you can pass the key in directly via the `apiKey` named parameter when initiating the `ChatAnthropic` class: ```typescript import { ChatAnthropic } from "@langchain/anthropic"; const chatModel = new ChatAnthropic({ - anthropicApiKey: "...", + apiKey: "...", }); ``` diff --git a/docs/core_docs/docs/modules/model_io/llms/llm_caching.mdx b/docs/core_docs/docs/modules/model_io/llms/llm_caching.mdx index 8babea3ab163..648d0fac3e55 100644 --- a/docs/core_docs/docs/modules/model_io/llms/llm_caching.mdx +++ b/docs/core_docs/docs/modules/model_io/llms/llm_caching.mdx @@ -23,7 +23,7 @@ npm install @langchain/openai import { OpenAI } from "@langchain/openai"; const model = new OpenAI({ - modelName: "gpt-3.5-turbo-instruct", + model: "gpt-3.5-turbo-instruct", cache: true, }); ``` diff --git a/docs/core_docs/docs/modules/model_io/llms/quick_start.mdx b/docs/core_docs/docs/modules/model_io/llms/quick_start.mdx index 4bc9ea1cfb5f..e0d8128a9650 100644 --- a/docs/core_docs/docs/modules/model_io/llms/quick_start.mdx +++ b/docs/core_docs/docs/modules/model_io/llms/quick_start.mdx @@ -36,13 +36,13 @@ Accessing the API requires an API key, which you can get by creating an account export OPENAI_API_KEY="..." ``` -If you'd prefer not to set an environment variable you can pass the key in directly via the `openAIApiKey` named parameter when initiating the OpenAI Chat Model class: +If you'd prefer not to set an environment variable you can pass the key in directly via the `apiKey` named parameter when initiating the OpenAI Chat Model class: ```typescript import { OpenAI } from "@langchain/openai"; const llm = new OpenAI({ - openAIApiKey: "YOUR_KEY_HERE", + apiKey: "YOUR_KEY_HERE", }); ``` diff --git a/docs/core_docs/docs/modules/model_io/quick_start.mdx b/docs/core_docs/docs/modules/model_io/quick_start.mdx index b3a5299468ad..9213a4af5970 100644 --- a/docs/core_docs/docs/modules/model_io/quick_start.mdx +++ b/docs/core_docs/docs/modules/model_io/quick_start.mdx @@ -39,18 +39,18 @@ We can then initialize the model: import { OpenAI, ChatOpenAI } from "@langchain/openai"; const llm = new OpenAI({ - modelName: "gpt-3.5-turbo-instruct", + model: "gpt-3.5-turbo-instruct", }); const chatModel = new ChatOpenAI({ - modelName: "gpt-3.5-turbo", + model: "gpt-3.5-turbo", }); ``` -If you can't or would prefer not to set an environment variable, you can pass the key in directly via the `openAIApiKey` named parameter when initiating the OpenAI LLM class: +If you can't or would prefer not to set an environment variable, you can pass the key in directly via the `apiKey` named parameter when initiating the OpenAI LLM class: ```typescript const model = new ChatOpenAI({ - openAIApiKey: "", + apiKey: "", }); ``` @@ -111,15 +111,15 @@ We can then initialize the model: import { ChatAnthropic } from "@langchain/anthropic"; const chatModel = new ChatAnthropic({ - modelName: "claude-3-sonnet-20240229", + model: "claude-3-sonnet-20240229", }); ``` -If you can't or would prefer not to set an environment variable, you can pass the key in directly via the `anthropicApiKey` named parameter when initiating the ChatAnthropic class: +If you can't or would prefer not to set an environment variable, you can pass the key in directly via the `apiKey` named parameter when initiating the ChatAnthropic class: ```typescript const model = new ChatAnthropic({ - anthropicApiKey: "", + apiKey: "", }); ``` @@ -146,7 +146,7 @@ We can then initialize the model: import { ChatGoogleGenerativeAI } from "@langchain/google-genai"; const chatModel = new ChatGoogleGenerativeAI({ - modelName: "gemini-1.0-pro", + model: "gemini-1.0-pro", }); ``` diff --git a/docs/core_docs/docs/use_cases/chatbots/memory_management.mdx b/docs/core_docs/docs/use_cases/chatbots/memory_management.mdx index fd7f476551f2..ff1064b8d985 100644 --- a/docs/core_docs/docs/use_cases/chatbots/memory_management.mdx +++ b/docs/core_docs/docs/use_cases/chatbots/memory_management.mdx @@ -26,7 +26,7 @@ Let’s also set up a chat model that we’ll use for the below examples: import { ChatOpenAI } from "@langchain/openai"; const chat = new ChatOpenAI({ - modelName: "gpt-3.5-turbo-1106", + model: "gpt-3.5-turbo-1106", }); ``` diff --git a/docs/core_docs/docs/use_cases/chatbots/quickstart.mdx b/docs/core_docs/docs/use_cases/chatbots/quickstart.mdx index 24b1a7bfe0cf..c03d0c87de8d 100644 --- a/docs/core_docs/docs/use_cases/chatbots/quickstart.mdx +++ b/docs/core_docs/docs/use_cases/chatbots/quickstart.mdx @@ -29,7 +29,7 @@ Let’s initialize the chat model which will serve as the chatbot’s brain: import { ChatOpenAI } from "@langchain/openai"; const chat = new ChatOpenAI({ - modelName: "gpt-3.5-turbo-1106", + model: "gpt-3.5-turbo-1106", temperature: 0.2, }); ``` diff --git a/docs/core_docs/docs/use_cases/chatbots/retrieval.mdx b/docs/core_docs/docs/use_cases/chatbots/retrieval.mdx index a50ffd3c4357..2e8ccce6ffb5 100644 --- a/docs/core_docs/docs/use_cases/chatbots/retrieval.mdx +++ b/docs/core_docs/docs/use_cases/chatbots/retrieval.mdx @@ -20,7 +20,7 @@ Let’s also set up a chat model that we’ll use for the below examples. import { ChatOpenAI } from "@langchain/openai"; const chat = new ChatOpenAI({ - modelName: "gpt-3.5-turbo-1106", + model: "gpt-3.5-turbo-1106", temperature: 0.2, }); ``` diff --git a/docs/core_docs/docs/use_cases/chatbots/tool_usage.mdx b/docs/core_docs/docs/use_cases/chatbots/tool_usage.mdx index d834f13412ef..d44b25d4885a 100644 --- a/docs/core_docs/docs/use_cases/chatbots/tool_usage.mdx +++ b/docs/core_docs/docs/use_cases/chatbots/tool_usage.mdx @@ -37,7 +37,7 @@ const tools = [ ]; const chat = new ChatOpenAI({ - modelName: "gpt-3.5-turbo-1106", + model: "gpt-3.5-turbo-1106", temperature: 0, }); ``` diff --git a/docs/core_docs/docs/use_cases/code_understanding.mdx b/docs/core_docs/docs/use_cases/code_understanding.mdx index 6b0dff5d7360..eaa8695cfcb1 100644 --- a/docs/core_docs/docs/use_cases/code_understanding.mdx +++ b/docs/core_docs/docs/use_cases/code_understanding.mdx @@ -144,9 +144,7 @@ import { ChatOpenAI } from "@langchain/openai"; Pipe the `StringOutputParser` through since both chains which use this model will also need this output parser. ```typescript -const model = new ChatOpenAI({ modelName: "gpt-4" }).pipe( - new StringOutputParser() -); +const model = new ChatOpenAI({ model: "gpt-4" }).pipe(new StringOutputParser()); ``` We're going to use `BufferMemory` as our memory chain. All this will do is take in inputs/outputs from the LLM and store them in memory. diff --git a/docs/core_docs/docs/use_cases/extraction/how_to/examples.ipynb b/docs/core_docs/docs/use_cases/extraction/how_to/examples.ipynb index b2c5772c7c52..be95e7d18c2f 100644 --- a/docs/core_docs/docs/use_cases/extraction/how_to/examples.ipynb +++ b/docs/core_docs/docs/use_cases/extraction/how_to/examples.ipynb @@ -1,606 +1,606 @@ { - "cells": [ - { - "cell_type": "raw", - "id": "a37d08e8-8d6d-4cf2-8215-2aafb6877fb5", - "metadata": {}, - "source": [ - "---\n", - "title: Use reference examples\n", - "sidebar_position: 1\n", - "---" - ] - }, - { - "cell_type": "markdown", - "id": "70403d4f-50c1-43f8-a7ea-a211167649a5", - "metadata": {}, - "source": [ - "The quality of extractions can often be improved by providing reference examples to the LLM.\n", - "\n", - ":::{.callout-tip}\n", - "While this tutorial focuses how to use examples with a tool calling model, this technique is generally applicable, and will work\n", - "also with JSON more or prompt based techniques.\n", - ":::\n", - "\n", - "We'll use OpenAI's GPT-4 this time for their robust support for `ToolMessages`:\n", - "\n", - "```{=mdx}\n", - "import IntegrationInstallTooltip from \"@mdx_components/integration_install_tooltip.mdx\";\n", - "import Npm2Yarn from \"@theme/Npm2Yarn\";\n", - "\n", - "\n", - "\n", - "\n", - " @langchain/openai zod uuid\n", - "\n", - "```\n", - "\n", - "Let's define a prompt:" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "89579144-bcb3-490a-8036-86a0a6bcd56b", - "metadata": {}, - "outputs": [], - "source": [ - "import { ChatPromptTemplate, MessagesPlaceholder } from \"@langchain/core/prompts\";\n", - "\n", - "const SYSTEM_PROMPT_TEMPLATE = `You are an expert extraction algorithm.\n", - "Only extract relevant information from the text.\n", - "If you do not know the value of an attribute asked to extract, you may omit the attribute's value.`;\n", - "\n", - "// Define a custom prompt to provide instructions and any additional context.\n", - "// 1) You can add examples into the prompt template to improve extraction quality\n", - "// 2) Introduce additional parameters to take context into account (e.g., include metadata\n", - "// about the document from which the text was extracted.)\n", - "const prompt = ChatPromptTemplate.fromMessages([\n", - " [\"system\", SYSTEM_PROMPT_TEMPLATE],\n", - " // ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓\n", - " new MessagesPlaceholder(\"examples\"),\n", - " // ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑\n", - " [\"human\", \"{text}\"]\n", - "]);" - ] - }, - { - "cell_type": "markdown", - "id": "2484008c-ba1a-42a5-87a1-628a900de7fd", - "metadata": {}, - "source": [ - "Test out the template:" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "610c3025-ea63-4cd7-88bd-c8cbcb4d8a3f", - "metadata": {}, - "outputs": [ + "cells": [ { - "data": { - "text/plain": [ - "[\n", - " SystemMessage {\n", - " lc_serializable: \u001b[33mtrue\u001b[39m,\n", - " lc_kwargs: {\n", - " content: \u001b[32m\"You are an expert extraction algorithm.\\n\"\u001b[39m +\n", - " \u001b[32m\"Only extract relevant information from the text.\\n\"\u001b[39m +\n", - " \u001b[32m\"If you do n\"\u001b[39m... 87 more characters,\n", - " additional_kwargs: {}\n", - " },\n", - " lc_namespace: [ \u001b[32m\"langchain_core\"\u001b[39m, \u001b[32m\"messages\"\u001b[39m ],\n", - " content: \u001b[32m\"You are an expert extraction algorithm.\\n\"\u001b[39m +\n", - " \u001b[32m\"Only extract relevant information from the text.\\n\"\u001b[39m +\n", - " \u001b[32m\"If you do n\"\u001b[39m... 87 more characters,\n", - " name: \u001b[90mundefined\u001b[39m,\n", - " additional_kwargs: {}\n", - " },\n", - " HumanMessage {\n", - " lc_serializable: \u001b[33mtrue\u001b[39m,\n", - " lc_kwargs: { content: \u001b[32m\"testing 1 2 3\"\u001b[39m, additional_kwargs: {} },\n", - " lc_namespace: [ \u001b[32m\"langchain_core\"\u001b[39m, \u001b[32m\"messages\"\u001b[39m ],\n", - " content: \u001b[32m\"testing 1 2 3\"\u001b[39m,\n", - " name: \u001b[90mundefined\u001b[39m,\n", - " additional_kwargs: {}\n", - " },\n", - " HumanMessage {\n", - " lc_serializable: \u001b[33mtrue\u001b[39m,\n", - " lc_kwargs: { content: \u001b[32m\"this is some text\"\u001b[39m, additional_kwargs: {} },\n", - " lc_namespace: [ \u001b[32m\"langchain_core\"\u001b[39m, \u001b[32m\"messages\"\u001b[39m ],\n", - " content: \u001b[32m\"this is some text\"\u001b[39m,\n", - " name: \u001b[90mundefined\u001b[39m,\n", - " additional_kwargs: {}\n", - " }\n", - "]" + "cell_type": "raw", + "id": "a37d08e8-8d6d-4cf2-8215-2aafb6877fb5", + "metadata": {}, + "source": [ + "---\n", + "title: Use reference examples\n", + "sidebar_position: 1\n", + "---" ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import { HumanMessage } from \"@langchain/core/messages\";\n", - "\n", - "const promptValue = await prompt.invoke({\n", - " text: \"this is some text\",\n", - " examples: [new HumanMessage(\"testing 1 2 3\")],\n", - "});\n", - "\n", - "promptValue.toChatMessages();" - ] - }, - { - "cell_type": "markdown", - "id": "368abd80-0cf0-41a7-8224-acf90dd6830d", - "metadata": {}, - "source": [ - "## Define the schema\n", - "\n", - "Let's re-use the people schema from the quickstart." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "d875a49a-d2cb-4b9e-b5bf-41073bc3905c", - "metadata": {}, - "outputs": [], - "source": [ - "import { z } from \"zod\";\n", - "\n", - "const personSchema = z.object({\n", - " name: z.optional(z.string()).describe(\"The name of the person\"),\n", - " hair_color: z.optional(z.string()).describe(\"The color of the person's hair, if known\"),\n", - " height_in_meters: z.optional(z.string()).describe(\"Height measured in meters\")\n", - "}).describe(\"Information about a person.\");\n", - "\n", - "const peopleSchema = z.object({\n", - " people: z.array(personSchema)\n", - "});" - ] - }, - { - "cell_type": "markdown", - "id": "96c42162-e4f6-4461-88fd-c76f5aab7e32", - "metadata": {}, - "source": [ - "## Define reference examples\n", - "\n", - "Examples can be defined as a list of input-output pairs. \n", - "\n", - "Each example contains an example `input` text and an example `output` showing what should be extracted from the text.\n", - "\n", - ":::{.callout-important}\n", - "The below example is a bit more advanced - the format of the example needs to match the API used (e.g., tool calling or JSON mode etc.).\n", - "\n", - "Here, the formatted examples will match the format expected for the OpenAI tool calling API since that's what we're using.\n", - ":::\n", - "\n", - "To provide reference examples to the model, we will mock out a fake chat history containing successful usages of the given tool.\n", - "Because the model can choose to call multiple tools at once (or the same tool multiple times), the example's outputs are an array:" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "08356810-77ce-4e68-99d9-faa0326f2cee", - "metadata": {}, - "outputs": [], - "source": [ - "import {\n", - " AIMessage,\n", - " type BaseMessage,\n", - " HumanMessage,\n", - " ToolMessage\n", - "} from \"@langchain/core/messages\";\n", - "import { v4 as uuid } from \"uuid\";\n", - "\n", - "type OpenAIToolCall = {\n", - " id: string,\n", - " type: \"function\",\n", - " function: {\n", - " name: string;\n", - " arguments: string;\n", - " }\n", - "};\n", - "\n", - "type Example = {\n", - " input: string;\n", - " toolCallOutputs: Record[];\n", - "}\n", - "\n", - "/**\n", - " * This function converts an example into a list of messages that can be fed into an LLM.\n", - " *\n", - " * This code serves as an adapter that transforms our example into a list of messages\n", - " * that can be processed by a chat model.\n", - " *\n", - " * The list of messages for each example includes:\n", - " *\n", - " * 1) HumanMessage: This contains the content from which information should be extracted.\n", - " * 2) AIMessage: This contains the information extracted by the model.\n", - " * 3) ToolMessage: This provides confirmation to the model that the tool was requested correctly.\n", - " *\n", - " * The inclusion of ToolMessage is necessary because some chat models are highly optimized for agents,\n", - " * making them less suitable for an extraction use case.\n", - " */\n", - "function toolExampleToMessages(example: Example): BaseMessage[] {\n", - " const openAIToolCalls: OpenAIToolCall[] = example.toolCallOutputs.map((output) => {\n", - " return {\n", - " id: uuid(),\n", - " type: \"function\",\n", - " function: {\n", - " // The name of the function right now corresponds\n", - " // to the passed name.\n", - " name: \"extract\",\n", - " arguments: JSON.stringify(output),\n", - " },\n", - " };\n", - " });\n", - " const messages: BaseMessage[] = [\n", - " new HumanMessage(example.input),\n", - " new AIMessage({\n", - " content: \"\",\n", - " additional_kwargs: { tool_calls: openAIToolCalls }\n", - " })\n", - " ];\n", - " const toolMessages = openAIToolCalls.map((toolCall, i) => {\n", - " // Return the mocked successful result for a given tool call.\n", - " return new ToolMessage({\n", - " content: \"You have correctly called this tool.\",\n", - " tool_call_id: toolCall.id\n", - " });\n", - " });\n", - " return messages.concat(toolMessages);\n", - "}\n" - ] - }, - { - "cell_type": "markdown", - "id": "463aa282-51c4-42bf-9463-6ca3b2c08de6", - "metadata": {}, - "source": [ - "Next let's define our examples and then convert them into message format." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "7f59a745-5c81-4011-a4c5-a33ec1eca7ef", - "metadata": {}, - "outputs": [ + }, { - "data": { - "text/plain": [ - "\u001b[33m6\u001b[39m" + "cell_type": "markdown", + "id": "70403d4f-50c1-43f8-a7ea-a211167649a5", + "metadata": {}, + "source": [ + "The quality of extractions can often be improved by providing reference examples to the LLM.\n", + "\n", + ":::{.callout-tip}\n", + "While this tutorial focuses how to use examples with a tool calling model, this technique is generally applicable, and will work\n", + "also with JSON more or prompt based techniques.\n", + ":::\n", + "\n", + "We'll use OpenAI's GPT-4 this time for their robust support for `ToolMessages`:\n", + "\n", + "```{=mdx}\n", + "import IntegrationInstallTooltip from \"@mdx_components/integration_install_tooltip.mdx\";\n", + "import Npm2Yarn from \"@theme/Npm2Yarn\";\n", + "\n", + "\n", + "\n", + "\n", + " @langchain/openai zod uuid\n", + "\n", + "```\n", + "\n", + "Let's define a prompt:" ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "const examples: Example[] = [\n", - " {\n", - " input: \"The ocean is vast and blue. It's more than 20,000 feet deep. There are many fish in it.\",\n", - " toolCallOutputs: [{}]\n", - " },\n", - " {\n", - " input: \"Fiona traveled far from France to Spain.\",\n", - " toolCallOutputs: [{\n", - " name: \"Fiona\",\n", - " }]\n", - " }\n", - "];\n", - "\n", - "const exampleMessages = [];\n", - "for (const example of examples) {\n", - " exampleMessages.push(...toolExampleToMessages(example));\n", - "}" - ] - }, - { - "cell_type": "markdown", - "id": "6fdbda30-e7e3-46b5-a54a-1769c580af93", - "metadata": {}, - "source": [ - "Let's test out the prompt" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "e61fa3a5-3d15-46a2-a23b-788f9a3ede52", - "metadata": {}, - "outputs": [ + }, { - "data": { - "text/plain": [ - "[\n", - " SystemMessage {\n", - " lc_serializable: \u001b[33mtrue\u001b[39m,\n", - " lc_kwargs: {\n", - " content: \u001b[32m\"You are an expert extraction algorithm.\\n\"\u001b[39m +\n", - " \u001b[32m\"Only extract relevant information from the text.\\n\"\u001b[39m +\n", - " \u001b[32m\"If you do n\"\u001b[39m... 87 more characters,\n", - " additional_kwargs: {}\n", - " },\n", - " lc_namespace: [ \u001b[32m\"langchain_core\"\u001b[39m, \u001b[32m\"messages\"\u001b[39m ],\n", - " content: \u001b[32m\"You are an expert extraction algorithm.\\n\"\u001b[39m +\n", - " \u001b[32m\"Only extract relevant information from the text.\\n\"\u001b[39m +\n", - " \u001b[32m\"If you do n\"\u001b[39m... 87 more characters,\n", - " name: \u001b[90mundefined\u001b[39m,\n", - " additional_kwargs: {}\n", - " },\n", - " HumanMessage {\n", - " lc_serializable: \u001b[33mtrue\u001b[39m,\n", - " lc_kwargs: {\n", - " content: \u001b[32m\"The ocean is vast and blue. It's more than 20,000 feet deep. There are many fish in it.\"\u001b[39m,\n", - " additional_kwargs: {}\n", - " },\n", - " lc_namespace: [ \u001b[32m\"langchain_core\"\u001b[39m, \u001b[32m\"messages\"\u001b[39m ],\n", - " content: \u001b[32m\"The ocean is vast and blue. It's more than 20,000 feet deep. There are many fish in it.\"\u001b[39m,\n", - " name: \u001b[90mundefined\u001b[39m,\n", - " additional_kwargs: {}\n", - " },\n", - " AIMessage {\n", - " lc_serializable: \u001b[33mtrue\u001b[39m,\n", - " lc_kwargs: { content: \u001b[32m\"\"\u001b[39m, additional_kwargs: { tool_calls: [ \u001b[36m[Object]\u001b[39m ] } },\n", - " lc_namespace: [ \u001b[32m\"langchain_core\"\u001b[39m, \u001b[32m\"messages\"\u001b[39m ],\n", - " content: \u001b[32m\"\"\u001b[39m,\n", - " name: \u001b[90mundefined\u001b[39m,\n", - " additional_kwargs: {\n", - " tool_calls: [\n", - " {\n", - " id: \u001b[32m\"8fa4d00d-801f-470e-8737-51ee9dc82259\"\u001b[39m,\n", - " type: \u001b[32m\"function\"\u001b[39m,\n", - " function: \u001b[36m[Object]\u001b[39m\n", - " }\n", - " ]\n", - " }\n", - " },\n", - " ToolMessage {\n", - " lc_serializable: \u001b[33mtrue\u001b[39m,\n", - " lc_kwargs: {\n", - " content: \u001b[32m\"You have correctly called this tool.\"\u001b[39m,\n", - " tool_call_id: \u001b[32m\"8fa4d00d-801f-470e-8737-51ee9dc82259\"\u001b[39m,\n", - " additional_kwargs: {}\n", - " },\n", - " lc_namespace: [ \u001b[32m\"langchain_core\"\u001b[39m, \u001b[32m\"messages\"\u001b[39m ],\n", - " content: \u001b[32m\"You have correctly called this tool.\"\u001b[39m,\n", - " name: \u001b[90mundefined\u001b[39m,\n", - " additional_kwargs: {},\n", - " tool_call_id: \u001b[32m\"8fa4d00d-801f-470e-8737-51ee9dc82259\"\u001b[39m\n", - " },\n", - " HumanMessage {\n", - " lc_serializable: \u001b[33mtrue\u001b[39m,\n", - " lc_kwargs: {\n", - " content: \u001b[32m\"Fiona traveled far from France to Spain.\"\u001b[39m,\n", - " additional_kwargs: {}\n", - " },\n", - " lc_namespace: [ \u001b[32m\"langchain_core\"\u001b[39m, \u001b[32m\"messages\"\u001b[39m ],\n", - " content: \u001b[32m\"Fiona traveled far from France to Spain.\"\u001b[39m,\n", - " name: \u001b[90mundefined\u001b[39m,\n", - " additional_kwargs: {}\n", - " },\n", - " AIMessage {\n", - " lc_serializable: \u001b[33mtrue\u001b[39m,\n", - " lc_kwargs: { content: \u001b[32m\"\"\u001b[39m, additional_kwargs: { tool_calls: [ \u001b[36m[Object]\u001b[39m ] } },\n", - " lc_namespace: [ \u001b[32m\"langchain_core\"\u001b[39m, \u001b[32m\"messages\"\u001b[39m ],\n", - " content: \u001b[32m\"\"\u001b[39m,\n", - " name: \u001b[90mundefined\u001b[39m,\n", - " additional_kwargs: {\n", - " tool_calls: [\n", - " {\n", - " id: \u001b[32m\"14ad6217-fcbd-47c7-9006-82f612e36c66\"\u001b[39m,\n", - " type: \u001b[32m\"function\"\u001b[39m,\n", - " function: \u001b[36m[Object]\u001b[39m\n", - " }\n", - " ]\n", - " }\n", - " },\n", - " ToolMessage {\n", - " lc_serializable: \u001b[33mtrue\u001b[39m,\n", - " lc_kwargs: {\n", - " content: \u001b[32m\"You have correctly called this tool.\"\u001b[39m,\n", - " tool_call_id: \u001b[32m\"14ad6217-fcbd-47c7-9006-82f612e36c66\"\u001b[39m,\n", - " additional_kwargs: {}\n", - " },\n", - " lc_namespace: [ \u001b[32m\"langchain_core\"\u001b[39m, \u001b[32m\"messages\"\u001b[39m ],\n", - " content: \u001b[32m\"You have correctly called this tool.\"\u001b[39m,\n", - " name: \u001b[90mundefined\u001b[39m,\n", - " additional_kwargs: {},\n", - " tool_call_id: \u001b[32m\"14ad6217-fcbd-47c7-9006-82f612e36c66\"\u001b[39m\n", - " },\n", - " HumanMessage {\n", - " lc_serializable: \u001b[33mtrue\u001b[39m,\n", - " lc_kwargs: { content: \u001b[32m\"this is some text\"\u001b[39m, additional_kwargs: {} },\n", - " lc_namespace: [ \u001b[32m\"langchain_core\"\u001b[39m, \u001b[32m\"messages\"\u001b[39m ],\n", - " content: \u001b[32m\"this is some text\"\u001b[39m,\n", - " name: \u001b[90mundefined\u001b[39m,\n", - " additional_kwargs: {}\n", - " }\n", - "]" + "cell_type": "code", + "execution_count": 1, + "id": "89579144-bcb3-490a-8036-86a0a6bcd56b", + "metadata": {}, + "outputs": [], + "source": [ + "import { ChatPromptTemplate, MessagesPlaceholder } from \"@langchain/core/prompts\";\n", + "\n", + "const SYSTEM_PROMPT_TEMPLATE = `You are an expert extraction algorithm.\n", + "Only extract relevant information from the text.\n", + "If you do not know the value of an attribute asked to extract, you may omit the attribute's value.`;\n", + "\n", + "// Define a custom prompt to provide instructions and any additional context.\n", + "// 1) You can add examples into the prompt template to improve extraction quality\n", + "// 2) Introduce additional parameters to take context into account (e.g., include metadata\n", + "// about the document from which the text was extracted.)\n", + "const prompt = ChatPromptTemplate.fromMessages([\n", + " [\"system\", SYSTEM_PROMPT_TEMPLATE],\n", + " // ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓\n", + " new MessagesPlaceholder(\"examples\"),\n", + " // ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑\n", + " [\"human\", \"{text}\"]\n", + "]);" ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "const promptValue = await prompt.invoke({\n", - " text: \"this is some text\",\n", - " examples: exampleMessages\n", - "});\n", - "\n", - "promptValue.toChatMessages();" - ] - }, - { - "cell_type": "markdown", - "id": "47b0bbef-bc6b-4535-a8e2-5c84f09d5637", - "metadata": {}, - "source": [ - "## Create an extractor\n", - "Here, we'll create an extractor using **gpt-4**." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "dbfea43d-769b-42e9-a76f-ce722f7d6f93", - "metadata": {}, - "outputs": [], - "source": [ - "import { ChatOpenAI } from \"@langchain/openai\";\n", - "\n", - "// We will be using tool calling mode, which\n", - "// requires a tool calling capable model.\n", - "const llm = new ChatOpenAI({\n", - " // Consider benchmarking with the best model you can to get\n", - " // a sense of the best possible quality.\n", - " modelName: \"gpt-4-0125-preview\",\n", - " temperature: 0,\n", - "});\n", - "\n", - "// For function/tool calling, we can also supply an name for the schema\n", - "// to give the LLM additional context about what it's extracting.\n", - "const extractionRunnable = prompt.pipe(llm.withStructuredOutput(peopleSchema, { name: \"people\" }));" - ] - }, - { - "cell_type": "markdown", - "id": "58a8139e-f201-4b8e-baf0-16a83e5fa987", - "metadata": {}, - "source": [ - "## Without examples 😿\n", - "\n", - "Notice that even though we're using `gpt-4`, it's unreliable with a **very simple** test case!\n", - "\n", - "We run it 5 times below to emphasize this:" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "8b1d6273-5ec5-4970-af8a-0da1f1efa293", - "metadata": {}, - "outputs": [ + }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "{\n", - " people: [ { name: \"earth\", hair_color: \"grey\", height_in_meters: \"1\" } ]\n", - "}\n", - "{ people: [ { name: \"earth\", hair_color: \"moon\" } ] }\n", - "{ people: [ { name: \"earth\", hair_color: \"moon\" } ] }\n", - "{ people: [ { name: \"earth\", hair_color: \"1 moon\" } ] }\n", - "{ people: [] }\n" - ] - } - ], - "source": [ - "const text = \"The solar system is large, but earth has only 1 moon.\";\n", - "\n", - "for (let i = 0; i < 5; i++) {\n", - " const result = await extractionRunnable.invoke({\n", - " text,\n", - " examples: []\n", - " });\n", - " console.log(result);\n", - "}" - ] - }, - { - "cell_type": "markdown", - "id": "09840f17-ab26-4ea2-8a39-c747103804ec", - "metadata": {}, - "source": [ - "## With examples 😻\n", - "\n", - "Reference examples help fix the failure!" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "9bdfa49e-0005-4c06-9598-2adfd882b014", - "metadata": {}, - "outputs": [ + "cell_type": "markdown", + "id": "2484008c-ba1a-42a5-87a1-628a900de7fd", + "metadata": {}, + "source": [ + "Test out the template:" + ] + }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "{ people: [] }\n", - "{ people: [] }\n", - "{ people: [] }\n", - "{ people: [] }\n", - "{ people: [] }\n" - ] - } - ], - "source": [ - "const text = \"The solar system is large, but earth has only 1 moon.\";\n", - "\n", - "for (let i = 0; i < 5; i++) {\n", - " const result = await extractionRunnable.invoke({\n", - " text,\n", - " // Example messages from above\n", - " examples: exampleMessages\n", - " });\n", - " console.log(result);\n", - "}" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "84413e17-608d-4f85-b70e-00b89b271927", - "metadata": {}, - "outputs": [ + "cell_type": "code", + "execution_count": 2, + "id": "610c3025-ea63-4cd7-88bd-c8cbcb4d8a3f", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[\n", + " SystemMessage {\n", + " lc_serializable: \u001b[33mtrue\u001b[39m,\n", + " lc_kwargs: {\n", + " content: \u001b[32m\"You are an expert extraction algorithm.\\n\"\u001b[39m +\n", + " \u001b[32m\"Only extract relevant information from the text.\\n\"\u001b[39m +\n", + " \u001b[32m\"If you do n\"\u001b[39m... 87 more characters,\n", + " additional_kwargs: {}\n", + " },\n", + " lc_namespace: [ \u001b[32m\"langchain_core\"\u001b[39m, \u001b[32m\"messages\"\u001b[39m ],\n", + " content: \u001b[32m\"You are an expert extraction algorithm.\\n\"\u001b[39m +\n", + " \u001b[32m\"Only extract relevant information from the text.\\n\"\u001b[39m +\n", + " \u001b[32m\"If you do n\"\u001b[39m... 87 more characters,\n", + " name: \u001b[90mundefined\u001b[39m,\n", + " additional_kwargs: {}\n", + " },\n", + " HumanMessage {\n", + " lc_serializable: \u001b[33mtrue\u001b[39m,\n", + " lc_kwargs: { content: \u001b[32m\"testing 1 2 3\"\u001b[39m, additional_kwargs: {} },\n", + " lc_namespace: [ \u001b[32m\"langchain_core\"\u001b[39m, \u001b[32m\"messages\"\u001b[39m ],\n", + " content: \u001b[32m\"testing 1 2 3\"\u001b[39m,\n", + " name: \u001b[90mundefined\u001b[39m,\n", + " additional_kwargs: {}\n", + " },\n", + " HumanMessage {\n", + " lc_serializable: \u001b[33mtrue\u001b[39m,\n", + " lc_kwargs: { content: \u001b[32m\"this is some text\"\u001b[39m, additional_kwargs: {} },\n", + " lc_namespace: [ \u001b[32m\"langchain_core\"\u001b[39m, \u001b[32m\"messages\"\u001b[39m ],\n", + " content: \u001b[32m\"this is some text\"\u001b[39m,\n", + " name: \u001b[90mundefined\u001b[39m,\n", + " additional_kwargs: {}\n", + " }\n", + "]" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import { HumanMessage } from \"@langchain/core/messages\";\n", + "\n", + "const promptValue = await prompt.invoke({\n", + " text: \"this is some text\",\n", + " examples: [new HumanMessage(\"testing 1 2 3\")],\n", + "});\n", + "\n", + "promptValue.toChatMessages();" + ] + }, + { + "cell_type": "markdown", + "id": "368abd80-0cf0-41a7-8224-acf90dd6830d", + "metadata": {}, + "source": [ + "## Define the schema\n", + "\n", + "Let's re-use the people schema from the quickstart." + ] + }, { - "data": { - "text/plain": [ - "{\n", - " people: [ { name: \u001b[32m\"Hair-ison\"\u001b[39m, hair_color: \u001b[32m\"black\"\u001b[39m, height_in_meters: \u001b[32m\"3\"\u001b[39m } ]\n", - "}" + "cell_type": "code", + "execution_count": 3, + "id": "d875a49a-d2cb-4b9e-b5bf-41073bc3905c", + "metadata": {}, + "outputs": [], + "source": [ + "import { z } from \"zod\";\n", + "\n", + "const personSchema = z.object({\n", + " name: z.optional(z.string()).describe(\"The name of the person\"),\n", + " hair_color: z.optional(z.string()).describe(\"The color of the person's hair, if known\"),\n", + " height_in_meters: z.optional(z.string()).describe(\"Height measured in meters\")\n", + "}).describe(\"Information about a person.\");\n", + "\n", + "const peopleSchema = z.object({\n", + " people: z.array(personSchema)\n", + "});" ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" + }, + { + "cell_type": "markdown", + "id": "96c42162-e4f6-4461-88fd-c76f5aab7e32", + "metadata": {}, + "source": [ + "## Define reference examples\n", + "\n", + "Examples can be defined as a list of input-output pairs. \n", + "\n", + "Each example contains an example `input` text and an example `output` showing what should be extracted from the text.\n", + "\n", + ":::{.callout-important}\n", + "The below example is a bit more advanced - the format of the example needs to match the API used (e.g., tool calling or JSON mode etc.).\n", + "\n", + "Here, the formatted examples will match the format expected for the OpenAI tool calling API since that's what we're using.\n", + ":::\n", + "\n", + "To provide reference examples to the model, we will mock out a fake chat history containing successful usages of the given tool.\n", + "Because the model can choose to call multiple tools at once (or the same tool multiple times), the example's outputs are an array:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "08356810-77ce-4e68-99d9-faa0326f2cee", + "metadata": {}, + "outputs": [], + "source": [ + "import {\n", + " AIMessage,\n", + " type BaseMessage,\n", + " HumanMessage,\n", + " ToolMessage\n", + "} from \"@langchain/core/messages\";\n", + "import { v4 as uuid } from \"uuid\";\n", + "\n", + "type OpenAIToolCall = {\n", + " id: string,\n", + " type: \"function\",\n", + " function: {\n", + " name: string;\n", + " arguments: string;\n", + " }\n", + "};\n", + "\n", + "type Example = {\n", + " input: string;\n", + " toolCallOutputs: Record[];\n", + "}\n", + "\n", + "/**\n", + " * This function converts an example into a list of messages that can be fed into an LLM.\n", + " *\n", + " * This code serves as an adapter that transforms our example into a list of messages\n", + " * that can be processed by a chat model.\n", + " *\n", + " * The list of messages for each example includes:\n", + " *\n", + " * 1) HumanMessage: This contains the content from which information should be extracted.\n", + " * 2) AIMessage: This contains the information extracted by the model.\n", + " * 3) ToolMessage: This provides confirmation to the model that the tool was requested correctly.\n", + " *\n", + " * The inclusion of ToolMessage is necessary because some chat models are highly optimized for agents,\n", + " * making them less suitable for an extraction use case.\n", + " */\n", + "function toolExampleToMessages(example: Example): BaseMessage[] {\n", + " const openAIToolCalls: OpenAIToolCall[] = example.toolCallOutputs.map((output) => {\n", + " return {\n", + " id: uuid(),\n", + " type: \"function\",\n", + " function: {\n", + " // The name of the function right now corresponds\n", + " // to the passed name.\n", + " name: \"extract\",\n", + " arguments: JSON.stringify(output),\n", + " },\n", + " };\n", + " });\n", + " const messages: BaseMessage[] = [\n", + " new HumanMessage(example.input),\n", + " new AIMessage({\n", + " content: \"\",\n", + " additional_kwargs: { tool_calls: openAIToolCalls }\n", + " })\n", + " ];\n", + " const toolMessages = openAIToolCalls.map((toolCall, i) => {\n", + " // Return the mocked successful result for a given tool call.\n", + " return new ToolMessage({\n", + " content: \"You have correctly called this tool.\",\n", + " tool_call_id: toolCall.id\n", + " });\n", + " });\n", + " return messages.concat(toolMessages);\n", + "}\n" + ] + }, + { + "cell_type": "markdown", + "id": "463aa282-51c4-42bf-9463-6ca3b2c08de6", + "metadata": {}, + "source": [ + "Next let's define our examples and then convert them into message format." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "7f59a745-5c81-4011-a4c5-a33ec1eca7ef", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "\u001b[33m6\u001b[39m" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "const examples: Example[] = [\n", + " {\n", + " input: \"The ocean is vast and blue. It's more than 20,000 feet deep. There are many fish in it.\",\n", + " toolCallOutputs: [{}]\n", + " },\n", + " {\n", + " input: \"Fiona traveled far from France to Spain.\",\n", + " toolCallOutputs: [{\n", + " name: \"Fiona\",\n", + " }]\n", + " }\n", + "];\n", + "\n", + "const exampleMessages = [];\n", + "for (const example of examples) {\n", + " exampleMessages.push(...toolExampleToMessages(example));\n", + "}" + ] + }, + { + "cell_type": "markdown", + "id": "6fdbda30-e7e3-46b5-a54a-1769c580af93", + "metadata": {}, + "source": [ + "Let's test out the prompt" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "e61fa3a5-3d15-46a2-a23b-788f9a3ede52", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[\n", + " SystemMessage {\n", + " lc_serializable: \u001b[33mtrue\u001b[39m,\n", + " lc_kwargs: {\n", + " content: \u001b[32m\"You are an expert extraction algorithm.\\n\"\u001b[39m +\n", + " \u001b[32m\"Only extract relevant information from the text.\\n\"\u001b[39m +\n", + " \u001b[32m\"If you do n\"\u001b[39m... 87 more characters,\n", + " additional_kwargs: {}\n", + " },\n", + " lc_namespace: [ \u001b[32m\"langchain_core\"\u001b[39m, \u001b[32m\"messages\"\u001b[39m ],\n", + " content: \u001b[32m\"You are an expert extraction algorithm.\\n\"\u001b[39m +\n", + " \u001b[32m\"Only extract relevant information from the text.\\n\"\u001b[39m +\n", + " \u001b[32m\"If you do n\"\u001b[39m... 87 more characters,\n", + " name: \u001b[90mundefined\u001b[39m,\n", + " additional_kwargs: {}\n", + " },\n", + " HumanMessage {\n", + " lc_serializable: \u001b[33mtrue\u001b[39m,\n", + " lc_kwargs: {\n", + " content: \u001b[32m\"The ocean is vast and blue. It's more than 20,000 feet deep. There are many fish in it.\"\u001b[39m,\n", + " additional_kwargs: {}\n", + " },\n", + " lc_namespace: [ \u001b[32m\"langchain_core\"\u001b[39m, \u001b[32m\"messages\"\u001b[39m ],\n", + " content: \u001b[32m\"The ocean is vast and blue. It's more than 20,000 feet deep. There are many fish in it.\"\u001b[39m,\n", + " name: \u001b[90mundefined\u001b[39m,\n", + " additional_kwargs: {}\n", + " },\n", + " AIMessage {\n", + " lc_serializable: \u001b[33mtrue\u001b[39m,\n", + " lc_kwargs: { content: \u001b[32m\"\"\u001b[39m, additional_kwargs: { tool_calls: [ \u001b[36m[Object]\u001b[39m ] } },\n", + " lc_namespace: [ \u001b[32m\"langchain_core\"\u001b[39m, \u001b[32m\"messages\"\u001b[39m ],\n", + " content: \u001b[32m\"\"\u001b[39m,\n", + " name: \u001b[90mundefined\u001b[39m,\n", + " additional_kwargs: {\n", + " tool_calls: [\n", + " {\n", + " id: \u001b[32m\"8fa4d00d-801f-470e-8737-51ee9dc82259\"\u001b[39m,\n", + " type: \u001b[32m\"function\"\u001b[39m,\n", + " function: \u001b[36m[Object]\u001b[39m\n", + " }\n", + " ]\n", + " }\n", + " },\n", + " ToolMessage {\n", + " lc_serializable: \u001b[33mtrue\u001b[39m,\n", + " lc_kwargs: {\n", + " content: \u001b[32m\"You have correctly called this tool.\"\u001b[39m,\n", + " tool_call_id: \u001b[32m\"8fa4d00d-801f-470e-8737-51ee9dc82259\"\u001b[39m,\n", + " additional_kwargs: {}\n", + " },\n", + " lc_namespace: [ \u001b[32m\"langchain_core\"\u001b[39m, \u001b[32m\"messages\"\u001b[39m ],\n", + " content: \u001b[32m\"You have correctly called this tool.\"\u001b[39m,\n", + " name: \u001b[90mundefined\u001b[39m,\n", + " additional_kwargs: {},\n", + " tool_call_id: \u001b[32m\"8fa4d00d-801f-470e-8737-51ee9dc82259\"\u001b[39m\n", + " },\n", + " HumanMessage {\n", + " lc_serializable: \u001b[33mtrue\u001b[39m,\n", + " lc_kwargs: {\n", + " content: \u001b[32m\"Fiona traveled far from France to Spain.\"\u001b[39m,\n", + " additional_kwargs: {}\n", + " },\n", + " lc_namespace: [ \u001b[32m\"langchain_core\"\u001b[39m, \u001b[32m\"messages\"\u001b[39m ],\n", + " content: \u001b[32m\"Fiona traveled far from France to Spain.\"\u001b[39m,\n", + " name: \u001b[90mundefined\u001b[39m,\n", + " additional_kwargs: {}\n", + " },\n", + " AIMessage {\n", + " lc_serializable: \u001b[33mtrue\u001b[39m,\n", + " lc_kwargs: { content: \u001b[32m\"\"\u001b[39m, additional_kwargs: { tool_calls: [ \u001b[36m[Object]\u001b[39m ] } },\n", + " lc_namespace: [ \u001b[32m\"langchain_core\"\u001b[39m, \u001b[32m\"messages\"\u001b[39m ],\n", + " content: \u001b[32m\"\"\u001b[39m,\n", + " name: \u001b[90mundefined\u001b[39m,\n", + " additional_kwargs: {\n", + " tool_calls: [\n", + " {\n", + " id: \u001b[32m\"14ad6217-fcbd-47c7-9006-82f612e36c66\"\u001b[39m,\n", + " type: \u001b[32m\"function\"\u001b[39m,\n", + " function: \u001b[36m[Object]\u001b[39m\n", + " }\n", + " ]\n", + " }\n", + " },\n", + " ToolMessage {\n", + " lc_serializable: \u001b[33mtrue\u001b[39m,\n", + " lc_kwargs: {\n", + " content: \u001b[32m\"You have correctly called this tool.\"\u001b[39m,\n", + " tool_call_id: \u001b[32m\"14ad6217-fcbd-47c7-9006-82f612e36c66\"\u001b[39m,\n", + " additional_kwargs: {}\n", + " },\n", + " lc_namespace: [ \u001b[32m\"langchain_core\"\u001b[39m, \u001b[32m\"messages\"\u001b[39m ],\n", + " content: \u001b[32m\"You have correctly called this tool.\"\u001b[39m,\n", + " name: \u001b[90mundefined\u001b[39m,\n", + " additional_kwargs: {},\n", + " tool_call_id: \u001b[32m\"14ad6217-fcbd-47c7-9006-82f612e36c66\"\u001b[39m\n", + " },\n", + " HumanMessage {\n", + " lc_serializable: \u001b[33mtrue\u001b[39m,\n", + " lc_kwargs: { content: \u001b[32m\"this is some text\"\u001b[39m, additional_kwargs: {} },\n", + " lc_namespace: [ \u001b[32m\"langchain_core\"\u001b[39m, \u001b[32m\"messages\"\u001b[39m ],\n", + " content: \u001b[32m\"this is some text\"\u001b[39m,\n", + " name: \u001b[90mundefined\u001b[39m,\n", + " additional_kwargs: {}\n", + " }\n", + "]" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "const promptValue = await prompt.invoke({\n", + " text: \"this is some text\",\n", + " examples: exampleMessages\n", + "});\n", + "\n", + "promptValue.toChatMessages();" + ] + }, + { + "cell_type": "markdown", + "id": "47b0bbef-bc6b-4535-a8e2-5c84f09d5637", + "metadata": {}, + "source": [ + "## Create an extractor\n", + "Here, we'll create an extractor using **gpt-4**." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "dbfea43d-769b-42e9-a76f-ce722f7d6f93", + "metadata": {}, + "outputs": [], + "source": [ + "import { ChatOpenAI } from \"@langchain/openai\";\n", + "\n", + "// We will be using tool calling mode, which\n", + "// requires a tool calling capable model.\n", + "const llm = new ChatOpenAI({\n", + " // Consider benchmarking with the best model you can to get\n", + " // a sense of the best possible quality.\n", + " model: \"gpt-4-0125-preview\",\n", + " temperature: 0,\n", + "});\n", + "\n", + "// For function/tool calling, we can also supply an name for the schema\n", + "// to give the LLM additional context about what it's extracting.\n", + "const extractionRunnable = prompt.pipe(llm.withStructuredOutput(peopleSchema, { name: \"people\" }));" + ] + }, + { + "cell_type": "markdown", + "id": "58a8139e-f201-4b8e-baf0-16a83e5fa987", + "metadata": {}, + "source": [ + "## Without examples 😿\n", + "\n", + "Notice that even though we're using `gpt-4`, it's unreliable with a **very simple** test case!\n", + "\n", + "We run it 5 times below to emphasize this:" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "8b1d6273-5ec5-4970-af8a-0da1f1efa293", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{\n", + " people: [ { name: \"earth\", hair_color: \"grey\", height_in_meters: \"1\" } ]\n", + "}\n", + "{ people: [ { name: \"earth\", hair_color: \"moon\" } ] }\n", + "{ people: [ { name: \"earth\", hair_color: \"moon\" } ] }\n", + "{ people: [ { name: \"earth\", hair_color: \"1 moon\" } ] }\n", + "{ people: [] }\n" + ] + } + ], + "source": [ + "const text = \"The solar system is large, but earth has only 1 moon.\";\n", + "\n", + "for (let i = 0; i < 5; i++) {\n", + " const result = await extractionRunnable.invoke({\n", + " text,\n", + " examples: []\n", + " });\n", + " console.log(result);\n", + "}" + ] + }, + { + "cell_type": "markdown", + "id": "09840f17-ab26-4ea2-8a39-c747103804ec", + "metadata": {}, + "source": [ + "## With examples 😻\n", + "\n", + "Reference examples help fix the failure!" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "9bdfa49e-0005-4c06-9598-2adfd882b014", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{ people: [] }\n", + "{ people: [] }\n", + "{ people: [] }\n", + "{ people: [] }\n", + "{ people: [] }\n" + ] + } + ], + "source": [ + "const text = \"The solar system is large, but earth has only 1 moon.\";\n", + "\n", + "for (let i = 0; i < 5; i++) {\n", + " const result = await extractionRunnable.invoke({\n", + " text,\n", + " // Example messages from above\n", + " examples: exampleMessages\n", + " });\n", + " console.log(result);\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "84413e17-608d-4f85-b70e-00b89b271927", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{\n", + " people: [ { name: \u001b[32m\"Hair-ison\"\u001b[39m, hair_color: \u001b[32m\"black\"\u001b[39m, height_in_meters: \u001b[32m\"3\"\u001b[39m } ]\n", + "}" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "await extractionRunnable.invoke({\n", + " text: \"My name is Hair-ison. My hair is black. I am 3 meters tall.\",\n", + " examples: exampleMessages,\n", + "});" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Deno", + "language": "typescript", + "name": "deno" + }, + "language_info": { + "file_extension": ".ts", + "mimetype": "text/x.typescript", + "name": "typescript", + "nb_converter": "script", + "pygments_lexer": "typescript", + "version": "5.3.3" } - ], - "source": [ - "await extractionRunnable.invoke({\n", - " text: \"My name is Hair-ison. My hair is black. I am 3 meters tall.\",\n", - " examples: exampleMessages,\n", - "});" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Deno", - "language": "typescript", - "name": "deno" }, - "language_info": { - "file_extension": ".ts", - "mimetype": "text/x.typescript", - "name": "typescript", - "nb_converter": "script", - "pygments_lexer": "typescript", - "version": "5.3.3" - } - }, - "nbformat": 4, - "nbformat_minor": 5 + "nbformat": 4, + "nbformat_minor": 5 } diff --git a/docs/core_docs/docs/use_cases/extraction/how_to/handle_files.ipynb b/docs/core_docs/docs/use_cases/extraction/how_to/handle_files.ipynb index 26cb95358133..495112147675 100644 --- a/docs/core_docs/docs/use_cases/extraction/how_to/handle_files.ipynb +++ b/docs/core_docs/docs/use_cases/extraction/how_to/handle_files.ipynb @@ -1,186 +1,186 @@ { - "cells": [ - { - "cell_type": "raw", - "id": "8371e5d6-eb65-4c97-aac2-05037356c2c1", - "metadata": {}, - "source": [ - "---\n", - "title: Handle Files\n", - "sidebar_position: 3\n", - "---" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "0d5eea7c-bc69-4da2-b91d-d7c71f7085d0", - "metadata": {}, - "source": [ - "Besides raw text data, you may wish to extract information from other file types such as PowerPoint presentations or PDFs.\n", - "\n", - "The general strategy is to use a LangChain [document loader](/docs/modules/data_connection/document_loaders/) or other method to parse files into a text format that can be fed into LLMs.\n", - "\n", - "LangChain features a large number of [document loader integrations](/docs/integrations/document_loaders).\n", - "\n", - "Let's go over an example of loading and extracting data from a PDF. First, we install required dependencies:\n", - "\n", - "```{=mdx}\n", - "import IntegrationInstallTooltip from \"@mdx_components/integration_install_tooltip.mdx\";\n", - "import Npm2Yarn from \"@theme/Npm2Yarn\";\n", - "\n", - "\n", - "\n", - "\n", - " @langchain/openai zod\n", - "\n", - "```" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "430806a7-7d8a-4111-9f5d-46840dab0dc0", - "metadata": {}, - "outputs": [ + "cells": [ { - "data": { - "text/plain": [ - "[Module: null prototype] { default: \u001b[36m[AsyncFunction: PDF]\u001b[39m }" + "cell_type": "raw", + "id": "8371e5d6-eb65-4c97-aac2-05037356c2c1", + "metadata": {}, + "source": [ + "---\n", + "title: Handle Files\n", + "sidebar_position: 3\n", + "---" ] - }, - "execution_count": 1, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import { PDFLoader } from \"langchain/document_loaders/fs/pdf\";\n", - "// Only required in a Deno notebook environment to load the peer dep.\n", - "import \"pdf-parse\";\n", - "\n", - "const loader = new PDFLoader(\"./test/data/bitcoin.pdf\");\n", - "\n", - "const docs = await loader.load();" - ] - }, - { - "cell_type": "markdown", - "id": "50593908", - "metadata": {}, - "source": [ - "Now that we've loaded a PDF document, let's try extracting mentioned people. We can define a schema like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "fb618df7-d7be-4f34-8939-6f7b10dfc2b6", - "metadata": {}, - "outputs": [], - "source": [ - "import { z } from \"zod\";\n", - "\n", - "const personSchema = z.object({\n", - " name: z.optional(z.string()).describe(\"The name of the person\"),\n", - " hair_color: z.optional(z.string()).describe(\"The color of the person's hair, if known\"),\n", - " height_in_meters: z.optional(z.string()).describe(\"Height measured in meters\"),\n", - " email: z.optional(z.string()).describe(\"The person's email, if present\"),\n", - "}).describe(\"Information about a person.\");\n", - "\n", - "const peopleSchema = z.object({\n", - " people: z.array(personSchema),\n", - "});" - ] - }, - { - "cell_type": "markdown", - "id": "8824d553", - "metadata": {}, - "source": [ - "And then initialize our extraction chain like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "046ae5ce", - "metadata": {}, - "outputs": [], - "source": [ - "import { ChatPromptTemplate } from \"@langchain/core/prompts\";\n", - "import { ChatOpenAI } from \"@langchain/openai\";\n", - "\n", - "const SYSTEM_PROMPT_TEMPLATE = `You are an expert extraction algorithm.\n", - "Only extract relevant information from the text.\n", - "If you do not know the value of an attribute asked to extract, you may omit the attribute's value.`;\n", - "\n", - "const prompt = ChatPromptTemplate.fromMessages([\n", - " [\"system\", SYSTEM_PROMPT_TEMPLATE],\n", - " [\"human\", \"{text}\"]\n", - "]);\n", - "\n", - "const llm = new ChatOpenAI({\n", - " modelName: \"gpt-4-0125-preview\",\n", - " temperature: 0,\n", - "})\n", - "\n", - "const extractionRunnable = prompt.pipe(llm.withStructuredOutput(peopleSchema, { name: \"people\", }));" - ] - }, - { - "cell_type": "markdown", - "id": "62a92830", - "metadata": {}, - "source": [ - "Now, let's try invoking it!" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "fb8876a5", - "metadata": {}, - "outputs": [ + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "0d5eea7c-bc69-4da2-b91d-d7c71f7085d0", + "metadata": {}, + "source": [ + "Besides raw text data, you may wish to extract information from other file types such as PowerPoint presentations or PDFs.\n", + "\n", + "The general strategy is to use a LangChain [document loader](/docs/modules/data_connection/document_loaders/) or other method to parse files into a text format that can be fed into LLMs.\n", + "\n", + "LangChain features a large number of [document loader integrations](/docs/integrations/document_loaders).\n", + "\n", + "Let's go over an example of loading and extracting data from a PDF. First, we install required dependencies:\n", + "\n", + "```{=mdx}\n", + "import IntegrationInstallTooltip from \"@mdx_components/integration_install_tooltip.mdx\";\n", + "import Npm2Yarn from \"@theme/Npm2Yarn\";\n", + "\n", + "\n", + "\n", + "\n", + " @langchain/openai zod\n", + "\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "430806a7-7d8a-4111-9f5d-46840dab0dc0", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[Module: null prototype] { default: \u001b[36m[AsyncFunction: PDF]\u001b[39m }" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import { PDFLoader } from \"langchain/document_loaders/fs/pdf\";\n", + "// Only required in a Deno notebook environment to load the peer dep.\n", + "import \"pdf-parse\";\n", + "\n", + "const loader = new PDFLoader(\"./test/data/bitcoin.pdf\");\n", + "\n", + "const docs = await loader.load();" + ] + }, { - "data": { - "text/plain": [ - "{ people: [ { name: \u001b[32m\"Satoshi Nakamoto\"\u001b[39m, email: \u001b[32m\"satoshin@gmx.com\"\u001b[39m } ] }" + "cell_type": "markdown", + "id": "50593908", + "metadata": {}, + "source": [ + "Now that we've loaded a PDF document, let's try extracting mentioned people. We can define a schema like this:" ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "fb618df7-d7be-4f34-8939-6f7b10dfc2b6", + "metadata": {}, + "outputs": [], + "source": [ + "import { z } from \"zod\";\n", + "\n", + "const personSchema = z.object({\n", + " name: z.optional(z.string()).describe(\"The name of the person\"),\n", + " hair_color: z.optional(z.string()).describe(\"The color of the person's hair, if known\"),\n", + " height_in_meters: z.optional(z.string()).describe(\"Height measured in meters\"),\n", + " email: z.optional(z.string()).describe(\"The person's email, if present\"),\n", + "}).describe(\"Information about a person.\");\n", + "\n", + "const peopleSchema = z.object({\n", + " people: z.array(personSchema),\n", + "});" + ] + }, + { + "cell_type": "markdown", + "id": "8824d553", + "metadata": {}, + "source": [ + "And then initialize our extraction chain like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "046ae5ce", + "metadata": {}, + "outputs": [], + "source": [ + "import { ChatPromptTemplate } from \"@langchain/core/prompts\";\n", + "import { ChatOpenAI } from \"@langchain/openai\";\n", + "\n", + "const SYSTEM_PROMPT_TEMPLATE = `You are an expert extraction algorithm.\n", + "Only extract relevant information from the text.\n", + "If you do not know the value of an attribute asked to extract, you may omit the attribute's value.`;\n", + "\n", + "const prompt = ChatPromptTemplate.fromMessages([\n", + " [\"system\", SYSTEM_PROMPT_TEMPLATE],\n", + " [\"human\", \"{text}\"]\n", + "]);\n", + "\n", + "const llm = new ChatOpenAI({\n", + " model: \"gpt-4-0125-preview\",\n", + " temperature: 0,\n", + "})\n", + "\n", + "const extractionRunnable = prompt.pipe(llm.withStructuredOutput(peopleSchema, { name: \"people\", }));" + ] + }, + { + "cell_type": "markdown", + "id": "62a92830", + "metadata": {}, + "source": [ + "Now, let's try invoking it!" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "fb8876a5", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{ people: [ { name: \u001b[32m\"Satoshi Nakamoto\"\u001b[39m, email: \u001b[32m\"satoshin@gmx.com\"\u001b[39m } ] }" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "await extractionRunnable.invoke({ text: docs[0].pageContent });" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "88b52919", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Deno", + "language": "typescript", + "name": "deno" + }, + "language_info": { + "file_extension": ".ts", + "mimetype": "text/x.typescript", + "name": "typescript", + "nb_converter": "script", + "pygments_lexer": "typescript", + "version": "5.3.3" } - ], - "source": [ - "await extractionRunnable.invoke({ text: docs[0].pageContent });" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "88b52919", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Deno", - "language": "typescript", - "name": "deno" }, - "language_info": { - "file_extension": ".ts", - "mimetype": "text/x.typescript", - "name": "typescript", - "nb_converter": "script", - "pygments_lexer": "typescript", - "version": "5.3.3" - } - }, - "nbformat": 4, - "nbformat_minor": 5 + "nbformat": 4, + "nbformat_minor": 5 } diff --git a/docs/core_docs/docs/use_cases/extraction/how_to/handle_long_text.ipynb b/docs/core_docs/docs/use_cases/extraction/how_to/handle_long_text.ipynb index e8d328bcffe4..e9b172c63850 100644 --- a/docs/core_docs/docs/use_cases/extraction/how_to/handle_long_text.ipynb +++ b/docs/core_docs/docs/use_cases/extraction/how_to/handle_long_text.ipynb @@ -1,453 +1,453 @@ { - "cells": [ - { - "cell_type": "raw", - "id": "913dd5a2-24d1-4f8e-bc15-ab518483eef9", - "metadata": {}, - "source": [ - "---\n", - "title: Handle long text\n", - "sidebar_position: 2\n", - "---" - ] - }, - { - "cell_type": "markdown", - "id": "9e161a8a-fcf0-4d55-933e-da271ce28d7e", - "metadata": {}, - "source": [ - "When working with files, like PDFs, you're likely to encounter text that exceeds your language model's context window. To process this text, consider these strategies:\n", - "\n", - "1. **Change LLM** Choose a different LLM that supports a larger context window.\n", - "2. **Brute Force** Chunk the document, and extract content from each chunk.\n", - "3. **RAG** Chunk the document, index the chunks, and only extract content from a subset of chunks that look \"relevant\".\n", - "\n", - "Keep in mind that these strategies have different trade offs and the best strategy likely depends on the application that you're designing!" - ] - }, - { - "cell_type": "markdown", - "id": "57969139-ad0a-487e-97d8-cb30e2af9742", - "metadata": {}, - "source": [ - "## Set up\n", - "\n", - "First, let's install some required dependencies:\n", - "\n", - "```{=mdx}\n", - "import IntegrationInstallTooltip from \"@mdx_components/integration_install_tooltip.mdx\";\n", - "import Npm2Yarn from \"@theme/Npm2Yarn\";\n", - "\n", - "\n", - "\n", - "\n", - " @langchain/openai zod cheerio\n", - "\n", - "```\n", - "\n", - "Next, we need some example data! Let's download an article about [cars from Wikipedia](https://en.wikipedia.org/wiki/Car) and load it as a LangChain `Document`." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "571aad22-2cec-4b9b-b656-5e4b81a1ec6c", - "metadata": {}, - "outputs": [ + "cells": [ { - "data": { - "text/plain": [ - "[Module: null prototype] {\n", - " contains: \u001b[36m[Function: contains]\u001b[39m,\n", - " default: [Function: initialize] {\n", - " contains: \u001b[36m[Function: contains]\u001b[39m,\n", - " html: \u001b[36m[Function: html]\u001b[39m,\n", - " merge: \u001b[36m[Function: merge]\u001b[39m,\n", - " parseHTML: \u001b[36m[Function: parseHTML]\u001b[39m,\n", - " root: \u001b[36m[Function: root]\u001b[39m,\n", - " text: \u001b[36m[Function: text]\u001b[39m,\n", - " xml: \u001b[36m[Function: xml]\u001b[39m,\n", - " load: \u001b[36m[Function: load]\u001b[39m,\n", - " _root: Document {\n", - " parent: \u001b[1mnull\u001b[22m,\n", - " prev: \u001b[1mnull\u001b[22m,\n", - " next: \u001b[1mnull\u001b[22m,\n", - " startIndex: \u001b[1mnull\u001b[22m,\n", - " endIndex: \u001b[1mnull\u001b[22m,\n", - " children: [],\n", - " type: \u001b[32m\"root\"\u001b[39m\n", - " },\n", - " _options: { xml: \u001b[33mfalse\u001b[39m, decodeEntities: \u001b[33mtrue\u001b[39m },\n", - " fn: Cheerio {}\n", - " },\n", - " html: \u001b[36m[Function: html]\u001b[39m,\n", - " load: \u001b[36m[Function: load]\u001b[39m,\n", - " merge: \u001b[36m[Function: merge]\u001b[39m,\n", - " parseHTML: \u001b[36m[Function: parseHTML]\u001b[39m,\n", - " root: \u001b[36m[Function: root]\u001b[39m,\n", - " text: \u001b[36m[Function: text]\u001b[39m,\n", - " xml: \u001b[36m[Function: xml]\u001b[39m\n", - "}" + "cell_type": "raw", + "id": "913dd5a2-24d1-4f8e-bc15-ab518483eef9", + "metadata": {}, + "source": [ + "---\n", + "title: Handle long text\n", + "sidebar_position: 2\n", + "---" ] - }, - "execution_count": 1, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import { CheerioWebBaseLoader } from \"langchain/document_loaders/web/cheerio\";\n", - "// Only required in a Deno notebook environment to load the peer dep.\n", - "import \"cheerio\";\n", - "\n", - "const loader = new CheerioWebBaseLoader(\n", - " \"https://en.wikipedia.org/wiki/Car\"\n", - ");\n", - "\n", - "const docs = await loader.load();" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "85656454-6d5d-4ff6-93ca-690791ac1ec4", - "metadata": {}, - "outputs": [ + }, { - "data": { - "text/plain": [ - "\u001b[33m95865\u001b[39m" + "cell_type": "markdown", + "id": "9e161a8a-fcf0-4d55-933e-da271ce28d7e", + "metadata": {}, + "source": [ + "When working with files, like PDFs, you're likely to encounter text that exceeds your language model's context window. To process this text, consider these strategies:\n", + "\n", + "1. **Change LLM** Choose a different LLM that supports a larger context window.\n", + "2. **Brute Force** Chunk the document, and extract content from each chunk.\n", + "3. **RAG** Chunk the document, index the chunks, and only extract content from a subset of chunks that look \"relevant\".\n", + "\n", + "Keep in mind that these strategies have different trade offs and the best strategy likely depends on the application that you're designing!" ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "docs[0].pageContent.length;" - ] - }, - { - "cell_type": "markdown", - "id": "af3ffb8d-587a-4370-886a-e56e617bcb9c", - "metadata": {}, - "source": [ - "## Define the schema\n", - "\n", - "Here, we'll define schema to extract key developments from the text." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "a3b288ed-87a6-4af0-aac8-20921dc370d4", - "metadata": {}, - "outputs": [], - "source": [ - "import { z } from \"zod\";\n", - "import { ChatPromptTemplate } from \"@langchain/core/prompts\";\n", - "import { ChatOpenAI } from \"@langchain/openai\";\n", - "\n", - "const keyDevelopmentSchema = z.object({\n", - " year: z.number().describe(\"The year when there was an important historic development.\"),\n", - " description: z.string().describe(\"What happened in this year? What was the development?\"),\n", - " evidence: z.string().describe(\"Repeat verbatim the sentence(s) from which the year and description information were extracted\"),\n", - "}).describe(\"Information about a development in the history of cars.\");\n", - "\n", - "const extractionDataSchema = z.object({\n", - " key_developments: z.array(keyDevelopmentSchema),\n", - "}).describe(\"Extracted information about key developments in the history of cars\");\n", - "\n", - "const SYSTEM_PROMPT_TEMPLATE = [\n", - " \"You are an expert at identifying key historic development in text.\",\n", - " \"Only extract important historic developments. Extract nothing if no important information can be found in the text.\"\n", - "].join(\"\\n\");\n", - "\n", - "// Define a custom prompt to provide instructions and any additional context.\n", - "// 1) You can add examples into the prompt template to improve extraction quality\n", - "// 2) Introduce additional parameters to take context into account (e.g., include metadata\n", - "// about the document from which the text was extracted.)\n", - "const prompt = ChatPromptTemplate.fromMessages([\n", - " [\n", - " \"system\",\n", - " SYSTEM_PROMPT_TEMPLATE,\n", - " ],\n", - " // Keep on reading through this use case to see how to use examples to improve performance\n", - " // MessagesPlaceholder('examples'),\n", - " [\"human\", \"{text}\"],\n", - "]);\n", - "\n", - "// We will be using tool calling mode, which\n", - "// requires a tool calling capable model.\n", - "const llm = new ChatOpenAI({\n", - " modelName: \"gpt-4-0125-preview\",\n", - " temperature: 0,\n", - "});\n", - "\n", - "const extractionChain = prompt.pipe(llm.withStructuredOutput(extractionDataSchema));" - ] - }, - { - "cell_type": "markdown", - "id": "13aebafb-26b5-42b2-ae8e-9c05cd56e5c5", - "metadata": {}, - "source": [ - "## Brute force approach\n", - "\n", - "Split the documents into chunks such that each chunk fits into the context window of the LLMs." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "27b8a373-14b3-45ea-8bf5-9749122ad927", - "metadata": {}, - "outputs": [], - "source": [ - "import { TokenTextSplitter } from \"langchain/text_splitter\";\n", - "\n", - "const textSplitter = new TokenTextSplitter({\n", - " chunkSize: 2000,\n", - " chunkOverlap: 20,\n", - "});\n", - "\n", - "// Note that this method takes an array of docs\n", - "const splitDocs = await textSplitter.splitDocuments(docs);" - ] - }, - { - "cell_type": "markdown", - "id": "5b43d7e0-3c85-4d97-86c7-e8c984b60b0a", - "metadata": {}, - "source": [ - "Use the `.batch` method present on all runnables to run the extraction in **parallel** across each chunk! \n", - "\n", - ":::{.callout-tip}\n", - "You can often use `.batch()` to parallelize the extractions!\n", - "\n", - "If your model is exposed via an API, this will likely speed up your extraction flow.\n", - ":::" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "6ba766b5-8d6c-48e6-8d69-f391a66b65d2", - "metadata": {}, - "outputs": [], - "source": [ - "// Limit just to the first 3 chunks\n", - "// so the code can be re-run quickly\n", - "const firstFewTexts = splitDocs.slice(0, 3).map((doc) => doc.pageContent);\n", - "\n", - "const extractionChainParams = firstFewTexts.map((text) => {\n", - " return { text };\n", - "});\n", - "\n", - "const results = await extractionChain.batch(extractionChainParams, { maxConcurrency: 5 });" - ] - }, - { - "cell_type": "markdown", - "id": "67da8904-e927-406b-a439-2a16f6087ccf", - "metadata": {}, - "source": [ - "### Merge results\n", - "\n", - "After extracting data from across the chunks, we'll want to merge the extractions together." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "30b35897-4d94-44ad-80c6-446eff61b76b", - "metadata": {}, - "outputs": [ + }, { - "data": { - "text/plain": [ - "[\n", - " { year: \u001b[33m0\u001b[39m, description: \u001b[32m\"\"\u001b[39m, evidence: \u001b[32m\"\"\u001b[39m },\n", - " {\n", - " year: \u001b[33m1769\u001b[39m,\n", - " description: \u001b[32m\"French inventor Nicolas-Joseph Cugnot built the first steam-powered road vehicle.\"\u001b[39m,\n", - " evidence: \u001b[32m\"French inventor Nicolas-Joseph Cugnot built the first steam-powered road vehicle in 1769.\"\u001b[39m\n", - " },\n", - " {\n", - " year: \u001b[33m1808\u001b[39m,\n", - " description: \u001b[32m\"French-born Swiss inventor François Isaac de Rivaz designed and constructed the first internal combu\"\u001b[39m... 25 more characters,\n", - " evidence: \u001b[32m\"French-born Swiss inventor François Isaac de Rivaz designed and constructed the first internal combu\"\u001b[39m... 33 more characters\n", - " },\n", - " {\n", - " year: \u001b[33m1886\u001b[39m,\n", - " description: \u001b[32m\"German inventor Carl Benz patented his Benz Patent-Motorwagen, inventing the modern car—a practical,\"\u001b[39m... 40 more characters,\n", - " evidence: \u001b[32m\"The modern car—a practical, marketable automobile for everyday use—was invented in 1886, when German\"\u001b[39m... 56 more characters\n", - " },\n", - " {\n", - " year: \u001b[33m1908\u001b[39m,\n", - " description: \u001b[32m\"The 1908 Model T, an American car manufactured by the Ford Motor Company, became one of the first ca\"\u001b[39m... 28 more characters,\n", - " evidence: \u001b[32m\"One of the first cars affordable by the masses was the 1908 Model T, an American car manufactured by\"\u001b[39m... 24 more characters\n", - " }\n", - "]" + "cell_type": "markdown", + "id": "57969139-ad0a-487e-97d8-cb30e2af9742", + "metadata": {}, + "source": [ + "## Set up\n", + "\n", + "First, let's install some required dependencies:\n", + "\n", + "```{=mdx}\n", + "import IntegrationInstallTooltip from \"@mdx_components/integration_install_tooltip.mdx\";\n", + "import Npm2Yarn from \"@theme/Npm2Yarn\";\n", + "\n", + "\n", + "\n", + "\n", + " @langchain/openai zod cheerio\n", + "\n", + "```\n", + "\n", + "Next, we need some example data! Let's download an article about [cars from Wikipedia](https://en.wikipedia.org/wiki/Car) and load it as a LangChain `Document`." ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "const keyDevelopments = results.flatMap((result) => result.key_developments);\n", - "\n", - "keyDevelopments.slice(0, 20);" - ] - }, - { - "cell_type": "markdown", - "id": "48afd4a7-abcd-48b4-8ff1-6ca485f529e3", - "metadata": {}, - "source": [ - "## RAG based approach\n", - "\n", - "Another simple idea is to chunk up the text, but instead of extracting information from every chunk, just focus on the the most relevant chunks.\n", - "\n", - ":::{.callout-caution}\n", - "It can be difficult to identify which chunks are relevant.\n", - "\n", - "For example, in the `car` article we're using here, most of the article contains key development information. So by using\n", - "**RAG**, we'll likely be throwing out a lot of relevant information.\n", - "\n", - "We suggest experimenting with your use case and determining whether this approach works or not.\n", - ":::\n", - "\n", - "Here's a simple example that relies on an in-memory demo `MemoryVectorStore` vectorstore." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "aaf37c82-625b-4fa1-8e88-73303f08ac16", - "metadata": {}, - "outputs": [], - "source": [ - "import { MemoryVectorStore } from \"langchain/vectorstores/memory\";\n", - "import { OpenAIEmbeddings } from \"@langchain/openai\";\n", - "\n", - "// Only load the first 10 docs for speed in this demo use-case\n", - "const vectorstore = await MemoryVectorStore.fromDocuments(\n", - " splitDocs.slice(0, 10),\n", - " new OpenAIEmbeddings()\n", - ");\n", - "\n", - "// Only extract from top document\n", - "const retriever = vectorstore.asRetriever({ k: 1 });" - ] - }, - { - "cell_type": "markdown", - "id": "013ecad9-f80f-477c-b954-494b46a02a07", - "metadata": {}, - "source": [ - "In this case the RAG extractor is only looking at the top document." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "47aad00b-7013-4f7f-a1b0-02ef269093bf", - "metadata": {}, - "outputs": [], - "source": [ - "import { RunnableSequence } from \"@langchain/core/runnables\";\n", - "\n", - "const ragExtractor = RunnableSequence.from([\n", - " {\n", - " text: retriever.pipe((docs) => docs[0].pageContent)\n", - " },\n", - " extractionChain,\n", - "]);" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "68f2de01-0cd8-456e-a959-db236189d41b", - "metadata": {}, - "outputs": [], - "source": [ - "const results = await ragExtractor.invoke(\"Key developments associated with cars\");" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "56f434ea-1869-4192-914e-3ccf64e72f75", - "metadata": {}, - "outputs": [ + }, { - "data": { - "text/plain": [ - "[\n", - " {\n", - " year: \u001b[33m2020\u001b[39m,\n", - " description: \u001b[32m\"The lifetime of a car built in the 2020s is expected to be about 16 years, or about 2 million km (1.\"\u001b[39m... 33 more characters,\n", - " evidence: \u001b[32m\"The lifetime of a car built in the 2020s is expected to be about 16 years, or about 2 millionkm (1.2\"\u001b[39m... 31 more characters\n", - " },\n", - " {\n", - " year: \u001b[33m2030\u001b[39m,\n", - " description: \u001b[32m\"All fossil fuel vehicles will be banned in Amsterdam from 2030.\"\u001b[39m,\n", - " evidence: \u001b[32m\"all fossil fuel vehicles will be banned in Amsterdam from 2030.\"\u001b[39m\n", - " },\n", - " {\n", - " year: \u001b[33m2020\u001b[39m,\n", - " description: \u001b[32m\"In 2020, there were 56 million cars manufactured worldwide, down from 67 million the previous year.\"\u001b[39m,\n", - " evidence: \u001b[32m\"In 2020, there were 56 million cars manufactured worldwide, down from 67 million the previous year.\"\u001b[39m\n", - " }\n", - "]" + "cell_type": "code", + "execution_count": 1, + "id": "571aad22-2cec-4b9b-b656-5e4b81a1ec6c", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[Module: null prototype] {\n", + " contains: \u001b[36m[Function: contains]\u001b[39m,\n", + " default: [Function: initialize] {\n", + " contains: \u001b[36m[Function: contains]\u001b[39m,\n", + " html: \u001b[36m[Function: html]\u001b[39m,\n", + " merge: \u001b[36m[Function: merge]\u001b[39m,\n", + " parseHTML: \u001b[36m[Function: parseHTML]\u001b[39m,\n", + " root: \u001b[36m[Function: root]\u001b[39m,\n", + " text: \u001b[36m[Function: text]\u001b[39m,\n", + " xml: \u001b[36m[Function: xml]\u001b[39m,\n", + " load: \u001b[36m[Function: load]\u001b[39m,\n", + " _root: Document {\n", + " parent: \u001b[1mnull\u001b[22m,\n", + " prev: \u001b[1mnull\u001b[22m,\n", + " next: \u001b[1mnull\u001b[22m,\n", + " startIndex: \u001b[1mnull\u001b[22m,\n", + " endIndex: \u001b[1mnull\u001b[22m,\n", + " children: [],\n", + " type: \u001b[32m\"root\"\u001b[39m\n", + " },\n", + " _options: { xml: \u001b[33mfalse\u001b[39m, decodeEntities: \u001b[33mtrue\u001b[39m },\n", + " fn: Cheerio {}\n", + " },\n", + " html: \u001b[36m[Function: html]\u001b[39m,\n", + " load: \u001b[36m[Function: load]\u001b[39m,\n", + " merge: \u001b[36m[Function: merge]\u001b[39m,\n", + " parseHTML: \u001b[36m[Function: parseHTML]\u001b[39m,\n", + " root: \u001b[36m[Function: root]\u001b[39m,\n", + " text: \u001b[36m[Function: text]\u001b[39m,\n", + " xml: \u001b[36m[Function: xml]\u001b[39m\n", + "}" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import { CheerioWebBaseLoader } from \"langchain/document_loaders/web/cheerio\";\n", + "// Only required in a Deno notebook environment to load the peer dep.\n", + "import \"cheerio\";\n", + "\n", + "const loader = new CheerioWebBaseLoader(\n", + " \"https://en.wikipedia.org/wiki/Car\"\n", + ");\n", + "\n", + "const docs = await loader.load();" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "85656454-6d5d-4ff6-93ca-690791ac1ec4", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "\u001b[33m95865\u001b[39m" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "docs[0].pageContent.length;" + ] + }, + { + "cell_type": "markdown", + "id": "af3ffb8d-587a-4370-886a-e56e617bcb9c", + "metadata": {}, + "source": [ + "## Define the schema\n", + "\n", + "Here, we'll define schema to extract key developments from the text." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "a3b288ed-87a6-4af0-aac8-20921dc370d4", + "metadata": {}, + "outputs": [], + "source": [ + "import { z } from \"zod\";\n", + "import { ChatPromptTemplate } from \"@langchain/core/prompts\";\n", + "import { ChatOpenAI } from \"@langchain/openai\";\n", + "\n", + "const keyDevelopmentSchema = z.object({\n", + " year: z.number().describe(\"The year when there was an important historic development.\"),\n", + " description: z.string().describe(\"What happened in this year? What was the development?\"),\n", + " evidence: z.string().describe(\"Repeat verbatim the sentence(s) from which the year and description information were extracted\"),\n", + "}).describe(\"Information about a development in the history of cars.\");\n", + "\n", + "const extractionDataSchema = z.object({\n", + " key_developments: z.array(keyDevelopmentSchema),\n", + "}).describe(\"Extracted information about key developments in the history of cars\");\n", + "\n", + "const SYSTEM_PROMPT_TEMPLATE = [\n", + " \"You are an expert at identifying key historic development in text.\",\n", + " \"Only extract important historic developments. Extract nothing if no important information can be found in the text.\"\n", + "].join(\"\\n\");\n", + "\n", + "// Define a custom prompt to provide instructions and any additional context.\n", + "// 1) You can add examples into the prompt template to improve extraction quality\n", + "// 2) Introduce additional parameters to take context into account (e.g., include metadata\n", + "// about the document from which the text was extracted.)\n", + "const prompt = ChatPromptTemplate.fromMessages([\n", + " [\n", + " \"system\",\n", + " SYSTEM_PROMPT_TEMPLATE,\n", + " ],\n", + " // Keep on reading through this use case to see how to use examples to improve performance\n", + " // MessagesPlaceholder('examples'),\n", + " [\"human\", \"{text}\"],\n", + "]);\n", + "\n", + "// We will be using tool calling mode, which\n", + "// requires a tool calling capable model.\n", + "const llm = new ChatOpenAI({\n", + " model: \"gpt-4-0125-preview\",\n", + " temperature: 0,\n", + "});\n", + "\n", + "const extractionChain = prompt.pipe(llm.withStructuredOutput(extractionDataSchema));" + ] + }, + { + "cell_type": "markdown", + "id": "13aebafb-26b5-42b2-ae8e-9c05cd56e5c5", + "metadata": {}, + "source": [ + "## Brute force approach\n", + "\n", + "Split the documents into chunks such that each chunk fits into the context window of the LLMs." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "27b8a373-14b3-45ea-8bf5-9749122ad927", + "metadata": {}, + "outputs": [], + "source": [ + "import { TokenTextSplitter } from \"langchain/text_splitter\";\n", + "\n", + "const textSplitter = new TokenTextSplitter({\n", + " chunkSize: 2000,\n", + " chunkOverlap: 20,\n", + "});\n", + "\n", + "// Note that this method takes an array of docs\n", + "const splitDocs = await textSplitter.splitDocuments(docs);" + ] + }, + { + "cell_type": "markdown", + "id": "5b43d7e0-3c85-4d97-86c7-e8c984b60b0a", + "metadata": {}, + "source": [ + "Use the `.batch` method present on all runnables to run the extraction in **parallel** across each chunk! \n", + "\n", + ":::{.callout-tip}\n", + "You can often use `.batch()` to parallelize the extractions!\n", + "\n", + "If your model is exposed via an API, this will likely speed up your extraction flow.\n", + ":::" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "6ba766b5-8d6c-48e6-8d69-f391a66b65d2", + "metadata": {}, + "outputs": [], + "source": [ + "// Limit just to the first 3 chunks\n", + "// so the code can be re-run quickly\n", + "const firstFewTexts = splitDocs.slice(0, 3).map((doc) => doc.pageContent);\n", + "\n", + "const extractionChainParams = firstFewTexts.map((text) => {\n", + " return { text };\n", + "});\n", + "\n", + "const results = await extractionChain.batch(extractionChainParams, { maxConcurrency: 5 });" + ] + }, + { + "cell_type": "markdown", + "id": "67da8904-e927-406b-a439-2a16f6087ccf", + "metadata": {}, + "source": [ + "### Merge results\n", + "\n", + "After extracting data from across the chunks, we'll want to merge the extractions together." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "30b35897-4d94-44ad-80c6-446eff61b76b", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[\n", + " { year: \u001b[33m0\u001b[39m, description: \u001b[32m\"\"\u001b[39m, evidence: \u001b[32m\"\"\u001b[39m },\n", + " {\n", + " year: \u001b[33m1769\u001b[39m,\n", + " description: \u001b[32m\"French inventor Nicolas-Joseph Cugnot built the first steam-powered road vehicle.\"\u001b[39m,\n", + " evidence: \u001b[32m\"French inventor Nicolas-Joseph Cugnot built the first steam-powered road vehicle in 1769.\"\u001b[39m\n", + " },\n", + " {\n", + " year: \u001b[33m1808\u001b[39m,\n", + " description: \u001b[32m\"French-born Swiss inventor François Isaac de Rivaz designed and constructed the first internal combu\"\u001b[39m... 25 more characters,\n", + " evidence: \u001b[32m\"French-born Swiss inventor François Isaac de Rivaz designed and constructed the first internal combu\"\u001b[39m... 33 more characters\n", + " },\n", + " {\n", + " year: \u001b[33m1886\u001b[39m,\n", + " description: \u001b[32m\"German inventor Carl Benz patented his Benz Patent-Motorwagen, inventing the modern car—a practical,\"\u001b[39m... 40 more characters,\n", + " evidence: \u001b[32m\"The modern car—a practical, marketable automobile for everyday use—was invented in 1886, when German\"\u001b[39m... 56 more characters\n", + " },\n", + " {\n", + " year: \u001b[33m1908\u001b[39m,\n", + " description: \u001b[32m\"The 1908 Model T, an American car manufactured by the Ford Motor Company, became one of the first ca\"\u001b[39m... 28 more characters,\n", + " evidence: \u001b[32m\"One of the first cars affordable by the masses was the 1908 Model T, an American car manufactured by\"\u001b[39m... 24 more characters\n", + " }\n", + "]" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "const keyDevelopments = results.flatMap((result) => result.key_developments);\n", + "\n", + "keyDevelopments.slice(0, 20);" + ] + }, + { + "cell_type": "markdown", + "id": "48afd4a7-abcd-48b4-8ff1-6ca485f529e3", + "metadata": {}, + "source": [ + "## RAG based approach\n", + "\n", + "Another simple idea is to chunk up the text, but instead of extracting information from every chunk, just focus on the the most relevant chunks.\n", + "\n", + ":::{.callout-caution}\n", + "It can be difficult to identify which chunks are relevant.\n", + "\n", + "For example, in the `car` article we're using here, most of the article contains key development information. So by using\n", + "**RAG**, we'll likely be throwing out a lot of relevant information.\n", + "\n", + "We suggest experimenting with your use case and determining whether this approach works or not.\n", + ":::\n", + "\n", + "Here's a simple example that relies on an in-memory demo `MemoryVectorStore` vectorstore." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "aaf37c82-625b-4fa1-8e88-73303f08ac16", + "metadata": {}, + "outputs": [], + "source": [ + "import { MemoryVectorStore } from \"langchain/vectorstores/memory\";\n", + "import { OpenAIEmbeddings } from \"@langchain/openai\";\n", + "\n", + "// Only load the first 10 docs for speed in this demo use-case\n", + "const vectorstore = await MemoryVectorStore.fromDocuments(\n", + " splitDocs.slice(0, 10),\n", + " new OpenAIEmbeddings()\n", + ");\n", + "\n", + "// Only extract from top document\n", + "const retriever = vectorstore.asRetriever({ k: 1 });" + ] + }, + { + "cell_type": "markdown", + "id": "013ecad9-f80f-477c-b954-494b46a02a07", + "metadata": {}, + "source": [ + "In this case the RAG extractor is only looking at the top document." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "47aad00b-7013-4f7f-a1b0-02ef269093bf", + "metadata": {}, + "outputs": [], + "source": [ + "import { RunnableSequence } from \"@langchain/core/runnables\";\n", + "\n", + "const ragExtractor = RunnableSequence.from([\n", + " {\n", + " text: retriever.pipe((docs) => docs[0].pageContent)\n", + " },\n", + " extractionChain,\n", + "]);" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "68f2de01-0cd8-456e-a959-db236189d41b", + "metadata": {}, + "outputs": [], + "source": [ + "const results = await ragExtractor.invoke(\"Key developments associated with cars\");" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "56f434ea-1869-4192-914e-3ccf64e72f75", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[\n", + " {\n", + " year: \u001b[33m2020\u001b[39m,\n", + " description: \u001b[32m\"The lifetime of a car built in the 2020s is expected to be about 16 years, or about 2 million km (1.\"\u001b[39m... 33 more characters,\n", + " evidence: \u001b[32m\"The lifetime of a car built in the 2020s is expected to be about 16 years, or about 2 millionkm (1.2\"\u001b[39m... 31 more characters\n", + " },\n", + " {\n", + " year: \u001b[33m2030\u001b[39m,\n", + " description: \u001b[32m\"All fossil fuel vehicles will be banned in Amsterdam from 2030.\"\u001b[39m,\n", + " evidence: \u001b[32m\"all fossil fuel vehicles will be banned in Amsterdam from 2030.\"\u001b[39m\n", + " },\n", + " {\n", + " year: \u001b[33m2020\u001b[39m,\n", + " description: \u001b[32m\"In 2020, there were 56 million cars manufactured worldwide, down from 67 million the previous year.\"\u001b[39m,\n", + " evidence: \u001b[32m\"In 2020, there were 56 million cars manufactured worldwide, down from 67 million the previous year.\"\u001b[39m\n", + " }\n", + "]" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "results.key_developments;" + ] + }, + { + "cell_type": "markdown", + "id": "cf36e626-cf5d-4324-ba29-9bd602be9b97", + "metadata": {}, + "source": [ + "## Common issues\n", + "\n", + "Different methods have their own pros and cons related to cost, speed, and accuracy.\n", + "\n", + "Watch out for these issues:\n", + "\n", + "* Chunking content means that the LLM can fail to extract information if the information is spread across multiple chunks.\n", + "* Large chunk overlap may cause the same information to be extracted twice, so be prepared to de-duplicate!\n", + "* LLMs can make up data. If looking for a single fact across a large text and using a brute force approach, you may end up getting more made up data." ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" } - ], - "source": [ - "results.key_developments;" - ] - }, - { - "cell_type": "markdown", - "id": "cf36e626-cf5d-4324-ba29-9bd602be9b97", - "metadata": {}, - "source": [ - "## Common issues\n", - "\n", - "Different methods have their own pros and cons related to cost, speed, and accuracy.\n", - "\n", - "Watch out for these issues:\n", - "\n", - "* Chunking content means that the LLM can fail to extract information if the information is spread across multiple chunks.\n", - "* Large chunk overlap may cause the same information to be extracted twice, so be prepared to de-duplicate!\n", - "* LLMs can make up data. If looking for a single fact across a large text and using a brute force approach, you may end up getting more made up data." - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Deno", - "language": "typescript", - "name": "deno" + ], + "metadata": { + "kernelspec": { + "display_name": "Deno", + "language": "typescript", + "name": "deno" + }, + "language_info": { + "file_extension": ".ts", + "mimetype": "text/x.typescript", + "name": "typescript", + "nb_converter": "script", + "pygments_lexer": "typescript", + "version": "5.3.3" + } }, - "language_info": { - "file_extension": ".ts", - "mimetype": "text/x.typescript", - "name": "typescript", - "nb_converter": "script", - "pygments_lexer": "typescript", - "version": "5.3.3" - } - }, - "nbformat": 4, - "nbformat_minor": 5 + "nbformat": 4, + "nbformat_minor": 5 } diff --git a/docs/core_docs/docs/use_cases/extraction/how_to/parse.ipynb b/docs/core_docs/docs/use_cases/extraction/how_to/parse.ipynb index 5d260ac31884..9a2f7e417759 100644 --- a/docs/core_docs/docs/use_cases/extraction/how_to/parse.ipynb +++ b/docs/core_docs/docs/use_cases/extraction/how_to/parse.ipynb @@ -1,337 +1,337 @@ { - "cells": [ - { - "cell_type": "raw", - "id": "df29b30a-fd27-4e08-8269-870df5631f9e", - "metadata": {}, - "source": [ - "---\n", - "title: Without function calling\n", - "sidebar_position: 4\n", - "---" - ] - }, - { - "cell_type": "markdown", - "id": "ea37db49-d389-4291-be73-885d06c1fb7e", - "metadata": {}, - "source": [ - "LLMs that are able to follow prompt instructions well can be tasked with outputting information in a given format without using function calling.\n", - "\n", - "This approach relies on designing good prompts and then parsing the output of the LLMs to make them extract information well, though it lacks some of the guarantees provided by function calling or JSON mode.\n", - "\n", - "Here, we'll use Claude which is great at following instructions! See [here for more about Anthropic models](/docs/integrations/chat/anthropic).\n", - "\n", - "First, we'll install the integration package:\n", - "\n", - "```{=mdx}\n", - "import IntegrationInstallTooltip from \"@mdx_components/integration_install_tooltip.mdx\";\n", - "import Npm2Yarn from \"@theme/Npm2Yarn\";\n", - "\n", - "\n", - "\n", - "\n", - " @langchain/anthropic zod zod-to-json-schema\n", - "\n", - "```" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "d71b32de-a6b4-45ed-83a9-ba1925f9470c", - "metadata": {}, - "outputs": [], - "source": [ - "import { ChatAnthropic } from \"@langchain/anthropic\";\n", - "\n", - "const model = new ChatAnthropic({\n", - " modelName: \"claude-3-sonnet-20240229\",\n", - " temperature: 0,\n", - "})" - ] - }, - { - "cell_type": "markdown", - "id": "3e412374-3beb-4bbf-966b-400c1f66a258", - "metadata": {}, - "source": [ - ":::{.callout-tip}\n", - "All the same considerations for extraction quality apply for parsing approach. Review the [guidelines](/docs/use_cases/extraction/guidelines) for extraction quality.\n", - "\n", - "This tutorial is meant to be simple, but generally should really include reference examples to squeeze out performance!\n", - ":::" - ] - }, - { - "cell_type": "markdown", - "id": "abc1a945-0f80-4953-add4-cd572b6f2a51", - "metadata": {}, - "source": [ - "## Using StructuredOutputParser\n", - "\n", - "The following example uses the built-in [`StructuredOutputParser`](/docs/modules/model_io/output_parsers/types/structured) to parse the output of a chat model. We use the built-in prompt formatting instructions contained in the parser." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "497eb023-c043-443d-ac62-2d4ea85fe1b0", - "metadata": {}, - "outputs": [], - "source": [ - "import { z } from \"zod\";\n", - "import { StructuredOutputParser } from \"langchain/output_parsers\";\n", - "import { ChatPromptTemplate } from \"@langchain/core/prompts\";\n", - "\n", - "const personSchema = z.object({\n", - " name: z.optional(z.string()).describe(\"The name of the person\"),\n", - " hair_color: z.optional(z.string()).describe(\"The color of the person's hair, if known\"),\n", - " height_in_meters: z.optional(z.string()).describe(\"Height measured in meters\")\n", - "}).describe(\"Information about a person.\");\n", - "\n", - "const parser = StructuredOutputParser.fromZodSchema(personSchema);\n", - "\n", - "const prompt = ChatPromptTemplate.fromMessages([\n", - " [\"system\", \"Answer the user query. Wrap the output in `json` tags\\n{format_instructions}\"],\n", - " [\"human\", \"{query}\"],\n", - "]);\n", - "\n", - "const partialedPrompt = await prompt.partial({\n", - " format_instructions: parser.getFormatInstructions(),\n", - "});" - ] - }, - { - "cell_type": "markdown", - "id": "c31aa2c8-05a9-4a12-80c5-ea1250dea0ae", - "metadata": {}, - "source": [ - "Let's take a look at what information is sent to the model" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "20b99ffb-a114-49a9-a7be-154c525f8ada", - "metadata": {}, - "outputs": [], - "source": [ - "const query = \"Anna is 23 years old and she is 6 feet tall\";" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "4f3a66ce-de19-4571-9e54-67504ae3fba7", - "metadata": {}, - "outputs": [ + "cells": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "[\n", - " SystemMessage {\n", - " lc_serializable: true,\n", - " lc_kwargs: {\n", - " content: \"Answer the user query. Wrap the output in `json` tags\\n\" +\n", - " \"You must format your output as a JSON value th\"... 1444 more characters,\n", - " additional_kwargs: {}\n", - " },\n", - " lc_namespace: [ \"langchain_core\", \"messages\" ],\n", - " content: \"Answer the user query. Wrap the output in `json` tags\\n\" +\n", - " \"You must format your output as a JSON value th\"... 1444 more characters,\n", - " name: undefined,\n", - " additional_kwargs: {}\n", - " },\n", - " HumanMessage {\n", - " lc_serializable: true,\n", - " lc_kwargs: {\n", - " content: \"Anna is 23 years old and she is 6 feet tall\",\n", - " additional_kwargs: {}\n", - " },\n", - " lc_namespace: [ \"langchain_core\", \"messages\" ],\n", - " content: \"Anna is 23 years old and she is 6 feet tall\",\n", - " name: undefined,\n", - " additional_kwargs: {}\n", - " }\n", - "]\n" - ] - } - ], - "source": [ - "const promptValue = await partialedPrompt.invoke({ query });\n", - "\n", - "console.log(promptValue.toChatMessages());" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "3a46b5fd-9242-4b8c-a4e2-3f04fc19b3a4", - "metadata": {}, - "outputs": [ + "cell_type": "raw", + "id": "df29b30a-fd27-4e08-8269-870df5631f9e", + "metadata": {}, + "source": [ + "---\n", + "title: Without function calling\n", + "sidebar_position: 4\n", + "---" + ] + }, { - "data": { - "text/plain": [ - "{ name: \u001b[32m\"Anna\"\u001b[39m, hair_color: \u001b[32m\"\"\u001b[39m, height_in_meters: \u001b[32m\"1.83\"\u001b[39m }" + "cell_type": "markdown", + "id": "ea37db49-d389-4291-be73-885d06c1fb7e", + "metadata": {}, + "source": [ + "LLMs that are able to follow prompt instructions well can be tasked with outputting information in a given format without using function calling.\n", + "\n", + "This approach relies on designing good prompts and then parsing the output of the LLMs to make them extract information well, though it lacks some of the guarantees provided by function calling or JSON mode.\n", + "\n", + "Here, we'll use Claude which is great at following instructions! See [here for more about Anthropic models](/docs/integrations/chat/anthropic).\n", + "\n", + "First, we'll install the integration package:\n", + "\n", + "```{=mdx}\n", + "import IntegrationInstallTooltip from \"@mdx_components/integration_install_tooltip.mdx\";\n", + "import Npm2Yarn from \"@theme/Npm2Yarn\";\n", + "\n", + "\n", + "\n", + "\n", + " @langchain/anthropic zod zod-to-json-schema\n", + "\n", + "```" ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "const chain = partialedPrompt.pipe(model).pipe(parser);\n", - "\n", - "await chain.invoke({ query });" - ] - }, - { - "cell_type": "markdown", - "id": "815b3b87-3bc6-4b56-835e-c6b6703cef5d", - "metadata": {}, - "source": [ - "## Custom Parsing\n", - "\n", - "You can also create a custom prompt and parser with `LangChain` and `LCEL`.\n", - "\n", - "You can use a raw function to parse the output from the model.\n", - "\n", - "In the below example, we'll pass the schema into the prompt as JSON schema. For convenience, we'll declare our schema with Zod, then use the [`zod-to-json-schema`](https://github.com/StefanTerdell/zod-to-json-schema) utility to convert it to JSON schema." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "b1f11912-c1bb-4a2a-a482-79bf3996961f", - "metadata": {}, - "outputs": [], - "source": [ - "import { z } from \"zod\";\n", - "import { zodToJsonSchema } from \"zod-to-json-schema\";\n", - "\n", - "const personSchema = z.object({\n", - " name: z.optional(z.string()).describe(\"The name of the person\"),\n", - " hair_color: z.optional(z.string()).describe(\"The color of the person's hair, if known\"),\n", - " height_in_meters: z.optional(z.string()).describe(\"Height measured in meters\")\n", - "}).describe(\"Information about a person.\");\n", - "\n", - "const peopleSchema = z.object({\n", - " people: z.array(personSchema),\n", - "});\n", - "\n", - "const SYSTEM_PROMPT_TEMPLATE = [\n", - " \"Answer the user's query. You must return your answer as JSON that matches the given schema:\",\n", - " \"```json\\n{schema}\\n```.\",\n", - " \"Make sure to wrap the answer in ```json and ``` tags. Conform to the given schema exactly.\",\n", - "].join(\"\\n\");\n", - "\n", - "const prompt = ChatPromptTemplate.fromMessages([\n", - " [\"system\", SYSTEM_PROMPT_TEMPLATE],\n", - " [\"human\", \"{query}\"],\n", - "]);\n", - "\n", - "const extractJsonFromOutput = (message) => {\n", - " const text = message.content;\n", - "\n", - " // Define the regular expression pattern to match JSON blocks\n", - " const pattern = /```json\\s*((.|\\n)*?)\\s*```/gs;\n", - "\n", - " // Find all non-overlapping matches of the pattern in the string\n", - " const matches = pattern.exec(text);\n", - "\n", - " if (matches && matches[1]) {\n", - " try {\n", - " return JSON.parse(matches[1].trim());\n", - " } catch (error) {\n", - " throw new Error(`Failed to parse: ${matches[1]}`);\n", - " }\n", - " } else {\n", - " throw new Error(`No JSON found in: ${message}`);\n", - " }\n", - "}" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "cda52ef5-a354-47a7-9c25-45153c2389e2", - "metadata": {}, - "outputs": [ + }, { - "data": { - "text/plain": [ - "\u001b[32m\"System: Answer the user's query. You must return your answer as JSON that matches the given schema:\\n\"\u001b[39m... 170 more characters" + "cell_type": "code", + "execution_count": 1, + "id": "d71b32de-a6b4-45ed-83a9-ba1925f9470c", + "metadata": {}, + "outputs": [], + "source": [ + "import { ChatAnthropic } from \"@langchain/anthropic\";\n", + "\n", + "const model = new ChatAnthropic({\n", + " model: \"claude-3-sonnet-20240229\",\n", + " temperature: 0,\n", + "})" ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "const query = \"Anna is 23 years old and she is 6 feet tall\";\n", - "\n", - "const promptValue = await prompt.invoke({\n", - " schema: zodToJsonSchema(peopleSchema),\n", - " query\n", - "});\n", - "\n", - "promptValue.toString();" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "993dc61a-229d-4795-a746-0d17df86b5c0", - "metadata": {}, - "outputs": [ + }, + { + "cell_type": "markdown", + "id": "3e412374-3beb-4bbf-966b-400c1f66a258", + "metadata": {}, + "source": [ + ":::{.callout-tip}\n", + "All the same considerations for extraction quality apply for parsing approach. Review the [guidelines](/docs/use_cases/extraction/guidelines) for extraction quality.\n", + "\n", + "This tutorial is meant to be simple, but generally should really include reference examples to squeeze out performance!\n", + ":::" + ] + }, + { + "cell_type": "markdown", + "id": "abc1a945-0f80-4953-add4-cd572b6f2a51", + "metadata": {}, + "source": [ + "## Using StructuredOutputParser\n", + "\n", + "The following example uses the built-in [`StructuredOutputParser`](/docs/modules/model_io/output_parsers/types/structured) to parse the output of a chat model. We use the built-in prompt formatting instructions contained in the parser." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "497eb023-c043-443d-ac62-2d4ea85fe1b0", + "metadata": {}, + "outputs": [], + "source": [ + "import { z } from \"zod\";\n", + "import { StructuredOutputParser } from \"langchain/output_parsers\";\n", + "import { ChatPromptTemplate } from \"@langchain/core/prompts\";\n", + "\n", + "const personSchema = z.object({\n", + " name: z.optional(z.string()).describe(\"The name of the person\"),\n", + " hair_color: z.optional(z.string()).describe(\"The color of the person's hair, if known\"),\n", + " height_in_meters: z.optional(z.string()).describe(\"Height measured in meters\")\n", + "}).describe(\"Information about a person.\");\n", + "\n", + "const parser = StructuredOutputParser.fromZodSchema(personSchema);\n", + "\n", + "const prompt = ChatPromptTemplate.fromMessages([\n", + " [\"system\", \"Answer the user query. Wrap the output in `json` tags\\n{format_instructions}\"],\n", + " [\"human\", \"{query}\"],\n", + "]);\n", + "\n", + "const partialedPrompt = await prompt.partial({\n", + " format_instructions: parser.getFormatInstructions(),\n", + "});" + ] + }, + { + "cell_type": "markdown", + "id": "c31aa2c8-05a9-4a12-80c5-ea1250dea0ae", + "metadata": {}, + "source": [ + "Let's take a look at what information is sent to the model" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "20b99ffb-a114-49a9-a7be-154c525f8ada", + "metadata": {}, + "outputs": [], + "source": [ + "const query = \"Anna is 23 years old and she is 6 feet tall\";" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "4f3a66ce-de19-4571-9e54-67504ae3fba7", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[\n", + " SystemMessage {\n", + " lc_serializable: true,\n", + " lc_kwargs: {\n", + " content: \"Answer the user query. Wrap the output in `json` tags\\n\" +\n", + " \"You must format your output as a JSON value th\"... 1444 more characters,\n", + " additional_kwargs: {}\n", + " },\n", + " lc_namespace: [ \"langchain_core\", \"messages\" ],\n", + " content: \"Answer the user query. Wrap the output in `json` tags\\n\" +\n", + " \"You must format your output as a JSON value th\"... 1444 more characters,\n", + " name: undefined,\n", + " additional_kwargs: {}\n", + " },\n", + " HumanMessage {\n", + " lc_serializable: true,\n", + " lc_kwargs: {\n", + " content: \"Anna is 23 years old and she is 6 feet tall\",\n", + " additional_kwargs: {}\n", + " },\n", + " lc_namespace: [ \"langchain_core\", \"messages\" ],\n", + " content: \"Anna is 23 years old and she is 6 feet tall\",\n", + " name: undefined,\n", + " additional_kwargs: {}\n", + " }\n", + "]\n" + ] + } + ], + "source": [ + "const promptValue = await partialedPrompt.invoke({ query });\n", + "\n", + "console.log(promptValue.toChatMessages());" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "3a46b5fd-9242-4b8c-a4e2-3f04fc19b3a4", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{ name: \u001b[32m\"Anna\"\u001b[39m, hair_color: \u001b[32m\"\"\u001b[39m, height_in_meters: \u001b[32m\"1.83\"\u001b[39m }" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "const chain = partialedPrompt.pipe(model).pipe(parser);\n", + "\n", + "await chain.invoke({ query });" + ] + }, + { + "cell_type": "markdown", + "id": "815b3b87-3bc6-4b56-835e-c6b6703cef5d", + "metadata": {}, + "source": [ + "## Custom Parsing\n", + "\n", + "You can also create a custom prompt and parser with `LangChain` and `LCEL`.\n", + "\n", + "You can use a raw function to parse the output from the model.\n", + "\n", + "In the below example, we'll pass the schema into the prompt as JSON schema. For convenience, we'll declare our schema with Zod, then use the [`zod-to-json-schema`](https://github.com/StefanTerdell/zod-to-json-schema) utility to convert it to JSON schema." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "b1f11912-c1bb-4a2a-a482-79bf3996961f", + "metadata": {}, + "outputs": [], + "source": [ + "import { z } from \"zod\";\n", + "import { zodToJsonSchema } from \"zod-to-json-schema\";\n", + "\n", + "const personSchema = z.object({\n", + " name: z.optional(z.string()).describe(\"The name of the person\"),\n", + " hair_color: z.optional(z.string()).describe(\"The color of the person's hair, if known\"),\n", + " height_in_meters: z.optional(z.string()).describe(\"Height measured in meters\")\n", + "}).describe(\"Information about a person.\");\n", + "\n", + "const peopleSchema = z.object({\n", + " people: z.array(personSchema),\n", + "});\n", + "\n", + "const SYSTEM_PROMPT_TEMPLATE = [\n", + " \"Answer the user's query. You must return your answer as JSON that matches the given schema:\",\n", + " \"```json\\n{schema}\\n```.\",\n", + " \"Make sure to wrap the answer in ```json and ``` tags. Conform to the given schema exactly.\",\n", + "].join(\"\\n\");\n", + "\n", + "const prompt = ChatPromptTemplate.fromMessages([\n", + " [\"system\", SYSTEM_PROMPT_TEMPLATE],\n", + " [\"human\", \"{query}\"],\n", + "]);\n", + "\n", + "const extractJsonFromOutput = (message) => {\n", + " const text = message.content;\n", + "\n", + " // Define the regular expression pattern to match JSON blocks\n", + " const pattern = /```json\\s*((.|\\n)*?)\\s*```/gs;\n", + "\n", + " // Find all non-overlapping matches of the pattern in the string\n", + " const matches = pattern.exec(text);\n", + "\n", + " if (matches && matches[1]) {\n", + " try {\n", + " return JSON.parse(matches[1].trim());\n", + " } catch (error) {\n", + " throw new Error(`Failed to parse: ${matches[1]}`);\n", + " }\n", + " } else {\n", + " throw new Error(`No JSON found in: ${message}`);\n", + " }\n", + "}" + ] + }, { - "data": { - "text/plain": [ - "{ name: \u001b[32m\"Anna\"\u001b[39m, age: \u001b[33m23\u001b[39m, height: { feet: \u001b[33m6\u001b[39m, inches: \u001b[33m0\u001b[39m } }" + "cell_type": "code", + "execution_count": 7, + "id": "cda52ef5-a354-47a7-9c25-45153c2389e2", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "\u001b[32m\"System: Answer the user's query. You must return your answer as JSON that matches the given schema:\\n\"\u001b[39m... 170 more characters" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "const query = \"Anna is 23 years old and she is 6 feet tall\";\n", + "\n", + "const promptValue = await prompt.invoke({\n", + " schema: zodToJsonSchema(peopleSchema),\n", + " query\n", + "});\n", + "\n", + "promptValue.toString();" ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "993dc61a-229d-4795-a746-0d17df86b5c0", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{ name: \u001b[32m\"Anna\"\u001b[39m, age: \u001b[33m23\u001b[39m, height: { feet: \u001b[33m6\u001b[39m, inches: \u001b[33m0\u001b[39m } }" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "const chain = prompt.pipe(model).pipe(extractJsonFromOutput);\n", + "\n", + "await chain.invoke({\n", + " schema: zodToJsonSchema(peopleSchema),\n", + " query,\n", + "});" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fc6cd89f", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Deno", + "language": "typescript", + "name": "deno" + }, + "language_info": { + "file_extension": ".ts", + "mimetype": "text/x.typescript", + "name": "typescript", + "nb_converter": "script", + "pygments_lexer": "typescript", + "version": "5.3.3" } - ], - "source": [ - "const chain = prompt.pipe(model).pipe(extractJsonFromOutput);\n", - "\n", - "await chain.invoke({\n", - " schema: zodToJsonSchema(peopleSchema),\n", - " query,\n", - "});" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "fc6cd89f", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Deno", - "language": "typescript", - "name": "deno" }, - "language_info": { - "file_extension": ".ts", - "mimetype": "text/x.typescript", - "name": "typescript", - "nb_converter": "script", - "pygments_lexer": "typescript", - "version": "5.3.3" - } - }, - "nbformat": 4, - "nbformat_minor": 5 + "nbformat": 4, + "nbformat_minor": 5 } diff --git a/docs/core_docs/docs/use_cases/extraction/quickstart.ipynb b/docs/core_docs/docs/use_cases/extraction/quickstart.ipynb index a792e6f9e7ea..9024016623f0 100644 --- a/docs/core_docs/docs/use_cases/extraction/quickstart.ipynb +++ b/docs/core_docs/docs/use_cases/extraction/quickstart.ipynb @@ -1,310 +1,310 @@ { - "cells": [ - { - "cell_type": "raw", - "id": "df29b30a-fd27-4e08-8269-870df5631f9e", - "metadata": {}, - "source": [ - "---\n", - "title: Quickstart\n", - "sidebar_position: 0\n", - "---" - ] - }, - { - "cell_type": "markdown", - "id": "d28530a6-ddfd-49c0-85dc-b723551f6614", - "metadata": {}, - "source": [ - "In this quick start, we will use LLMs that are capable of **function/tool calling** to extract information from text.\n", - "\n", - ":::{.callout-important}\n", - "Extraction using **function/tool calling** only works with [models that support **function/tool calling**](/docs/modules/model_io/chat/function_calling).\n", - ":::" - ] - }, - { - "cell_type": "markdown", - "id": "4412def2-38e3-4bd0-bbf0-fb09ff9e5985", - "metadata": {}, - "source": [ - "## Set up\n", - "\n", - "We will use the new [withStructuredOutput()](/docs/integrations/chat/) method available on LLMs that are capable of **function/tool calling**, along with the popular and intuitive [Zod](https://zod.dev/) typing library.\n", - "\n", - "Select a model, install the dependencies for it and set your API keys as environment variables. We'll use Mistral as an example below:\n", - "\n", - "```{=mdx}\n", - "import IntegrationInstallTooltip from \"@mdx_components/integration_install_tooltip.mdx\";\n", - "import Npm2Yarn from \"@theme/Npm2Yarn\";\n", - "\n", - "\n", - "\n", - "\n", - " @langchain/mistralai zod\n", - "\n", - "```\n", - "\n", - "You can also see [this page](/docs/integrations/chat/) for an overview of which models support different kinds of structured output." - ] - }, - { - "cell_type": "markdown", - "id": "54d6b970-2ea3-4192-951e-21237212b359", - "metadata": {}, - "source": [ - "## The Schema\n", - "\n", - "First, we need to describe what information we want to extract from the text.\n", - "\n", - "For convenience, we'll use Zod to define an example schema to extract personal information. You may also use JSON schema directly if you wish." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "c141084c-fb94-4093-8d6a-81175d688e40", - "metadata": {}, - "outputs": [], - "source": [ - "import { z } from \"zod\";\n", - "\n", - "// Note that:\n", - "// 1. Each field is `optional` -- this allows the model to decline to extract it!\n", - "// 2. Each field uses the `.describe()` method -- this description is used by the LLM.\n", - "// Having a good description can help improve extraction results.\n", - "const personSchema = z.object({\n", - " name: z.optional(z.string()).describe(\"The name of the person\"),\n", - " hair_color: z.optional(z.string()).describe(\"The color of the person's hair, if known\"),\n", - " height_in_meters: z.optional(z.string()).describe(\"Height measured in meters\")\n", - "}).describe(\"Information about a person.\");" - ] - }, - { - "cell_type": "markdown", - "id": "f248dd54-e36d-435a-b154-394ab4ed6792", - "metadata": {}, - "source": [ - "There are two best practices when defining schema:\n", - "\n", - "1. Document the **attributes** and the **schema** itself: This information is sent to the LLM and is used to improve the quality of information extraction.\n", - "2. Do not force the LLM to make up information! Above we used `Optional` for the attributes allowing the LLM to output `None` if it doesn't know the answer.\n", - "\n", - ":::{.callout-important}\n", - "For best performance, document the schema well and make sure the model isn't force to return results if there's no information to be extracted in the text.\n", - ":::\n", - "\n", - "## The Extractor\n", - "\n", - "Let's create an information extractor using the schema we defined above." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "a5e490f6-35ad-455e-8ae4-2bae021583ff", - "metadata": {}, - "outputs": [], - "source": [ - "import { ChatPromptTemplate, MessagesPlaceholder } from \"@langchain/core/prompts\"\n", - "\n", - "// Define a custom prompt to provide instructions and any additional context.\n", - "// 1) You can add examples into the prompt template to improve extraction quality\n", - "// 2) Introduce additional parameters to take context into account (e.g., include metadata\n", - "// about the document from which the text was extracted.)\n", - "\n", - "const SYSTEM_PROMPT_TEMPLATE = `You are an expert extraction algorithm.\n", - "Only extract relevant information from the text.\n", - "If you do not know the value of an attribute asked to extract, you may omit the attribute's value.`;\n", - "\n", - "const prompt = ChatPromptTemplate.fromMessages([\n", - " [\"system\", SYSTEM_PROMPT_TEMPLATE],\n", - " // Please see the how-to about improving performance with\n", - " // reference examples.\n", - " // new MessagesPlaceholder(\"examples\"),\n", - " [\"human\", \"{text}\"]\n", - "]);" - ] - }, - { - "cell_type": "markdown", - "id": "832bf6a1-8e0c-4b6a-aa37-12fe9c42a6d9", - "metadata": {}, - "source": [ - "We need to use a model that supports function/tool calling.\n", - "\n", - "Please review [the chat model integration page](/docs/integrations/chat/) for list of some models that can be used with this API." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "04d846a6-d5cb-4009-ac19-61e3aac0177e", - "metadata": {}, - "outputs": [], - "source": [ - "import { ChatMistralAI } from \"@langchain/mistralai\";\n", - "\n", - "const llm = new ChatMistralAI({\n", - " modelName: \"mistral-large-latest\",\n", - " temperature: 0,\n", - "});\n", - "\n", - "const extractionRunnable = prompt.pipe(llm.withStructuredOutput(personSchema));" - ] - }, - { - "cell_type": "markdown", - "id": "23582c0b-00ed-403f-a10e-3aeabf921f12", - "metadata": {}, - "source": [ - "Let's test it out!" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "13165ac8-a1dc-44ce-a6ed-f52b577473e4", - "metadata": {}, - "outputs": [ + "cells": [ { - "data": { - "text/plain": [ - "{ name: \u001b[32m\"Alan Smith\"\u001b[39m, height_in_meters: \u001b[32m\"1.8288\"\u001b[39m, hair_color: \u001b[32m\"blond\"\u001b[39m }" + "cell_type": "raw", + "id": "df29b30a-fd27-4e08-8269-870df5631f9e", + "metadata": {}, + "source": [ + "---\n", + "title: Quickstart\n", + "sidebar_position: 0\n", + "---" ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "const text = \"Alan Smith is 6 feet tall and has blond hair.\"\n", - "\n", - "await extractionRunnable.invoke({ text });" - ] - }, - { - "cell_type": "markdown", - "id": "bd1c493d-f9dc-4236-8da9-50f6919f5710", - "metadata": {}, - "source": [ - ":::{.callout-important} \n", - "\n", - "Extraction is Generative 🤯\n", - "\n", - "LLMs are generative models, so they can do some pretty cool things like correctly extract the height of the person in meters\n", - "even though it was provided in feet!\n", - ":::" - ] - }, - { - "cell_type": "markdown", - "id": "28c5ef0c-b8d1-4e12-bd0e-e2528de87fcc", - "metadata": {}, - "source": [ - "## Multiple Entities\n", - "\n", - "In **most cases**, you should be extracting a list of entities rather than a single entity.\n", - "\n", - "This can be easily achieved with Zod by nesting models inside one another. Here's an example using the `personSchema` we defined above:" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "591a0c16-7a17-4883-91ee-0d6d2fdb265c", - "metadata": {}, - "outputs": [], - "source": [ - "const dataSchema = z.object({\n", - " people: z.array(personSchema)\n", - "});" - ] - }, - { - "cell_type": "markdown", - "id": "5f5cda33-fd7b-481e-956a-703f45e40e1d", - "metadata": {}, - "source": [ - ":::{.callout-important}\n", - "Extraction might not be perfect here. Please continue to see how to use **Reference Examples** to improve the quality of extraction, and see the **guidelines** section!\n", - ":::" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "cf7062cc-1d1d-4a37-9122-509d1b87f0a6", - "metadata": {}, - "outputs": [ + }, + { + "cell_type": "markdown", + "id": "d28530a6-ddfd-49c0-85dc-b723551f6614", + "metadata": {}, + "source": [ + "In this quick start, we will use LLMs that are capable of **function/tool calling** to extract information from text.\n", + "\n", + ":::{.callout-important}\n", + "Extraction using **function/tool calling** only works with [models that support **function/tool calling**](/docs/modules/model_io/chat/function_calling).\n", + ":::" + ] + }, + { + "cell_type": "markdown", + "id": "4412def2-38e3-4bd0-bbf0-fb09ff9e5985", + "metadata": {}, + "source": [ + "## Set up\n", + "\n", + "We will use the new [withStructuredOutput()](/docs/integrations/chat/) method available on LLMs that are capable of **function/tool calling**, along with the popular and intuitive [Zod](https://zod.dev/) typing library.\n", + "\n", + "Select a model, install the dependencies for it and set your API keys as environment variables. We'll use Mistral as an example below:\n", + "\n", + "```{=mdx}\n", + "import IntegrationInstallTooltip from \"@mdx_components/integration_install_tooltip.mdx\";\n", + "import Npm2Yarn from \"@theme/Npm2Yarn\";\n", + "\n", + "\n", + "\n", + "\n", + " @langchain/mistralai zod\n", + "\n", + "```\n", + "\n", + "You can also see [this page](/docs/integrations/chat/) for an overview of which models support different kinds of structured output." + ] + }, + { + "cell_type": "markdown", + "id": "54d6b970-2ea3-4192-951e-21237212b359", + "metadata": {}, + "source": [ + "## The Schema\n", + "\n", + "First, we need to describe what information we want to extract from the text.\n", + "\n", + "For convenience, we'll use Zod to define an example schema to extract personal information. You may also use JSON schema directly if you wish." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "c141084c-fb94-4093-8d6a-81175d688e40", + "metadata": {}, + "outputs": [], + "source": [ + "import { z } from \"zod\";\n", + "\n", + "// Note that:\n", + "// 1. Each field is `optional` -- this allows the model to decline to extract it!\n", + "// 2. Each field uses the `.describe()` method -- this description is used by the LLM.\n", + "// Having a good description can help improve extraction results.\n", + "const personSchema = z.object({\n", + " name: z.optional(z.string()).describe(\"The name of the person\"),\n", + " hair_color: z.optional(z.string()).describe(\"The color of the person's hair, if known\"),\n", + " height_in_meters: z.optional(z.string()).describe(\"Height measured in meters\")\n", + "}).describe(\"Information about a person.\");" + ] + }, + { + "cell_type": "markdown", + "id": "f248dd54-e36d-435a-b154-394ab4ed6792", + "metadata": {}, + "source": [ + "There are two best practices when defining schema:\n", + "\n", + "1. Document the **attributes** and the **schema** itself: This information is sent to the LLM and is used to improve the quality of information extraction.\n", + "2. Do not force the LLM to make up information! Above we used `Optional` for the attributes allowing the LLM to output `None` if it doesn't know the answer.\n", + "\n", + ":::{.callout-important}\n", + "For best performance, document the schema well and make sure the model isn't force to return results if there's no information to be extracted in the text.\n", + ":::\n", + "\n", + "## The Extractor\n", + "\n", + "Let's create an information extractor using the schema we defined above." + ] + }, { - "data": { - "text/plain": [ - "{\n", - " people: [\n", - " { name: \u001b[32m\"Jeff\"\u001b[39m, hair_color: \u001b[32m\"black\"\u001b[39m, height_in_meters: \u001b[32m\"1.8288\"\u001b[39m },\n", - " { name: \u001b[32m\"Anna\"\u001b[39m, hair_color: \u001b[32m\"black\"\u001b[39m }\n", - " ]\n", - "}" + "cell_type": "code", + "execution_count": 2, + "id": "a5e490f6-35ad-455e-8ae4-2bae021583ff", + "metadata": {}, + "outputs": [], + "source": [ + "import { ChatPromptTemplate, MessagesPlaceholder } from \"@langchain/core/prompts\"\n", + "\n", + "// Define a custom prompt to provide instructions and any additional context.\n", + "// 1) You can add examples into the prompt template to improve extraction quality\n", + "// 2) Introduce additional parameters to take context into account (e.g., include metadata\n", + "// about the document from which the text was extracted.)\n", + "\n", + "const SYSTEM_PROMPT_TEMPLATE = `You are an expert extraction algorithm.\n", + "Only extract relevant information from the text.\n", + "If you do not know the value of an attribute asked to extract, you may omit the attribute's value.`;\n", + "\n", + "const prompt = ChatPromptTemplate.fromMessages([\n", + " [\"system\", SYSTEM_PROMPT_TEMPLATE],\n", + " // Please see the how-to about improving performance with\n", + " // reference examples.\n", + " // new MessagesPlaceholder(\"examples\"),\n", + " [\"human\", \"{text}\"]\n", + "]);" + ] + }, + { + "cell_type": "markdown", + "id": "832bf6a1-8e0c-4b6a-aa37-12fe9c42a6d9", + "metadata": {}, + "source": [ + "We need to use a model that supports function/tool calling.\n", + "\n", + "Please review [the chat model integration page](/docs/integrations/chat/) for list of some models that can be used with this API." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "04d846a6-d5cb-4009-ac19-61e3aac0177e", + "metadata": {}, + "outputs": [], + "source": [ + "import { ChatMistralAI } from \"@langchain/mistralai\";\n", + "\n", + "const llm = new ChatMistralAI({\n", + " model: \"mistral-large-latest\",\n", + " temperature: 0,\n", + "});\n", + "\n", + "const extractionRunnable = prompt.pipe(llm.withStructuredOutput(personSchema));" + ] + }, + { + "cell_type": "markdown", + "id": "23582c0b-00ed-403f-a10e-3aeabf921f12", + "metadata": {}, + "source": [ + "Let's test it out!" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "13165ac8-a1dc-44ce-a6ed-f52b577473e4", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{ name: \u001b[32m\"Alan Smith\"\u001b[39m, height_in_meters: \u001b[32m\"1.8288\"\u001b[39m, hair_color: \u001b[32m\"blond\"\u001b[39m }" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "const text = \"Alan Smith is 6 feet tall and has blond hair.\"\n", + "\n", + "await extractionRunnable.invoke({ text });" + ] + }, + { + "cell_type": "markdown", + "id": "bd1c493d-f9dc-4236-8da9-50f6919f5710", + "metadata": {}, + "source": [ + ":::{.callout-important} \n", + "\n", + "Extraction is Generative 🤯\n", + "\n", + "LLMs are generative models, so they can do some pretty cool things like correctly extract the height of the person in meters\n", + "even though it was provided in feet!\n", + ":::" + ] + }, + { + "cell_type": "markdown", + "id": "28c5ef0c-b8d1-4e12-bd0e-e2528de87fcc", + "metadata": {}, + "source": [ + "## Multiple Entities\n", + "\n", + "In **most cases**, you should be extracting a list of entities rather than a single entity.\n", + "\n", + "This can be easily achieved with Zod by nesting models inside one another. Here's an example using the `personSchema` we defined above:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "591a0c16-7a17-4883-91ee-0d6d2fdb265c", + "metadata": {}, + "outputs": [], + "source": [ + "const dataSchema = z.object({\n", + " people: z.array(personSchema)\n", + "});" + ] + }, + { + "cell_type": "markdown", + "id": "5f5cda33-fd7b-481e-956a-703f45e40e1d", + "metadata": {}, + "source": [ + ":::{.callout-important}\n", + "Extraction might not be perfect here. Please continue to see how to use **Reference Examples** to improve the quality of extraction, and see the **guidelines** section!\n", + ":::" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "cf7062cc-1d1d-4a37-9122-509d1b87f0a6", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{\n", + " people: [\n", + " { name: \u001b[32m\"Jeff\"\u001b[39m, hair_color: \u001b[32m\"black\"\u001b[39m, height_in_meters: \u001b[32m\"1.8288\"\u001b[39m },\n", + " { name: \u001b[32m\"Anna\"\u001b[39m, hair_color: \u001b[32m\"black\"\u001b[39m }\n", + " ]\n", + "}" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "const extractionRunnable = prompt.pipe(llm.withStructuredOutput(dataSchema));\n", + "const text = \"My name is Jeff, my hair is black and i am 6 feet tall. Anna has the same color hair as me.\";\n", + "await extractionRunnable.invoke({ text });" + ] + }, + { + "cell_type": "markdown", + "id": "fba1d770-bf4d-4de4-9e4f-7384872ef0dc", + "metadata": {}, + "source": [ + ":::{.callout-tip}\n", + "When the schema accommodates the extraction of **multiple entities**, it also allows the model to extract **no entities** if no relevant information\n", + "is in the text by providing an empty list. \n", + "\n", + "This is usually a **good** thing! It allows specifying **required** attributes on an entity without necessarily forcing the model to detect this entity.\n", + ":::" + ] + }, + { + "cell_type": "markdown", + "id": "f07a7455-7de6-4a6f-9772-0477ef65e3dc", + "metadata": {}, + "source": [ + "## Next steps\n", + "\n", + "Now that you understand the basics of extraction with LangChain, you're ready to proceed to the rest of the how-to guide:\n", + "\n", + "- [Add Examples](/docs/use_cases/extraction/how_to/examples): Learn how to use **reference examples** to improve performance.\n", + "- [Handle Long Text](/docs/use_cases/extraction/how_to/handle_long_text): What should you do if the text does not fit into the context window of the LLM?\n", + "- [Handle Files](/docs/use_cases/extraction/how_to/handle_files): Examples of using LangChain document loaders and parsers to extract from files like PDFs.\n", + "- [Without function calling](/docs/use_cases/extraction/how_to/parse): Use a prompt based approach to extract with models that do not support **tool/function calling**.\n", + "- [Guidelines](/docs/use_cases/extraction/guidelines): Guidelines for getting good performance on extraction tasks." ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" } - ], - "source": [ - "const extractionRunnable = prompt.pipe(llm.withStructuredOutput(dataSchema));\n", - "const text = \"My name is Jeff, my hair is black and i am 6 feet tall. Anna has the same color hair as me.\";\n", - "await extractionRunnable.invoke({ text });" - ] - }, - { - "cell_type": "markdown", - "id": "fba1d770-bf4d-4de4-9e4f-7384872ef0dc", - "metadata": {}, - "source": [ - ":::{.callout-tip}\n", - "When the schema accommodates the extraction of **multiple entities**, it also allows the model to extract **no entities** if no relevant information\n", - "is in the text by providing an empty list. \n", - "\n", - "This is usually a **good** thing! It allows specifying **required** attributes on an entity without necessarily forcing the model to detect this entity.\n", - ":::" - ] - }, - { - "cell_type": "markdown", - "id": "f07a7455-7de6-4a6f-9772-0477ef65e3dc", - "metadata": {}, - "source": [ - "## Next steps\n", - "\n", - "Now that you understand the basics of extraction with LangChain, you're ready to proceed to the rest of the how-to guide:\n", - "\n", - "- [Add Examples](/docs/use_cases/extraction/how_to/examples): Learn how to use **reference examples** to improve performance.\n", - "- [Handle Long Text](/docs/use_cases/extraction/how_to/handle_long_text): What should you do if the text does not fit into the context window of the LLM?\n", - "- [Handle Files](/docs/use_cases/extraction/how_to/handle_files): Examples of using LangChain document loaders and parsers to extract from files like PDFs.\n", - "- [Without function calling](/docs/use_cases/extraction/how_to/parse): Use a prompt based approach to extract with models that do not support **tool/function calling**.\n", - "- [Guidelines](/docs/use_cases/extraction/guidelines): Guidelines for getting good performance on extraction tasks." - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Deno", - "language": "typescript", - "name": "deno" + ], + "metadata": { + "kernelspec": { + "display_name": "Deno", + "language": "typescript", + "name": "deno" + }, + "language_info": { + "file_extension": ".ts", + "mimetype": "text/x.typescript", + "name": "typescript", + "nb_converter": "script", + "pygments_lexer": "typescript", + "version": "5.3.3" + } }, - "language_info": { - "file_extension": ".ts", - "mimetype": "text/x.typescript", - "name": "typescript", - "nb_converter": "script", - "pygments_lexer": "typescript", - "version": "5.3.3" - } - }, - "nbformat": 4, - "nbformat_minor": 5 + "nbformat": 4, + "nbformat_minor": 5 } diff --git a/docs/core_docs/docs/use_cases/graph/mapping.ipynb b/docs/core_docs/docs/use_cases/graph/mapping.ipynb index 86e0a1a907c5..17359be1020e 100644 --- a/docs/core_docs/docs/use_cases/graph/mapping.ipynb +++ b/docs/core_docs/docs/use_cases/graph/mapping.ipynb @@ -1,348 +1,348 @@ { - "cells": [ - { - "cell_type": "raw", - "id": "5e61b0f2-15b9-4241-9ab5-ff0f3f732232", - "metadata": {}, - "source": [ - "---\n", - "sidebar_position: 1\n", - "---" - ] - }, - { - "cell_type": "markdown", - "id": "846ef4f4-ee38-4a42-a7d3-1a23826e4830", - "metadata": {}, - "source": [ - "# Mapping values to database\n", - "\n", - "In this guide we'll go over strategies to improve graph database query generation by mapping values from user inputs to database.\n", - "When using the built-in graph chains, the LLM is aware of the graph schema, but has no information about the values of properties stored in the database.\n", - "Therefore, we can introduce a new step in graph database QA system to accurately map values." - ] - }, - { - "cell_type": "markdown", - "id": "26677b08", - "metadata": {}, - "source": [ - "## Setup\n", - "#### Install dependencies\n", - "\n", - "```{=mdx}\n", - "import IntegrationInstallTooltip from \"@mdx_components/integration_install_tooltip.mdx\";\n", - "import Npm2Yarn from \"@theme/Npm2Yarn\";\n", - "\n", - "\n", - "\n", - "\n", - " langchain @langchain/community @langchain/openai neo4j-driver zod\n", - "\n", - "```\n", - "\n", - "#### Set environment variables\n", - "\n", - "We'll use OpenAI in this example:\n", - "\n", - "```env\n", - "OPENAI_API_KEY=your-api-key\n", - "\n", - "# Optional, use LangSmith for best-in-class observability\n", - "LANGSMITH_API_KEY=your-api-key\n", - "LANGCHAIN_TRACING_V2=true\n", - "```\n", - "\n", - "Next, we need to define Neo4j credentials.\n", - "Follow [these installation steps](https://neo4j.com/docs/operations-manual/current/installation/) to set up a Neo4j database.\n", - "\n", - "```env\n", - "NEO4J_URI=\"bolt://localhost:7687\"\n", - "NEO4J_USERNAME=\"neo4j\"\n", - "NEO4J_PASSWORD=\"password\"\n", - "```" - ] - }, - { - "cell_type": "markdown", - "id": "50fa4510-29b7-49b6-8496-5e86f694e81f", - "metadata": {}, - "source": [ - "The below example will create a connection with a Neo4j database and will populate it with example data about movies and their actors." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "4ee9ef7a-eef9-4289-b9fd-8fbc31041688", - "metadata": {}, - "outputs": [ + "cells": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "Schema refreshed successfully.\n" - ] + "cell_type": "raw", + "id": "5e61b0f2-15b9-4241-9ab5-ff0f3f732232", + "metadata": {}, + "source": [ + "---\n", + "sidebar_position: 1\n", + "---" + ] }, { - "data": { - "text/plain": [ - "[]" + "cell_type": "markdown", + "id": "846ef4f4-ee38-4a42-a7d3-1a23826e4830", + "metadata": {}, + "source": [ + "# Mapping values to database\n", + "\n", + "In this guide we'll go over strategies to improve graph database query generation by mapping values from user inputs to database.\n", + "When using the built-in graph chains, the LLM is aware of the graph schema, but has no information about the values of properties stored in the database.\n", + "Therefore, we can introduce a new step in graph database QA system to accurately map values." ] - }, - "execution_count": 1, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import \"neo4j-driver\";\n", - "import { Neo4jGraph } from \"@langchain/community/graphs/neo4j_graph\";\n", - "\n", - "const url = Deno.env.get(\"NEO4J_URI\");\n", - "const username = Deno.env.get(\"NEO4J_USER\");\n", - "const password = Deno.env.get(\"NEO4J_PASSWORD\");\n", - "const graph = await Neo4jGraph.initialize({ url, username, password });\n", - "\n", - "// Import movie information\n", - "const moviesQuery = `LOAD CSV WITH HEADERS FROM \n", - "'https://raw.githubusercontent.com/tomasonjo/blog-datasets/main/movies/movies_small.csv'\n", - "AS row\n", - "MERGE (m:Movie {id:row.movieId})\n", - "SET m.released = date(row.released),\n", - " m.title = row.title,\n", - " m.imdbRating = toFloat(row.imdbRating)\n", - "FOREACH (director in split(row.director, '|') | \n", - " MERGE (p:Person {name:trim(director)})\n", - " MERGE (p)-[:DIRECTED]->(m))\n", - "FOREACH (actor in split(row.actors, '|') | \n", - " MERGE (p:Person {name:trim(actor)})\n", - " MERGE (p)-[:ACTED_IN]->(m))\n", - "FOREACH (genre in split(row.genres, '|') | \n", - " MERGE (g:Genre {name:trim(genre)})\n", - " MERGE (m)-[:IN_GENRE]->(g))`\n", - "\n", - "await graph.query(moviesQuery);" - ] - }, - { - "cell_type": "markdown", - "id": "0cb0ea30-ca55-4f35-aad6-beb57453de66", - "metadata": {}, - "source": [ - "## Detecting entities in the user input\n", - "We have to extract the types of entities/values we want to map to a graph database. In this example, we are dealing with a movie graph, so we can map movies and people to the database." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "id": "e1a19424-6046-40c2-81d1-f3b88193a293", - "metadata": {}, - "outputs": [], - "source": [ - "import { createStructuredOutputRunnable } from \"langchain/chains/openai_functions\";\n", - "import { ChatPromptTemplate } from \"@langchain/core/prompts\";\n", - "import { ChatOpenAI } from \"@langchain/openai\";\n", - "import { z } from \"zod\";\n", - "\n", - "const llm = new ChatOpenAI({ modelName: \"gpt-3.5-turbo\", temperature: 0 })\n", - "\n", - "const entities = z.object({\n", - " names: z.array(z.string()).describe(\"All the person or movies appearing in the text\"),\n", - "}).describe(\"Identifying information about entities.\");\n", - "\n", - "\n", - "const prompt = ChatPromptTemplate.fromMessages(\n", - " [\n", - " [\n", - " \"system\",\n", - " \"You are extracting person and movies from the text.\"\n", - " ],\n", - " [\n", - " \"human\",\n", - " \"Use the given format to extract information from the following\\ninput: {question}\"\n", - " ]\n", - " ]\n", - ")\n", - "\n", - "\n", - "const entityChain = createStructuredOutputRunnable({\n", - " outputSchema: entities,\n", - " prompt,\n", - " llm,\n", - " });" - ] - }, - { - "cell_type": "markdown", - "id": "9c14084c-37a7-4a9c-a026-74e12961c781", - "metadata": {}, - "source": [ - "We can test the entity extraction chain." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "bbfe0d8f-982e-46e6-88fb-8a4f0d850b07", - "metadata": {}, - "outputs": [ + }, { - "data": { - "text/plain": [ - "{ names: [ \u001b[32m\"Casino\"\u001b[39m ] }" + "cell_type": "markdown", + "id": "26677b08", + "metadata": {}, + "source": [ + "## Setup\n", + "#### Install dependencies\n", + "\n", + "```{=mdx}\n", + "import IntegrationInstallTooltip from \"@mdx_components/integration_install_tooltip.mdx\";\n", + "import Npm2Yarn from \"@theme/Npm2Yarn\";\n", + "\n", + "\n", + "\n", + "\n", + " langchain @langchain/community @langchain/openai neo4j-driver zod\n", + "\n", + "```\n", + "\n", + "#### Set environment variables\n", + "\n", + "We'll use OpenAI in this example:\n", + "\n", + "```env\n", + "OPENAI_API_KEY=your-api-key\n", + "\n", + "# Optional, use LangSmith for best-in-class observability\n", + "LANGSMITH_API_KEY=your-api-key\n", + "LANGCHAIN_TRACING_V2=true\n", + "```\n", + "\n", + "Next, we need to define Neo4j credentials.\n", + "Follow [these installation steps](https://neo4j.com/docs/operations-manual/current/installation/) to set up a Neo4j database.\n", + "\n", + "```env\n", + "NEO4J_URI=\"bolt://localhost:7687\"\n", + "NEO4J_USERNAME=\"neo4j\"\n", + "NEO4J_PASSWORD=\"password\"\n", + "```" ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "const entities = await entityChain.invoke({ question: \"Who played in Casino movie?\" })\n", - "entities" - ] - }, - { - "cell_type": "markdown", - "id": "a8afbf13-05d0-4383-8050-f88b8c2f6fab", - "metadata": {}, - "source": [ - "We will utilize a simple `CONTAINS` clause to match entities to database. In practice, you might want to use a fuzzy search or a fulltext index to allow for minor misspellings." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "id": "6f92929f-74fb-4db2-b7e1-eb1e9d386a67", - "metadata": {}, - "outputs": [ + }, { - "data": { - "text/plain": [ - "\u001b[32m\"Casino maps to Casino Movie in database\\n\"\u001b[39m" + "cell_type": "markdown", + "id": "50fa4510-29b7-49b6-8496-5e86f694e81f", + "metadata": {}, + "source": [ + "The below example will create a connection with a Neo4j database and will populate it with example data about movies and their actors." ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "const matchQuery = `\n", - "MATCH (p:Person|Movie)\n", - "WHERE p.name CONTAINS $value OR p.title CONTAINS $value\n", - "RETURN coalesce(p.name, p.title) AS result, labels(p)[0] AS type\n", - "LIMIT 1`\n", - "\n", - "const matchToDatabase = async (values) => {\n", - " let result = \"\"\n", - " for (const entity of values.names) {\n", - " const response = await graph.query(matchQuery, {\n", - " value: entity\n", - " })\n", - " if (response.length > 0) {\n", - " result += `${entity} maps to ${response[0][\"result\"]} ${response[0][\"type\"]} in database\\n`\n", - " }\n", - " }\n", - " return result\n", - "}\n", - "\n", - "await matchToDatabase(entities)" - ] - }, - { - "cell_type": "markdown", - "id": "f66c6756-6efb-4b1e-9b5d-87ed914a5212", - "metadata": {}, - "source": [ - "## Custom Cypher generating chain\n", - "\n", - "We need to define a custom Cypher prompt that takes the entity mapping information along with the schema and the user question to construct a Cypher statement.\n", - "We will be using the LangChain expression language to accomplish that." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "id": "8ef3e21d-f1c2-45e2-9511-4920d1cf6e7e", - "metadata": {}, - "outputs": [], - "source": [ - "import { StringOutputParser } from \"@langchain/core/output_parsers\";\n", - "import { RunnablePassthrough, RunnableSequence } from \"@langchain/core/runnables\";\n", - "\n", - "// Generate Cypher statement based on natural language input\n", - "const cypherTemplate = `Based on the Neo4j graph schema below, write a Cypher query that would answer the user's question:\n", - "{schema}\n", - "Entities in the question map to the following database values:\n", - "{entities_list}\n", - "Question: {question}\n", - "Cypher query:`\n", - "\n", - "const cypherPrompt = ChatPromptTemplate.fromMessages(\n", - " [\n", - " [\n", - " \"system\",\n", - " \"Given an input question, convert it to a Cypher query. No pre-amble.\",\n", - " ],\n", - " [\"human\", cypherTemplate]\n", - " ]\n", - ")\n", - "\n", - "const llmWithStop = llm.bind({ stop: [\"\\nCypherResult:\"] })\n", - "\n", - "const cypherResponse = RunnableSequence.from([\n", - " RunnablePassthrough.assign({ names: entityChain }),\n", - " RunnablePassthrough.assign({\n", - " entities_list: async (x) => matchToDatabase(x.names),\n", - " schema: async (_) => graph.getSchema(),\n", - " }),\n", - " cypherPrompt,\n", - " llmWithStop,\n", - " new StringOutputParser(),\n", - "])" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "id": "1f0011e3-9660-4975-af2a-486b1bc3b954", - "metadata": {}, - "outputs": [ + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "4ee9ef7a-eef9-4289-b9fd-8fbc31041688", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Schema refreshed successfully.\n" + ] + }, + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import \"neo4j-driver\";\n", + "import { Neo4jGraph } from \"@langchain/community/graphs/neo4j_graph\";\n", + "\n", + "const url = Deno.env.get(\"NEO4J_URI\");\n", + "const username = Deno.env.get(\"NEO4J_USER\");\n", + "const password = Deno.env.get(\"NEO4J_PASSWORD\");\n", + "const graph = await Neo4jGraph.initialize({ url, username, password });\n", + "\n", + "// Import movie information\n", + "const moviesQuery = `LOAD CSV WITH HEADERS FROM \n", + "'https://raw.githubusercontent.com/tomasonjo/blog-datasets/main/movies/movies_small.csv'\n", + "AS row\n", + "MERGE (m:Movie {id:row.movieId})\n", + "SET m.released = date(row.released),\n", + " m.title = row.title,\n", + " m.imdbRating = toFloat(row.imdbRating)\n", + "FOREACH (director in split(row.director, '|') | \n", + " MERGE (p:Person {name:trim(director)})\n", + " MERGE (p)-[:DIRECTED]->(m))\n", + "FOREACH (actor in split(row.actors, '|') | \n", + " MERGE (p:Person {name:trim(actor)})\n", + " MERGE (p)-[:ACTED_IN]->(m))\n", + "FOREACH (genre in split(row.genres, '|') | \n", + " MERGE (g:Genre {name:trim(genre)})\n", + " MERGE (m)-[:IN_GENRE]->(g))`\n", + "\n", + "await graph.query(moviesQuery);" + ] + }, { - "data": { - "text/plain": [ - "\u001b[32m'MATCH (:Movie {title: \"Casino\"})<-[:ACTED_IN]-(actor)\\nRETURN actor.name'\u001b[39m" + "cell_type": "markdown", + "id": "0cb0ea30-ca55-4f35-aad6-beb57453de66", + "metadata": {}, + "source": [ + "## Detecting entities in the user input\n", + "We have to extract the types of entities/values we want to map to a graph database. In this example, we are dealing with a movie graph, so we can map movies and people to the database." ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "e1a19424-6046-40c2-81d1-f3b88193a293", + "metadata": {}, + "outputs": [], + "source": [ + "import { createStructuredOutputRunnable } from \"langchain/chains/openai_functions\";\n", + "import { ChatPromptTemplate } from \"@langchain/core/prompts\";\n", + "import { ChatOpenAI } from \"@langchain/openai\";\n", + "import { z } from \"zod\";\n", + "\n", + "const llm = new ChatOpenAI({ model: \"gpt-3.5-turbo\", temperature: 0 })\n", + "\n", + "const entities = z.object({\n", + " names: z.array(z.string()).describe(\"All the person or movies appearing in the text\"),\n", + "}).describe(\"Identifying information about entities.\");\n", + "\n", + "\n", + "const prompt = ChatPromptTemplate.fromMessages(\n", + " [\n", + " [\n", + " \"system\",\n", + " \"You are extracting person and movies from the text.\"\n", + " ],\n", + " [\n", + " \"human\",\n", + " \"Use the given format to extract information from the following\\ninput: {question}\"\n", + " ]\n", + " ]\n", + ")\n", + "\n", + "\n", + "const entityChain = createStructuredOutputRunnable({\n", + " outputSchema: entities,\n", + " prompt,\n", + " llm,\n", + " });" + ] + }, + { + "cell_type": "markdown", + "id": "9c14084c-37a7-4a9c-a026-74e12961c781", + "metadata": {}, + "source": [ + "We can test the entity extraction chain." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "bbfe0d8f-982e-46e6-88fb-8a4f0d850b07", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{ names: [ \u001b[32m\"Casino\"\u001b[39m ] }" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "const entities = await entityChain.invoke({ question: \"Who played in Casino movie?\" })\n", + "entities" + ] + }, + { + "cell_type": "markdown", + "id": "a8afbf13-05d0-4383-8050-f88b8c2f6fab", + "metadata": {}, + "source": [ + "We will utilize a simple `CONTAINS` clause to match entities to database. In practice, you might want to use a fuzzy search or a fulltext index to allow for minor misspellings." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "6f92929f-74fb-4db2-b7e1-eb1e9d386a67", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "\u001b[32m\"Casino maps to Casino Movie in database\\n\"\u001b[39m" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "const matchQuery = `\n", + "MATCH (p:Person|Movie)\n", + "WHERE p.name CONTAINS $value OR p.title CONTAINS $value\n", + "RETURN coalesce(p.name, p.title) AS result, labels(p)[0] AS type\n", + "LIMIT 1`\n", + "\n", + "const matchToDatabase = async (values) => {\n", + " let result = \"\"\n", + " for (const entity of values.names) {\n", + " const response = await graph.query(matchQuery, {\n", + " value: entity\n", + " })\n", + " if (response.length > 0) {\n", + " result += `${entity} maps to ${response[0][\"result\"]} ${response[0][\"type\"]} in database\\n`\n", + " }\n", + " }\n", + " return result\n", + "}\n", + "\n", + "await matchToDatabase(entities)" + ] + }, + { + "cell_type": "markdown", + "id": "f66c6756-6efb-4b1e-9b5d-87ed914a5212", + "metadata": {}, + "source": [ + "## Custom Cypher generating chain\n", + "\n", + "We need to define a custom Cypher prompt that takes the entity mapping information along with the schema and the user question to construct a Cypher statement.\n", + "We will be using the LangChain expression language to accomplish that." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "8ef3e21d-f1c2-45e2-9511-4920d1cf6e7e", + "metadata": {}, + "outputs": [], + "source": [ + "import { StringOutputParser } from \"@langchain/core/output_parsers\";\n", + "import { RunnablePassthrough, RunnableSequence } from \"@langchain/core/runnables\";\n", + "\n", + "// Generate Cypher statement based on natural language input\n", + "const cypherTemplate = `Based on the Neo4j graph schema below, write a Cypher query that would answer the user's question:\n", + "{schema}\n", + "Entities in the question map to the following database values:\n", + "{entities_list}\n", + "Question: {question}\n", + "Cypher query:`\n", + "\n", + "const cypherPrompt = ChatPromptTemplate.fromMessages(\n", + " [\n", + " [\n", + " \"system\",\n", + " \"Given an input question, convert it to a Cypher query. No pre-amble.\",\n", + " ],\n", + " [\"human\", cypherTemplate]\n", + " ]\n", + ")\n", + "\n", + "const llmWithStop = llm.bind({ stop: [\"\\nCypherResult:\"] })\n", + "\n", + "const cypherResponse = RunnableSequence.from([\n", + " RunnablePassthrough.assign({ names: entityChain }),\n", + " RunnablePassthrough.assign({\n", + " entities_list: async (x) => matchToDatabase(x.names),\n", + " schema: async (_) => graph.getSchema(),\n", + " }),\n", + " cypherPrompt,\n", + " llmWithStop,\n", + " new StringOutputParser(),\n", + "])" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "1f0011e3-9660-4975-af2a-486b1bc3b954", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "\u001b[32m'MATCH (:Movie {title: \"Casino\"})<-[:ACTED_IN]-(actor)\\nRETURN actor.name'\u001b[39m" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "const cypher = await cypherResponse.invoke({\"question\": \"Who played in Casino movie?\"})\n", + "cypher" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Deno", + "language": "typescript", + "name": "deno" + }, + "language_info": { + "file_extension": ".ts", + "mimetype": "text/x.typescript", + "name": "typescript", + "nb_converter": "script", + "pygments_lexer": "typescript", + "version": "5.3.3" } - ], - "source": [ - "const cypher = await cypherResponse.invoke({\"question\": \"Who played in Casino movie?\"})\n", - "cypher" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Deno", - "language": "typescript", - "name": "deno" }, - "language_info": { - "file_extension": ".ts", - "mimetype": "text/x.typescript", - "name": "typescript", - "nb_converter": "script", - "pygments_lexer": "typescript", - "version": "5.3.3" - } - }, - "nbformat": 4, - "nbformat_minor": 5 + "nbformat": 4, + "nbformat_minor": 5 } diff --git a/docs/core_docs/docs/use_cases/graph/prompting.ipynb b/docs/core_docs/docs/use_cases/graph/prompting.ipynb index ff3c6d5c61d0..a5eec78d6fd1 100644 --- a/docs/core_docs/docs/use_cases/graph/prompting.ipynb +++ b/docs/core_docs/docs/use_cases/graph/prompting.ipynb @@ -1,483 +1,483 @@ { - "cells": [ - { - "cell_type": "raw", - "metadata": {}, - "source": [ - "---\n", - "sidebar_position: 2\n", - "---" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Prompting strategies\n", - "\n", - "In this guide we’ll go over prompting strategies to improve graph database query generation. We’ll largely focus on methods for getting relevant database-specific information in your prompt." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Setup\n", - "#### Install dependencies\n", - "\n", - "```{=mdx}\n", - "import IntegrationInstallTooltip from \"@mdx_components/integration_install_tooltip.mdx\";\n", - "import Npm2Yarn from \"@theme/Npm2Yarn\";\n", - "\n", - "\n", - "\n", - "\n", - " langchain @langchain/community @langchain/openai neo4j-driver\n", - "\n", - "```\n", - "\n", - "#### Set environment variables\n", - "\n", - "We'll use OpenAI in this example:\n", - "\n", - "```env\n", - "OPENAI_API_KEY=your-api-key\n", - "\n", - "# Optional, use LangSmith for best-in-class observability\n", - "LANGSMITH_API_KEY=your-api-key\n", - "LANGCHAIN_TRACING_V2=true\n", - "```\n", - "\n", - "Next, we need to define Neo4j credentials.\n", - "Follow [these installation steps](https://neo4j.com/docs/operations-manual/current/installation/) to set up a Neo4j database.\n", - "\n", - "```env\n", - "NEO4J_URI=\"bolt://localhost:7687\"\n", - "NEO4J_USERNAME=\"neo4j\"\n", - "NEO4J_PASSWORD=\"password\"\n", - "```" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The below example will create a connection with a Neo4j database and will populate it with example data about movies and their actors." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "const url = Deno.env.get(\"NEO4J_URI\");\n", - "const username = Deno.env.get(\"NEO4J_USER\");\n", - "const password = Deno.env.get(\"NEO4J_PASSWORD\");" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ + "cells": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "Schema refreshed successfully.\n" - ] + "cell_type": "raw", + "metadata": {}, + "source": [ + "---\n", + "sidebar_position: 2\n", + "---" + ] }, { - "data": { - "text/plain": [ - "[]" + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Prompting strategies\n", + "\n", + "In this guide we’ll go over prompting strategies to improve graph database query generation. We’ll largely focus on methods for getting relevant database-specific information in your prompt." ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import \"neo4j-driver\";\n", - "import { Neo4jGraph } from \"@langchain/community/graphs/neo4j_graph\";\n", - "\n", - "const graph = await Neo4jGraph.initialize({ url, username, password });\n", - "\n", - "// Import movie information\n", - "const moviesQuery = `LOAD CSV WITH HEADERS FROM \n", - "'https://raw.githubusercontent.com/tomasonjo/blog-datasets/main/movies/movies_small.csv'\n", - "AS row\n", - "MERGE (m:Movie {id:row.movieId})\n", - "SET m.released = date(row.released),\n", - " m.title = row.title,\n", - " m.imdbRating = toFloat(row.imdbRating)\n", - "FOREACH (director in split(row.director, '|') | \n", - " MERGE (p:Person {name:trim(director)})\n", - " MERGE (p)-[:DIRECTED]->(m))\n", - "FOREACH (actor in split(row.actors, '|') | \n", - " MERGE (p:Person {name:trim(actor)})\n", - " MERGE (p)-[:ACTED_IN]->(m))\n", - "FOREACH (genre in split(row.genres, '|') | \n", - " MERGE (g:Genre {name:trim(genre)})\n", - " MERGE (m)-[:IN_GENRE]->(g))`\n", - "\n", - "await graph.query(moviesQuery);" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Filtering graph schema\n", - "\n", - "At times, you may need to focus on a specific subset of the graph schema while generating Cypher statements.\n", - "Let's say we are dealing with the following graph schema:" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ + }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "Node properties are the following:\n", - "Movie {imdbRating: FLOAT, id: STRING, released: DATE, title: STRING}, Person {name: STRING}, Genre {name: STRING}, Chunk {embedding: LIST, id: STRING, text: STRING}\n", - "Relationship properties are the following:\n", - "\n", - "The relationships are the following:\n", - "(:Movie)-[:IN_GENRE]->(:Genre), (:Person)-[:DIRECTED]->(:Movie), (:Person)-[:ACTED_IN]->(:Movie)\n" - ] - } - ], - "source": [ - "await graph.refreshSchema()\n", - "console.log(graph.schema)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Few-shot examples\n", - "\n", - "Including examples of natural language questions being converted to valid Cypher queries against our database in the prompt will often improve model performance, especially for complex queries.\n", - "\n", - "Let's say we have the following examples:" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "const examples = [\n", - " {\n", - " \"question\": \"How many artists are there?\",\n", - " \"query\": \"MATCH (a:Person)-[:ACTED_IN]->(:Movie) RETURN count(DISTINCT a)\",\n", - " },\n", - " {\n", - " \"question\": \"Which actors played in the movie Casino?\",\n", - " \"query\": \"MATCH (m:Movie {{title: 'Casino'}})<-[:ACTED_IN]-(a) RETURN a.name\",\n", - " },\n", - " {\n", - " \"question\": \"How many movies has Tom Hanks acted in?\",\n", - " \"query\": \"MATCH (a:Person {{name: 'Tom Hanks'}})-[:ACTED_IN]->(m:Movie) RETURN count(m)\",\n", - " },\n", - " {\n", - " \"question\": \"List all the genres of the movie Schindler's List\",\n", - " \"query\": \"MATCH (m:Movie {{title: 'Schindler\\\\'s List'}})-[:IN_GENRE]->(g:Genre) RETURN g.name\",\n", - " },\n", - " {\n", - " \"question\": \"Which actors have worked in movies from both the comedy and action genres?\",\n", - " \"query\": \"MATCH (a:Person)-[:ACTED_IN]->(:Movie)-[:IN_GENRE]->(g1:Genre), (a)-[:ACTED_IN]->(:Movie)-[:IN_GENRE]->(g2:Genre) WHERE g1.name = 'Comedy' AND g2.name = 'Action' RETURN DISTINCT a.name\",\n", - " },\n", - " {\n", - " \"question\": \"Which directors have made movies with at least three different actors named 'John'?\",\n", - " \"query\": \"MATCH (d:Person)-[:DIRECTED]->(m:Movie)<-[:ACTED_IN]-(a:Person) WHERE a.name STARTS WITH 'John' WITH d, COUNT(DISTINCT a) AS JohnsCount WHERE JohnsCount >= 3 RETURN d.name\",\n", - " },\n", - " {\n", - " \"question\": \"Identify movies where directors also played a role in the film.\",\n", - " \"query\": \"MATCH (p:Person)-[:DIRECTED]->(m:Movie), (p)-[:ACTED_IN]->(m) RETURN m.title, p.name\",\n", - " },\n", - " {\n", - " \"question\": \"Find the actor with the highest number of movies in the database.\",\n", - " \"query\": \"MATCH (a:Actor)-[:ACTED_IN]->(m:Movie) RETURN a.name, COUNT(m) AS movieCount ORDER BY movieCount DESC LIMIT 1\",\n", - " },\n", - "]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can create a few-shot prompt with them like so:" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "import { FewShotPromptTemplate, PromptTemplate } from \"@langchain/core/prompts\";\n", - "\n", - "const examplePrompt = PromptTemplate.fromTemplate(\n", - " \"User input: {question}\\nCypher query: {query}\"\n", - ")\n", - "const prompt = new FewShotPromptTemplate({\n", - " examples: examples.slice(0, 5),\n", - " examplePrompt,\n", - " prefix: \"You are a Neo4j expert. Given an input question, create a syntactically correct Cypher query to run.\\n\\nHere is the schema information\\n{schema}.\\n\\nBelow are a number of examples of questions and their corresponding Cypher queries.\",\n", - " suffix: \"User input: {question}\\nCypher query: \",\n", - " inputVariables: [\"question\", \"schema\"],\n", - "})" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Setup\n", + "#### Install dependencies\n", + "\n", + "```{=mdx}\n", + "import IntegrationInstallTooltip from \"@mdx_components/integration_install_tooltip.mdx\";\n", + "import Npm2Yarn from \"@theme/Npm2Yarn\";\n", + "\n", + "\n", + "\n", + "\n", + " langchain @langchain/community @langchain/openai neo4j-driver\n", + "\n", + "```\n", + "\n", + "#### Set environment variables\n", + "\n", + "We'll use OpenAI in this example:\n", + "\n", + "```env\n", + "OPENAI_API_KEY=your-api-key\n", + "\n", + "# Optional, use LangSmith for best-in-class observability\n", + "LANGSMITH_API_KEY=your-api-key\n", + "LANGCHAIN_TRACING_V2=true\n", + "```\n", + "\n", + "Next, we need to define Neo4j credentials.\n", + "Follow [these installation steps](https://neo4j.com/docs/operations-manual/current/installation/) to set up a Neo4j database.\n", + "\n", + "```env\n", + "NEO4J_URI=\"bolt://localhost:7687\"\n", + "NEO4J_USERNAME=\"neo4j\"\n", + "NEO4J_PASSWORD=\"password\"\n", + "```" + ] + }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "You are a Neo4j expert. Given an input question, create a syntactically correct Cypher query to run.\n", - "\n", - "Here is the schema information\n", - "foo.\n", - "\n", - "Below are a number of examples of questions and their corresponding Cypher queries.\n", - "\n", - "User input: How many artists are there?\n", - "Cypher query: MATCH (a:Person)-[:ACTED_IN]->(:Movie) RETURN count(DISTINCT a)\n", - "\n", - "User input: Which actors played in the movie Casino?\n", - "Cypher query: MATCH (m:Movie {title: 'Casino'})<-[:ACTED_IN]-(a) RETURN a.name\n", - "\n", - "User input: How many movies has Tom Hanks acted in?\n", - "Cypher query: MATCH (a:Person {name: 'Tom Hanks'})-[:ACTED_IN]->(m:Movie) RETURN count(m)\n", - "\n", - "User input: List all the genres of the movie Schindler's List\n", - "Cypher query: MATCH (m:Movie {title: 'Schindler\\'s List'})-[:IN_GENRE]->(g:Genre) RETURN g.name\n", - "\n", - "User input: Which actors have worked in movies from both the comedy and action genres?\n", - "Cypher query: MATCH (a:Person)-[:ACTED_IN]->(:Movie)-[:IN_GENRE]->(g1:Genre), (a)-[:ACTED_IN]->(:Movie)-[:IN_GENRE]->(g2:Genre) WHERE g1.name = 'Comedy' AND g2.name = 'Action' RETURN DISTINCT a.name\n", - "\n", - "User input: How many artists are there?\n", - "Cypher query: \n" - ] - } - ], - "source": [ - "console.log(await prompt.format({ question: \"How many artists are there?\", schema: \"foo\" }))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Dynamic few-shot examples\n", - "\n", - "If we have enough examples, we may want to only include the most relevant ones in the prompt, either because they don't fit in the model's context window or because the long tail of examples distracts the model. And specifically, given any input we want to include the examples most relevant to that input.\n", - "\n", - "We can do just this using an ExampleSelector. In this case we'll use a [SemanticSimilarityExampleSelector](https://api.js.langchain.com/classes/langchain_core_example_selectors.SemanticSimilarityExampleSelector.html), which will store the examples in the vector database of our choosing. At runtime it will perform a similarity search between the input and our examples, and return the most semantically similar ones: " - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "import { OpenAIEmbeddings } from \"@langchain/openai\";\n", - "import { SemanticSimilarityExampleSelector } from \"@langchain/core/example_selectors\";\n", - "import { Neo4jVectorStore } from \"@langchain/community/vectorstores/neo4j_vector\";\n", - "\n", - "const exampleSelector = await SemanticSimilarityExampleSelector.fromExamples(\n", - " examples,\n", - " new OpenAIEmbeddings(),\n", - " Neo4jVectorStore,\n", - " {\n", - " k: 5,\n", - " inputKeys: [\"question\"],\n", - " preDeleteCollection: true,\n", - " url,\n", - " username,\n", - " password\n", - " }\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The below example will create a connection with a Neo4j database and will populate it with example data about movies and their actors." + ] + }, { - "data": { - "text/plain": [ - "[\n", - " {\n", - " query: \u001b[32m\"MATCH (a:Person)-[:ACTED_IN]->(:Movie) RETURN count(DISTINCT a)\"\u001b[39m,\n", - " question: \u001b[32m\"How many artists are there?\"\u001b[39m\n", - " },\n", - " {\n", - " query: \u001b[32m\"MATCH (a:Person {{name: 'Tom Hanks'}})-[:ACTED_IN]->(m:Movie) RETURN count(m)\"\u001b[39m,\n", - " question: \u001b[32m\"How many movies has Tom Hanks acted in?\"\u001b[39m\n", - " },\n", - " {\n", - " query: \u001b[32m\"MATCH (a:Person)-[:ACTED_IN]->(:Movie)-[:IN_GENRE]->(g1:Genre), (a)-[:ACTED_IN]->(:Movie)-[:IN_GENRE\"\u001b[39m... 84 more characters,\n", - " question: \u001b[32m\"Which actors have worked in movies from both the comedy and action genres?\"\u001b[39m\n", - " },\n", - " {\n", - " query: \u001b[32m\"MATCH (d:Person)-[:DIRECTED]->(m:Movie)<-[:ACTED_IN]-(a:Person) WHERE a.name STARTS WITH 'John' WITH\"\u001b[39m... 71 more characters,\n", - " question: \u001b[32m\"Which directors have made movies with at least three different actors named 'John'?\"\u001b[39m\n", - " },\n", - " {\n", - " query: \u001b[32m\"MATCH (a:Actor)-[:ACTED_IN]->(m:Movie) RETURN a.name, COUNT(m) AS movieCount ORDER BY movieCount DES\"\u001b[39m... 9 more characters,\n", - " question: \u001b[32m\"Find the actor with the highest number of movies in the database.\"\u001b[39m\n", - " }\n", - "]" + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "const url = Deno.env.get(\"NEO4J_URI\");\n", + "const username = Deno.env.get(\"NEO4J_USER\");\n", + "const password = Deno.env.get(\"NEO4J_PASSWORD\");" ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "await exampleSelector.selectExamples({ question: \"how many artists are there?\" })" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To use it, we can pass the ExampleSelector directly in to our FewShotPromptTemplate:" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "const prompt = new FewShotPromptTemplate({\n", - " exampleSelector,\n", - " examplePrompt,\n", - " prefix: \"You are a Neo4j expert. Given an input question, create a syntactically correct Cypher query to run.\\n\\nHere is the schema information\\n{schema}.\\n\\nBelow are a number of examples of questions and their corresponding Cypher queries.\",\n", - " suffix: \"User input: {question}\\nCypher query: \",\n", - " inputVariables: [\"question\", \"schema\"],\n", - "})" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ + }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "You are a Neo4j expert. Given an input question, create a syntactically correct Cypher query to run.\n", - "\n", - "Here is the schema information\n", - "foo.\n", - "\n", - "Below are a number of examples of questions and their corresponding Cypher queries.\n", - "\n", - "User input: How many artists are there?\n", - "Cypher query: MATCH (a:Person)-[:ACTED_IN]->(:Movie) RETURN count(DISTINCT a)\n", - "\n", - "User input: How many movies has Tom Hanks acted in?\n", - "Cypher query: MATCH (a:Person {name: 'Tom Hanks'})-[:ACTED_IN]->(m:Movie) RETURN count(m)\n", - "\n", - "User input: Which actors have worked in movies from both the comedy and action genres?\n", - "Cypher query: MATCH (a:Person)-[:ACTED_IN]->(:Movie)-[:IN_GENRE]->(g1:Genre), (a)-[:ACTED_IN]->(:Movie)-[:IN_GENRE]->(g2:Genre) WHERE g1.name = 'Comedy' AND g2.name = 'Action' RETURN DISTINCT a.name\n", - "\n", - "User input: Which directors have made movies with at least three different actors named 'John'?\n", - "Cypher query: MATCH (d:Person)-[:DIRECTED]->(m:Movie)<-[:ACTED_IN]-(a:Person) WHERE a.name STARTS WITH 'John' WITH d, COUNT(DISTINCT a) AS JohnsCount WHERE JohnsCount >= 3 RETURN d.name\n", - "\n", - "User input: Find the actor with the highest number of movies in the database.\n", - "Cypher query: MATCH (a:Actor)-[:ACTED_IN]->(m:Movie) RETURN a.name, COUNT(m) AS movieCount ORDER BY movieCount DESC LIMIT 1\n", - "\n", - "User input: how many artists are there?\n", - "Cypher query: \n" - ] - } - ], - "source": [ - "console.log(await prompt.format({ question: \"how many artists are there?\", schema: \"foo\" }))" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "import { ChatOpenAI } from \"@langchain/openai\";\n", - "import { GraphCypherQAChain } from \"langchain/chains/graph_qa/cypher\";\n", - "\n", - "const llm = new ChatOpenAI({\n", - " modelName: \"gpt-3.5-turbo\",\n", - " temperature: 0,\n", - "});\n", - "const chain = GraphCypherQAChain.fromLLM(\n", - " {\n", - " graph,\n", - " llm,\n", - " cypherPrompt: prompt,\n", - " }\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Schema refreshed successfully.\n" + ] + }, + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import \"neo4j-driver\";\n", + "import { Neo4jGraph } from \"@langchain/community/graphs/neo4j_graph\";\n", + "\n", + "const graph = await Neo4jGraph.initialize({ url, username, password });\n", + "\n", + "// Import movie information\n", + "const moviesQuery = `LOAD CSV WITH HEADERS FROM \n", + "'https://raw.githubusercontent.com/tomasonjo/blog-datasets/main/movies/movies_small.csv'\n", + "AS row\n", + "MERGE (m:Movie {id:row.movieId})\n", + "SET m.released = date(row.released),\n", + " m.title = row.title,\n", + " m.imdbRating = toFloat(row.imdbRating)\n", + "FOREACH (director in split(row.director, '|') | \n", + " MERGE (p:Person {name:trim(director)})\n", + " MERGE (p)-[:DIRECTED]->(m))\n", + "FOREACH (actor in split(row.actors, '|') | \n", + " MERGE (p:Person {name:trim(actor)})\n", + " MERGE (p)-[:ACTED_IN]->(m))\n", + "FOREACH (genre in split(row.genres, '|') | \n", + " MERGE (g:Genre {name:trim(genre)})\n", + " MERGE (m)-[:IN_GENRE]->(g))`\n", + "\n", + "await graph.query(moviesQuery);" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Filtering graph schema\n", + "\n", + "At times, you may need to focus on a specific subset of the graph schema while generating Cypher statements.\n", + "Let's say we are dealing with the following graph schema:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Node properties are the following:\n", + "Movie {imdbRating: FLOAT, id: STRING, released: DATE, title: STRING}, Person {name: STRING}, Genre {name: STRING}, Chunk {embedding: LIST, id: STRING, text: STRING}\n", + "Relationship properties are the following:\n", + "\n", + "The relationships are the following:\n", + "(:Movie)-[:IN_GENRE]->(:Genre), (:Person)-[:DIRECTED]->(:Movie), (:Person)-[:ACTED_IN]->(:Movie)\n" + ] + } + ], + "source": [ + "await graph.refreshSchema()\n", + "console.log(graph.schema)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Few-shot examples\n", + "\n", + "Including examples of natural language questions being converted to valid Cypher queries against our database in the prompt will often improve model performance, especially for complex queries.\n", + "\n", + "Let's say we have the following examples:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "const examples = [\n", + " {\n", + " \"question\": \"How many artists are there?\",\n", + " \"query\": \"MATCH (a:Person)-[:ACTED_IN]->(:Movie) RETURN count(DISTINCT a)\",\n", + " },\n", + " {\n", + " \"question\": \"Which actors played in the movie Casino?\",\n", + " \"query\": \"MATCH (m:Movie {{title: 'Casino'}})<-[:ACTED_IN]-(a) RETURN a.name\",\n", + " },\n", + " {\n", + " \"question\": \"How many movies has Tom Hanks acted in?\",\n", + " \"query\": \"MATCH (a:Person {{name: 'Tom Hanks'}})-[:ACTED_IN]->(m:Movie) RETURN count(m)\",\n", + " },\n", + " {\n", + " \"question\": \"List all the genres of the movie Schindler's List\",\n", + " \"query\": \"MATCH (m:Movie {{title: 'Schindler\\\\'s List'}})-[:IN_GENRE]->(g:Genre) RETURN g.name\",\n", + " },\n", + " {\n", + " \"question\": \"Which actors have worked in movies from both the comedy and action genres?\",\n", + " \"query\": \"MATCH (a:Person)-[:ACTED_IN]->(:Movie)-[:IN_GENRE]->(g1:Genre), (a)-[:ACTED_IN]->(:Movie)-[:IN_GENRE]->(g2:Genre) WHERE g1.name = 'Comedy' AND g2.name = 'Action' RETURN DISTINCT a.name\",\n", + " },\n", + " {\n", + " \"question\": \"Which directors have made movies with at least three different actors named 'John'?\",\n", + " \"query\": \"MATCH (d:Person)-[:DIRECTED]->(m:Movie)<-[:ACTED_IN]-(a:Person) WHERE a.name STARTS WITH 'John' WITH d, COUNT(DISTINCT a) AS JohnsCount WHERE JohnsCount >= 3 RETURN d.name\",\n", + " },\n", + " {\n", + " \"question\": \"Identify movies where directors also played a role in the film.\",\n", + " \"query\": \"MATCH (p:Person)-[:DIRECTED]->(m:Movie), (p)-[:ACTED_IN]->(m) RETURN m.title, p.name\",\n", + " },\n", + " {\n", + " \"question\": \"Find the actor with the highest number of movies in the database.\",\n", + " \"query\": \"MATCH (a:Actor)-[:ACTED_IN]->(m:Movie) RETURN a.name, COUNT(m) AS movieCount ORDER BY movieCount DESC LIMIT 1\",\n", + " },\n", + "]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can create a few-shot prompt with them like so:" + ] + }, { - "data": { - "text/plain": [ - "{ result: \u001b[32m\"There are 967 actors in the graph.\"\u001b[39m }" + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "import { FewShotPromptTemplate, PromptTemplate } from \"@langchain/core/prompts\";\n", + "\n", + "const examplePrompt = PromptTemplate.fromTemplate(\n", + " \"User input: {question}\\nCypher query: {query}\"\n", + ")\n", + "const prompt = new FewShotPromptTemplate({\n", + " examples: examples.slice(0, 5),\n", + " examplePrompt,\n", + " prefix: \"You are a Neo4j expert. Given an input question, create a syntactically correct Cypher query to run.\\n\\nHere is the schema information\\n{schema}.\\n\\nBelow are a number of examples of questions and their corresponding Cypher queries.\",\n", + " suffix: \"User input: {question}\\nCypher query: \",\n", + " inputVariables: [\"question\", \"schema\"],\n", + "})" ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "You are a Neo4j expert. Given an input question, create a syntactically correct Cypher query to run.\n", + "\n", + "Here is the schema information\n", + "foo.\n", + "\n", + "Below are a number of examples of questions and their corresponding Cypher queries.\n", + "\n", + "User input: How many artists are there?\n", + "Cypher query: MATCH (a:Person)-[:ACTED_IN]->(:Movie) RETURN count(DISTINCT a)\n", + "\n", + "User input: Which actors played in the movie Casino?\n", + "Cypher query: MATCH (m:Movie {title: 'Casino'})<-[:ACTED_IN]-(a) RETURN a.name\n", + "\n", + "User input: How many movies has Tom Hanks acted in?\n", + "Cypher query: MATCH (a:Person {name: 'Tom Hanks'})-[:ACTED_IN]->(m:Movie) RETURN count(m)\n", + "\n", + "User input: List all the genres of the movie Schindler's List\n", + "Cypher query: MATCH (m:Movie {title: 'Schindler\\'s List'})-[:IN_GENRE]->(g:Genre) RETURN g.name\n", + "\n", + "User input: Which actors have worked in movies from both the comedy and action genres?\n", + "Cypher query: MATCH (a:Person)-[:ACTED_IN]->(:Movie)-[:IN_GENRE]->(g1:Genre), (a)-[:ACTED_IN]->(:Movie)-[:IN_GENRE]->(g2:Genre) WHERE g1.name = 'Comedy' AND g2.name = 'Action' RETURN DISTINCT a.name\n", + "\n", + "User input: How many artists are there?\n", + "Cypher query: \n" + ] + } + ], + "source": [ + "console.log(await prompt.format({ question: \"How many artists are there?\", schema: \"foo\" }))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Dynamic few-shot examples\n", + "\n", + "If we have enough examples, we may want to only include the most relevant ones in the prompt, either because they don't fit in the model's context window or because the long tail of examples distracts the model. And specifically, given any input we want to include the examples most relevant to that input.\n", + "\n", + "We can do just this using an ExampleSelector. In this case we'll use a [SemanticSimilarityExampleSelector](https://api.js.langchain.com/classes/langchain_core_example_selectors.SemanticSimilarityExampleSelector.html), which will store the examples in the vector database of our choosing. At runtime it will perform a similarity search between the input and our examples, and return the most semantically similar ones: " + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "import { OpenAIEmbeddings } from \"@langchain/openai\";\n", + "import { SemanticSimilarityExampleSelector } from \"@langchain/core/example_selectors\";\n", + "import { Neo4jVectorStore } from \"@langchain/community/vectorstores/neo4j_vector\";\n", + "\n", + "const exampleSelector = await SemanticSimilarityExampleSelector.fromExamples(\n", + " examples,\n", + " new OpenAIEmbeddings(),\n", + " Neo4jVectorStore,\n", + " {\n", + " k: 5,\n", + " inputKeys: [\"question\"],\n", + " preDeleteCollection: true,\n", + " url,\n", + " username,\n", + " password\n", + " }\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[\n", + " {\n", + " query: \u001b[32m\"MATCH (a:Person)-[:ACTED_IN]->(:Movie) RETURN count(DISTINCT a)\"\u001b[39m,\n", + " question: \u001b[32m\"How many artists are there?\"\u001b[39m\n", + " },\n", + " {\n", + " query: \u001b[32m\"MATCH (a:Person {{name: 'Tom Hanks'}})-[:ACTED_IN]->(m:Movie) RETURN count(m)\"\u001b[39m,\n", + " question: \u001b[32m\"How many movies has Tom Hanks acted in?\"\u001b[39m\n", + " },\n", + " {\n", + " query: \u001b[32m\"MATCH (a:Person)-[:ACTED_IN]->(:Movie)-[:IN_GENRE]->(g1:Genre), (a)-[:ACTED_IN]->(:Movie)-[:IN_GENRE\"\u001b[39m... 84 more characters,\n", + " question: \u001b[32m\"Which actors have worked in movies from both the comedy and action genres?\"\u001b[39m\n", + " },\n", + " {\n", + " query: \u001b[32m\"MATCH (d:Person)-[:DIRECTED]->(m:Movie)<-[:ACTED_IN]-(a:Person) WHERE a.name STARTS WITH 'John' WITH\"\u001b[39m... 71 more characters,\n", + " question: \u001b[32m\"Which directors have made movies with at least three different actors named 'John'?\"\u001b[39m\n", + " },\n", + " {\n", + " query: \u001b[32m\"MATCH (a:Actor)-[:ACTED_IN]->(m:Movie) RETURN a.name, COUNT(m) AS movieCount ORDER BY movieCount DES\"\u001b[39m... 9 more characters,\n", + " question: \u001b[32m\"Find the actor with the highest number of movies in the database.\"\u001b[39m\n", + " }\n", + "]" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "await exampleSelector.selectExamples({ question: \"how many artists are there?\" })" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To use it, we can pass the ExampleSelector directly in to our FewShotPromptTemplate:" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "const prompt = new FewShotPromptTemplate({\n", + " exampleSelector,\n", + " examplePrompt,\n", + " prefix: \"You are a Neo4j expert. Given an input question, create a syntactically correct Cypher query to run.\\n\\nHere is the schema information\\n{schema}.\\n\\nBelow are a number of examples of questions and their corresponding Cypher queries.\",\n", + " suffix: \"User input: {question}\\nCypher query: \",\n", + " inputVariables: [\"question\", \"schema\"],\n", + "})" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "You are a Neo4j expert. Given an input question, create a syntactically correct Cypher query to run.\n", + "\n", + "Here is the schema information\n", + "foo.\n", + "\n", + "Below are a number of examples of questions and their corresponding Cypher queries.\n", + "\n", + "User input: How many artists are there?\n", + "Cypher query: MATCH (a:Person)-[:ACTED_IN]->(:Movie) RETURN count(DISTINCT a)\n", + "\n", + "User input: How many movies has Tom Hanks acted in?\n", + "Cypher query: MATCH (a:Person {name: 'Tom Hanks'})-[:ACTED_IN]->(m:Movie) RETURN count(m)\n", + "\n", + "User input: Which actors have worked in movies from both the comedy and action genres?\n", + "Cypher query: MATCH (a:Person)-[:ACTED_IN]->(:Movie)-[:IN_GENRE]->(g1:Genre), (a)-[:ACTED_IN]->(:Movie)-[:IN_GENRE]->(g2:Genre) WHERE g1.name = 'Comedy' AND g2.name = 'Action' RETURN DISTINCT a.name\n", + "\n", + "User input: Which directors have made movies with at least three different actors named 'John'?\n", + "Cypher query: MATCH (d:Person)-[:DIRECTED]->(m:Movie)<-[:ACTED_IN]-(a:Person) WHERE a.name STARTS WITH 'John' WITH d, COUNT(DISTINCT a) AS JohnsCount WHERE JohnsCount >= 3 RETURN d.name\n", + "\n", + "User input: Find the actor with the highest number of movies in the database.\n", + "Cypher query: MATCH (a:Actor)-[:ACTED_IN]->(m:Movie) RETURN a.name, COUNT(m) AS movieCount ORDER BY movieCount DESC LIMIT 1\n", + "\n", + "User input: how many artists are there?\n", + "Cypher query: \n" + ] + } + ], + "source": [ + "console.log(await prompt.format({ question: \"how many artists are there?\", schema: \"foo\" }))" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "import { ChatOpenAI } from \"@langchain/openai\";\n", + "import { GraphCypherQAChain } from \"langchain/chains/graph_qa/cypher\";\n", + "\n", + "const llm = new ChatOpenAI({\n", + " model: \"gpt-3.5-turbo\",\n", + " temperature: 0,\n", + "});\n", + "const chain = GraphCypherQAChain.fromLLM(\n", + " {\n", + " graph,\n", + " llm,\n", + " cypherPrompt: prompt,\n", + " }\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{ result: \u001b[32m\"There are 967 actors in the graph.\"\u001b[39m }" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "await chain.invoke({\n", + " query: \"How many actors are in the graph?\"\n", + "})" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Deno", + "language": "typescript", + "name": "deno" + }, + "language_info": { + "file_extension": ".ts", + "mimetype": "text/x.typescript", + "name": "typescript", + "nb_converter": "script", + "pygments_lexer": "typescript", + "version": "5.3.3" } - ], - "source": [ - "await chain.invoke({\n", - " query: \"How many actors are in the graph?\"\n", - "})" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Deno", - "language": "typescript", - "name": "deno" }, - "language_info": { - "file_extension": ".ts", - "mimetype": "text/x.typescript", - "name": "typescript", - "nb_converter": "script", - "pygments_lexer": "typescript", - "version": "5.3.3" - } - }, - "nbformat": 4, - "nbformat_minor": 4 + "nbformat": 4, + "nbformat_minor": 4 } diff --git a/docs/core_docs/docs/use_cases/graph/quickstart.ipynb b/docs/core_docs/docs/use_cases/graph/quickstart.ipynb index bea82cf95dcc..6cb4aa12f45c 100644 --- a/docs/core_docs/docs/use_cases/graph/quickstart.ipynb +++ b/docs/core_docs/docs/use_cases/graph/quickstart.ipynb @@ -1,257 +1,258 @@ { - "cells": [ - { - "cell_type": "raw", - "metadata": {}, - "source": [ - "---\n", - "sidebar_position: 0\n", - "---" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Quickstart\n", - "\n", - "In this guide we'll go over the basic ways to create a Q&A chain over a graph database. These systems will allow us to ask a question about the data in a graph database and get back a natural language answer.\n", - "\n", - "## ⚠️ Security note ⚠️\n", - "\n", - "Building Q&A systems of graph databases requires executing model-generated graph queries. There are inherent risks in doing this. Make sure that your database connection permissions are always scoped as narrowly as possible for your chain/agent's needs. This will mitigate though not eliminate the risks of building a model-driven system. For more on general security best practices, [see here](/docs/security).\n", - "\n", - "## Architecture\n", - "\n", - "At a high-level, the steps of most graph chains are:\n", - "\n", - "1. **Convert question to a graph database query**: Model converts user input to a graph database query (e.g. Cypher).\n", - "2. **Execute graph database query**: Execute the graph database query.\n", - "3. **Answer the question**: Model responds to user input using the query results.\n", - "\n", - "\n", - "![SQL Use Case Diagram](../../../static/img/graph_usecase.png)\n", - "\n", - "## Setup\n", - "\n", - "First, get required packages and set environment variables.\n", - "In this example, we will be using Neo4j graph database." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Setup\n", - "#### Install dependencies\n", - "\n", - "```{=mdx}\n", - "import IntegrationInstallTooltip from \"@mdx_components/integration_install_tooltip.mdx\";\n", - "import Npm2Yarn from \"@theme/Npm2Yarn\";\n", - "\n", - "\n", - "\n", - "\n", - " langchain @langchain/community @langchain/openai neo4j-driver\n", - "\n", - "```\n", - "\n", - "#### Set environment variables\n", - "\n", - "We'll use OpenAI in this example:\n", - "\n", - "```env\n", - "OPENAI_API_KEY=your-api-key\n", - "\n", - "# Optional, use LangSmith for best-in-class observability\n", - "LANGSMITH_API_KEY=your-api-key\n", - "LANGCHAIN_TRACING_V2=true\n", - "```\n", - "\n", - "Next, we need to define Neo4j credentials.\n", - "Follow [these installation steps](https://neo4j.com/docs/operations-manual/current/installation/) to set up a Neo4j database.\n", - "\n", - "```env\n", - "NEO4J_URI=\"bolt://localhost:7687\"\n", - "NEO4J_USERNAME=\"neo4j\"\n", - "NEO4J_PASSWORD=\"password\"\n", - "```" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The below example will create a connection with a Neo4j database and will populate it with example data about movies and their actors." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Schema refreshed successfully.\n" - ] - }, - { - "data": { - "text/plain": [ - "[]" + "cells": [ + { + "cell_type": "raw", + "metadata": {}, + "source": [ + "---\n", + "sidebar_position: 0\n", + "---" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Quickstart\n", + "\n", + "In this guide we'll go over the basic ways to create a Q&A chain over a graph database. These systems will allow us to ask a question about the data in a graph database and get back a natural language answer.\n", + "\n", + "## ⚠️ Security note ⚠️\n", + "\n", + "Building Q&A systems of graph databases requires executing model-generated graph queries. There are inherent risks in doing this. Make sure that your database connection permissions are always scoped as narrowly as possible for your chain/agent's needs. This will mitigate though not eliminate the risks of building a model-driven system. For more on general security best practices, [see here](/docs/security).\n", + "\n", + "## Architecture\n", + "\n", + "At a high-level, the steps of most graph chains are:\n", + "\n", + "1. **Convert question to a graph database query**: Model converts user input to a graph database query (e.g. Cypher).\n", + "2. **Execute graph database query**: Execute the graph database query.\n", + "3. **Answer the question**: Model responds to user input using the query results.\n", + "\n", + "\n", + "![SQL Use Case Diagram](../../../static/img/graph_usecase.png)\n", + "\n", + "## Setup\n", + "\n", + "First, get required packages and set environment variables.\n", + "In this example, we will be using Neo4j graph database." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Setup\n", + "#### Install dependencies\n", + "\n", + "```{=mdx}\n", + "import IntegrationInstallTooltip from \"@mdx_components/integration_install_tooltip.mdx\";\n", + "import Npm2Yarn from \"@theme/Npm2Yarn\";\n", + "\n", + "\n", + "\n", + "\n", + " langchain @langchain/community @langchain/openai neo4j-driver\n", + "\n", + "```\n", + "\n", + "#### Set environment variables\n", + "\n", + "We'll use OpenAI in this example:\n", + "\n", + "```env\n", + "OPENAI_API_KEY=your-api-key\n", + "\n", + "# Optional, use LangSmith for best-in-class observability\n", + "LANGSMITH_API_KEY=your-api-key\n", + "LANGCHAIN_TRACING_V2=true\n", + "```\n", + "\n", + "Next, we need to define Neo4j credentials.\n", + "Follow [these installation steps](https://neo4j.com/docs/operations-manual/current/installation/) to set up a Neo4j database.\n", + "\n", + "```env\n", + "NEO4J_URI=\"bolt://localhost:7687\"\n", + "NEO4J_USERNAME=\"neo4j\"\n", + "NEO4J_PASSWORD=\"password\"\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The below example will create a connection with a Neo4j database and will populate it with example data about movies and their actors." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Schema refreshed successfully.\n" ] }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import \"neo4j-driver\";\n", - "import { Neo4jGraph } from \"@langchain/community/graphs/neo4j_graph\";\n", - "\n", - "const url = Deno.env.get(\"NEO4J_URI\");\n", - "const username = Deno.env.get(\"NEO4J_USER\");\n", - "const password = Deno.env.get(\"NEO4J_PASSWORD\");\n", - "const graph = await Neo4jGraph.initialize({ url, username, password });\n", - "\n", - "// Import movie information\n", - "const moviesQuery = `LOAD CSV WITH HEADERS FROM \n", - "'https://raw.githubusercontent.com/tomasonjo/blog-datasets/main/movies/movies_small.csv'\n", - "AS row\n", - "MERGE (m:Movie {id:row.movieId})\n", - "SET m.released = date(row.released),\n", - " m.title = row.title,\n", - " m.imdbRating = toFloat(row.imdbRating)\n", - "FOREACH (director in split(row.director, '|') | \n", - " MERGE (p:Person {name:trim(director)})\n", - " MERGE (p)-[:DIRECTED]->(m))\n", - "FOREACH (actor in split(row.actors, '|') | \n", - " MERGE (p:Person {name:trim(actor)})\n", - " MERGE (p)-[:ACTED_IN]->(m))\n", - "FOREACH (genre in split(row.genres, '|') | \n", - " MERGE (g:Genre {name:trim(genre)})\n", - " MERGE (m)-[:IN_GENRE]->(g))`\n", - "\n", - "await graph.query(moviesQuery);" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Graph schema\n", - "\n", - "In order for an LLM to be able to generate a Cypher statement, it needs information about the graph schema. When you instantiate a graph object, it retrieves the information about the graph schema. If you later make any changes to the graph, you can run the `refreshSchema` method to refresh the schema information." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Node properties are the following:\n", - "Movie {imdbRating: FLOAT, id: STRING, released: DATE, title: STRING}, Person {name: STRING}, Genre {name: STRING}\n", - "Relationship properties are the following:\n", - "\n", - "The relationships are the following:\n", - "(:Movie)-[:IN_GENRE]->(:Genre), (:Person)-[:DIRECTED]->(:Movie), (:Person)-[:ACTED_IN]->(:Movie)\n" - ] - } - ], - "source": [ - "await graph.refreshSchema()\n", - "console.log(graph.schema)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Great! We've got a graph database that we can query. Now let's try hooking it up to an LLM.\n", - "\n", - "## Chain\n", - "\n", - "Let's use a simple chain that takes a question, turns it into a Cypher query, executes the query, and uses the result to answer the original question.\n", - "\n", - "![graph_chain.webp](../../../static/img/graph_chain.webp)\n", - "\n", - "\n", - "LangChain comes with a built-in chain for this workflow that is designed to work with Neo4j: [GraphCypherQAChain](https://python.langchain.com/docs/use_cases/graph/graph_cypher_qa)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{ result: \u001b[32m\"James Woods, Joe Pesci, Robert De Niro, Sharon Stone\"\u001b[39m }" + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import \"neo4j-driver\";\n", + "import { Neo4jGraph } from \"@langchain/community/graphs/neo4j_graph\";\n", + "\n", + "const url = Deno.env.get(\"NEO4J_URI\");\n", + "const username = Deno.env.get(\"NEO4J_USER\");\n", + "const password = Deno.env.get(\"NEO4J_PASSWORD\");\n", + "const graph = await Neo4jGraph.initialize({ url, username, password });\n", + "\n", + "// Import movie information\n", + "const moviesQuery = `LOAD CSV WITH HEADERS FROM \n", + "'https://raw.githubusercontent.com/tomasonjo/blog-datasets/main/movies/movies_small.csv'\n", + "AS row\n", + "MERGE (m:Movie {id:row.movieId})\n", + "SET m.released = date(row.released),\n", + " m.title = row.title,\n", + " m.imdbRating = toFloat(row.imdbRating)\n", + "FOREACH (director in split(row.director, '|') | \n", + " MERGE (p:Person {name:trim(director)})\n", + " MERGE (p)-[:DIRECTED]->(m))\n", + "FOREACH (actor in split(row.actors, '|') | \n", + " MERGE (p:Person {name:trim(actor)})\n", + " MERGE (p)-[:ACTED_IN]->(m))\n", + "FOREACH (genre in split(row.genres, '|') | \n", + " MERGE (g:Genre {name:trim(genre)})\n", + " MERGE (m)-[:IN_GENRE]->(g))`\n", + "\n", + "await graph.query(moviesQuery);" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Graph schema\n", + "\n", + "In order for an LLM to be able to generate a Cypher statement, it needs information about the graph schema. When you instantiate a graph object, it retrieves the information about the graph schema. If you later make any changes to the graph, you can run the `refreshSchema` method to refresh the schema information." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Node properties are the following:\n", + "Movie {imdbRating: FLOAT, id: STRING, released: DATE, title: STRING}, Person {name: STRING}, Genre {name: STRING}\n", + "Relationship properties are the following:\n", + "\n", + "The relationships are the following:\n", + "(:Movie)-[:IN_GENRE]->(:Genre), (:Person)-[:DIRECTED]->(:Movie), (:Person)-[:ACTED_IN]->(:Movie)\n" ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import { GraphCypherQAChain } from \"langchain/chains/graph_qa/cypher\";\n", - "import { ChatOpenAI } from \"@langchain/openai\";\n", - "\n", - "const llm = new ChatOpenAI({ modelName: \"gpt-3.5-turbo\", temperature: 0 })\n", - "const chain = GraphCypherQAChain.fromLLM({\n", - " llm,\n", - " graph,\n", - "});\n", - "const response = await chain.invoke({ query: \"What was the cast of the Casino?\" })\n", - "response" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Next steps\n", - "\n", - "For more complex query-generation, we may want to create few-shot prompts or add query-checking steps. For advanced techniques like this and more check out:\n", - "\n", - "* [Prompting strategies](/docs/use_cases/graph/prompting): Advanced prompt engineering techniques.\n", - "* [Mapping values](/docs/use_cases/graph/mapping): Techniques for mapping values from questions to database.\n", - "* [Semantic layer](/docs/use_cases/graph/semantic): Techniques for working implementing semantic layers.\n", - "* [Constructing graphs](/docs/use_cases/graph/construction): Techniques for constructing knowledge graphs.\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Deno", - "language": "typescript", - "name": "deno" + } + ], + "source": [ + "await graph.refreshSchema()\n", + "console.log(graph.schema)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Great! We've got a graph database that we can query. Now let's try hooking it up to an LLM.\n", + "\n", + "## Chain\n", + "\n", + "Let's use a simple chain that takes a question, turns it into a Cypher query, executes the query, and uses the result to answer the original question.\n", + "\n", + "![graph_chain.webp](../../../static/img/graph_chain.webp)\n", + "\n", + "\n", + "LangChain comes with a built-in chain for this workflow that is designed to work with Neo4j: [GraphCypherQAChain](https://python.langchain.com/docs/use_cases/graph/graph_cypher_qa)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{ result: \u001b[32m\"James Woods, Joe Pesci, Robert De Niro, Sharon Stone\"\u001b[39m }" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import { GraphCypherQAChain } from \"langchain/chains/graph_qa/cypher\";\n", + "import { ChatOpenAI } from \"@langchain/openai\";\n", + "\n", + "const llm = new ChatOpenAI({ model: \"gpt-3.5-turbo\", temperature: 0 })\n", + "const chain = GraphCypherQAChain.fromLLM({\n", + " llm,\n", + " graph,\n", + "});\n", + "const response = await chain.invoke({ query: \"What was the cast of the Casino?\" })\n", + "response" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Next steps\n", + "\n", + "For more complex query-generation, we may want to create few-shot prompts or add query-checking steps. For advanced techniques like this and more check out:\n", + "\n", + "* [Prompting strategies](/docs/use_cases/graph/prompting): Advanced prompt engineering techniques.\n", + "* [Mapping values](/docs/use_cases/graph/mapping): Techniques for mapping values from questions to database.\n", + "* [Semantic layer](/docs/use_cases/graph/semantic): Techniques for working implementing semantic layers.\n", + "* [Constructing graphs](/docs/use_cases/graph/construction): Techniques for constructing knowledge graphs.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Deno", + "language": "typescript", + "name": "deno" + }, + "language_info": { + "file_extension": ".ts", + "mimetype": "text/x.typescript", + "name": "typescript", + "nb_converter": "script", + "pygments_lexer": "typescript", + "version": "5.4.3" + } }, - "language_info": { - "file_extension": ".ts", - "mimetype": "text/x.typescript", - "name": "typescript", - "nb_converter": "script", - "pygments_lexer": "typescript", - "version": "5.4.3" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} + "nbformat": 4, + "nbformat_minor": 4 + } + \ No newline at end of file diff --git a/docs/core_docs/docs/use_cases/graph/semantic.ipynb b/docs/core_docs/docs/use_cases/graph/semantic.ipynb index df621a4aaa8b..9a74c82c44dd 100644 --- a/docs/core_docs/docs/use_cases/graph/semantic.ipynb +++ b/docs/core_docs/docs/use_cases/graph/semantic.ipynb @@ -1,332 +1,332 @@ { - "cells": [ - { - "cell_type": "raw", - "id": "19cc5b11-3822-454b-afb3-7bebd7f17b5c", - "metadata": {}, - "source": [ - "---\n", - "sidebar_position: 1\n", - "---" - ] - }, - { - "cell_type": "markdown", - "id": "2e17a273-bcfc-433f-8d42-2ba9533feeb8", - "metadata": {}, - "source": [ - "# Semantic layer over graph database\n", - "\n", - "You can use database queries to retrieve information from a graph database like Neo4j.\n", - "One option is to use LLMs to generate Cypher statements.\n", - "While that option provides excellent flexibility, the solution could be brittle and not consistently generating precise Cypher statements.\n", - "Instead of generating Cypher statements, we can implement Cypher templates as tools in a semantic layer that an LLM agent can interact with.\n", - "\n", - "![graph_semantic.png](../../../static/img/graph_semantic.png)" - ] - }, - { - "cell_type": "markdown", - "id": "e811ebad", - "metadata": {}, - "source": [ - "## Setup\n", - "#### Install dependencies\n", - "\n", - "```{=mdx}\n", - "import IntegrationInstallTooltip from \"@mdx_components/integration_install_tooltip.mdx\";\n", - "import Npm2Yarn from \"@theme/Npm2Yarn\";\n", - "\n", - "\n", - "\n", - "\n", - " langchain @langchain/community @langchain/openai neo4j-driver zod\n", - "\n", - "```\n", - "\n", - "#### Set environment variables\n", - "\n", - "We'll use OpenAI in this example:\n", - "\n", - "```env\n", - "OPENAI_API_KEY=your-api-key\n", - "\n", - "# Optional, use LangSmith for best-in-class observability\n", - "LANGSMITH_API_KEY=your-api-key\n", - "LANGCHAIN_TRACING_V2=true\n", - "```\n", - "\n", - "Next, we need to define Neo4j credentials.\n", - "Follow [these installation steps](https://neo4j.com/docs/operations-manual/current/installation/) to set up a Neo4j database.\n", - "\n", - "```env\n", - "NEO4J_URI=\"bolt://localhost:7687\"\n", - "NEO4J_USERNAME=\"neo4j\"\n", - "NEO4J_PASSWORD=\"password\"\n", - "```" - ] - }, - { - "cell_type": "markdown", - "id": "1e8fbc2c-b8e8-4c53-8fce-243cf99d3c1c", - "metadata": {}, - "source": [ - "The below example will create a connection with a Neo4j database and will populate it with example data about movies and their actors." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "c84b1449-6fcd-4140-b591-cb45e8dce207", - "metadata": {}, - "outputs": [ + "cells": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "Schema refreshed successfully.\n" - ] + "cell_type": "raw", + "id": "19cc5b11-3822-454b-afb3-7bebd7f17b5c", + "metadata": {}, + "source": [ + "---\n", + "sidebar_position: 1\n", + "---" + ] }, { - "data": { - "text/plain": [ - "[]" + "cell_type": "markdown", + "id": "2e17a273-bcfc-433f-8d42-2ba9533feeb8", + "metadata": {}, + "source": [ + "# Semantic layer over graph database\n", + "\n", + "You can use database queries to retrieve information from a graph database like Neo4j.\n", + "One option is to use LLMs to generate Cypher statements.\n", + "While that option provides excellent flexibility, the solution could be brittle and not consistently generating precise Cypher statements.\n", + "Instead of generating Cypher statements, we can implement Cypher templates as tools in a semantic layer that an LLM agent can interact with.\n", + "\n", + "![graph_semantic.png](../../../static/img/graph_semantic.png)" ] - }, - "execution_count": 1, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import \"neo4j-driver\";\n", - "import { Neo4jGraph } from \"@langchain/community/graphs/neo4j_graph\";\n", - "\n", - "const url = Deno.env.get(\"NEO4J_URI\");\n", - "const username = Deno.env.get(\"NEO4J_USER\");\n", - "const password = Deno.env.get(\"NEO4J_PASSWORD\");\n", - "const graph = await Neo4jGraph.initialize({ url, username, password });\n", - "\n", - "// Import movie information\n", - "const moviesQuery = `LOAD CSV WITH HEADERS FROM \n", - "'https://raw.githubusercontent.com/tomasonjo/blog-datasets/main/movies/movies_small.csv'\n", - "AS row\n", - "MERGE (m:Movie {id:row.movieId})\n", - "SET m.released = date(row.released),\n", - " m.title = row.title,\n", - " m.imdbRating = toFloat(row.imdbRating)\n", - "FOREACH (director in split(row.director, '|') | \n", - " MERGE (p:Person {name:trim(director)})\n", - " MERGE (p)-[:DIRECTED]->(m))\n", - "FOREACH (actor in split(row.actors, '|') | \n", - " MERGE (p:Person {name:trim(actor)})\n", - " MERGE (p)-[:ACTED_IN]->(m))\n", - "FOREACH (genre in split(row.genres, '|') | \n", - " MERGE (g:Genre {name:trim(genre)})\n", - " MERGE (m)-[:IN_GENRE]->(g))`\n", - "\n", - "await graph.query(moviesQuery);" - ] - }, - { - "cell_type": "markdown", - "id": "403b9acd-aa0d-4157-b9de-6ec426835c43", - "metadata": {}, - "source": [ - "## Custom tools with Cypher templates\n", - "\n", - "A semantic layer consists of various tools exposed to an LLM that it can use to interact with a knowledge graph.\n", - "They can be of various complexity. You can think of each tool in a semantic layer as a function.\n", - "\n", - "The function we will implement is to retrieve information about movies or their cast." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "d1dc1c8c-f343-4024-924b-a8a86cf5f1af", - "metadata": {}, - "outputs": [], - "source": [ - "const descriptionQuery = `MATCH (m:Movie|Person)\n", - "WHERE m.title CONTAINS $candidate OR m.name CONTAINS $candidate\n", - "MATCH (m)-[r:ACTED_IN|HAS_GENRE]-(t)\n", - "WITH m, type(r) as type, collect(coalesce(t.name, t.title)) as names\n", - "WITH m, type+\": \"+reduce(s=\"\", n IN names | s + n + \", \") as types\n", - "WITH m, collect(types) as contexts\n", - "WITH m, \"type:\" + labels(m)[0] + \"\\ntitle: \"+ coalesce(m.title, m.name) \n", - " + \"\\nyear: \"+coalesce(m.released,\"\") +\"\\n\" +\n", - " reduce(s=\"\", c in contexts | s + substring(c, 0, size(c)-2) +\"\\n\") as context\n", - "RETURN context LIMIT 1`\n", - "\n", - "const getInformation = async (entity: string) => {\n", - " try {\n", - " const data = await graph.query(descriptionQuery, { candidate: entity });\n", - " return data[0][\"context\"];\n", - " } catch (error) {\n", - " return \"No information was found\";\n", - " }\n", - " \n", - "}" - ] - }, - { - "cell_type": "markdown", - "id": "bdecc24b-8065-4755-98cc-9c6d093d4897", - "metadata": {}, - "source": [ - "You can observe that we have defined the Cypher statement used to retrieve information.\n", - "Therefore, we can avoid generating Cypher statements and use the LLM agent to only populate the input parameters.\n", - "To provide additional information to an LLM agent about when to use the tool and their input parameters, we wrap the function as a tool." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "f4cde772-0d05-475d-a2f0-b53e1669bd13", - "metadata": {}, - "outputs": [], - "source": [ - "import { StructuredTool } from \"@langchain/core/tools\";\n", - "import { z } from \"zod\";\n", - "\n", - "const informationInput = z.object({\n", - " entity: z.string().describe(\"movie or a person mentioned in the question\"),\n", - "});\n", - "\n", - "class InformationTool extends StructuredTool {\n", - " schema = informationInput;\n", - "\n", - " name = \"Information\";\n", - "\n", - " description = \"useful for when you need to answer questions about various actors or movies\";\n", - "\n", - " async _call(input: z.infer): Promise {\n", - " return getInformation(input.entity);\n", - " }\n", - "}" - ] - }, - { - "cell_type": "markdown", - "id": "ff4820aa-2b57-4558-901f-6d984b326738", - "metadata": {}, - "source": [ - "## OpenAI Agent\n", - "\n", - "LangChain expression language makes it very convenient to define an agent to interact with a graph database over the semantic layer." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "6e959ac2-537d-4358-a43b-e3a47f68e1d6", - "metadata": {}, - "outputs": [], - "source": [ - "import { ChatOpenAI } from \"@langchain/openai\";\n", - "import { AgentExecutor } from \"langchain/agents\";\n", - "import { formatToOpenAIFunctionMessages } from \"langchain/agents/format_scratchpad\";\n", - "import { OpenAIFunctionsAgentOutputParser } from \"langchain/agents/openai/output_parser\";\n", - "import { convertToOpenAIFunction } from \"@langchain/core/utils/function_calling\";\n", - "import { ChatPromptTemplate, MessagesPlaceholder } from \"@langchain/core/prompts\";\n", - "import { AIMessage, BaseMessage, HumanMessage } from \"@langchain/core/messages\";\n", - "import { RunnableSequence } from \"@langchain/core/runnables\";\n", - "\n", - "const llm = new ChatOpenAI({ modelName: \"gpt-3.5-turbo\", temperature: 0 })\n", - "const tools = [new InformationTool()]\n", - "\n", - "const llmWithTools = llm.bind({\n", - " functions: tools.map(convertToOpenAIFunction),\n", - "})\n", - "\n", - "const prompt = ChatPromptTemplate.fromMessages(\n", - " [\n", - " [\n", - " \"system\",\n", - " \"You are a helpful assistant that finds information about movies and recommends them. If tools require follow up questions, make sure to ask the user for clarification. Make sure to include any available options that need to be clarified in the follow up questions Do only the things the user specifically requested.\"\n", - " ],\n", - " new MessagesPlaceholder(\"chat_history\"),\n", - " [\"human\", \"{input}\"],\n", - " new MessagesPlaceholder(\"agent_scratchpad\"),\n", - " ]\n", - ")\n", - "\n", - "const _formatChatHistory = (chatHistory) => {\n", - " const buffer: Array = []\n", - " for (const [human, ai] of chatHistory) {\n", - " buffer.push(new HumanMessage({ content: human }))\n", - " buffer.push(new AIMessage({ content: ai }))\n", - " }\n", - " return buffer\n", - "}\n", - "\n", - "const agent = RunnableSequence.from([\n", - " {\n", - " input: (x) => x.input,\n", - " chat_history: (x) => {\n", - " if (\"chat_history\" in x) {\n", - " return _formatChatHistory(x.chat_history);\n", - " }\n", - " return [];\n", - " },\n", - " agent_scratchpad: (x) => {\n", - " if (\"steps\" in x) {\n", - " return formatToOpenAIFunctionMessages(\n", - " x.steps\n", - " );\n", - " }\n", - " return [];\n", - " },\n", - " },\n", - " prompt,\n", - " llmWithTools,\n", - " new OpenAIFunctionsAgentOutputParser(),\n", - "])\n", - "\n", - "const agentExecutor = new AgentExecutor({ agent, tools });" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "b0459833-fe84-4ebc-9823-a3a3ffd929e9", - "metadata": {}, - "outputs": [ + }, + { + "cell_type": "markdown", + "id": "e811ebad", + "metadata": {}, + "source": [ + "## Setup\n", + "#### Install dependencies\n", + "\n", + "```{=mdx}\n", + "import IntegrationInstallTooltip from \"@mdx_components/integration_install_tooltip.mdx\";\n", + "import Npm2Yarn from \"@theme/Npm2Yarn\";\n", + "\n", + "\n", + "\n", + "\n", + " langchain @langchain/community @langchain/openai neo4j-driver zod\n", + "\n", + "```\n", + "\n", + "#### Set environment variables\n", + "\n", + "We'll use OpenAI in this example:\n", + "\n", + "```env\n", + "OPENAI_API_KEY=your-api-key\n", + "\n", + "# Optional, use LangSmith for best-in-class observability\n", + "LANGSMITH_API_KEY=your-api-key\n", + "LANGCHAIN_TRACING_V2=true\n", + "```\n", + "\n", + "Next, we need to define Neo4j credentials.\n", + "Follow [these installation steps](https://neo4j.com/docs/operations-manual/current/installation/) to set up a Neo4j database.\n", + "\n", + "```env\n", + "NEO4J_URI=\"bolt://localhost:7687\"\n", + "NEO4J_USERNAME=\"neo4j\"\n", + "NEO4J_PASSWORD=\"password\"\n", + "```" + ] + }, { - "data": { - "text/plain": [ - "{\n", - " input: \u001b[32m\"Who played in Casino?\"\u001b[39m,\n", - " output: \u001b[32m'The movie \"Casino\" starred James Woods, Joe Pesci, Robert De Niro, and Sharon Stone.'\u001b[39m\n", - "}" + "cell_type": "markdown", + "id": "1e8fbc2c-b8e8-4c53-8fce-243cf99d3c1c", + "metadata": {}, + "source": [ + "The below example will create a connection with a Neo4j database and will populate it with example data about movies and their actors." ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "c84b1449-6fcd-4140-b591-cb45e8dce207", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Schema refreshed successfully.\n" + ] + }, + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import \"neo4j-driver\";\n", + "import { Neo4jGraph } from \"@langchain/community/graphs/neo4j_graph\";\n", + "\n", + "const url = Deno.env.get(\"NEO4J_URI\");\n", + "const username = Deno.env.get(\"NEO4J_USER\");\n", + "const password = Deno.env.get(\"NEO4J_PASSWORD\");\n", + "const graph = await Neo4jGraph.initialize({ url, username, password });\n", + "\n", + "// Import movie information\n", + "const moviesQuery = `LOAD CSV WITH HEADERS FROM \n", + "'https://raw.githubusercontent.com/tomasonjo/blog-datasets/main/movies/movies_small.csv'\n", + "AS row\n", + "MERGE (m:Movie {id:row.movieId})\n", + "SET m.released = date(row.released),\n", + " m.title = row.title,\n", + " m.imdbRating = toFloat(row.imdbRating)\n", + "FOREACH (director in split(row.director, '|') | \n", + " MERGE (p:Person {name:trim(director)})\n", + " MERGE (p)-[:DIRECTED]->(m))\n", + "FOREACH (actor in split(row.actors, '|') | \n", + " MERGE (p:Person {name:trim(actor)})\n", + " MERGE (p)-[:ACTED_IN]->(m))\n", + "FOREACH (genre in split(row.genres, '|') | \n", + " MERGE (g:Genre {name:trim(genre)})\n", + " MERGE (m)-[:IN_GENRE]->(g))`\n", + "\n", + "await graph.query(moviesQuery);" + ] + }, + { + "cell_type": "markdown", + "id": "403b9acd-aa0d-4157-b9de-6ec426835c43", + "metadata": {}, + "source": [ + "## Custom tools with Cypher templates\n", + "\n", + "A semantic layer consists of various tools exposed to an LLM that it can use to interact with a knowledge graph.\n", + "They can be of various complexity. You can think of each tool in a semantic layer as a function.\n", + "\n", + "The function we will implement is to retrieve information about movies or their cast." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "d1dc1c8c-f343-4024-924b-a8a86cf5f1af", + "metadata": {}, + "outputs": [], + "source": [ + "const descriptionQuery = `MATCH (m:Movie|Person)\n", + "WHERE m.title CONTAINS $candidate OR m.name CONTAINS $candidate\n", + "MATCH (m)-[r:ACTED_IN|HAS_GENRE]-(t)\n", + "WITH m, type(r) as type, collect(coalesce(t.name, t.title)) as names\n", + "WITH m, type+\": \"+reduce(s=\"\", n IN names | s + n + \", \") as types\n", + "WITH m, collect(types) as contexts\n", + "WITH m, \"type:\" + labels(m)[0] + \"\\ntitle: \"+ coalesce(m.title, m.name) \n", + " + \"\\nyear: \"+coalesce(m.released,\"\") +\"\\n\" +\n", + " reduce(s=\"\", c in contexts | s + substring(c, 0, size(c)-2) +\"\\n\") as context\n", + "RETURN context LIMIT 1`\n", + "\n", + "const getInformation = async (entity: string) => {\n", + " try {\n", + " const data = await graph.query(descriptionQuery, { candidate: entity });\n", + " return data[0][\"context\"];\n", + " } catch (error) {\n", + " return \"No information was found\";\n", + " }\n", + " \n", + "}" + ] + }, + { + "cell_type": "markdown", + "id": "bdecc24b-8065-4755-98cc-9c6d093d4897", + "metadata": {}, + "source": [ + "You can observe that we have defined the Cypher statement used to retrieve information.\n", + "Therefore, we can avoid generating Cypher statements and use the LLM agent to only populate the input parameters.\n", + "To provide additional information to an LLM agent about when to use the tool and their input parameters, we wrap the function as a tool." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "f4cde772-0d05-475d-a2f0-b53e1669bd13", + "metadata": {}, + "outputs": [], + "source": [ + "import { StructuredTool } from \"@langchain/core/tools\";\n", + "import { z } from \"zod\";\n", + "\n", + "const informationInput = z.object({\n", + " entity: z.string().describe(\"movie or a person mentioned in the question\"),\n", + "});\n", + "\n", + "class InformationTool extends StructuredTool {\n", + " schema = informationInput;\n", + "\n", + " name = \"Information\";\n", + "\n", + " description = \"useful for when you need to answer questions about various actors or movies\";\n", + "\n", + " async _call(input: z.infer): Promise {\n", + " return getInformation(input.entity);\n", + " }\n", + "}" + ] + }, + { + "cell_type": "markdown", + "id": "ff4820aa-2b57-4558-901f-6d984b326738", + "metadata": {}, + "source": [ + "## OpenAI Agent\n", + "\n", + "LangChain expression language makes it very convenient to define an agent to interact with a graph database over the semantic layer." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "6e959ac2-537d-4358-a43b-e3a47f68e1d6", + "metadata": {}, + "outputs": [], + "source": [ + "import { ChatOpenAI } from \"@langchain/openai\";\n", + "import { AgentExecutor } from \"langchain/agents\";\n", + "import { formatToOpenAIFunctionMessages } from \"langchain/agents/format_scratchpad\";\n", + "import { OpenAIFunctionsAgentOutputParser } from \"langchain/agents/openai/output_parser\";\n", + "import { convertToOpenAIFunction } from \"@langchain/core/utils/function_calling\";\n", + "import { ChatPromptTemplate, MessagesPlaceholder } from \"@langchain/core/prompts\";\n", + "import { AIMessage, BaseMessage, HumanMessage } from \"@langchain/core/messages\";\n", + "import { RunnableSequence } from \"@langchain/core/runnables\";\n", + "\n", + "const llm = new ChatOpenAI({ model: \"gpt-3.5-turbo\", temperature: 0 })\n", + "const tools = [new InformationTool()]\n", + "\n", + "const llmWithTools = llm.bind({\n", + " functions: tools.map(convertToOpenAIFunction),\n", + "})\n", + "\n", + "const prompt = ChatPromptTemplate.fromMessages(\n", + " [\n", + " [\n", + " \"system\",\n", + " \"You are a helpful assistant that finds information about movies and recommends them. If tools require follow up questions, make sure to ask the user for clarification. Make sure to include any available options that need to be clarified in the follow up questions Do only the things the user specifically requested.\"\n", + " ],\n", + " new MessagesPlaceholder(\"chat_history\"),\n", + " [\"human\", \"{input}\"],\n", + " new MessagesPlaceholder(\"agent_scratchpad\"),\n", + " ]\n", + ")\n", + "\n", + "const _formatChatHistory = (chatHistory) => {\n", + " const buffer: Array = []\n", + " for (const [human, ai] of chatHistory) {\n", + " buffer.push(new HumanMessage({ content: human }))\n", + " buffer.push(new AIMessage({ content: ai }))\n", + " }\n", + " return buffer\n", + "}\n", + "\n", + "const agent = RunnableSequence.from([\n", + " {\n", + " input: (x) => x.input,\n", + " chat_history: (x) => {\n", + " if (\"chat_history\" in x) {\n", + " return _formatChatHistory(x.chat_history);\n", + " }\n", + " return [];\n", + " },\n", + " agent_scratchpad: (x) => {\n", + " if (\"steps\" in x) {\n", + " return formatToOpenAIFunctionMessages(\n", + " x.steps\n", + " );\n", + " }\n", + " return [];\n", + " },\n", + " },\n", + " prompt,\n", + " llmWithTools,\n", + " new OpenAIFunctionsAgentOutputParser(),\n", + "])\n", + "\n", + "const agentExecutor = new AgentExecutor({ agent, tools });" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "b0459833-fe84-4ebc-9823-a3a3ffd929e9", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{\n", + " input: \u001b[32m\"Who played in Casino?\"\u001b[39m,\n", + " output: \u001b[32m'The movie \"Casino\" starred James Woods, Joe Pesci, Robert De Niro, and Sharon Stone.'\u001b[39m\n", + "}" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "await agentExecutor.invoke({ input: \"Who played in Casino?\" })" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Deno", + "language": "typescript", + "name": "deno" + }, + "language_info": { + "file_extension": ".ts", + "mimetype": "text/x.typescript", + "name": "typescript", + "nb_converter": "script", + "pygments_lexer": "typescript", + "version": "5.3.3" } - ], - "source": [ - "await agentExecutor.invoke({ input: \"Who played in Casino?\" })" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Deno", - "language": "typescript", - "name": "deno" }, - "language_info": { - "file_extension": ".ts", - "mimetype": "text/x.typescript", - "name": "typescript", - "nb_converter": "script", - "pygments_lexer": "typescript", - "version": "5.3.3" - } - }, - "nbformat": 4, - "nbformat_minor": 5 + "nbformat": 4, + "nbformat_minor": 5 } diff --git a/docs/core_docs/docs/use_cases/query_analysis/how_to/high_cardinality.ipynb b/docs/core_docs/docs/use_cases/query_analysis/how_to/high_cardinality.ipynb index 2c0dd22e7a20..fcb9b9582553 100644 --- a/docs/core_docs/docs/use_cases/query_analysis/how_to/high_cardinality.ipynb +++ b/docs/core_docs/docs/use_cases/query_analysis/how_to/high_cardinality.ipynb @@ -1,646 +1,646 @@ { - "cells": [ - { - "cell_type": "raw", - "id": "df7d42b9-58a6-434c-a2d7-0b61142f6d3e", - "metadata": {}, - "source": [ - "---\n", - "sidebar_position: 7\n", - "---" - ] - }, - { - "cell_type": "markdown", - "id": "f2195672-0cab-4967-ba8a-c6544635547d", - "metadata": {}, - "source": [ - "# Deal with High Cardinality Categoricals\n", - "\n", - "You may want to do query analysis to create a filter on a categorical column. One of the difficulties here is that you usually need to specify the EXACT categorical value. The issue is you need to make sure the LLM generates that categorical value exactly. This can be done relatively easy with prompting when there are only a few values that are valid. When there are a high number of valid values then it becomes more difficult, as those values may not fit in the LLM context, or (if they do) there may be too many for the LLM to properly attend to.\n", - "\n", - "In this notebook we take a look at how to approach this." - ] - }, - { - "cell_type": "markdown", - "id": "a4079b57-4369-49c9-b2ad-c809b5408d7e", - "metadata": {}, - "source": [ - "## Setup\n", - "#### Install dependencies\n", - "\n", - "```{=mdx}\n", - "import IntegrationInstallTooltip from \"@mdx_components/integration_install_tooltip.mdx\";\n", - "import Npm2Yarn from \"@theme/Npm2Yarn\";\n", - "\n", - "\n", - "\n", - "\n", - " @langchain/core @langchain/community zod chromadb @faker-js/faker\n", - "\n", - "```\n", - "\n", - "#### Set environment variables\n", - "\n", - "```\n", - "# Optional, use LangSmith for best-in-class observability\n", - "LANGSMITH_API_KEY=your-api-key\n", - "LANGCHAIN_TRACING_V2=true\n", - "```" - ] - }, - { - "cell_type": "markdown", - "id": "d8d47f4b", - "metadata": {}, - "source": [ - "#### Set up data\n", - "\n", - "We will generate a bunch of fake names" - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "id": "e5ba65c2", - "metadata": {}, - "outputs": [], - "source": [ - "import { faker } from \"@faker-js/faker\";\n", - "\n", - "const names = Array.from({ length: 10000 }, () => faker.person.fullName());" - ] - }, - { - "cell_type": "markdown", - "id": "41133694", - "metadata": {}, - "source": [ - "Let's look at some of the names" - ] - }, - { - "cell_type": "code", - "execution_count": 46, - "id": "c901ea97", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "\u001b[32m\"Dale Kessler\"\u001b[39m" - ] - }, - "execution_count": 46, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "names[0]" - ] - }, - { - "cell_type": "code", - "execution_count": 47, - "id": "b0d42ae2", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "\u001b[32m\"Mrs. Chelsea Bayer MD\"\u001b[39m" - ] - }, - "execution_count": 47, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "names[567]" - ] - }, - { - "cell_type": "markdown", - "id": "1725883d", - "metadata": {}, - "source": [ - "## Query Analysis\n", - "\n", - "We can now set up a baseline query analysis" - ] - }, - { - "cell_type": "code", - "execution_count": 48, - "id": "6c9485ce", - "metadata": {}, - "outputs": [], - "source": [ - "import { z } from \"zod\";\n", - "\n", - "const searchSchema = z.object({\n", - " query: z.string(),\n", - " author: z.string(),\n", - "})" - ] - }, - { - "cell_type": "markdown", - "id": "0c02d1b3", - "metadata": {}, - "source": [ - "```{=mdx}\n", - "import ChatModelTabs from \"@theme/ChatModelTabs\";\n", - "\n", - "\n", - "```" - ] - }, - { - "cell_type": "code", - "execution_count": 49, - "id": "aebd704a", - "metadata": {}, - "outputs": [], - "source": [ - "import { ChatPromptTemplate } from \"@langchain/core/prompts\";\n", - "import { RunnablePassthrough, RunnableSequence } from \"@langchain/core/runnables\";\n", - "\n", - "const system = `Generate a relevant search query for a library system`;\n", - "const prompt = ChatPromptTemplate.fromMessages(\n", - " [\n", - " [\"system\", system],\n", - " [\"human\", \"{question}\"],\n", - " ]\n", - ")\n", - "const llmWithTools = llm.withStructuredOutput(searchSchema, {\n", - " name: \"Search\"\n", - "})\n", - "const queryAnalyzer = RunnableSequence.from([\n", - " {\n", - " question: new RunnablePassthrough(),\n", - " },\n", - " prompt,\n", - " llmWithTools\n", - "]);" - ] - }, - { - "cell_type": "markdown", - "id": "41709a2e", - "metadata": {}, - "source": [ - "We can see that if we spell the name exactly correctly, it knows how to handle it" - ] - }, - { - "cell_type": "code", - "execution_count": 50, - "id": "cc0d344b", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{ query: \u001b[32m\"books about aliens\"\u001b[39m, author: \u001b[32m\"Jesse Knight\"\u001b[39m }" - ] - }, - "execution_count": 50, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "await queryAnalyzer.invoke(\"what are books about aliens by Jesse Knight\")" - ] - }, - { - "cell_type": "markdown", - "id": "a1b57eab", - "metadata": {}, - "source": [ - "The issue is that the values you want to filter on may NOT be spelled exactly correctly" - ] - }, - { - "cell_type": "code", - "execution_count": 51, - "id": "82b6b2ad", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{ query: \u001b[32m\"books about aliens\"\u001b[39m, author: \u001b[32m\"Jess Knight\"\u001b[39m }" - ] - }, - "execution_count": 51, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "await queryAnalyzer.invoke(\"what are books about aliens by jess knight\")" - ] - }, - { - "cell_type": "markdown", - "id": "0b60b7c2", - "metadata": {}, - "source": [ - "### Add in all values\n", - "\n", - "One way around this is to add ALL possible values to the prompt. That will generally guide the query in the right direction" - ] - }, - { - "cell_type": "code", - "execution_count": 52, - "id": "98788a94", - "metadata": {}, - "outputs": [], - "source": [ - "const system = `Generate a relevant search query for a library system using the 'search' tool.\n", - "\n", - "The 'author' you return to the user MUST be one of the following authors:\n", - "\n", - "{authors}\n", - "\n", - "Do NOT hallucinate author name!`\n", - "const basePrompt = ChatPromptTemplate.fromMessages(\n", - " [\n", - " [\"system\", system],\n", - " [\"human\", \"{question}\"],\n", - " ]\n", - ")\n", - "const prompt = await basePrompt.partial({ authors: names.join(\", \") })" - ] - }, - { - "cell_type": "code", - "execution_count": 53, - "id": "e65412f5", - "metadata": {}, - "outputs": [], - "source": [ - "const queryAnalyzerAll = RunnableSequence.from([\n", - " {\n", - " question: new RunnablePassthrough(),\n", - " },\n", - " prompt,\n", - " llmWithTools\n", - "])" - ] - }, - { - "cell_type": "markdown", - "id": "e639285a", - "metadata": {}, - "source": [ - "However... if the list of categoricals is long enough, it may error!" - ] - }, - { - "cell_type": "code", - "execution_count": 54, - "id": "696b000f", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Error: 400 This model's maximum context length is 16385 tokens. However, your messages resulted in 49822 tokens (49792 in the messages, 30 in the functions). Please reduce the length of the messages or functions.\n", - " at Function.generate (file:///Users/bracesproul/Library/Caches/deno/npm/registry.npmjs.org/openai/4.28.4/error.mjs:40:20)\n", - " at OpenAI.makeStatusError (file:///Users/bracesproul/Library/Caches/deno/npm/registry.npmjs.org/openai/4.28.4/core.mjs:256:25)\n", - " at OpenAI.makeRequest (file:///Users/bracesproul/Library/Caches/deno/npm/registry.npmjs.org/openai/4.28.4/core.mjs:299:30)\n", - " at eventLoopTick (ext:core/01_core.js:63:7)\n", - " at async file:///Users/bracesproul/Library/Caches/deno/npm/registry.npmjs.org/@langchain/openai/0.0.15/dist/chat_models.js:650:29\n", - " at async RetryOperation._fn (file:///Users/bracesproul/Library/Caches/deno/npm/registry.npmjs.org/p-retry/4.6.2/index.js:50:12) {\n", - " status: 400,\n", - " headers: {\n", - " \"access-control-allow-origin\": \"*\",\n", - " \"alt-svc\": 'h3=\":443\"; ma=86400',\n", - " \"cf-cache-status\": \"DYNAMIC\",\n", - " \"cf-ray\": \"85f6e713581815d0-SJC\",\n", - " \"content-length\": \"341\",\n", - " \"content-type\": \"application/json\",\n", - " date: \"Tue, 05 Mar 2024 03:08:39 GMT\",\n", - " \"openai-organization\": \"langchain\",\n", - " \"openai-processing-ms\": \"349\",\n", - " \"openai-version\": \"2020-10-01\",\n", - " server: \"cloudflare\",\n", - " \"set-cookie\": \"_cfuvid=NXe7nstRj6UNdFs5F8k49JZF6Tz7EE8dfKwYRpV3AWI-1709608119946-0.0.1.1-604800000; path=/; domain=\"... 48 more characters,\n", - " \"strict-transport-security\": \"max-age=15724800; includeSubDomains\",\n", - " \"x-ratelimit-limit-requests\": \"10000\",\n", - " \"x-ratelimit-limit-tokens\": \"2000000\",\n", - " \"x-ratelimit-remaining-requests\": \"9999\",\n", - " \"x-ratelimit-remaining-tokens\": \"1958537\",\n", - " \"x-ratelimit-reset-requests\": \"6ms\",\n", - " \"x-ratelimit-reset-tokens\": \"1.243s\",\n", - " \"x-request-id\": \"req_99890749d442033c6145f9a8f1324aea\"\n", - " },\n", - " error: {\n", - " message: \"This model's maximum context length is 16385 tokens. However, your messages resulted in 49822 tokens\"... 101 more characters,\n", - " type: \"invalid_request_error\",\n", - " param: \"messages\",\n", - " code: \"context_length_exceeded\"\n", - " },\n", - " code: \"context_length_exceeded\",\n", - " param: \"messages\",\n", - " type: \"invalid_request_error\",\n", - " attemptNumber: 1,\n", - " retriesLeft: 6\n", - "}\n" - ] - } - ], - "source": [ - "try {\n", - " const res = await queryAnalyzerAll.invoke(\"what are books about aliens by jess knight\")\n", - "} catch (e) {\n", - " console.error(e)\n", - "}" - ] - }, - { - "cell_type": "markdown", - "id": "1d5d7891", - "metadata": {}, - "source": [ - "We can try to use a longer context window... but with so much information in there, it is not garunteed to pick it up reliably" - ] - }, - { - "cell_type": "markdown", - "id": "618a9762", - "metadata": {}, - "source": [ - "```{=mdx}\n", - "\n", - "```" - ] - }, - { - "cell_type": "code", - "execution_count": 55, - "id": "0f0d0757", - "metadata": {}, - "outputs": [], - "source": [ - "const structuredLlmLong = llmLong.withStructuredOutput(searchSchema, {\n", - " name: \"Search\"\n", - "});\n", - "const queryAnalyzerAll = RunnableSequence.from([\n", - " {\n", - " question: new RunnablePassthrough(),\n", - " },\n", - " prompt,\n", - " structuredLlmLong\n", - "]);" - ] - }, - { - "cell_type": "code", - "execution_count": 56, - "id": "03e5b7b2", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{ query: \u001b[32m\"aliens\"\u001b[39m, author: \u001b[32m\"Jess Knight\"\u001b[39m }" - ] - }, - "execution_count": 56, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "await queryAnalyzerAll.invoke(\"what are books about aliens by jess knight\")" - ] - }, - { - "cell_type": "markdown", - "id": "73ecf52b", - "metadata": {}, - "source": [ - "### Find and all relevant values\n", - "\n", - "Instead, what we can do is create an index over the relevant values and then query that for the N most relevant values," - ] - }, - { - "cell_type": "code", - "execution_count": 57, - "id": "32b19e07", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[Module: null prototype] {\n", - " AdminClient: \u001b[36m[class AdminClient]\u001b[39m,\n", - " ChromaClient: \u001b[36m[class ChromaClient]\u001b[39m,\n", - " CloudClient: \u001b[36m[class CloudClient extends ChromaClient]\u001b[39m,\n", - " CohereEmbeddingFunction: \u001b[36m[class CohereEmbeddingFunction]\u001b[39m,\n", - " Collection: \u001b[36m[class Collection]\u001b[39m,\n", - " DefaultEmbeddingFunction: \u001b[36m[class _DefaultEmbeddingFunction]\u001b[39m,\n", - " GoogleGenerativeAiEmbeddingFunction: \u001b[36m[class _GoogleGenerativeAiEmbeddingFunction]\u001b[39m,\n", - " HuggingFaceEmbeddingServerFunction: \u001b[36m[class HuggingFaceEmbeddingServerFunction]\u001b[39m,\n", - " IncludeEnum: {\n", - " Documents: \u001b[32m\"documents\"\u001b[39m,\n", - " Embeddings: \u001b[32m\"embeddings\"\u001b[39m,\n", - " Metadatas: \u001b[32m\"metadatas\"\u001b[39m,\n", - " Distances: \u001b[32m\"distances\"\u001b[39m\n", - " },\n", - " JinaEmbeddingFunction: \u001b[36m[class JinaEmbeddingFunction]\u001b[39m,\n", - " OpenAIEmbeddingFunction: \u001b[36m[class _OpenAIEmbeddingFunction]\u001b[39m,\n", - " TransformersEmbeddingFunction: \u001b[36m[class _TransformersEmbeddingFunction]\u001b[39m\n", - "}" - ] - }, - "execution_count": 57, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import { Chroma } from \"@langchain/community/vectorstores/chroma\";\n", - "import { OpenAIEmbeddings } from \"@langchain/openai\";\n", - "import \"chromadb\";\n", - "\n", - "const embeddings = new OpenAIEmbeddings({\n", - " modelName: \"text-embedding-3-small\",\n", - "})\n", - "const vectorstore = await Chroma.fromTexts(names, {}, embeddings, {\n", - " collectionName: \"author_names\"\n", - "})" - ] - }, - { - "cell_type": "code", - "execution_count": 58, - "id": "774cb7b0", - "metadata": {}, - "outputs": [], - "source": [ - "const selectNames = async (question: string) => {\n", - " const _docs = await vectorstore.similaritySearch(question, 10);\n", - " const _names = _docs.map(d => d.pageContent);\n", - " return _names.join(\", \");\n", - "}" - ] - }, - { - "cell_type": "code", - "execution_count": 59, - "id": "1173159c", - "metadata": {}, - "outputs": [], - "source": [ - "const createPrompt = RunnableSequence.from([\n", - " {\n", - " question: new RunnablePassthrough(),\n", - " authors: selectNames,\n", - " },\n", - " basePrompt\n", - "])" - ] - }, - { - "cell_type": "code", - "execution_count": 60, - "id": "0a892607", - "metadata": {}, - "outputs": [], - "source": [ - "const queryAnalyzerSelect = createPrompt.pipe(llmWithTools);" - ] - }, - { - "cell_type": "code", - "execution_count": 61, - "id": "8195d7cd", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "ChatPromptValue {\n", - " lc_serializable: \u001b[33mtrue\u001b[39m,\n", - " lc_kwargs: {\n", - " messages: [\n", - " SystemMessage {\n", - " lc_serializable: \u001b[33mtrue\u001b[39m,\n", - " lc_kwargs: {\n", - " content: \u001b[32m\"Generate a relevant search query for a library system using the 'search' tool.\\n\"\u001b[39m +\n", - " \u001b[32m\"\\n\"\u001b[39m +\n", - " \u001b[32m\"The 'author' you ret\"\u001b[39m... 259 more characters,\n", - " additional_kwargs: {}\n", - " },\n", - " lc_namespace: [ \u001b[32m\"langchain_core\"\u001b[39m, \u001b[32m\"messages\"\u001b[39m ],\n", - " content: \u001b[32m\"Generate a relevant search query for a library system using the 'search' tool.\\n\"\u001b[39m +\n", - " \u001b[32m\"\\n\"\u001b[39m +\n", - " \u001b[32m\"The 'author' you ret\"\u001b[39m... 259 more characters,\n", - " name: \u001b[90mundefined\u001b[39m,\n", - " additional_kwargs: {}\n", - " },\n", - " HumanMessage {\n", - " lc_serializable: \u001b[33mtrue\u001b[39m,\n", - " lc_kwargs: {\n", - " content: \u001b[32m\"what are books by jess knight\"\u001b[39m,\n", - " additional_kwargs: {}\n", - " },\n", - " lc_namespace: [ \u001b[32m\"langchain_core\"\u001b[39m, \u001b[32m\"messages\"\u001b[39m ],\n", - " content: \u001b[32m\"what are books by jess knight\"\u001b[39m,\n", - " name: \u001b[90mundefined\u001b[39m,\n", - " additional_kwargs: {}\n", - " }\n", - " ]\n", - " },\n", - " lc_namespace: [ \u001b[32m\"langchain_core\"\u001b[39m, \u001b[32m\"prompt_values\"\u001b[39m ],\n", - " messages: [\n", - " SystemMessage {\n", - " lc_serializable: \u001b[33mtrue\u001b[39m,\n", - " lc_kwargs: {\n", - " content: \u001b[32m\"Generate a relevant search query for a library system using the 'search' tool.\\n\"\u001b[39m +\n", - " \u001b[32m\"\\n\"\u001b[39m +\n", - " \u001b[32m\"The 'author' you ret\"\u001b[39m... 259 more characters,\n", - " additional_kwargs: {}\n", - " },\n", - " lc_namespace: [ \u001b[32m\"langchain_core\"\u001b[39m, \u001b[32m\"messages\"\u001b[39m ],\n", - " content: \u001b[32m\"Generate a relevant search query for a library system using the 'search' tool.\\n\"\u001b[39m +\n", - " \u001b[32m\"\\n\"\u001b[39m +\n", - " \u001b[32m\"The 'author' you ret\"\u001b[39m... 259 more characters,\n", - " name: \u001b[90mundefined\u001b[39m,\n", - " additional_kwargs: {}\n", - " },\n", - " HumanMessage {\n", - " lc_serializable: \u001b[33mtrue\u001b[39m,\n", - " lc_kwargs: {\n", - " content: \u001b[32m\"what are books by jess knight\"\u001b[39m,\n", - " additional_kwargs: {}\n", - " },\n", - " lc_namespace: [ \u001b[32m\"langchain_core\"\u001b[39m, \u001b[32m\"messages\"\u001b[39m ],\n", - " content: \u001b[32m\"what are books by jess knight\"\u001b[39m,\n", - " name: \u001b[90mundefined\u001b[39m,\n", - " additional_kwargs: {}\n", - " }\n", - " ]\n", - "}" - ] - }, - "execution_count": 61, - "metadata": {}, - "output_type": "execute_result" + "cells": [ + { + "cell_type": "raw", + "id": "df7d42b9-58a6-434c-a2d7-0b61142f6d3e", + "metadata": {}, + "source": [ + "---\n", + "sidebar_position: 7\n", + "---" + ] + }, + { + "cell_type": "markdown", + "id": "f2195672-0cab-4967-ba8a-c6544635547d", + "metadata": {}, + "source": [ + "# Deal with High Cardinality Categoricals\n", + "\n", + "You may want to do query analysis to create a filter on a categorical column. One of the difficulties here is that you usually need to specify the EXACT categorical value. The issue is you need to make sure the LLM generates that categorical value exactly. This can be done relatively easy with prompting when there are only a few values that are valid. When there are a high number of valid values then it becomes more difficult, as those values may not fit in the LLM context, or (if they do) there may be too many for the LLM to properly attend to.\n", + "\n", + "In this notebook we take a look at how to approach this." + ] + }, + { + "cell_type": "markdown", + "id": "a4079b57-4369-49c9-b2ad-c809b5408d7e", + "metadata": {}, + "source": [ + "## Setup\n", + "#### Install dependencies\n", + "\n", + "```{=mdx}\n", + "import IntegrationInstallTooltip from \"@mdx_components/integration_install_tooltip.mdx\";\n", + "import Npm2Yarn from \"@theme/Npm2Yarn\";\n", + "\n", + "\n", + "\n", + "\n", + " @langchain/core @langchain/community zod chromadb @faker-js/faker\n", + "\n", + "```\n", + "\n", + "#### Set environment variables\n", + "\n", + "```\n", + "# Optional, use LangSmith for best-in-class observability\n", + "LANGSMITH_API_KEY=your-api-key\n", + "LANGCHAIN_TRACING_V2=true\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "d8d47f4b", + "metadata": {}, + "source": [ + "#### Set up data\n", + "\n", + "We will generate a bunch of fake names" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "id": "e5ba65c2", + "metadata": {}, + "outputs": [], + "source": [ + "import { faker } from \"@faker-js/faker\";\n", + "\n", + "const names = Array.from({ length: 10000 }, () => faker.person.fullName());" + ] + }, + { + "cell_type": "markdown", + "id": "41133694", + "metadata": {}, + "source": [ + "Let's look at some of the names" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "id": "c901ea97", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "\u001b[32m\"Dale Kessler\"\u001b[39m" + ] + }, + "execution_count": 46, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "names[0]" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "id": "b0d42ae2", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "\u001b[32m\"Mrs. Chelsea Bayer MD\"\u001b[39m" + ] + }, + "execution_count": 47, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "names[567]" + ] + }, + { + "cell_type": "markdown", + "id": "1725883d", + "metadata": {}, + "source": [ + "## Query Analysis\n", + "\n", + "We can now set up a baseline query analysis" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "id": "6c9485ce", + "metadata": {}, + "outputs": [], + "source": [ + "import { z } from \"zod\";\n", + "\n", + "const searchSchema = z.object({\n", + " query: z.string(),\n", + " author: z.string(),\n", + "})" + ] + }, + { + "cell_type": "markdown", + "id": "0c02d1b3", + "metadata": {}, + "source": [ + "```{=mdx}\n", + "import ChatModelTabs from \"@theme/ChatModelTabs\";\n", + "\n", + "\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "id": "aebd704a", + "metadata": {}, + "outputs": [], + "source": [ + "import { ChatPromptTemplate } from \"@langchain/core/prompts\";\n", + "import { RunnablePassthrough, RunnableSequence } from \"@langchain/core/runnables\";\n", + "\n", + "const system = `Generate a relevant search query for a library system`;\n", + "const prompt = ChatPromptTemplate.fromMessages(\n", + " [\n", + " [\"system\", system],\n", + " [\"human\", \"{question}\"],\n", + " ]\n", + ")\n", + "const llmWithTools = llm.withStructuredOutput(searchSchema, {\n", + " name: \"Search\"\n", + "})\n", + "const queryAnalyzer = RunnableSequence.from([\n", + " {\n", + " question: new RunnablePassthrough(),\n", + " },\n", + " prompt,\n", + " llmWithTools\n", + "]);" + ] + }, + { + "cell_type": "markdown", + "id": "41709a2e", + "metadata": {}, + "source": [ + "We can see that if we spell the name exactly correctly, it knows how to handle it" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "id": "cc0d344b", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{ query: \u001b[32m\"books about aliens\"\u001b[39m, author: \u001b[32m\"Jesse Knight\"\u001b[39m }" + ] + }, + "execution_count": 50, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "await queryAnalyzer.invoke(\"what are books about aliens by Jesse Knight\")" + ] + }, + { + "cell_type": "markdown", + "id": "a1b57eab", + "metadata": {}, + "source": [ + "The issue is that the values you want to filter on may NOT be spelled exactly correctly" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "id": "82b6b2ad", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{ query: \u001b[32m\"books about aliens\"\u001b[39m, author: \u001b[32m\"Jess Knight\"\u001b[39m }" + ] + }, + "execution_count": 51, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "await queryAnalyzer.invoke(\"what are books about aliens by jess knight\")" + ] + }, + { + "cell_type": "markdown", + "id": "0b60b7c2", + "metadata": {}, + "source": [ + "### Add in all values\n", + "\n", + "One way around this is to add ALL possible values to the prompt. That will generally guide the query in the right direction" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "id": "98788a94", + "metadata": {}, + "outputs": [], + "source": [ + "const system = `Generate a relevant search query for a library system using the 'search' tool.\n", + "\n", + "The 'author' you return to the user MUST be one of the following authors:\n", + "\n", + "{authors}\n", + "\n", + "Do NOT hallucinate author name!`\n", + "const basePrompt = ChatPromptTemplate.fromMessages(\n", + " [\n", + " [\"system\", system],\n", + " [\"human\", \"{question}\"],\n", + " ]\n", + ")\n", + "const prompt = await basePrompt.partial({ authors: names.join(\", \") })" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "id": "e65412f5", + "metadata": {}, + "outputs": [], + "source": [ + "const queryAnalyzerAll = RunnableSequence.from([\n", + " {\n", + " question: new RunnablePassthrough(),\n", + " },\n", + " prompt,\n", + " llmWithTools\n", + "])" + ] + }, + { + "cell_type": "markdown", + "id": "e639285a", + "metadata": {}, + "source": [ + "However... if the list of categoricals is long enough, it may error!" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "id": "696b000f", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Error: 400 This model's maximum context length is 16385 tokens. However, your messages resulted in 49822 tokens (49792 in the messages, 30 in the functions). Please reduce the length of the messages or functions.\n", + " at Function.generate (file:///Users/bracesproul/Library/Caches/deno/npm/registry.npmjs.org/openai/4.28.4/error.mjs:40:20)\n", + " at OpenAI.makeStatusError (file:///Users/bracesproul/Library/Caches/deno/npm/registry.npmjs.org/openai/4.28.4/core.mjs:256:25)\n", + " at OpenAI.makeRequest (file:///Users/bracesproul/Library/Caches/deno/npm/registry.npmjs.org/openai/4.28.4/core.mjs:299:30)\n", + " at eventLoopTick (ext:core/01_core.js:63:7)\n", + " at async file:///Users/bracesproul/Library/Caches/deno/npm/registry.npmjs.org/@langchain/openai/0.0.15/dist/chat_models.js:650:29\n", + " at async RetryOperation._fn (file:///Users/bracesproul/Library/Caches/deno/npm/registry.npmjs.org/p-retry/4.6.2/index.js:50:12) {\n", + " status: 400,\n", + " headers: {\n", + " \"access-control-allow-origin\": \"*\",\n", + " \"alt-svc\": 'h3=\":443\"; ma=86400',\n", + " \"cf-cache-status\": \"DYNAMIC\",\n", + " \"cf-ray\": \"85f6e713581815d0-SJC\",\n", + " \"content-length\": \"341\",\n", + " \"content-type\": \"application/json\",\n", + " date: \"Tue, 05 Mar 2024 03:08:39 GMT\",\n", + " \"openai-organization\": \"langchain\",\n", + " \"openai-processing-ms\": \"349\",\n", + " \"openai-version\": \"2020-10-01\",\n", + " server: \"cloudflare\",\n", + " \"set-cookie\": \"_cfuvid=NXe7nstRj6UNdFs5F8k49JZF6Tz7EE8dfKwYRpV3AWI-1709608119946-0.0.1.1-604800000; path=/; domain=\"... 48 more characters,\n", + " \"strict-transport-security\": \"max-age=15724800; includeSubDomains\",\n", + " \"x-ratelimit-limit-requests\": \"10000\",\n", + " \"x-ratelimit-limit-tokens\": \"2000000\",\n", + " \"x-ratelimit-remaining-requests\": \"9999\",\n", + " \"x-ratelimit-remaining-tokens\": \"1958537\",\n", + " \"x-ratelimit-reset-requests\": \"6ms\",\n", + " \"x-ratelimit-reset-tokens\": \"1.243s\",\n", + " \"x-request-id\": \"req_99890749d442033c6145f9a8f1324aea\"\n", + " },\n", + " error: {\n", + " message: \"This model's maximum context length is 16385 tokens. However, your messages resulted in 49822 tokens\"... 101 more characters,\n", + " type: \"invalid_request_error\",\n", + " param: \"messages\",\n", + " code: \"context_length_exceeded\"\n", + " },\n", + " code: \"context_length_exceeded\",\n", + " param: \"messages\",\n", + " type: \"invalid_request_error\",\n", + " attemptNumber: 1,\n", + " retriesLeft: 6\n", + "}\n" + ] + } + ], + "source": [ + "try {\n", + " const res = await queryAnalyzerAll.invoke(\"what are books about aliens by jess knight\")\n", + "} catch (e) {\n", + " console.error(e)\n", + "}" + ] + }, + { + "cell_type": "markdown", + "id": "1d5d7891", + "metadata": {}, + "source": [ + "We can try to use a longer context window... but with so much information in there, it is not garunteed to pick it up reliably" + ] + }, + { + "cell_type": "markdown", + "id": "618a9762", + "metadata": {}, + "source": [ + "```{=mdx}\n", + "\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "id": "0f0d0757", + "metadata": {}, + "outputs": [], + "source": [ + "const structuredLlmLong = llmLong.withStructuredOutput(searchSchema, {\n", + " name: \"Search\"\n", + "});\n", + "const queryAnalyzerAll = RunnableSequence.from([\n", + " {\n", + " question: new RunnablePassthrough(),\n", + " },\n", + " prompt,\n", + " structuredLlmLong\n", + "]);" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "id": "03e5b7b2", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{ query: \u001b[32m\"aliens\"\u001b[39m, author: \u001b[32m\"Jess Knight\"\u001b[39m }" + ] + }, + "execution_count": 56, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "await queryAnalyzerAll.invoke(\"what are books about aliens by jess knight\")" + ] + }, + { + "cell_type": "markdown", + "id": "73ecf52b", + "metadata": {}, + "source": [ + "### Find and all relevant values\n", + "\n", + "Instead, what we can do is create an index over the relevant values and then query that for the N most relevant values," + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "id": "32b19e07", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[Module: null prototype] {\n", + " AdminClient: \u001b[36m[class AdminClient]\u001b[39m,\n", + " ChromaClient: \u001b[36m[class ChromaClient]\u001b[39m,\n", + " CloudClient: \u001b[36m[class CloudClient extends ChromaClient]\u001b[39m,\n", + " CohereEmbeddingFunction: \u001b[36m[class CohereEmbeddingFunction]\u001b[39m,\n", + " Collection: \u001b[36m[class Collection]\u001b[39m,\n", + " DefaultEmbeddingFunction: \u001b[36m[class _DefaultEmbeddingFunction]\u001b[39m,\n", + " GoogleGenerativeAiEmbeddingFunction: \u001b[36m[class _GoogleGenerativeAiEmbeddingFunction]\u001b[39m,\n", + " HuggingFaceEmbeddingServerFunction: \u001b[36m[class HuggingFaceEmbeddingServerFunction]\u001b[39m,\n", + " IncludeEnum: {\n", + " Documents: \u001b[32m\"documents\"\u001b[39m,\n", + " Embeddings: \u001b[32m\"embeddings\"\u001b[39m,\n", + " Metadatas: \u001b[32m\"metadatas\"\u001b[39m,\n", + " Distances: \u001b[32m\"distances\"\u001b[39m\n", + " },\n", + " JinaEmbeddingFunction: \u001b[36m[class JinaEmbeddingFunction]\u001b[39m,\n", + " OpenAIEmbeddingFunction: \u001b[36m[class _OpenAIEmbeddingFunction]\u001b[39m,\n", + " TransformersEmbeddingFunction: \u001b[36m[class _TransformersEmbeddingFunction]\u001b[39m\n", + "}" + ] + }, + "execution_count": 57, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import { Chroma } from \"@langchain/community/vectorstores/chroma\";\n", + "import { OpenAIEmbeddings } from \"@langchain/openai\";\n", + "import \"chromadb\";\n", + "\n", + "const embeddings = new OpenAIEmbeddings({\n", + " model: \"text-embedding-3-small\",\n", + "})\n", + "const vectorstore = await Chroma.fromTexts(names, {}, embeddings, {\n", + " collectionName: \"author_names\"\n", + "})" + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "id": "774cb7b0", + "metadata": {}, + "outputs": [], + "source": [ + "const selectNames = async (question: string) => {\n", + " const _docs = await vectorstore.similaritySearch(question, 10);\n", + " const _names = _docs.map(d => d.pageContent);\n", + " return _names.join(\", \");\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "id": "1173159c", + "metadata": {}, + "outputs": [], + "source": [ + "const createPrompt = RunnableSequence.from([\n", + " {\n", + " question: new RunnablePassthrough(),\n", + " authors: selectNames,\n", + " },\n", + " basePrompt\n", + "])" + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "id": "0a892607", + "metadata": {}, + "outputs": [], + "source": [ + "const queryAnalyzerSelect = createPrompt.pipe(llmWithTools);" + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "id": "8195d7cd", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "ChatPromptValue {\n", + " lc_serializable: \u001b[33mtrue\u001b[39m,\n", + " lc_kwargs: {\n", + " messages: [\n", + " SystemMessage {\n", + " lc_serializable: \u001b[33mtrue\u001b[39m,\n", + " lc_kwargs: {\n", + " content: \u001b[32m\"Generate a relevant search query for a library system using the 'search' tool.\\n\"\u001b[39m +\n", + " \u001b[32m\"\\n\"\u001b[39m +\n", + " \u001b[32m\"The 'author' you ret\"\u001b[39m... 259 more characters,\n", + " additional_kwargs: {}\n", + " },\n", + " lc_namespace: [ \u001b[32m\"langchain_core\"\u001b[39m, \u001b[32m\"messages\"\u001b[39m ],\n", + " content: \u001b[32m\"Generate a relevant search query for a library system using the 'search' tool.\\n\"\u001b[39m +\n", + " \u001b[32m\"\\n\"\u001b[39m +\n", + " \u001b[32m\"The 'author' you ret\"\u001b[39m... 259 more characters,\n", + " name: \u001b[90mundefined\u001b[39m,\n", + " additional_kwargs: {}\n", + " },\n", + " HumanMessage {\n", + " lc_serializable: \u001b[33mtrue\u001b[39m,\n", + " lc_kwargs: {\n", + " content: \u001b[32m\"what are books by jess knight\"\u001b[39m,\n", + " additional_kwargs: {}\n", + " },\n", + " lc_namespace: [ \u001b[32m\"langchain_core\"\u001b[39m, \u001b[32m\"messages\"\u001b[39m ],\n", + " content: \u001b[32m\"what are books by jess knight\"\u001b[39m,\n", + " name: \u001b[90mundefined\u001b[39m,\n", + " additional_kwargs: {}\n", + " }\n", + " ]\n", + " },\n", + " lc_namespace: [ \u001b[32m\"langchain_core\"\u001b[39m, \u001b[32m\"prompt_values\"\u001b[39m ],\n", + " messages: [\n", + " SystemMessage {\n", + " lc_serializable: \u001b[33mtrue\u001b[39m,\n", + " lc_kwargs: {\n", + " content: \u001b[32m\"Generate a relevant search query for a library system using the 'search' tool.\\n\"\u001b[39m +\n", + " \u001b[32m\"\\n\"\u001b[39m +\n", + " \u001b[32m\"The 'author' you ret\"\u001b[39m... 259 more characters,\n", + " additional_kwargs: {}\n", + " },\n", + " lc_namespace: [ \u001b[32m\"langchain_core\"\u001b[39m, \u001b[32m\"messages\"\u001b[39m ],\n", + " content: \u001b[32m\"Generate a relevant search query for a library system using the 'search' tool.\\n\"\u001b[39m +\n", + " \u001b[32m\"\\n\"\u001b[39m +\n", + " \u001b[32m\"The 'author' you ret\"\u001b[39m... 259 more characters,\n", + " name: \u001b[90mundefined\u001b[39m,\n", + " additional_kwargs: {}\n", + " },\n", + " HumanMessage {\n", + " lc_serializable: \u001b[33mtrue\u001b[39m,\n", + " lc_kwargs: {\n", + " content: \u001b[32m\"what are books by jess knight\"\u001b[39m,\n", + " additional_kwargs: {}\n", + " },\n", + " lc_namespace: [ \u001b[32m\"langchain_core\"\u001b[39m, \u001b[32m\"messages\"\u001b[39m ],\n", + " content: \u001b[32m\"what are books by jess knight\"\u001b[39m,\n", + " name: \u001b[90mundefined\u001b[39m,\n", + " additional_kwargs: {}\n", + " }\n", + " ]\n", + "}" + ] + }, + "execution_count": 61, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "await createPrompt.invoke(\"what are books by jess knight\")" + ] + }, + { + "cell_type": "code", + "execution_count": 62, + "id": "d3228b4e", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{ query: \u001b[32m\"books about aliens\"\u001b[39m, author: \u001b[32m\"Jessica Kerluke\"\u001b[39m }" + ] + }, + "execution_count": 62, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "await queryAnalyzerSelect.invoke(\"what are books about aliens by jess knight\")" + ] } - ], - "source": [ - "await createPrompt.invoke(\"what are books by jess knight\")" - ] - }, - { - "cell_type": "code", - "execution_count": 62, - "id": "d3228b4e", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{ query: \u001b[32m\"books about aliens\"\u001b[39m, author: \u001b[32m\"Jessica Kerluke\"\u001b[39m }" - ] - }, - "execution_count": 62, - "metadata": {}, - "output_type": "execute_result" + ], + "metadata": { + "kernelspec": { + "display_name": "Deno", + "language": "typescript", + "name": "deno" + }, + "language_info": { + "file_extension": ".ts", + "mimetype": "text/x.typescript", + "name": "typescript", + "nb_converter": "script", + "pygments_lexer": "typescript", + "version": "5.3.3" } - ], - "source": [ - "await queryAnalyzerSelect.invoke(\"what are books about aliens by jess knight\")" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Deno", - "language": "typescript", - "name": "deno" }, - "language_info": { - "file_extension": ".ts", - "mimetype": "text/x.typescript", - "name": "typescript", - "nb_converter": "script", - "pygments_lexer": "typescript", - "version": "5.3.3" - } - }, - "nbformat": 4, - "nbformat_minor": 5 + "nbformat": 4, + "nbformat_minor": 5 } diff --git a/docs/core_docs/docs/use_cases/query_analysis/how_to/multiple_queries.ipynb b/docs/core_docs/docs/use_cases/query_analysis/how_to/multiple_queries.ipynb index de6b5fc39d6b..c18fefb1d9cf 100644 --- a/docs/core_docs/docs/use_cases/query_analysis/how_to/multiple_queries.ipynb +++ b/docs/core_docs/docs/use_cases/query_analysis/how_to/multiple_queries.ipynb @@ -1,329 +1,329 @@ { - "cells": [ - { - "cell_type": "raw", - "id": "df7d42b9-58a6-434c-a2d7-0b61142f6d3e", - "metadata": {}, - "source": [ - "---\n", - "sidebar_position: 4\n", - "---" - ] - }, - { - "cell_type": "markdown", - "id": "f2195672-0cab-4967-ba8a-c6544635547d", - "metadata": {}, - "source": [ - "# Handle Multiple Queries\n", - "\n", - "Sometimes, a query analysis technique may allow for multiple queries to be generated. In these cases, we need to remember to run all queries and then to combine the results. We will show a simple example (using mock data) of how to do that." - ] - }, - { - "cell_type": "markdown", - "id": "a4079b57-4369-49c9-b2ad-c809b5408d7e", - "metadata": {}, - "source": [ - "## Setup\n", - "#### Install dependencies\n", - "\n", - "```{=mdx}\n", - "import IntegrationInstallTooltip from \"@mdx_components/integration_install_tooltip.mdx\";\n", - "import Npm2Yarn from \"@theme/Npm2Yarn\";\n", - "\n", - "\n", - "\n", - "\n", - " @langchain/core @langchain/community @langchain/openai zod chromadb\n", - "\n", - "```\n", - "\n", - "#### Set environment variables\n", - "\n", - "```\n", - "OPENAI_API_KEY=your-api-key\n", - "\n", - "# Optional, use LangSmith for best-in-class observability\n", - "LANGSMITH_API_KEY=your-api-key\n", - "LANGCHAIN_TRACING_V2=true\n", - "```" - ] - }, - { - "cell_type": "markdown", - "id": "c20b48b8-16d7-4089-bc17-f2d240b3935a", - "metadata": {}, - "source": [ - "### Create Index\n", - "\n", - "We will create a vectorstore over fake information." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "1f621694", - "metadata": {}, - "outputs": [ + "cells": [ { - "data": { - "text/plain": [ - "[Module: null prototype] {\n", - " AdminClient: \u001b[36m[class AdminClient]\u001b[39m,\n", - " ChromaClient: \u001b[36m[class ChromaClient]\u001b[39m,\n", - " CloudClient: \u001b[36m[class CloudClient extends ChromaClient]\u001b[39m,\n", - " CohereEmbeddingFunction: \u001b[36m[class CohereEmbeddingFunction]\u001b[39m,\n", - " Collection: \u001b[36m[class Collection]\u001b[39m,\n", - " DefaultEmbeddingFunction: \u001b[36m[class _DefaultEmbeddingFunction]\u001b[39m,\n", - " GoogleGenerativeAiEmbeddingFunction: \u001b[36m[class _GoogleGenerativeAiEmbeddingFunction]\u001b[39m,\n", - " HuggingFaceEmbeddingServerFunction: \u001b[36m[class HuggingFaceEmbeddingServerFunction]\u001b[39m,\n", - " IncludeEnum: {\n", - " Documents: \u001b[32m\"documents\"\u001b[39m,\n", - " Embeddings: \u001b[32m\"embeddings\"\u001b[39m,\n", - " Metadatas: \u001b[32m\"metadatas\"\u001b[39m,\n", - " Distances: \u001b[32m\"distances\"\u001b[39m\n", - " },\n", - " JinaEmbeddingFunction: \u001b[36m[class JinaEmbeddingFunction]\u001b[39m,\n", - " OpenAIEmbeddingFunction: \u001b[36m[class _OpenAIEmbeddingFunction]\u001b[39m,\n", - " TransformersEmbeddingFunction: \u001b[36m[class _TransformersEmbeddingFunction]\u001b[39m\n", - "}" + "cell_type": "raw", + "id": "df7d42b9-58a6-434c-a2d7-0b61142f6d3e", + "metadata": {}, + "source": [ + "---\n", + "sidebar_position: 4\n", + "---" ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import { Chroma } from \"@langchain/community/vectorstores/chroma\"\n", - "import { OpenAIEmbeddings } from \"@langchain/openai\"\n", - "import \"chromadb\";\n", - "\n", - "const texts = [\"Harrison worked at Kensho\", \"Ankush worked at Facebook\"]\n", - "const embeddings = new OpenAIEmbeddings({ modelName: \"text-embedding-3-small\" })\n", - "const vectorstore = await Chroma.fromTexts(\n", - " texts,\n", - " {},\n", - " embeddings,\n", - " {\n", - " collectionName: \"multi_query\"\n", - " }\n", - ")\n", - "const retriever = vectorstore.asRetriever(1);" - ] - }, - { - "cell_type": "markdown", - "id": "57396e23-c192-4d97-846b-5eacea4d6b8d", - "metadata": {}, - "source": [ - "## Query analysis\n", - "\n", - "We will use function calling to structure the output. We will let it return multiple queries." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "0b51dd76-820d-41a4-98c8-893f6fe0d1ea", - "metadata": {}, - "outputs": [], - "source": [ - "import { z } from \"zod\";\n", - "\n", - "const searchSchema = z.object({\n", - " queries: z.array(z.string()).describe(\"Distinct queries to search for\")\n", - "}).describe(\"Search over a database of job records.\");" - ] - }, - { - "cell_type": "markdown", - "id": "013a5041", - "metadata": {}, - "source": [ - "```{=mdx}\n", - "import ChatModelTabs from \"@theme/ChatModelTabs\";\n", - "\n", - "\n", - "```" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "783c03c3-8c72-4f88-9cf4-5829ce6745d6", - "metadata": {}, - "outputs": [], - "source": [ - "import { ChatPromptTemplate } from \"@langchain/core/prompts\";\n", - "import { RunnableSequence, RunnablePassthrough } from \"@langchain/core/runnables\";\n", - "\n", - "const system = `You have the ability to issue search queries to get information to help answer user information.\n", - "\n", - "If you need to look up two distinct pieces of information, you are allowed to do that!`;\n", - "\n", - "const prompt = ChatPromptTemplate.fromMessages([\n", - " [\"system\", system],\n", - " [\"human\", \"{question}\"],\n", - "])\n", - "const llmWithTools = llm.withStructuredOutput(searchSchema, {\n", - " name: \"Search\"\n", - "});\n", - "const queryAnalyzer = RunnableSequence.from([\n", - " {\n", - " question: new RunnablePassthrough(),\n", - " },\n", - " prompt,\n", - " llmWithTools\n", - "]);" - ] - }, - { - "cell_type": "markdown", - "id": "b9564078", - "metadata": {}, - "source": [ - "We can see that this allows for creating multiple queries" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "bc1d3863", - "metadata": {}, - "outputs": [ + }, { - "data": { - "text/plain": [ - "{ queries: [ \u001b[32m\"Harrison\"\u001b[39m ] }" + "cell_type": "markdown", + "id": "f2195672-0cab-4967-ba8a-c6544635547d", + "metadata": {}, + "source": [ + "# Handle Multiple Queries\n", + "\n", + "Sometimes, a query analysis technique may allow for multiple queries to be generated. In these cases, we need to remember to run all queries and then to combine the results. We will show a simple example (using mock data) of how to do that." ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "await queryAnalyzer.invoke(\"where did Harrison Work\")" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "af62af17-4f90-4dbd-a8b4-dfff51f1db95", - "metadata": {}, - "outputs": [ + }, { - "data": { - "text/plain": [ - "{ queries: [ \u001b[32m\"Harrison work\"\u001b[39m, \u001b[32m\"Ankush work\"\u001b[39m ] }" + "cell_type": "markdown", + "id": "a4079b57-4369-49c9-b2ad-c809b5408d7e", + "metadata": {}, + "source": [ + "## Setup\n", + "#### Install dependencies\n", + "\n", + "```{=mdx}\n", + "import IntegrationInstallTooltip from \"@mdx_components/integration_install_tooltip.mdx\";\n", + "import Npm2Yarn from \"@theme/Npm2Yarn\";\n", + "\n", + "\n", + "\n", + "\n", + " @langchain/core @langchain/community @langchain/openai zod chromadb\n", + "\n", + "```\n", + "\n", + "#### Set environment variables\n", + "\n", + "```\n", + "OPENAI_API_KEY=your-api-key\n", + "\n", + "# Optional, use LangSmith for best-in-class observability\n", + "LANGSMITH_API_KEY=your-api-key\n", + "LANGCHAIN_TRACING_V2=true\n", + "```" ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "await queryAnalyzer.invoke(\"where did Harrison and ankush Work\")" - ] - }, - { - "cell_type": "markdown", - "id": "c7c65b2f-7881-45fc-a47b-a4eaaf48245f", - "metadata": {}, - "source": [ - "## Retrieval with query analysis\n", - "\n", - "So how would we include this in a chain? One thing that will make this a lot easier is if we call our retriever asyncronously - this will let us loop over the queries and not get blocked on the response time." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "8dac7866", - "metadata": {}, - "outputs": [], - "source": [ - "import { RunnableConfig, RunnableLambda } from \"@langchain/core/runnables\";\n", - "\n", - "const chain = async (question: string, config?: RunnableConfig) => {\n", - " const response = await queryAnalyzer.invoke(question, config);\n", - " const docs = [];\n", - " for (const query of response.queries) {\n", - " const newDocs = await retriever.invoke(query, config);\n", - " docs.push(...newDocs);\n", - " }\n", - " // You probably want to think about reranking or deduplicating documents here\n", - " // But that is a separate topic\n", - " return docs;\n", - "}\n", - "\n", - "const customChain = new RunnableLambda({ func: chain });" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "232ad8a7-7990-4066-9228-d35a555f7293", - "metadata": {}, - "outputs": [ + }, { - "data": { - "text/plain": [ - "[ Document { pageContent: \u001b[32m\"Harrison worked at Kensho\"\u001b[39m, metadata: {} } ]" + "cell_type": "markdown", + "id": "c20b48b8-16d7-4089-bc17-f2d240b3935a", + "metadata": {}, + "source": [ + "### Create Index\n", + "\n", + "We will create a vectorstore over fake information." ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "await customChain.invoke(\"where did Harrison Work\")" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "28e14ba5", - "metadata": {}, - "outputs": [ + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "1f621694", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[Module: null prototype] {\n", + " AdminClient: \u001b[36m[class AdminClient]\u001b[39m,\n", + " ChromaClient: \u001b[36m[class ChromaClient]\u001b[39m,\n", + " CloudClient: \u001b[36m[class CloudClient extends ChromaClient]\u001b[39m,\n", + " CohereEmbeddingFunction: \u001b[36m[class CohereEmbeddingFunction]\u001b[39m,\n", + " Collection: \u001b[36m[class Collection]\u001b[39m,\n", + " DefaultEmbeddingFunction: \u001b[36m[class _DefaultEmbeddingFunction]\u001b[39m,\n", + " GoogleGenerativeAiEmbeddingFunction: \u001b[36m[class _GoogleGenerativeAiEmbeddingFunction]\u001b[39m,\n", + " HuggingFaceEmbeddingServerFunction: \u001b[36m[class HuggingFaceEmbeddingServerFunction]\u001b[39m,\n", + " IncludeEnum: {\n", + " Documents: \u001b[32m\"documents\"\u001b[39m,\n", + " Embeddings: \u001b[32m\"embeddings\"\u001b[39m,\n", + " Metadatas: \u001b[32m\"metadatas\"\u001b[39m,\n", + " Distances: \u001b[32m\"distances\"\u001b[39m\n", + " },\n", + " JinaEmbeddingFunction: \u001b[36m[class JinaEmbeddingFunction]\u001b[39m,\n", + " OpenAIEmbeddingFunction: \u001b[36m[class _OpenAIEmbeddingFunction]\u001b[39m,\n", + " TransformersEmbeddingFunction: \u001b[36m[class _TransformersEmbeddingFunction]\u001b[39m\n", + "}" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import { Chroma } from \"@langchain/community/vectorstores/chroma\"\n", + "import { OpenAIEmbeddings } from \"@langchain/openai\"\n", + "import \"chromadb\";\n", + "\n", + "const texts = [\"Harrison worked at Kensho\", \"Ankush worked at Facebook\"]\n", + "const embeddings = new OpenAIEmbeddings({ model: \"text-embedding-3-small\" })\n", + "const vectorstore = await Chroma.fromTexts(\n", + " texts,\n", + " {},\n", + " embeddings,\n", + " {\n", + " collectionName: \"multi_query\"\n", + " }\n", + ")\n", + "const retriever = vectorstore.asRetriever(1);" + ] + }, { - "data": { - "text/plain": [ - "[\n", - " Document { pageContent: \u001b[32m\"Harrison worked at Kensho\"\u001b[39m, metadata: {} },\n", - " Document { pageContent: \u001b[32m\"Ankush worked at Facebook\"\u001b[39m, metadata: {} }\n", - "]" + "cell_type": "markdown", + "id": "57396e23-c192-4d97-846b-5eacea4d6b8d", + "metadata": {}, + "source": [ + "## Query analysis\n", + "\n", + "We will use function calling to structure the output. We will let it return multiple queries." ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "0b51dd76-820d-41a4-98c8-893f6fe0d1ea", + "metadata": {}, + "outputs": [], + "source": [ + "import { z } from \"zod\";\n", + "\n", + "const searchSchema = z.object({\n", + " queries: z.array(z.string()).describe(\"Distinct queries to search for\")\n", + "}).describe(\"Search over a database of job records.\");" + ] + }, + { + "cell_type": "markdown", + "id": "013a5041", + "metadata": {}, + "source": [ + "```{=mdx}\n", + "import ChatModelTabs from \"@theme/ChatModelTabs\";\n", + "\n", + "\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "783c03c3-8c72-4f88-9cf4-5829ce6745d6", + "metadata": {}, + "outputs": [], + "source": [ + "import { ChatPromptTemplate } from \"@langchain/core/prompts\";\n", + "import { RunnableSequence, RunnablePassthrough } from \"@langchain/core/runnables\";\n", + "\n", + "const system = `You have the ability to issue search queries to get information to help answer user information.\n", + "\n", + "If you need to look up two distinct pieces of information, you are allowed to do that!`;\n", + "\n", + "const prompt = ChatPromptTemplate.fromMessages([\n", + " [\"system\", system],\n", + " [\"human\", \"{question}\"],\n", + "])\n", + "const llmWithTools = llm.withStructuredOutput(searchSchema, {\n", + " name: \"Search\"\n", + "});\n", + "const queryAnalyzer = RunnableSequence.from([\n", + " {\n", + " question: new RunnablePassthrough(),\n", + " },\n", + " prompt,\n", + " llmWithTools\n", + "]);" + ] + }, + { + "cell_type": "markdown", + "id": "b9564078", + "metadata": {}, + "source": [ + "We can see that this allows for creating multiple queries" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "bc1d3863", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{ queries: [ \u001b[32m\"Harrison\"\u001b[39m ] }" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "await queryAnalyzer.invoke(\"where did Harrison Work\")" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "af62af17-4f90-4dbd-a8b4-dfff51f1db95", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{ queries: [ \u001b[32m\"Harrison work\"\u001b[39m, \u001b[32m\"Ankush work\"\u001b[39m ] }" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "await queryAnalyzer.invoke(\"where did Harrison and ankush Work\")" + ] + }, + { + "cell_type": "markdown", + "id": "c7c65b2f-7881-45fc-a47b-a4eaaf48245f", + "metadata": {}, + "source": [ + "## Retrieval with query analysis\n", + "\n", + "So how would we include this in a chain? One thing that will make this a lot easier is if we call our retriever asyncronously - this will let us loop over the queries and not get blocked on the response time." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "8dac7866", + "metadata": {}, + "outputs": [], + "source": [ + "import { RunnableConfig, RunnableLambda } from \"@langchain/core/runnables\";\n", + "\n", + "const chain = async (question: string, config?: RunnableConfig) => {\n", + " const response = await queryAnalyzer.invoke(question, config);\n", + " const docs = [];\n", + " for (const query of response.queries) {\n", + " const newDocs = await retriever.invoke(query, config);\n", + " docs.push(...newDocs);\n", + " }\n", + " // You probably want to think about reranking or deduplicating documents here\n", + " // But that is a separate topic\n", + " return docs;\n", + "}\n", + "\n", + "const customChain = new RunnableLambda({ func: chain });" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "232ad8a7-7990-4066-9228-d35a555f7293", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[ Document { pageContent: \u001b[32m\"Harrison worked at Kensho\"\u001b[39m, metadata: {} } ]" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "await customChain.invoke(\"where did Harrison Work\")" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "28e14ba5", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[\n", + " Document { pageContent: \u001b[32m\"Harrison worked at Kensho\"\u001b[39m, metadata: {} },\n", + " Document { pageContent: \u001b[32m\"Ankush worked at Facebook\"\u001b[39m, metadata: {} }\n", + "]" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "await customChain.invoke(\"where did Harrison and ankush Work\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Deno", + "language": "typescript", + "name": "deno" + }, + "language_info": { + "file_extension": ".ts", + "mimetype": "text/x.typescript", + "name": "typescript", + "nb_converter": "script", + "pygments_lexer": "typescript", + "version": "5.3.3" } - ], - "source": [ - "await customChain.invoke(\"where did Harrison and ankush Work\")" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Deno", - "language": "typescript", - "name": "deno" }, - "language_info": { - "file_extension": ".ts", - "mimetype": "text/x.typescript", - "name": "typescript", - "nb_converter": "script", - "pygments_lexer": "typescript", - "version": "5.3.3" - } - }, - "nbformat": 4, - "nbformat_minor": 5 + "nbformat": 4, + "nbformat_minor": 5 } diff --git a/docs/core_docs/docs/use_cases/query_analysis/how_to/multiple_retrievers.ipynb b/docs/core_docs/docs/use_cases/query_analysis/how_to/multiple_retrievers.ipynb index bb143cd1b41b..bef4158f7112 100644 --- a/docs/core_docs/docs/use_cases/query_analysis/how_to/multiple_retrievers.ipynb +++ b/docs/core_docs/docs/use_cases/query_analysis/how_to/multiple_retrievers.ipynb @@ -1,343 +1,343 @@ { - "cells": [ - { - "cell_type": "raw", - "id": "df7d42b9-58a6-434c-a2d7-0b61142f6d3e", - "metadata": {}, - "source": [ - "---\n", - "sidebar_position: 5\n", - "---" - ] - }, - { - "cell_type": "markdown", - "id": "f2195672-0cab-4967-ba8a-c6544635547d", - "metadata": {}, - "source": [ - "# Handle Multiple Retrievers\n", - "\n", - "Sometimes, a query analysis technique may allow for selection of which retriever to use. To use this, you will need to add some logic to select the retriever to do. We will show a simple example (using mock data) of how to do that." - ] - }, - { - "cell_type": "markdown", - "id": "a4079b57-4369-49c9-b2ad-c809b5408d7e", - "metadata": {}, - "source": [ - "## Setup\n", - "#### Install dependencies\n", - "\n", - "```{=mdx}\n", - "import IntegrationInstallTooltip from \"@mdx_components/integration_install_tooltip.mdx\";\n", - "import Npm2Yarn from \"@theme/Npm2Yarn\";\n", - "\n", - "\n", - "\n", - "\n", - " @langchain/core @langchain/community @langchain/openai zod chromadb\n", - "\n", - "```\n", - "\n", - "#### Set environment variables\n", - "\n", - "```\n", - "OPENAI_API_KEY=your-api-key\n", - "\n", - "# Optional, use LangSmith for best-in-class observability\n", - "LANGSMITH_API_KEY=your-api-key\n", - "LANGCHAIN_TRACING_V2=true\n", - "```" - ] - }, - { - "cell_type": "markdown", - "id": "c20b48b8-16d7-4089-bc17-f2d240b3935a", - "metadata": {}, - "source": [ - "### Create Index\n", - "\n", - "We will create a vectorstore over fake information." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "1f621694", - "metadata": {}, - "outputs": [ + "cells": [ { - "data": { - "text/plain": [ - "[Module: null prototype] {\n", - " AdminClient: \u001b[36m[class AdminClient]\u001b[39m,\n", - " ChromaClient: \u001b[36m[class ChromaClient]\u001b[39m,\n", - " CloudClient: \u001b[36m[class CloudClient extends ChromaClient]\u001b[39m,\n", - " CohereEmbeddingFunction: \u001b[36m[class CohereEmbeddingFunction]\u001b[39m,\n", - " Collection: \u001b[36m[class Collection]\u001b[39m,\n", - " DefaultEmbeddingFunction: \u001b[36m[class _DefaultEmbeddingFunction]\u001b[39m,\n", - " GoogleGenerativeAiEmbeddingFunction: \u001b[36m[class _GoogleGenerativeAiEmbeddingFunction]\u001b[39m,\n", - " HuggingFaceEmbeddingServerFunction: \u001b[36m[class HuggingFaceEmbeddingServerFunction]\u001b[39m,\n", - " IncludeEnum: {\n", - " Documents: \u001b[32m\"documents\"\u001b[39m,\n", - " Embeddings: \u001b[32m\"embeddings\"\u001b[39m,\n", - " Metadatas: \u001b[32m\"metadatas\"\u001b[39m,\n", - " Distances: \u001b[32m\"distances\"\u001b[39m\n", - " },\n", - " JinaEmbeddingFunction: \u001b[36m[class JinaEmbeddingFunction]\u001b[39m,\n", - " OpenAIEmbeddingFunction: \u001b[36m[class _OpenAIEmbeddingFunction]\u001b[39m,\n", - " TransformersEmbeddingFunction: \u001b[36m[class _TransformersEmbeddingFunction]\u001b[39m\n", - "}" + "cell_type": "raw", + "id": "df7d42b9-58a6-434c-a2d7-0b61142f6d3e", + "metadata": {}, + "source": [ + "---\n", + "sidebar_position: 5\n", + "---" ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import { Chroma } from \"@langchain/community/vectorstores/chroma\"\n", - "import { OpenAIEmbeddings } from \"@langchain/openai\"\n", - "import \"chromadb\";\n", - "\n", - "const texts = [\"Harrison worked at Kensho\"]\n", - "const embeddings = new OpenAIEmbeddings({ modelName: \"text-embedding-3-small\" })\n", - "const vectorstore = await Chroma.fromTexts(texts, {}, embeddings, {\n", - " collectionName: \"harrison\"\n", - "})\n", - "const retrieverHarrison = vectorstore.asRetriever(1)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "cb313c9e", - "metadata": {}, - "outputs": [], - "source": [ - "const texts = [\"Ankush worked at Facebook\"]\n", - "const embeddings = new OpenAIEmbeddings({ modelName: \"text-embedding-3-small\" })\n", - "const vectorstore = await Chroma.fromTexts(texts, {}, embeddings, {\n", - " collectionName: \"ankush\"\n", - "})\n", - "const retrieverAnkush = vectorstore.asRetriever(1)" - ] - }, - { - "cell_type": "markdown", - "id": "57396e23-c192-4d97-846b-5eacea4d6b8d", - "metadata": {}, - "source": [ - "## Query analysis\n", - "\n", - "We will use function calling to structure the output. We will let it return multiple queries." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "0b51dd76-820d-41a4-98c8-893f6fe0d1ea", - "metadata": {}, - "outputs": [], - "source": [ - "import { z } from \"zod\";\n", - "\n", - "const searchSchema = z.object({\n", - " query: z.string().describe(\"Query to look up\"),\n", - " person: z.string().describe(\"Person to look things up for. Should be `HARRISON` or `ANKUSH`.\")\n", - "})" - ] - }, - { - "cell_type": "markdown", - "id": "a3c79210", - "metadata": {}, - "source": [ - "```{=mdx}\n", - "import ChatModelTabs from \"@theme/ChatModelTabs\";\n", - "\n", - "\n", - "```" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "783c03c3-8c72-4f88-9cf4-5829ce6745d6", - "metadata": {}, - "outputs": [], - "source": [ - "import { ChatPromptTemplate } from \"@langchain/core/prompts\";\n", - "import { RunnableSequence, RunnablePassthrough } from \"@langchain/core/runnables\";\n", - "\n", - "const system = `You have the ability to issue search queries to get information to help answer user information.`\n", - "const prompt = ChatPromptTemplate.fromMessages(\n", - "[\n", - " [\"system\", system],\n", - " [\"human\", \"{question}\"],\n", - "]\n", - ")\n", - "const llmWithTools = llm.withStructuredOutput(searchSchema, {\n", - "name: \"Search\"\n", - "})\n", - "const queryAnalyzer = RunnableSequence.from([\n", - " {\n", - " question: new RunnablePassthrough(),\n", - " },\n", - " prompt,\n", - " llmWithTools\n", - "])" - ] - }, - { - "cell_type": "markdown", - "id": "b9564078", - "metadata": {}, - "source": [ - "We can see that this allows for routing between retrievers" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "bc1d3863", - "metadata": {}, - "outputs": [ + }, { - "data": { - "text/plain": [ - "{ query: \u001b[32m\"workplace of Harrison\"\u001b[39m, person: \u001b[32m\"HARRISON\"\u001b[39m }" + "cell_type": "markdown", + "id": "f2195672-0cab-4967-ba8a-c6544635547d", + "metadata": {}, + "source": [ + "# Handle Multiple Retrievers\n", + "\n", + "Sometimes, a query analysis technique may allow for selection of which retriever to use. To use this, you will need to add some logic to select the retriever to do. We will show a simple example (using mock data) of how to do that." ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "await queryAnalyzer.invoke(\"where did Harrison Work\")" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "af62af17-4f90-4dbd-a8b4-dfff51f1db95", - "metadata": {}, - "outputs": [ + }, { - "data": { - "text/plain": [ - "{ query: \u001b[32m\"Workplace of Ankush\"\u001b[39m, person: \u001b[32m\"ANKUSH\"\u001b[39m }" + "cell_type": "markdown", + "id": "a4079b57-4369-49c9-b2ad-c809b5408d7e", + "metadata": {}, + "source": [ + "## Setup\n", + "#### Install dependencies\n", + "\n", + "```{=mdx}\n", + "import IntegrationInstallTooltip from \"@mdx_components/integration_install_tooltip.mdx\";\n", + "import Npm2Yarn from \"@theme/Npm2Yarn\";\n", + "\n", + "\n", + "\n", + "\n", + " @langchain/core @langchain/community @langchain/openai zod chromadb\n", + "\n", + "```\n", + "\n", + "#### Set environment variables\n", + "\n", + "```\n", + "OPENAI_API_KEY=your-api-key\n", + "\n", + "# Optional, use LangSmith for best-in-class observability\n", + "LANGSMITH_API_KEY=your-api-key\n", + "LANGCHAIN_TRACING_V2=true\n", + "```" ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "await queryAnalyzer.invoke(\"where did ankush Work\")" - ] - }, - { - "cell_type": "markdown", - "id": "c7c65b2f-7881-45fc-a47b-a4eaaf48245f", - "metadata": {}, - "source": [ - "## Retrieval with query analysis\n", - "\n", - "So how would we include this in a chain? We just need some simple logic to select the retriever and pass in the search query" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "4ec0c7fe", - "metadata": {}, - "outputs": [], - "source": [ - "const retrievers = {\n", - " HARRISON: retrieverHarrison,\n", - " ANKUSH: retrieverAnkush,\n", - "}" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "id": "8dac7866", - "metadata": {}, - "outputs": [], - "source": [ - "import { RunnableConfig, RunnableLambda } from \"@langchain/core/runnables\";\n", - "\n", - "const chain = async (question: string, config?: RunnableConfig) => {\n", - " const response = await queryAnalyzer.invoke(question, config);\n", - " const retriever = retrievers[response.person];\n", - " return retriever.invoke(response.query, config);\n", - "}\n", - "\n", - "const customChain = new RunnableLambda({ func: chain });" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "id": "232ad8a7-7990-4066-9228-d35a555f7293", - "metadata": {}, - "outputs": [ + }, { - "data": { - "text/plain": [ - "[ Document { pageContent: \u001b[32m\"Harrison worked at Kensho\"\u001b[39m, metadata: {} } ]" + "cell_type": "markdown", + "id": "c20b48b8-16d7-4089-bc17-f2d240b3935a", + "metadata": {}, + "source": [ + "### Create Index\n", + "\n", + "We will create a vectorstore over fake information." ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "await customChain.invoke(\"where did Harrison Work\")" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "id": "28e14ba5", - "metadata": {}, - "outputs": [ + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "1f621694", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[Module: null prototype] {\n", + " AdminClient: \u001b[36m[class AdminClient]\u001b[39m,\n", + " ChromaClient: \u001b[36m[class ChromaClient]\u001b[39m,\n", + " CloudClient: \u001b[36m[class CloudClient extends ChromaClient]\u001b[39m,\n", + " CohereEmbeddingFunction: \u001b[36m[class CohereEmbeddingFunction]\u001b[39m,\n", + " Collection: \u001b[36m[class Collection]\u001b[39m,\n", + " DefaultEmbeddingFunction: \u001b[36m[class _DefaultEmbeddingFunction]\u001b[39m,\n", + " GoogleGenerativeAiEmbeddingFunction: \u001b[36m[class _GoogleGenerativeAiEmbeddingFunction]\u001b[39m,\n", + " HuggingFaceEmbeddingServerFunction: \u001b[36m[class HuggingFaceEmbeddingServerFunction]\u001b[39m,\n", + " IncludeEnum: {\n", + " Documents: \u001b[32m\"documents\"\u001b[39m,\n", + " Embeddings: \u001b[32m\"embeddings\"\u001b[39m,\n", + " Metadatas: \u001b[32m\"metadatas\"\u001b[39m,\n", + " Distances: \u001b[32m\"distances\"\u001b[39m\n", + " },\n", + " JinaEmbeddingFunction: \u001b[36m[class JinaEmbeddingFunction]\u001b[39m,\n", + " OpenAIEmbeddingFunction: \u001b[36m[class _OpenAIEmbeddingFunction]\u001b[39m,\n", + " TransformersEmbeddingFunction: \u001b[36m[class _TransformersEmbeddingFunction]\u001b[39m\n", + "}" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import { Chroma } from \"@langchain/community/vectorstores/chroma\"\n", + "import { OpenAIEmbeddings } from \"@langchain/openai\"\n", + "import \"chromadb\";\n", + "\n", + "const texts = [\"Harrison worked at Kensho\"]\n", + "const embeddings = new OpenAIEmbeddings({ model: \"text-embedding-3-small\" })\n", + "const vectorstore = await Chroma.fromTexts(texts, {}, embeddings, {\n", + " collectionName: \"harrison\"\n", + "})\n", + "const retrieverHarrison = vectorstore.asRetriever(1)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "cb313c9e", + "metadata": {}, + "outputs": [], + "source": [ + "const texts = [\"Ankush worked at Facebook\"]\n", + "const embeddings = new OpenAIEmbeddings({ model: \"text-embedding-3-small\" })\n", + "const vectorstore = await Chroma.fromTexts(texts, {}, embeddings, {\n", + " collectionName: \"ankush\"\n", + "})\n", + "const retrieverAnkush = vectorstore.asRetriever(1)" + ] + }, + { + "cell_type": "markdown", + "id": "57396e23-c192-4d97-846b-5eacea4d6b8d", + "metadata": {}, + "source": [ + "## Query analysis\n", + "\n", + "We will use function calling to structure the output. We will let it return multiple queries." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "0b51dd76-820d-41a4-98c8-893f6fe0d1ea", + "metadata": {}, + "outputs": [], + "source": [ + "import { z } from \"zod\";\n", + "\n", + "const searchSchema = z.object({\n", + " query: z.string().describe(\"Query to look up\"),\n", + " person: z.string().describe(\"Person to look things up for. Should be `HARRISON` or `ANKUSH`.\")\n", + "})" + ] + }, + { + "cell_type": "markdown", + "id": "a3c79210", + "metadata": {}, + "source": [ + "```{=mdx}\n", + "import ChatModelTabs from \"@theme/ChatModelTabs\";\n", + "\n", + "\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "783c03c3-8c72-4f88-9cf4-5829ce6745d6", + "metadata": {}, + "outputs": [], + "source": [ + "import { ChatPromptTemplate } from \"@langchain/core/prompts\";\n", + "import { RunnableSequence, RunnablePassthrough } from \"@langchain/core/runnables\";\n", + "\n", + "const system = `You have the ability to issue search queries to get information to help answer user information.`\n", + "const prompt = ChatPromptTemplate.fromMessages(\n", + "[\n", + " [\"system\", system],\n", + " [\"human\", \"{question}\"],\n", + "]\n", + ")\n", + "const llmWithTools = llm.withStructuredOutput(searchSchema, {\n", + "name: \"Search\"\n", + "})\n", + "const queryAnalyzer = RunnableSequence.from([\n", + " {\n", + " question: new RunnablePassthrough(),\n", + " },\n", + " prompt,\n", + " llmWithTools\n", + "])" + ] + }, + { + "cell_type": "markdown", + "id": "b9564078", + "metadata": {}, + "source": [ + "We can see that this allows for routing between retrievers" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "bc1d3863", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{ query: \u001b[32m\"workplace of Harrison\"\u001b[39m, person: \u001b[32m\"HARRISON\"\u001b[39m }" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "await queryAnalyzer.invoke(\"where did Harrison Work\")" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "af62af17-4f90-4dbd-a8b4-dfff51f1db95", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{ query: \u001b[32m\"Workplace of Ankush\"\u001b[39m, person: \u001b[32m\"ANKUSH\"\u001b[39m }" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "await queryAnalyzer.invoke(\"where did ankush Work\")" + ] + }, + { + "cell_type": "markdown", + "id": "c7c65b2f-7881-45fc-a47b-a4eaaf48245f", + "metadata": {}, + "source": [ + "## Retrieval with query analysis\n", + "\n", + "So how would we include this in a chain? We just need some simple logic to select the retriever and pass in the search query" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "4ec0c7fe", + "metadata": {}, + "outputs": [], + "source": [ + "const retrievers = {\n", + " HARRISON: retrieverHarrison,\n", + " ANKUSH: retrieverAnkush,\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "8dac7866", + "metadata": {}, + "outputs": [], + "source": [ + "import { RunnableConfig, RunnableLambda } from \"@langchain/core/runnables\";\n", + "\n", + "const chain = async (question: string, config?: RunnableConfig) => {\n", + " const response = await queryAnalyzer.invoke(question, config);\n", + " const retriever = retrievers[response.person];\n", + " return retriever.invoke(response.query, config);\n", + "}\n", + "\n", + "const customChain = new RunnableLambda({ func: chain });" + ] + }, { - "data": { - "text/plain": [ - "[ Document { pageContent: \u001b[32m\"Ankush worked at Facebook\"\u001b[39m, metadata: {} } ]" + "cell_type": "code", + "execution_count": 18, + "id": "232ad8a7-7990-4066-9228-d35a555f7293", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[ Document { pageContent: \u001b[32m\"Harrison worked at Kensho\"\u001b[39m, metadata: {} } ]" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "await customChain.invoke(\"where did Harrison Work\")" ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "28e14ba5", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[ Document { pageContent: \u001b[32m\"Ankush worked at Facebook\"\u001b[39m, metadata: {} } ]" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "await customChain.invoke(\"where did ankush Work\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Deno", + "language": "typescript", + "name": "deno" + }, + "language_info": { + "file_extension": ".ts", + "mimetype": "text/x.typescript", + "name": "typescript", + "nb_converter": "script", + "pygments_lexer": "typescript", + "version": "5.3.3" } - ], - "source": [ - "await customChain.invoke(\"where did ankush Work\")" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Deno", - "language": "typescript", - "name": "deno" }, - "language_info": { - "file_extension": ".ts", - "mimetype": "text/x.typescript", - "name": "typescript", - "nb_converter": "script", - "pygments_lexer": "typescript", - "version": "5.3.3" - } - }, - "nbformat": 4, - "nbformat_minor": 5 + "nbformat": 4, + "nbformat_minor": 5 } diff --git a/docs/core_docs/docs/use_cases/query_analysis/how_to/no_queries.ipynb b/docs/core_docs/docs/use_cases/query_analysis/how_to/no_queries.ipynb index 5d8b2c9f617f..718e658371b6 100644 --- a/docs/core_docs/docs/use_cases/query_analysis/how_to/no_queries.ipynb +++ b/docs/core_docs/docs/use_cases/query_analysis/how_to/no_queries.ipynb @@ -1,392 +1,392 @@ { - "cells": [ - { - "cell_type": "raw", - "id": "df7d42b9-58a6-434c-a2d7-0b61142f6d3e", - "metadata": {}, - "source": [ - "---\n", - "sidebar_position: 3\n", - "---" - ] - }, - { - "cell_type": "markdown", - "id": "f2195672-0cab-4967-ba8a-c6544635547d", - "metadata": {}, - "source": [ - "# Handle Cases Where No Queries are Generated\n", - "\n", - "Sometimes, a query analysis technique may allow for any number of queries to be generated - including no queries! In this case, our overall chain will need to inspect the result of the query analysis before deciding whether to call the retriever or not.\n", - "\n", - "We will use mock data for this example." - ] - }, - { - "cell_type": "markdown", - "id": "a4079b57-4369-49c9-b2ad-c809b5408d7e", - "metadata": {}, - "source": [ - "## Setup\n", - "#### Install dependencies\n", - "\n", - "```{=mdx}\n", - "import IntegrationInstallTooltip from \"@mdx_components/integration_install_tooltip.mdx\";\n", - "import Npm2Yarn from \"@theme/Npm2Yarn\";\n", - "\n", - "\n", - "\n", - "\n", - " @langchain/core @langchain/community @langchain/openai zod chromadb\n", - "\n", - "```\n", - "\n", - "#### Set environment variables\n", - "\n", - "```\n", - "OPENAI_API_KEY=your-api-key\n", - "\n", - "# Optional, use LangSmith for best-in-class observability\n", - "LANGSMITH_API_KEY=your-api-key\n", - "LANGCHAIN_TRACING_V2=true\n", - "```" - ] - }, - { - "cell_type": "markdown", - "id": "c20b48b8-16d7-4089-bc17-f2d240b3935a", - "metadata": {}, - "source": [ - "### Create Index\n", - "\n", - "We will create a vectorstore over fake information." - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "id": "1f621694", - "metadata": {}, - "outputs": [ + "cells": [ { - "data": { - "text/plain": [ - "[Module: null prototype] {\n", - " AdminClient: \u001b[36m[class AdminClient]\u001b[39m,\n", - " ChromaClient: \u001b[36m[class ChromaClient]\u001b[39m,\n", - " CloudClient: \u001b[36m[class CloudClient extends ChromaClient]\u001b[39m,\n", - " CohereEmbeddingFunction: \u001b[36m[class CohereEmbeddingFunction]\u001b[39m,\n", - " Collection: \u001b[36m[class Collection]\u001b[39m,\n", - " DefaultEmbeddingFunction: \u001b[36m[class _DefaultEmbeddingFunction]\u001b[39m,\n", - " GoogleGenerativeAiEmbeddingFunction: \u001b[36m[class _GoogleGenerativeAiEmbeddingFunction]\u001b[39m,\n", - " HuggingFaceEmbeddingServerFunction: \u001b[36m[class HuggingFaceEmbeddingServerFunction]\u001b[39m,\n", - " IncludeEnum: {\n", - " Documents: \u001b[32m\"documents\"\u001b[39m,\n", - " Embeddings: \u001b[32m\"embeddings\"\u001b[39m,\n", - " Metadatas: \u001b[32m\"metadatas\"\u001b[39m,\n", - " Distances: \u001b[32m\"distances\"\u001b[39m\n", - " },\n", - " JinaEmbeddingFunction: \u001b[36m[class JinaEmbeddingFunction]\u001b[39m,\n", - " OpenAIEmbeddingFunction: \u001b[36m[class _OpenAIEmbeddingFunction]\u001b[39m,\n", - " TransformersEmbeddingFunction: \u001b[36m[class _TransformersEmbeddingFunction]\u001b[39m\n", - "}" + "cell_type": "raw", + "id": "df7d42b9-58a6-434c-a2d7-0b61142f6d3e", + "metadata": {}, + "source": [ + "---\n", + "sidebar_position: 3\n", + "---" ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import { Chroma } from \"@langchain/community/vectorstores/chroma\"\n", - "import { OpenAIEmbeddings } from \"@langchain/openai\"\n", - "import \"chromadb\";\n", - "\n", - "const texts = [\"Harrison worked at Kensho\"]\n", - "const embeddings = new OpenAIEmbeddings({ modelName: \"text-embedding-3-small\" })\n", - "const vectorstore = await Chroma.fromTexts(texts, {}, embeddings, {\n", - " collectionName: \"harrison\"\n", - "})\n", - "const retriever = vectorstore.asRetriever(1)" - ] - }, - { - "cell_type": "markdown", - "id": "57396e23-c192-4d97-846b-5eacea4d6b8d", - "metadata": {}, - "source": [ - "## Query analysis\n", - "\n", - "We will use function calling to structure the output. However, we will configure the LLM such that is doesn't NEED to call the function representing a search query (should it decide not to). We will also then use a prompt to do query analysis that explicitly lays when it should and shouldn't make a search." - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "id": "0b51dd76-820d-41a4-98c8-893f6fe0d1ea", - "metadata": {}, - "outputs": [], - "source": [ - "import { z } from \"zod\";\n", - "\n", - "const searchSchema = z.object({\n", - " query: z.string().describe(\"Similarity search query applied to job record.\"),\n", - "});" - ] - }, - { - "cell_type": "markdown", - "id": "b7916d00", - "metadata": {}, - "source": [ - "```{=mdx}\n", - "import ChatModelTabs from \"@theme/ChatModelTabs\";\n", - "\n", - "\n", - "```" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "id": "783c03c3-8c72-4f88-9cf4-5829ce6745d6", - "metadata": {}, - "outputs": [], - "source": [ - "import { zodToJsonSchema } from \"zod-to-json-schema\";\n", - "import { ChatPromptTemplate } from \"@langchain/core/prompts\";\n", - "import { RunnableSequence, RunnablePassthrough } from \"@langchain/core/runnables\";\n", - "\n", - "const system = `You have the ability to issue search queries to get information to help answer user information.\n", - "\n", - "You do not NEED to look things up. If you don't need to, then just respond normally.`;\n", - "const prompt = ChatPromptTemplate.fromMessages(\n", - " [\n", - " [\"system\", system],\n", - " [\"human\", \"{question}\"],\n", - " ]\n", - ")\n", - "const llmWithTools = llm.bind({\n", - " tools: [{\n", - " type: \"function\" as const,\n", - " function: {\n", - " name: \"search\",\n", - " description: \"Search over a database of job records.\",\n", - " parameters: zodToJsonSchema(searchSchema),\n", - " }\n", - " }]\n", - "})\n", - "const queryAnalyzer = RunnableSequence.from([\n", - " {\n", - " question: new RunnablePassthrough(),\n", - " },\n", - " prompt,\n", - " llmWithTools\n", - "])" - ] - }, - { - "cell_type": "markdown", - "id": "b9564078", - "metadata": {}, - "source": [ - "We can see that by invoking this we get an message that sometimes - but not always - returns a tool call." - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "id": "bc1d3863", - "metadata": {}, - "outputs": [ + }, { - "data": { - "text/plain": [ - "AIMessage {\n", - " lc_serializable: \u001b[33mtrue\u001b[39m,\n", - " lc_kwargs: {\n", - " content: \u001b[32m\"\"\u001b[39m,\n", - " additional_kwargs: {\n", - " function_call: \u001b[90mundefined\u001b[39m,\n", - " tool_calls: [\n", - " {\n", - " id: \u001b[32m\"call_uqHm5OMbXBkmqDr7Xzj8EMmd\"\u001b[39m,\n", - " type: \u001b[32m\"function\"\u001b[39m,\n", - " function: \u001b[36m[Object]\u001b[39m\n", - " }\n", - " ]\n", - " }\n", - " },\n", - " lc_namespace: [ \u001b[32m\"langchain_core\"\u001b[39m, \u001b[32m\"messages\"\u001b[39m ],\n", - " content: \u001b[32m\"\"\u001b[39m,\n", - " name: \u001b[90mundefined\u001b[39m,\n", - " additional_kwargs: {\n", - " function_call: \u001b[90mundefined\u001b[39m,\n", - " tool_calls: [\n", - " {\n", - " id: \u001b[32m\"call_uqHm5OMbXBkmqDr7Xzj8EMmd\"\u001b[39m,\n", - " type: \u001b[32m\"function\"\u001b[39m,\n", - " function: { name: \u001b[32m\"search\"\u001b[39m, arguments: \u001b[32m'{\"query\":\"Harrison\"}'\u001b[39m }\n", - " }\n", - " ]\n", - " }\n", - "}" + "cell_type": "markdown", + "id": "f2195672-0cab-4967-ba8a-c6544635547d", + "metadata": {}, + "source": [ + "# Handle Cases Where No Queries are Generated\n", + "\n", + "Sometimes, a query analysis technique may allow for any number of queries to be generated - including no queries! In this case, our overall chain will need to inspect the result of the query analysis before deciding whether to call the retriever or not.\n", + "\n", + "We will use mock data for this example." ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "await queryAnalyzer.invoke(\"where did Harrison Work\")" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "id": "af62af17-4f90-4dbd-a8b4-dfff51f1db95", - "metadata": {}, - "outputs": [ + }, { - "data": { - "text/plain": [ - "AIMessage {\n", - " lc_serializable: \u001b[33mtrue\u001b[39m,\n", - " lc_kwargs: {\n", - " content: \u001b[32m\"Hello! How can I assist you today?\"\u001b[39m,\n", - " additional_kwargs: { function_call: \u001b[90mundefined\u001b[39m, tool_calls: \u001b[90mundefined\u001b[39m }\n", - " },\n", - " lc_namespace: [ \u001b[32m\"langchain_core\"\u001b[39m, \u001b[32m\"messages\"\u001b[39m ],\n", - " content: \u001b[32m\"Hello! How can I assist you today?\"\u001b[39m,\n", - " name: \u001b[90mundefined\u001b[39m,\n", - " additional_kwargs: { function_call: \u001b[90mundefined\u001b[39m, tool_calls: \u001b[90mundefined\u001b[39m }\n", - "}" + "cell_type": "markdown", + "id": "a4079b57-4369-49c9-b2ad-c809b5408d7e", + "metadata": {}, + "source": [ + "## Setup\n", + "#### Install dependencies\n", + "\n", + "```{=mdx}\n", + "import IntegrationInstallTooltip from \"@mdx_components/integration_install_tooltip.mdx\";\n", + "import Npm2Yarn from \"@theme/Npm2Yarn\";\n", + "\n", + "\n", + "\n", + "\n", + " @langchain/core @langchain/community @langchain/openai zod chromadb\n", + "\n", + "```\n", + "\n", + "#### Set environment variables\n", + "\n", + "```\n", + "OPENAI_API_KEY=your-api-key\n", + "\n", + "# Optional, use LangSmith for best-in-class observability\n", + "LANGSMITH_API_KEY=your-api-key\n", + "LANGCHAIN_TRACING_V2=true\n", + "```" ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "await queryAnalyzer.invoke(\"hi!\")" - ] - }, - { - "cell_type": "markdown", - "id": "c7c65b2f-7881-45fc-a47b-a4eaaf48245f", - "metadata": {}, - "source": [ - "## Retrieval with query analysis\n", - "\n", - "So how would we include this in a chain? Let's look at an example below." - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "id": "b209e10e", - "metadata": {}, - "outputs": [], - "source": [ - "import { JsonOutputKeyToolsParser } from \"@langchain/core/output_parsers/openai_tools\";\n", - "\n", - "const outputParser = new JsonOutputKeyToolsParser({\n", - " keyName: \"search\",\n", - "})" - ] - }, - { - "cell_type": "code", - "execution_count": 46, - "id": "8dac7866", - "metadata": {}, - "outputs": [], - "source": [ - "import { RunnableConfig, RunnableLambda } from \"@langchain/core/runnables\";\n", - "\n", - "const chain = async (question: string, config?: RunnableConfig) => {\n", - " const response = await queryAnalyzer.invoke(question, config);\n", - " if (\"tool_calls\" in response.additional_kwargs && response.additional_kwargs.tool_calls !== undefined) {\n", - " const query = await outputParser.invoke(response, config);\n", - " return retriever.invoke(query[0].query, config);\n", - " } else {\n", - " return response;\n", - " }\n", - "}\n", - "\n", - "const customChain = new RunnableLambda({ func: chain });" - ] - }, - { - "cell_type": "code", - "execution_count": 47, - "id": "232ad8a7-7990-4066-9228-d35a555f7293", - "metadata": {}, - "outputs": [ + }, { - "data": { - "text/plain": [ - "[ Document { pageContent: \u001b[32m\"Harrison worked at Kensho\"\u001b[39m, metadata: {} } ]" + "cell_type": "markdown", + "id": "c20b48b8-16d7-4089-bc17-f2d240b3935a", + "metadata": {}, + "source": [ + "### Create Index\n", + "\n", + "We will create a vectorstore over fake information." ] - }, - "execution_count": 47, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "await customChain.invoke(\"where did Harrison Work\")" - ] - }, - { - "cell_type": "code", - "execution_count": 48, - "id": "28e14ba5", - "metadata": {}, - "outputs": [ + }, { - "data": { - "text/plain": [ - "AIMessage {\n", - " lc_serializable: \u001b[33mtrue\u001b[39m,\n", - " lc_kwargs: {\n", - " content: \u001b[32m\"Hello! How can I assist you today?\"\u001b[39m,\n", - " additional_kwargs: { function_call: \u001b[90mundefined\u001b[39m, tool_calls: \u001b[90mundefined\u001b[39m }\n", - " },\n", - " lc_namespace: [ \u001b[32m\"langchain_core\"\u001b[39m, \u001b[32m\"messages\"\u001b[39m ],\n", - " content: \u001b[32m\"Hello! How can I assist you today?\"\u001b[39m,\n", - " name: \u001b[90mundefined\u001b[39m,\n", - " additional_kwargs: { function_call: \u001b[90mundefined\u001b[39m, tool_calls: \u001b[90mundefined\u001b[39m }\n", - "}" + "cell_type": "code", + "execution_count": 23, + "id": "1f621694", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[Module: null prototype] {\n", + " AdminClient: \u001b[36m[class AdminClient]\u001b[39m,\n", + " ChromaClient: \u001b[36m[class ChromaClient]\u001b[39m,\n", + " CloudClient: \u001b[36m[class CloudClient extends ChromaClient]\u001b[39m,\n", + " CohereEmbeddingFunction: \u001b[36m[class CohereEmbeddingFunction]\u001b[39m,\n", + " Collection: \u001b[36m[class Collection]\u001b[39m,\n", + " DefaultEmbeddingFunction: \u001b[36m[class _DefaultEmbeddingFunction]\u001b[39m,\n", + " GoogleGenerativeAiEmbeddingFunction: \u001b[36m[class _GoogleGenerativeAiEmbeddingFunction]\u001b[39m,\n", + " HuggingFaceEmbeddingServerFunction: \u001b[36m[class HuggingFaceEmbeddingServerFunction]\u001b[39m,\n", + " IncludeEnum: {\n", + " Documents: \u001b[32m\"documents\"\u001b[39m,\n", + " Embeddings: \u001b[32m\"embeddings\"\u001b[39m,\n", + " Metadatas: \u001b[32m\"metadatas\"\u001b[39m,\n", + " Distances: \u001b[32m\"distances\"\u001b[39m\n", + " },\n", + " JinaEmbeddingFunction: \u001b[36m[class JinaEmbeddingFunction]\u001b[39m,\n", + " OpenAIEmbeddingFunction: \u001b[36m[class _OpenAIEmbeddingFunction]\u001b[39m,\n", + " TransformersEmbeddingFunction: \u001b[36m[class _TransformersEmbeddingFunction]\u001b[39m\n", + "}" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import { Chroma } from \"@langchain/community/vectorstores/chroma\"\n", + "import { OpenAIEmbeddings } from \"@langchain/openai\"\n", + "import \"chromadb\";\n", + "\n", + "const texts = [\"Harrison worked at Kensho\"]\n", + "const embeddings = new OpenAIEmbeddings({ model: \"text-embedding-3-small\" })\n", + "const vectorstore = await Chroma.fromTexts(texts, {}, embeddings, {\n", + " collectionName: \"harrison\"\n", + "})\n", + "const retriever = vectorstore.asRetriever(1)" ] - }, - "execution_count": 48, - "metadata": {}, - "output_type": "execute_result" + }, + { + "cell_type": "markdown", + "id": "57396e23-c192-4d97-846b-5eacea4d6b8d", + "metadata": {}, + "source": [ + "## Query analysis\n", + "\n", + "We will use function calling to structure the output. However, we will configure the LLM such that is doesn't NEED to call the function representing a search query (should it decide not to). We will also then use a prompt to do query analysis that explicitly lays when it should and shouldn't make a search." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "0b51dd76-820d-41a4-98c8-893f6fe0d1ea", + "metadata": {}, + "outputs": [], + "source": [ + "import { z } from \"zod\";\n", + "\n", + "const searchSchema = z.object({\n", + " query: z.string().describe(\"Similarity search query applied to job record.\"),\n", + "});" + ] + }, + { + "cell_type": "markdown", + "id": "b7916d00", + "metadata": {}, + "source": [ + "```{=mdx}\n", + "import ChatModelTabs from \"@theme/ChatModelTabs\";\n", + "\n", + "\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "783c03c3-8c72-4f88-9cf4-5829ce6745d6", + "metadata": {}, + "outputs": [], + "source": [ + "import { zodToJsonSchema } from \"zod-to-json-schema\";\n", + "import { ChatPromptTemplate } from \"@langchain/core/prompts\";\n", + "import { RunnableSequence, RunnablePassthrough } from \"@langchain/core/runnables\";\n", + "\n", + "const system = `You have the ability to issue search queries to get information to help answer user information.\n", + "\n", + "You do not NEED to look things up. If you don't need to, then just respond normally.`;\n", + "const prompt = ChatPromptTemplate.fromMessages(\n", + " [\n", + " [\"system\", system],\n", + " [\"human\", \"{question}\"],\n", + " ]\n", + ")\n", + "const llmWithTools = llm.bind({\n", + " tools: [{\n", + " type: \"function\" as const,\n", + " function: {\n", + " name: \"search\",\n", + " description: \"Search over a database of job records.\",\n", + " parameters: zodToJsonSchema(searchSchema),\n", + " }\n", + " }]\n", + "})\n", + "const queryAnalyzer = RunnableSequence.from([\n", + " {\n", + " question: new RunnablePassthrough(),\n", + " },\n", + " prompt,\n", + " llmWithTools\n", + "])" + ] + }, + { + "cell_type": "markdown", + "id": "b9564078", + "metadata": {}, + "source": [ + "We can see that by invoking this we get an message that sometimes - but not always - returns a tool call." + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "bc1d3863", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "AIMessage {\n", + " lc_serializable: \u001b[33mtrue\u001b[39m,\n", + " lc_kwargs: {\n", + " content: \u001b[32m\"\"\u001b[39m,\n", + " additional_kwargs: {\n", + " function_call: \u001b[90mundefined\u001b[39m,\n", + " tool_calls: [\n", + " {\n", + " id: \u001b[32m\"call_uqHm5OMbXBkmqDr7Xzj8EMmd\"\u001b[39m,\n", + " type: \u001b[32m\"function\"\u001b[39m,\n", + " function: \u001b[36m[Object]\u001b[39m\n", + " }\n", + " ]\n", + " }\n", + " },\n", + " lc_namespace: [ \u001b[32m\"langchain_core\"\u001b[39m, \u001b[32m\"messages\"\u001b[39m ],\n", + " content: \u001b[32m\"\"\u001b[39m,\n", + " name: \u001b[90mundefined\u001b[39m,\n", + " additional_kwargs: {\n", + " function_call: \u001b[90mundefined\u001b[39m,\n", + " tool_calls: [\n", + " {\n", + " id: \u001b[32m\"call_uqHm5OMbXBkmqDr7Xzj8EMmd\"\u001b[39m,\n", + " type: \u001b[32m\"function\"\u001b[39m,\n", + " function: { name: \u001b[32m\"search\"\u001b[39m, arguments: \u001b[32m'{\"query\":\"Harrison\"}'\u001b[39m }\n", + " }\n", + " ]\n", + " }\n", + "}" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "await queryAnalyzer.invoke(\"where did Harrison Work\")" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "af62af17-4f90-4dbd-a8b4-dfff51f1db95", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "AIMessage {\n", + " lc_serializable: \u001b[33mtrue\u001b[39m,\n", + " lc_kwargs: {\n", + " content: \u001b[32m\"Hello! How can I assist you today?\"\u001b[39m,\n", + " additional_kwargs: { function_call: \u001b[90mundefined\u001b[39m, tool_calls: \u001b[90mundefined\u001b[39m }\n", + " },\n", + " lc_namespace: [ \u001b[32m\"langchain_core\"\u001b[39m, \u001b[32m\"messages\"\u001b[39m ],\n", + " content: \u001b[32m\"Hello! How can I assist you today?\"\u001b[39m,\n", + " name: \u001b[90mundefined\u001b[39m,\n", + " additional_kwargs: { function_call: \u001b[90mundefined\u001b[39m, tool_calls: \u001b[90mundefined\u001b[39m }\n", + "}" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "await queryAnalyzer.invoke(\"hi!\")" + ] + }, + { + "cell_type": "markdown", + "id": "c7c65b2f-7881-45fc-a47b-a4eaaf48245f", + "metadata": {}, + "source": [ + "## Retrieval with query analysis\n", + "\n", + "So how would we include this in a chain? Let's look at an example below." + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "b209e10e", + "metadata": {}, + "outputs": [], + "source": [ + "import { JsonOutputKeyToolsParser } from \"@langchain/core/output_parsers/openai_tools\";\n", + "\n", + "const outputParser = new JsonOutputKeyToolsParser({\n", + " keyName: \"search\",\n", + "})" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "id": "8dac7866", + "metadata": {}, + "outputs": [], + "source": [ + "import { RunnableConfig, RunnableLambda } from \"@langchain/core/runnables\";\n", + "\n", + "const chain = async (question: string, config?: RunnableConfig) => {\n", + " const response = await queryAnalyzer.invoke(question, config);\n", + " if (\"tool_calls\" in response.additional_kwargs && response.additional_kwargs.tool_calls !== undefined) {\n", + " const query = await outputParser.invoke(response, config);\n", + " return retriever.invoke(query[0].query, config);\n", + " } else {\n", + " return response;\n", + " }\n", + "}\n", + "\n", + "const customChain = new RunnableLambda({ func: chain });" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "id": "232ad8a7-7990-4066-9228-d35a555f7293", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[ Document { pageContent: \u001b[32m\"Harrison worked at Kensho\"\u001b[39m, metadata: {} } ]" + ] + }, + "execution_count": 47, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "await customChain.invoke(\"where did Harrison Work\")" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "id": "28e14ba5", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "AIMessage {\n", + " lc_serializable: \u001b[33mtrue\u001b[39m,\n", + " lc_kwargs: {\n", + " content: \u001b[32m\"Hello! How can I assist you today?\"\u001b[39m,\n", + " additional_kwargs: { function_call: \u001b[90mundefined\u001b[39m, tool_calls: \u001b[90mundefined\u001b[39m }\n", + " },\n", + " lc_namespace: [ \u001b[32m\"langchain_core\"\u001b[39m, \u001b[32m\"messages\"\u001b[39m ],\n", + " content: \u001b[32m\"Hello! How can I assist you today?\"\u001b[39m,\n", + " name: \u001b[90mundefined\u001b[39m,\n", + " additional_kwargs: { function_call: \u001b[90mundefined\u001b[39m, tool_calls: \u001b[90mundefined\u001b[39m }\n", + "}" + ] + }, + "execution_count": 48, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "await customChain.invoke(\"hi!\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Deno", + "language": "typescript", + "name": "deno" + }, + "language_info": { + "file_extension": ".ts", + "mimetype": "text/x.typescript", + "name": "typescript", + "nb_converter": "script", + "pygments_lexer": "typescript", + "version": "5.3.3" } - ], - "source": [ - "await customChain.invoke(\"hi!\")" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Deno", - "language": "typescript", - "name": "deno" }, - "language_info": { - "file_extension": ".ts", - "mimetype": "text/x.typescript", - "name": "typescript", - "nb_converter": "script", - "pygments_lexer": "typescript", - "version": "5.3.3" - } - }, - "nbformat": 4, - "nbformat_minor": 5 + "nbformat": 4, + "nbformat_minor": 5 } diff --git a/docs/core_docs/docs/use_cases/query_analysis/quickstart.ipynb b/docs/core_docs/docs/use_cases/query_analysis/quickstart.ipynb index ebb7daa55f39..a0910a347f04 100644 --- a/docs/core_docs/docs/use_cases/query_analysis/quickstart.ipynb +++ b/docs/core_docs/docs/use_cases/query_analysis/quickstart.ipynb @@ -1,486 +1,486 @@ { - "cells": [ - { - "cell_type": "markdown", - "id": "df7d42b9-58a6-434c-a2d7-0b61142f6d3e", - "metadata": {}, - "source": [ - "---\n", - "sidebar_position: 0\n", - "---\n", - "```{=mdx}\n", - "import CodeBlock from \"@theme/CodeBlock\";\n", - "```" - ] - }, - { - "cell_type": "markdown", - "id": "f2195672-0cab-4967-ba8a-c6544635547d", - "metadata": {}, - "source": [ - "# Quickstart\n", - "\n", - "This example will show how to use query analysis in a basic end-to-end example. This will cover creating a simple index, showing a failure mode that occur when passing a raw user question to that index, and then an example of how query analysis can help address that issue. There are MANY different query analysis techniques and this end-to-end example will not show all of them.\n", - "\n", - "For the purpose of this example, we will do retrieval over the LangChain YouTube videos." - ] - }, - { - "cell_type": "markdown", - "id": "a4079b57-4369-49c9-b2ad-c809b5408d7e", - "metadata": {}, - "source": [ - "## Setup\n", - "#### Install dependencies\n", - "\n", - "```{=mdx}\n", - "import IntegrationInstallTooltip from \"@mdx_components/integration_install_tooltip.mdx\";\n", - "import Npm2Yarn from \"@theme/Npm2Yarn\";\n", - "\n", - "\n", - "\n", - "\n", - " langchain @langchain/community @langchain/openai youtubei.js chromadb youtube-transcript\n", - "\n", - "```" - ] - }, - { - "cell_type": "markdown", - "id": "79d66a45-a05c-4d22-b011-b1cdbdfc8f9c", - "metadata": {}, - "source": [ - "#### Set environment variables\n", - "\n", - "We'll use OpenAI in this example:\n", - "\n", - "```env\n", - "OPENAI_API_KEY=your-api-key\n", - "\n", - "# Optional, use LangSmith for best-in-class observability\n", - "LANGSMITH_API_KEY=your-api-key\n", - "LANGCHAIN_TRACING_V2=true\n", - "```" - ] - }, - { - "cell_type": "markdown", - "id": "c20b48b8-16d7-4089-bc17-f2d240b3935a", - "metadata": {}, - "source": [ - "### Load documents\n", - "\n", - "We can use the `YouTubeLoader` to load transcripts of a few LangChain videos:\n", - "\n", - "```{=mdx}\n", - "import LoadYtVideos from \"@examples/use_cases/query_analysis/quickstart/load_yt_videos.ts\";\n", - "\n", - "{LoadYtVideos}\n", - "```" - ] - }, - { - "cell_type": "markdown", - "id": "516b47fb", - "metadata": {}, - "source": [ - "Here's the metadata associated with each video.\n", - "\n", - "We can see that each document also has a title, view count, publication date, and length:\n", - "\n", - "```{=mdx}\n", - "import VideoMetadata from \"@examples/use_cases/query_analysis/quickstart/metadata.ts\";\n", - "\n", - "{VideoMetadata}\n", - "```" - ] - }, - { - "cell_type": "markdown", - "id": "561697c8-b848-4b12-847c-ab6a8e2d1ae6", - "metadata": {}, - "source": [ - "### Indexing documents\n", - "\n", - "Whenever we perform retrieval we need to create an index of documents that we can query. We'll use a vector\n", - "store to index our documents, and we'll chunk them first to make our retrievals more concise and precise:\n", - "\n", - "```{=mdx}\n", - "import IndexDocs from \"@examples/use_cases/query_analysis/quickstart/index_docs.ts\";\n", - "\n", - "{IndexDocs}\n", - "```" - ] - }, - { - "cell_type": "markdown", - "id": "850717b9", - "metadata": {}, - "source": [ - "Then later, you can retrieve the index without having to re-query and embed:" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "247fae46", - "metadata": {}, - "outputs": [ + "cells": [ { - "data": { - "text/plain": [ - "[Module: null prototype] {\n", - " AdminClient: \u001b[36m[class AdminClient]\u001b[39m,\n", - " ChromaClient: \u001b[36m[class ChromaClient]\u001b[39m,\n", - " CloudClient: \u001b[36m[class CloudClient extends ChromaClient]\u001b[39m,\n", - " CohereEmbeddingFunction: \u001b[36m[class CohereEmbeddingFunction]\u001b[39m,\n", - " Collection: \u001b[36m[class Collection]\u001b[39m,\n", - " DefaultEmbeddingFunction: \u001b[36m[class _DefaultEmbeddingFunction]\u001b[39m,\n", - " GoogleGenerativeAiEmbeddingFunction: \u001b[36m[class _GoogleGenerativeAiEmbeddingFunction]\u001b[39m,\n", - " HuggingFaceEmbeddingServerFunction: \u001b[36m[class HuggingFaceEmbeddingServerFunction]\u001b[39m,\n", - " IncludeEnum: {\n", - " Documents: \u001b[32m\"documents\"\u001b[39m,\n", - " Embeddings: \u001b[32m\"embeddings\"\u001b[39m,\n", - " Metadatas: \u001b[32m\"metadatas\"\u001b[39m,\n", - " Distances: \u001b[32m\"distances\"\u001b[39m\n", - " },\n", - " JinaEmbeddingFunction: \u001b[36m[class JinaEmbeddingFunction]\u001b[39m,\n", - " OpenAIEmbeddingFunction: \u001b[36m[class _OpenAIEmbeddingFunction]\u001b[39m,\n", - " TransformersEmbeddingFunction: \u001b[36m[class _TransformersEmbeddingFunction]\u001b[39m\n", - "}" + "cell_type": "markdown", + "id": "df7d42b9-58a6-434c-a2d7-0b61142f6d3e", + "metadata": {}, + "source": [ + "---\n", + "sidebar_position: 0\n", + "---\n", + "```{=mdx}\n", + "import CodeBlock from \"@theme/CodeBlock\";\n", + "```" ] - }, - "execution_count": 1, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import \"chromadb\";\n", - "import { OpenAIEmbeddings } from \"@langchain/openai\";\n", - "import { Chroma } from \"@langchain/community/vectorstores/chroma\";\n", - "\n", - "const embeddings = new OpenAIEmbeddings({\n", - " modelName: \"text-embedding-3-small\"\n", - "});\n", - "const vectorStore = await Chroma.fromExistingCollection(embeddings, {\n", - " collectionName: \"yt-videos\",\n", - "});" - ] - }, - { - "cell_type": "markdown", - "id": "483d8d0a-5c1b-46b0-862c-a4eccfd5ae3c", - "metadata": {}, - "source": [ - "## Retrieval without query analysis\n", - "\n", - "We can perform similarity search on a user question directly to find chunks relevant to the question:" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "09435e9b-57b4-41b1-b34a-449815bdfae0", - "metadata": {}, - "outputs": [ + }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "OpenGPTs\n", - "hardcoded that it will always do a retrieval step here the assistant decides whether to do a retrieval step or not sometimes this is good sometimes this is bad sometimes it you don't need to do a retrieval step when I said hi it didn't need to call it tool um but other times you know the the llm might mess up and not realize that it needs to do a retrieval step and so the rag bot will always do a retrieval step so it's more focused there because this is also a simpler architecture so it's always\n" - ] - } - ], - "source": [ - "const searchResults = await vectorStore.similaritySearch(\"how do I build a RAG agent\");\n", - "console.log(searchResults[0].metadata.title);\n", - "console.log(searchResults[0].pageContent.slice(0, 500));" - ] - }, - { - "cell_type": "markdown", - "id": "5a79ef1b-7edd-4b68-98e5-c0e4c0dd02e6", - "metadata": {}, - "source": [ - "This works pretty okay! Our first result is somewhat relevant to the question.\n", - "\n", - "What if we wanted to search for results from a specific time period?" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "7adbfc11-ca01-4883-8978-e4f6e4a1d23d", - "metadata": {}, - "outputs": [ + "cell_type": "markdown", + "id": "f2195672-0cab-4967-ba8a-c6544635547d", + "metadata": {}, + "source": [ + "# Quickstart\n", + "\n", + "This example will show how to use query analysis in a basic end-to-end example. This will cover creating a simple index, showing a failure mode that occur when passing a raw user question to that index, and then an example of how query analysis can help address that issue. There are MANY different query analysis techniques and this end-to-end example will not show all of them.\n", + "\n", + "For the purpose of this example, we will do retrieval over the LangChain YouTube videos." + ] + }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "OpenGPTs\n", - "2024\n", - "hardcoded that it will always do a retrieval step here the assistant decides whether to do a retrieval step or not sometimes this is good sometimes this is bad sometimes it you don't need to do a retrieval step when I said hi it didn't need to call it tool um but other times you know the the llm might mess up and not realize that it needs to do a retrieval step and so the rag bot will always do a retrieval step so it's more focused there because this is also a simpler architecture so it's always\n" - ] - } - ], - "source": [ - "const searchResults = await vectorStore.similaritySearch(\"videos on RAG published in 2023\");\n", - "console.log(searchResults[0].metadata.title);\n", - "console.log(searchResults[0].metadata.publish_year);\n", - "console.log(searchResults[0].pageContent.slice(0, 500));" - ] - }, - { - "cell_type": "markdown", - "id": "4790e2db-3c6e-440b-b6e8-ebdd6600fda5", - "metadata": {}, - "source": [ - "Our first result is from 2024, and not very relevant to the input. Since we're just searching against document contents, there's no way for the results to be filtered on any document attributes.\n", - "\n", - "This is just one failure mode that can arise. Let's now take a look at how a basic form of query analysis can fix it!" - ] - }, - { - "cell_type": "markdown", - "id": "57396e23-c192-4d97-846b-5eacea4d6b8d", - "metadata": {}, - "source": [ - "## Query analysis\n", - "\n", - "To handle these failure modes we'll do some query structuring. This will involve defining a **query schema** that contains some date filters and use a function-calling model to convert a user question into a structured queries. \n", - "\n", - "### Query schema\n", - "In this case we'll have explicit min and max attributes for publication date so that it can be filtered on." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "0b51dd76-820d-41a4-98c8-893f6fe0d1ea", - "metadata": {}, - "outputs": [], - "source": [ - "import { z } from 'zod';\n", - "\n", - "const searchSchema = z.object({\n", - " query: z.string().describe(\"Similarity search query applied to video transcripts.\"),\n", - " publish_year: z.number().optional().describe(\"Year of video publication.\"),\n", - "}).describe(\"Search over a database of tutorial videos about a software library.\");" - ] - }, - { - "cell_type": "markdown", - "id": "f8b08c52-1ce9-4d8b-a779-cbe8efde51d1", - "metadata": {}, - "source": [ - "### Query generation\n", - "\n", - "To convert user questions to structured queries we'll make use of OpenAI's function-calling API. Specifically we'll use the new [ChatModel.withStructuredOutput()](https://api.js.langchain.com/classes/langchain_core_language_models_base.BaseLanguageModel.html#withStructuredOutput) constructor to handle passing the schema to the model and parsing the output." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "783c03c3-8c72-4f88-9cf4-5829ce6745d6", - "metadata": {}, - "outputs": [], - "source": [ - "import { ChatPromptTemplate } from \"@langchain/core/prompts\";\n", - "import { ChatOpenAI } from \"@langchain/openai\";\n", - "import { RunnablePassthrough, RunnableSequence } from \"@langchain/core/runnables\";\n", - "\n", - "const system = `You are an expert at converting user questions into database queries.\n", - "You have access to a database of tutorial videos about a software library for building LLM-powered applications.\n", - "Given a question, return a list of database queries optimized to retrieve the most relevant results.\n", - "\n", - "If there are acronyms or words you are not familiar with, do not try to rephrase them.`;\n", - "const prompt = ChatPromptTemplate.fromMessages([\n", - " [\"system\", system],\n", - " [\"human\", \"{question}\"]\n", - "]);\n", - "const llm = new ChatOpenAI({\n", - " modelName: \"gpt-3.5-turbo-0125\",\n", - " temperature: 0,\n", - "});\n", - "const structuredLLM = llm.withStructuredOutput(searchSchema, {\n", - " name: \"search\",\n", - "});\n", - "\n", - "const queryAnalyzer = RunnableSequence.from([\n", - " {\n", - " question: new RunnablePassthrough(),\n", - " },\n", - " prompt,\n", - " structuredLLM,\n", - "]);" - ] - }, - { - "cell_type": "markdown", - "id": "f403517a-b8e3-44ac-b0a6-02f8305635a2", - "metadata": {}, - "source": [ - "Let's see what queries our analyzer generates for the questions we searched earlier:" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "bc1d3863", - "metadata": {}, - "outputs": [ + "cell_type": "markdown", + "id": "a4079b57-4369-49c9-b2ad-c809b5408d7e", + "metadata": {}, + "source": [ + "## Setup\n", + "#### Install dependencies\n", + "\n", + "```{=mdx}\n", + "import IntegrationInstallTooltip from \"@mdx_components/integration_install_tooltip.mdx\";\n", + "import Npm2Yarn from \"@theme/Npm2Yarn\";\n", + "\n", + "\n", + "\n", + "\n", + " langchain @langchain/community @langchain/openai youtubei.js chromadb youtube-transcript\n", + "\n", + "```" + ] + }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "{ query: \"build a rag agent\" }\n" - ] - } - ], - "source": [ - "console.log(await queryAnalyzer.invoke(\"How do I build a rag agent\"));" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "af62af17-4f90-4dbd-a8b4-dfff51f1db95", - "metadata": {}, - "outputs": [ + "cell_type": "markdown", + "id": "79d66a45-a05c-4d22-b011-b1cdbdfc8f9c", + "metadata": {}, + "source": [ + "#### Set environment variables\n", + "\n", + "We'll use OpenAI in this example:\n", + "\n", + "```env\n", + "OPENAI_API_KEY=your-api-key\n", + "\n", + "# Optional, use LangSmith for best-in-class observability\n", + "LANGSMITH_API_KEY=your-api-key\n", + "LANGCHAIN_TRACING_V2=true\n", + "```" + ] + }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "{ query: \"RAG\", publish_year: 2023 }\n" - ] - } - ], - "source": [ - "console.log(await queryAnalyzer.invoke(\"videos on RAG published in 2023\"));" - ] - }, - { - "cell_type": "markdown", - "id": "c7c65b2f-7881-45fc-a47b-a4eaaf48245f", - "metadata": {}, - "source": [ - "## Retrieval with query analysis\n", - "\n", - "Our query analysis looks pretty good; now let's try using our generated queries to actually perform retrieval. \n", - "\n", - "**Note:** in our example, we specified `tool_choice: \"Search\"`. This will force the LLM to call one - and only one - function, meaning that we will always have one optimized query to look up. Note that this is not always the case - see other guides for how to deal with situations when no - or multiple - optimized queries are returned." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "8dac7866", - "metadata": {}, - "outputs": [], - "source": [ - "import { DocumentInterface } from \"@langchain/core/documents\";\n", - "\n", - "const retrieval = async (input: { query: string, publish_year?: number }): Promise => {\n", - " let _filter: Record = {};\n", - " if (input.publish_year) {\n", - " // This syntax is specific to Chroma\n", - " // the vector database we are using.\n", - " _filter = {\n", - " publish_year: {\n", - " \"$eq\": input.publish_year\n", - " }\n", - " };\n", - " }\n", - " \n", - " return vectorStore.similaritySearch(input.query, undefined, _filter);\n", - " };" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "232ad8a7-7990-4066-9228-d35a555f7293", - "metadata": {}, - "outputs": [], - "source": [ - "import { RunnableLambda } from \"@langchain/core/runnables\";\n", - "\n", - "const retrievalChain = queryAnalyzer.pipe(new RunnableLambda({\n", - " func: async (input) => retrieval(input as unknown as { query: string, publish_year?: number })\n", - "}));" - ] - }, - { - "cell_type": "markdown", - "id": "e6a4460c", - "metadata": {}, - "source": [ - "We can now run this chain on the problematic input from before, and see that it yields only results from that year!" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "e7f683b5-b1c5-4dec-b163-2efc162a2b51", - "metadata": {}, - "outputs": [], - "source": [ - "const results = await retrievalChain.invoke(\"RAG tutorial published in 2023\");" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "1ad52512-b3e8-42a3-8701-d9e87fb8b46c", - "metadata": {}, - "outputs": [ + "cell_type": "markdown", + "id": "c20b48b8-16d7-4089-bc17-f2d240b3935a", + "metadata": {}, + "source": [ + "### Load documents\n", + "\n", + "We can use the `YouTubeLoader` to load transcripts of a few LangChain videos:\n", + "\n", + "```{=mdx}\n", + "import LoadYtVideos from \"@examples/use_cases/query_analysis/quickstart/load_yt_videos.ts\";\n", + "\n", + "{LoadYtVideos}\n", + "```" + ] + }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "[\n", - " {\n", - " title: \"Getting Started with Multi-Modal LLMs\",\n", - " year: \"2023-12-20T08:00:00.000Z\"\n", - " },\n", - " {\n", - " title: \"LangServe and LangChain Templates Webinar\",\n", - " year: \"2023-11-02T07:00:00.000Z\"\n", - " },\n", - " {\n", - " title: \"Getting Started with Multi-Modal LLMs\",\n", - " year: \"2023-12-20T08:00:00.000Z\"\n", - " },\n", - " {\n", - " title: \"Building a Research Assistant from Scratch\",\n", - " year: \"2023-11-16T08:00:00.000Z\"\n", - " }\n", - "]\n" - ] + "cell_type": "markdown", + "id": "516b47fb", + "metadata": {}, + "source": [ + "Here's the metadata associated with each video.\n", + "\n", + "We can see that each document also has a title, view count, publication date, and length:\n", + "\n", + "```{=mdx}\n", + "import VideoMetadata from \"@examples/use_cases/query_analysis/quickstart/metadata.ts\";\n", + "\n", + "{VideoMetadata}\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "561697c8-b848-4b12-847c-ab6a8e2d1ae6", + "metadata": {}, + "source": [ + "### Indexing documents\n", + "\n", + "Whenever we perform retrieval we need to create an index of documents that we can query. We'll use a vector\n", + "store to index our documents, and we'll chunk them first to make our retrievals more concise and precise:\n", + "\n", + "```{=mdx}\n", + "import IndexDocs from \"@examples/use_cases/query_analysis/quickstart/index_docs.ts\";\n", + "\n", + "{IndexDocs}\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "850717b9", + "metadata": {}, + "source": [ + "Then later, you can retrieve the index without having to re-query and embed:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "247fae46", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[Module: null prototype] {\n", + " AdminClient: \u001b[36m[class AdminClient]\u001b[39m,\n", + " ChromaClient: \u001b[36m[class ChromaClient]\u001b[39m,\n", + " CloudClient: \u001b[36m[class CloudClient extends ChromaClient]\u001b[39m,\n", + " CohereEmbeddingFunction: \u001b[36m[class CohereEmbeddingFunction]\u001b[39m,\n", + " Collection: \u001b[36m[class Collection]\u001b[39m,\n", + " DefaultEmbeddingFunction: \u001b[36m[class _DefaultEmbeddingFunction]\u001b[39m,\n", + " GoogleGenerativeAiEmbeddingFunction: \u001b[36m[class _GoogleGenerativeAiEmbeddingFunction]\u001b[39m,\n", + " HuggingFaceEmbeddingServerFunction: \u001b[36m[class HuggingFaceEmbeddingServerFunction]\u001b[39m,\n", + " IncludeEnum: {\n", + " Documents: \u001b[32m\"documents\"\u001b[39m,\n", + " Embeddings: \u001b[32m\"embeddings\"\u001b[39m,\n", + " Metadatas: \u001b[32m\"metadatas\"\u001b[39m,\n", + " Distances: \u001b[32m\"distances\"\u001b[39m\n", + " },\n", + " JinaEmbeddingFunction: \u001b[36m[class JinaEmbeddingFunction]\u001b[39m,\n", + " OpenAIEmbeddingFunction: \u001b[36m[class _OpenAIEmbeddingFunction]\u001b[39m,\n", + " TransformersEmbeddingFunction: \u001b[36m[class _TransformersEmbeddingFunction]\u001b[39m\n", + "}" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import \"chromadb\";\n", + "import { OpenAIEmbeddings } from \"@langchain/openai\";\n", + "import { Chroma } from \"@langchain/community/vectorstores/chroma\";\n", + "\n", + "const embeddings = new OpenAIEmbeddings({\n", + " model: \"text-embedding-3-small\"\n", + "});\n", + "const vectorStore = await Chroma.fromExistingCollection(embeddings, {\n", + " collectionName: \"yt-videos\",\n", + "});" + ] + }, + { + "cell_type": "markdown", + "id": "483d8d0a-5c1b-46b0-862c-a4eccfd5ae3c", + "metadata": {}, + "source": [ + "## Retrieval without query analysis\n", + "\n", + "We can perform similarity search on a user question directly to find chunks relevant to the question:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "09435e9b-57b4-41b1-b34a-449815bdfae0", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "OpenGPTs\n", + "hardcoded that it will always do a retrieval step here the assistant decides whether to do a retrieval step or not sometimes this is good sometimes this is bad sometimes it you don't need to do a retrieval step when I said hi it didn't need to call it tool um but other times you know the the llm might mess up and not realize that it needs to do a retrieval step and so the rag bot will always do a retrieval step so it's more focused there because this is also a simpler architecture so it's always\n" + ] + } + ], + "source": [ + "const searchResults = await vectorStore.similaritySearch(\"how do I build a RAG agent\");\n", + "console.log(searchResults[0].metadata.title);\n", + "console.log(searchResults[0].pageContent.slice(0, 500));" + ] + }, + { + "cell_type": "markdown", + "id": "5a79ef1b-7edd-4b68-98e5-c0e4c0dd02e6", + "metadata": {}, + "source": [ + "This works pretty okay! Our first result is somewhat relevant to the question.\n", + "\n", + "What if we wanted to search for results from a specific time period?" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "7adbfc11-ca01-4883-8978-e4f6e4a1d23d", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "OpenGPTs\n", + "2024\n", + "hardcoded that it will always do a retrieval step here the assistant decides whether to do a retrieval step or not sometimes this is good sometimes this is bad sometimes it you don't need to do a retrieval step when I said hi it didn't need to call it tool um but other times you know the the llm might mess up and not realize that it needs to do a retrieval step and so the rag bot will always do a retrieval step so it's more focused there because this is also a simpler architecture so it's always\n" + ] + } + ], + "source": [ + "const searchResults = await vectorStore.similaritySearch(\"videos on RAG published in 2023\");\n", + "console.log(searchResults[0].metadata.title);\n", + "console.log(searchResults[0].metadata.publish_year);\n", + "console.log(searchResults[0].pageContent.slice(0, 500));" + ] + }, + { + "cell_type": "markdown", + "id": "4790e2db-3c6e-440b-b6e8-ebdd6600fda5", + "metadata": {}, + "source": [ + "Our first result is from 2024, and not very relevant to the input. Since we're just searching against document contents, there's no way for the results to be filtered on any document attributes.\n", + "\n", + "This is just one failure mode that can arise. Let's now take a look at how a basic form of query analysis can fix it!" + ] + }, + { + "cell_type": "markdown", + "id": "57396e23-c192-4d97-846b-5eacea4d6b8d", + "metadata": {}, + "source": [ + "## Query analysis\n", + "\n", + "To handle these failure modes we'll do some query structuring. This will involve defining a **query schema** that contains some date filters and use a function-calling model to convert a user question into a structured queries. \n", + "\n", + "### Query schema\n", + "In this case we'll have explicit min and max attributes for publication date so that it can be filtered on." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "0b51dd76-820d-41a4-98c8-893f6fe0d1ea", + "metadata": {}, + "outputs": [], + "source": [ + "import { z } from 'zod';\n", + "\n", + "const searchSchema = z.object({\n", + " query: z.string().describe(\"Similarity search query applied to video transcripts.\"),\n", + " publish_year: z.number().optional().describe(\"Year of video publication.\"),\n", + "}).describe(\"Search over a database of tutorial videos about a software library.\");" + ] + }, + { + "cell_type": "markdown", + "id": "f8b08c52-1ce9-4d8b-a779-cbe8efde51d1", + "metadata": {}, + "source": [ + "### Query generation\n", + "\n", + "To convert user questions to structured queries we'll make use of OpenAI's function-calling API. Specifically we'll use the new [ChatModel.withStructuredOutput()](https://api.js.langchain.com/classes/langchain_core_language_models_base.BaseLanguageModel.html#withStructuredOutput) constructor to handle passing the schema to the model and parsing the output." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "783c03c3-8c72-4f88-9cf4-5829ce6745d6", + "metadata": {}, + "outputs": [], + "source": [ + "import { ChatPromptTemplate } from \"@langchain/core/prompts\";\n", + "import { ChatOpenAI } from \"@langchain/openai\";\n", + "import { RunnablePassthrough, RunnableSequence } from \"@langchain/core/runnables\";\n", + "\n", + "const system = `You are an expert at converting user questions into database queries.\n", + "You have access to a database of tutorial videos about a software library for building LLM-powered applications.\n", + "Given a question, return a list of database queries optimized to retrieve the most relevant results.\n", + "\n", + "If there are acronyms or words you are not familiar with, do not try to rephrase them.`;\n", + "const prompt = ChatPromptTemplate.fromMessages([\n", + " [\"system\", system],\n", + " [\"human\", \"{question}\"]\n", + "]);\n", + "const llm = new ChatOpenAI({\n", + " model: \"gpt-3.5-turbo-0125\",\n", + " temperature: 0,\n", + "});\n", + "const structuredLLM = llm.withStructuredOutput(searchSchema, {\n", + " name: \"search\",\n", + "});\n", + "\n", + "const queryAnalyzer = RunnableSequence.from([\n", + " {\n", + " question: new RunnablePassthrough(),\n", + " },\n", + " prompt,\n", + " structuredLLM,\n", + "]);" + ] + }, + { + "cell_type": "markdown", + "id": "f403517a-b8e3-44ac-b0a6-02f8305635a2", + "metadata": {}, + "source": [ + "Let's see what queries our analyzer generates for the questions we searched earlier:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "bc1d3863", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{ query: \"build a rag agent\" }\n" + ] + } + ], + "source": [ + "console.log(await queryAnalyzer.invoke(\"How do I build a rag agent\"));" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "af62af17-4f90-4dbd-a8b4-dfff51f1db95", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{ query: \"RAG\", publish_year: 2023 }\n" + ] + } + ], + "source": [ + "console.log(await queryAnalyzer.invoke(\"videos on RAG published in 2023\"));" + ] + }, + { + "cell_type": "markdown", + "id": "c7c65b2f-7881-45fc-a47b-a4eaaf48245f", + "metadata": {}, + "source": [ + "## Retrieval with query analysis\n", + "\n", + "Our query analysis looks pretty good; now let's try using our generated queries to actually perform retrieval. \n", + "\n", + "**Note:** in our example, we specified `tool_choice: \"Search\"`. This will force the LLM to call one - and only one - function, meaning that we will always have one optimized query to look up. Note that this is not always the case - see other guides for how to deal with situations when no - or multiple - optimized queries are returned." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "8dac7866", + "metadata": {}, + "outputs": [], + "source": [ + "import { DocumentInterface } from \"@langchain/core/documents\";\n", + "\n", + "const retrieval = async (input: { query: string, publish_year?: number }): Promise => {\n", + " let _filter: Record = {};\n", + " if (input.publish_year) {\n", + " // This syntax is specific to Chroma\n", + " // the vector database we are using.\n", + " _filter = {\n", + " publish_year: {\n", + " \"$eq\": input.publish_year\n", + " }\n", + " };\n", + " }\n", + " \n", + " return vectorStore.similaritySearch(input.query, undefined, _filter);\n", + " };" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "232ad8a7-7990-4066-9228-d35a555f7293", + "metadata": {}, + "outputs": [], + "source": [ + "import { RunnableLambda } from \"@langchain/core/runnables\";\n", + "\n", + "const retrievalChain = queryAnalyzer.pipe(new RunnableLambda({\n", + " func: async (input) => retrieval(input as unknown as { query: string, publish_year?: number })\n", + "}));" + ] + }, + { + "cell_type": "markdown", + "id": "e6a4460c", + "metadata": {}, + "source": [ + "We can now run this chain on the problematic input from before, and see that it yields only results from that year!" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "e7f683b5-b1c5-4dec-b163-2efc162a2b51", + "metadata": {}, + "outputs": [], + "source": [ + "const results = await retrievalChain.invoke(\"RAG tutorial published in 2023\");" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "1ad52512-b3e8-42a3-8701-d9e87fb8b46c", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[\n", + " {\n", + " title: \"Getting Started with Multi-Modal LLMs\",\n", + " year: \"2023-12-20T08:00:00.000Z\"\n", + " },\n", + " {\n", + " title: \"LangServe and LangChain Templates Webinar\",\n", + " year: \"2023-11-02T07:00:00.000Z\"\n", + " },\n", + " {\n", + " title: \"Getting Started with Multi-Modal LLMs\",\n", + " year: \"2023-12-20T08:00:00.000Z\"\n", + " },\n", + " {\n", + " title: \"Building a Research Assistant from Scratch\",\n", + " year: \"2023-11-16T08:00:00.000Z\"\n", + " }\n", + "]\n" + ] + } + ], + "source": [ + "console.log(results.map((doc) => ({ title: doc.metadata.title, year: doc.metadata.publish_date })));" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Deno", + "language": "typescript", + "name": "deno" + }, + "language_info": { + "file_extension": ".ts", + "mimetype": "text/x.typescript", + "name": "typescript", + "nb_converter": "script", + "pygments_lexer": "typescript", + "version": "5.3.3" } - ], - "source": [ - "console.log(results.map((doc) => ({ title: doc.metadata.title, year: doc.metadata.publish_date })));" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Deno", - "language": "typescript", - "name": "deno" }, - "language_info": { - "file_extension": ".ts", - "mimetype": "text/x.typescript", - "name": "typescript", - "nb_converter": "script", - "pygments_lexer": "typescript", - "version": "5.3.3" - } - }, - "nbformat": 4, - "nbformat_minor": 5 + "nbformat": 4, + "nbformat_minor": 5 } diff --git a/docs/core_docs/docs/use_cases/question_answering/chat_history.ipynb b/docs/core_docs/docs/use_cases/question_answering/chat_history.ipynb index 752fa029837b..ce7d7475de17 100644 --- a/docs/core_docs/docs/use_cases/question_answering/chat_history.ipynb +++ b/docs/core_docs/docs/use_cases/question_answering/chat_history.ipynb @@ -100,7 +100,7 @@ "// Retrieve and generate using the relevant snippets of the blog.\n", "const retriever = vectorStore.asRetriever();\n", "const prompt = await pull(\"rlm/rag-prompt\");\n", - "const llm = new ChatOpenAI({ modelName: \"gpt-3.5-turbo\", temperature: 0 });\n", + "const llm = new ChatOpenAI({ model: \"gpt-3.5-turbo\", temperature: 0 });\n", "const ragChain = await createStuffDocumentsChain({\n", " llm,\n", " prompt,\n", diff --git a/docs/core_docs/docs/use_cases/question_answering/citations.ipynb b/docs/core_docs/docs/use_cases/question_answering/citations.ipynb index d05db8127f11..5d3d94aff0dc 100644 --- a/docs/core_docs/docs/use_cases/question_answering/citations.ipynb +++ b/docs/core_docs/docs/use_cases/question_answering/citations.ipynb @@ -1,1302 +1,1302 @@ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Citations\n", - "\n", - "How can we get a model to cite which parts of the source documents it referenced in its response?\n", - "\n", - "To explore some techniques for extracting citations, let's first create a simple RAG chain. To start we'll just retrieve from the web using the [TavilySearchAPIRetriever](https://js.langchain.com/docs/integrations/retrievers/tavily)." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Setup\n", - "### Dependencies\n", - "\n", - "We’ll use an OpenAI chat model and embeddings and a Memory vector store in this walkthrough, but everything shown here works with any [ChatModel](/docs/modules/model_io/chat) or [LLM](/docs/modules/model_io/llms), [Embeddings](https://js.langchain.com/docs/modules/data_connection/text_embedding/), and [VectorStore](https://js.langchain.com/docs/modules/data_connection/vectorstores/) or [Retriever](/docs/modules/data_connection/retrievers/).\n", - "\n", - "We’ll use the following packages:\n", - "\n", - "```bash\n", - "npm install --save langchain @langchain/community @langchain/openai\n", - "```\n", - "\n", - "We need to set environment variables for Tavily Search & OpenAI:\n", - "\n", - "```bash\n", - "export OPENAI_API_KEY=YOUR_KEY\n", - "export TAVILY_API_KEY=YOUR_KEY\n", - "```" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### LangSmith\n", - "\n", - "Many of the applications you build with LangChain will contain multiple steps with multiple invocations of LLM calls. As these applications get more and more complex, it becomes crucial to be able to inspect what exactly is going on inside your chain or agent. The best way to do this is with [LangSmith](https://smith.langchain.com/).\n", - "\n", - "Note that LangSmith is not needed, but it is helpful. If you do want to use LangSmith, after you sign up at the link above, make sure to set your environment variables to start logging traces:\n", - "\n", - "\n", - "```bash\n", - "export LANGCHAIN_TRACING_V2=true\n", - "export LANGCHAIN_API_KEY=YOUR_KEY\n", - "```" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Initial setup" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "import { TavilySearchAPIRetriever } from \"@langchain/community/retrievers/tavily_search_api\";\n", - "import { ChatPromptTemplate } from \"@langchain/core/prompts\";\n", - "import { ChatOpenAI } from \"@langchain/openai\";\n", - "\n", - "const llm = new ChatOpenAI({\n", - " modelName: \"gpt-3.5-turbo\",\n", - " temperature: 0,\n", - "});\n", - "const retriever = new TavilySearchAPIRetriever({\n", - " k: 6,\n", - "});\n", - "const prompt = ChatPromptTemplate.fromMessages([\n", - " [\"system\", \"You're a helpful AI assistant. Given a user question and some web article snippets, answer the user question. If none of the articles answer the question, just say you don't know.\\n\\nHere are the web articles:{context}\"],\n", - " [\"human\", \"{question}\"],\n", - "])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now that we've got a model, retriever and prompt, let's chain them all together. We'll need to add some logic for formatting our retrieved `Document`s to a string that can be passed to our prompt. We'll make it so our chain returns both the answer and the retrieved Documents." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "import { Document } from \"@langchain/core/documents\";\n", - "import { StringOutputParser } from \"@langchain/core/output_parsers\";\n", - "import { RunnableMap, RunnablePassthrough } from \"@langchain/core/runnables\";\n", - "\n", - "/**\n", - " * Format the documents into a readable string.\n", - " */\n", - "const formatDocs = (input: Record): string => {\n", - " const { docs } = input;\n", - " return \"\\n\\n\" + docs.map((doc: Document) => `Article title: ${doc.metadata.title}\\nArticle Snippet: ${doc.pageContent}`).join(\"\\n\\n\");\n", - "}\n", - "// subchain for generating an answer once we've done retrieval\n", - "const answerChain = prompt.pipe(llm).pipe(new StringOutputParser());\n", - "const map = RunnableMap.from({\n", - " question: new RunnablePassthrough(),\n", - " docs: retriever,\n", - "})\n", - "// complete chain that calls the retriever -> formats docs to string -> runs answer subchain -> returns just the answer and retrieved docs.\n", - "const chain = map.assign({ context: formatDocs }).assign({ answer: answerChain }).pick([\"answer\", \"docs\"])" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ + "cells": [ { - "data": { - "text/plain": [ - "{\n", - " answer: \u001b[32m\"Cheetahs are capable of reaching speeds as high as 75 mph or 120 km/h. Their average speed, however,\"\u001b[39m... 29 more characters,\n", - " docs: [\n", - " Document {\n", - " pageContent: \u001b[32m\"Now, their only hope lies in the hands of human conservationists, working tirelessly to save the che\"\u001b[39m... 880 more characters,\n", - " metadata: {\n", - " title: \u001b[32m\"How Fast Are Cheetahs, and Other Fascinating Facts About the World's ...\"\u001b[39m,\n", - " source: \u001b[32m\"https://www.discovermagazine.com/planet-earth/how-fast-are-cheetahs-and-other-fascinating-facts-abou\"\u001b[39m... 21 more characters,\n", - " score: \u001b[33m0.93715\u001b[39m,\n", - " images: \u001b[1mnull\u001b[22m\n", - " }\n", - " },\n", - " Document {\n", - " pageContent: \u001b[32m\"If a lion comes along, the cheetah will abandon its catch -- it can't fight off a lion, and chances \"\u001b[39m... 911 more characters,\n", - " metadata: {\n", - " title: \u001b[32m\"What makes a cheetah run so fast? | HowStuffWorks\"\u001b[39m,\n", - " source: \u001b[32m\"https://animals.howstuffworks.com/mammals/cheetah-speed.htm\"\u001b[39m,\n", - " score: \u001b[33m0.93412\u001b[39m,\n", - " images: \u001b[1mnull\u001b[22m\n", - " }\n", - " },\n", - " Document {\n", - " pageContent: \u001b[32m\"The science of cheetah speed\\n\"\u001b[39m +\n", - " \u001b[32m\"The cheetah (Acinonyx jubatus) is the fastest land animal on Earth, cap\"\u001b[39m... 738 more characters,\n", - " metadata: {\n", - " title: \u001b[32m\"How Fast Can a Cheetah Run? - ThoughtCo\"\u001b[39m,\n", - " source: \u001b[32m\"https://www.thoughtco.com/how-fast-can-a-cheetah-run-4587031\"\u001b[39m,\n", - " score: \u001b[33m0.93134\u001b[39m,\n", - " images: \u001b[1mnull\u001b[22m\n", - " }\n", - " },\n", - " Document {\n", - " pageContent: \u001b[32m\"One of two videos from National Geographic's award-winning multimedia coverage of cheetahs in the ma\"\u001b[39m... 60 more characters,\n", - " metadata: {\n", - " title: \u001b[32m\"The Science of a Cheetah's Speed | National Geographic\"\u001b[39m,\n", - " source: \u001b[32m\"https://www.youtube.com/watch?v=icFMTB0Pi0g\"\u001b[39m,\n", - " score: \u001b[33m0.93109\u001b[39m,\n", - " images: \u001b[1mnull\u001b[22m\n", - " }\n", - " },\n", - " Document {\n", - " pageContent: \u001b[32m\"Contact Us − +\\n\"\u001b[39m +\n", - " \u001b[32m\"Address\\n\"\u001b[39m +\n", - " \u001b[32m\"Smithsonian's National Zoo & Conservation Biology Institute  3001 Connecticut\"\u001b[39m... 1343 more characters,\n", - " metadata: {\n", - " title: \u001b[32m\"Cheetah | Smithsonian's National Zoo and Conservation Biology Institute\"\u001b[39m,\n", - " source: \u001b[32m\"https://nationalzoo.si.edu/animals/cheetah\"\u001b[39m,\n", - " score: \u001b[33m0.92938\u001b[39m,\n", - " images: \u001b[1mnull\u001b[22m\n", - " }\n", - " },\n", - " Document {\n", - " pageContent: \u001b[32m\"Threats to the Cheetah’s Reign\\n\"\u001b[39m +\n", - " \u001b[32m\"As unparalleled as the cheetah’s speed might be, they face numerous c\"\u001b[39m... 907 more characters,\n", - " metadata: {\n", - " title: \u001b[32m\"How Fast Can a Cheetah Run? The Secrets Behind Its Incredible Speed\"\u001b[39m,\n", - " source: \u001b[32m\"https://www.explorationjunkie.com/how-fast-can-a-cheetah-run/\"\u001b[39m,\n", - " score: \u001b[33m0.871\u001b[39m,\n", - " images: \u001b[1mnull\u001b[22m\n", - " }\n", - " }\n", - " ]\n", - "}" + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Citations\n", + "\n", + "How can we get a model to cite which parts of the source documents it referenced in its response?\n", + "\n", + "To explore some techniques for extracting citations, let's first create a simple RAG chain. To start we'll just retrieve from the web using the [TavilySearchAPIRetriever](https://js.langchain.com/docs/integrations/retrievers/tavily)." ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "await chain.invoke(\"How fast are cheetahs?\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "LangSmith trace [here](https://smith.langchain.com/public/bb0ed37e-b2be-4ae9-8b0d-ce2aff0b4b5e/r)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Function-calling\n", - "\n", - "### Cite documents\n", - "Let's try using [OpenAI function-calling](/docs/modules/model_io/chat/function_calling) to make the model specify which of the provided documents it's actually referencing when answering. LangChain has some utils for converting objects or zod objects to the JSONSchema format expected by OpenAI, so we'll use that to define our functions:" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "import { z } from \"zod\";\n", - "import { StructuredTool } from \"@langchain/core/tools\";\n", - "import { formatToOpenAITool } from \"@langchain/openai\";\n", - "\n", - "class CitedAnswer extends StructuredTool {\n", - " name = \"cited_answer\";\n", - " \n", - " description = \"Answer the user question based only on the given sources, and cite the sources used.\";\n", - "\n", - " schema = z.object({\n", - " answer: z.string().describe(\"The answer to the user question, which is based only on the given sources.\"),\n", - " citations: z.array(z.number()).describe(\"The integer IDs of the SPECIFIC sources which justify the answer.\")\n", - " });\n", - "\n", - " constructor() {\n", - " super();\n", - " }\n", - "\n", - " _call(input: z.infer): Promise {\n", - " return Promise.resolve(JSON.stringify(input, null, 2));\n", - " }\n", - "}\n", - "\n", - "const asOpenAITool = formatToOpenAITool(new CitedAnswer());\n", - "const tools1 = [asOpenAITool];" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's see what the model output is like when we pass in our functions and a user input:" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ + }, { - "data": { - "text/plain": [ - "AIMessage {\n", - " lc_serializable: \u001b[33mtrue\u001b[39m,\n", - " lc_kwargs: {\n", - " content: \u001b[32m\"\"\u001b[39m,\n", - " additional_kwargs: {\n", - " function_call: \u001b[90mundefined\u001b[39m,\n", - " tool_calls: [\n", - " {\n", - " id: \u001b[32m\"call_WzPoDCIRQ1pCah8k93cVrqex\"\u001b[39m,\n", - " type: \u001b[32m\"function\"\u001b[39m,\n", - " function: \u001b[36m[Object]\u001b[39m\n", - " }\n", - " ]\n", - " }\n", - " },\n", - " lc_namespace: [ \u001b[32m\"langchain_core\"\u001b[39m, \u001b[32m\"messages\"\u001b[39m ],\n", - " content: \u001b[32m\"\"\u001b[39m,\n", - " name: \u001b[90mundefined\u001b[39m,\n", - " additional_kwargs: {\n", - " function_call: \u001b[90mundefined\u001b[39m,\n", - " tool_calls: [\n", - " {\n", - " id: \u001b[32m\"call_WzPoDCIRQ1pCah8k93cVrqex\"\u001b[39m,\n", - " type: \u001b[32m\"function\"\u001b[39m,\n", - " function: {\n", - " name: \u001b[32m\"cited_answer\"\u001b[39m,\n", - " arguments: \u001b[32m\"{\\n\"\u001b[39m +\n", - " \u001b[32m` \"answer\": \"Brian's height is 6'2\\\\\" - 3 inches\",\\n`\u001b[39m +\n", - " \u001b[32m' \"citations\": [1, 3]\\n'\u001b[39m +\n", - " \u001b[32m\"}\"\u001b[39m\n", - " }\n", - " }\n", - " ]\n", - " }\n", - "}" + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Setup\n", + "### Dependencies\n", + "\n", + "We’ll use an OpenAI chat model and embeddings and a Memory vector store in this walkthrough, but everything shown here works with any [ChatModel](/docs/modules/model_io/chat) or [LLM](/docs/modules/model_io/llms), [Embeddings](https://js.langchain.com/docs/modules/data_connection/text_embedding/), and [VectorStore](https://js.langchain.com/docs/modules/data_connection/vectorstores/) or [Retriever](/docs/modules/data_connection/retrievers/).\n", + "\n", + "We’ll use the following packages:\n", + "\n", + "```bash\n", + "npm install --save langchain @langchain/community @langchain/openai\n", + "```\n", + "\n", + "We need to set environment variables for Tavily Search & OpenAI:\n", + "\n", + "```bash\n", + "export OPENAI_API_KEY=YOUR_KEY\n", + "export TAVILY_API_KEY=YOUR_KEY\n", + "```" ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "const llmWithTool1 = llm.bind({\n", - " tools: tools1,\n", - " tool_choice: asOpenAITool\n", - "});\n", - "\n", - "const exampleQ = `What Brian's height?\n", - "\n", - "Source: 1\n", - "Information: Suzy is 6'2\"\n", - "\n", - "Source: 2\n", - "Information: Jeremiah is blonde\n", - "\n", - "Source: 3\n", - "Information: Brian is 3 inches shorted than Suzy`;\n", - "\n", - "await llmWithTool1.invoke(exampleQ);" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "LangSmith trace [here](https://smith.langchain.com/public/34441213-cbb9-4775-a67e-2294aa1ccf69/r)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We'll add an output parser to convert the OpenAI API response to a nice object. We use the [JsonOutputKeyToolsParser](https://api.js.langchain.com/classes/langchain_output_parsers.JsonOutputKeyToolsParser.html) for this:" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ + }, { - "data": { - "text/plain": [ - "{ answer: \u001b[32m`Brian's height is 6'2\" - 3 inches`\u001b[39m, citations: [ \u001b[33m1\u001b[39m, \u001b[33m3\u001b[39m ] }" + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### LangSmith\n", + "\n", + "Many of the applications you build with LangChain will contain multiple steps with multiple invocations of LLM calls. As these applications get more and more complex, it becomes crucial to be able to inspect what exactly is going on inside your chain or agent. The best way to do this is with [LangSmith](https://smith.langchain.com/).\n", + "\n", + "Note that LangSmith is not needed, but it is helpful. If you do want to use LangSmith, after you sign up at the link above, make sure to set your environment variables to start logging traces:\n", + "\n", + "\n", + "```bash\n", + "export LANGCHAIN_TRACING_V2=true\n", + "export LANGCHAIN_API_KEY=YOUR_KEY\n", + "```" ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import { JsonOutputKeyToolsParser } from \"langchain/output_parsers\";\n", - "\n", - "const outputParser = new JsonOutputKeyToolsParser({ keyName: \"cited_answer\", returnSingle: true });\n", - "\n", - "await llmWithTool1.pipe(outputParser).invoke(exampleQ);" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "LangSmith trace [here](https://smith.langchain.com/public/1a045c25-ec5c-49f5-9756-6022edfea6af/r)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we're ready to put together our chain" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "import { Document } from \"@langchain/core/documents\";\n", - "\n", - "const formatDocsWithId = (docs: Array): string => {\n", - " return \"\\n\\n\" + docs.map((doc: Document, idx: number) => `Source ID: ${idx}\\nArticle title: ${doc.metadata.title}\\nArticle Snippet: ${doc.pageContent}`).join(\"\\n\\n\");\n", - "}\n", - "// subchain for generating an answer once we've done retrieval\n", - "const answerChain1 = prompt.pipe(llmWithTool1).pipe(outputParser);\n", - "const map1 = RunnableMap.from({\n", - " question: new RunnablePassthrough(),\n", - " docs: retriever,\n", - "})\n", - "// complete chain that calls the retriever -> formats docs to string -> runs answer subchain -> returns just the answer and retrieved docs.\n", - "const chain1 = map1\n", - " .assign({ context: (input: { docs: Array }) => formatDocsWithId(input.docs) })\n", - " .assign({ cited_answer: answerChain1 })\n", - " .pick([\"cited_answer\", \"docs\"])" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ + }, { - "data": { - "text/plain": [ - "{\n", - " cited_answer: {\n", - " answer: \u001b[32m\"Cheetahs can reach speeds of up to 75 mph (120 km/h).\"\u001b[39m,\n", - " citations: [ \u001b[33m3\u001b[39m ]\n", - " },\n", - " docs: [\n", - " Document {\n", - " pageContent: \u001b[32m\"The speeds attained by the cheetah may be only slightly greater than those achieved by the pronghorn\"\u001b[39m... 2527 more characters,\n", - " metadata: {\n", - " title: \u001b[32m\"Cheetah - Wikipedia\"\u001b[39m,\n", - " source: \u001b[32m\"https://en.wikipedia.org/wiki/Cheetah\"\u001b[39m,\n", - " score: \u001b[33m0.97773\u001b[39m,\n", - " images: \u001b[1mnull\u001b[22m\n", - " }\n", - " },\n", - " Document {\n", - " pageContent: \u001b[32m\"Contact Us − +\\n\"\u001b[39m +\n", - " \u001b[32m\"Address\\n\"\u001b[39m +\n", - " \u001b[32m\"Smithsonian's National Zoo & Conservation Biology Institute  3001 Connecticut\"\u001b[39m... 1343 more characters,\n", - " metadata: {\n", - " title: \u001b[32m\"Cheetah | Smithsonian's National Zoo and Conservation Biology Institute\"\u001b[39m,\n", - " source: \u001b[32m\"https://nationalzoo.si.edu/animals/cheetah\"\u001b[39m,\n", - " score: \u001b[33m0.9681\u001b[39m,\n", - " images: \u001b[1mnull\u001b[22m\n", - " }\n", - " },\n", - " Document {\n", - " pageContent: \u001b[32m\"The maximum speed cheetahs have been measured at is 114 km (71 miles) per hour, and they routinely r\"\u001b[39m... 1048 more characters,\n", - " metadata: {\n", - " title: \u001b[32m\"Cheetah | Description, Speed, Habitat, Diet, Cubs, & Facts\"\u001b[39m,\n", - " source: \u001b[32m\"https://www.britannica.com/animal/cheetah-mammal\"\u001b[39m,\n", - " score: \u001b[33m0.9459\u001b[39m,\n", - " images: \u001b[1mnull\u001b[22m\n", - " }\n", - " },\n", - " Document {\n", - " pageContent: \u001b[32m\"The science of cheetah speed\\n\"\u001b[39m +\n", - " \u001b[32m\"The cheetah (Acinonyx jubatus) is the fastest land animal on Earth, cap\"\u001b[39m... 738 more characters,\n", - " metadata: {\n", - " title: \u001b[32m\"How Fast Can a Cheetah Run? - ThoughtCo\"\u001b[39m,\n", - " source: \u001b[32m\"https://www.thoughtco.com/how-fast-can-a-cheetah-run-4587031\"\u001b[39m,\n", - " score: \u001b[33m0.93957\u001b[39m,\n", - " images: \u001b[1mnull\u001b[22m\n", - " }\n", - " },\n", - " Document {\n", - " pageContent: \u001b[32m\"One of two videos from National Geographic's award-winning multimedia coverage of cheetahs in the ma\"\u001b[39m... 60 more characters,\n", - " metadata: {\n", - " title: \u001b[32m\"The Science of a Cheetah's Speed | National Geographic\"\u001b[39m,\n", - " source: \u001b[32m\"https://www.youtube.com/watch?v=icFMTB0Pi0g\"\u001b[39m,\n", - " score: \u001b[33m0.92814\u001b[39m,\n", - " images: \u001b[1mnull\u001b[22m\n", - " }\n", - " },\n", - " Document {\n", - " pageContent: \u001b[32m\"If a lion comes along, the cheetah will abandon its catch -- it can't fight off a lion, and chances \"\u001b[39m... 911 more characters,\n", - " metadata: {\n", - " title: \u001b[32m\"What makes a cheetah run so fast? | HowStuffWorks\"\u001b[39m,\n", - " source: \u001b[32m\"https://animals.howstuffworks.com/mammals/cheetah-speed.htm\"\u001b[39m,\n", - " score: \u001b[33m0.85762\u001b[39m,\n", - " images: \u001b[1mnull\u001b[22m\n", - " }\n", - " }\n", - " ]\n", - "}" + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Initial setup" ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "await chain1.invoke(\"How fast are cheetahs?\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "LangSmith trace [here](https://smith.langchain.com/public/2a29cfd6-89fa-45bb-9b2a-f730e81061c2/r)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Cite snippets\n", - "\n", - "What if we want to cite actual text spans? We can try to get our model to return these, too.\n", - "\n", - "*Aside: Note that if we break up our documents so that we have many documents with only a sentence or two instead of a few long documents, citing documents becomes roughly equivalent to citing snippets, and may be easier for the model because the model just needs to return an identifier for each snippet instead of the actual text. Probably worth trying both approaches and evaluating.*" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "const citationSchema = z.object({\n", - " sourceId: z.number().describe(\"The integer ID of a SPECIFIC source which justifies the answer.\"),\n", - " quote: z.string().describe(\"The VERBATIM quote from the specified source that justifies the answer.\")\n", - "})\n", - "\n", - "class QuotedAnswer extends StructuredTool {\n", - " name = \"quoted_answer\";\n", - " \n", - " description = \"Answer the user question based only on the given sources, and cite the sources used.\";\n", - "\n", - " schema = z.object({\n", - " answer: z.string().describe(\"The answer to the user question, which is based only on the given sources.\"),\n", - " citations: z.array(citationSchema).describe(\"Citations from the given sources that justify the answer.\")\n", - " });\n", - "\n", - " constructor() {\n", - " super();\n", - " }\n", - "\n", - " _call(input: z.infer): Promise {\n", - " return Promise.resolve(JSON.stringify(input, null, 2));\n", - " }\n", - "}\n", - "\n", - "const quotedAnswerTool = formatToOpenAITool(new QuotedAnswer());\n", - "const tools2 = [quotedAnswerTool];" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "import { Document } from \"@langchain/core/documents\";\n", - "\n", - "const outputParser2 = new JsonOutputKeyToolsParser({ keyName: \"quoted_answer\", returnSingle: true });\n", - "const llmWithTool2 = llm.bind({\n", - " tools: tools2,\n", - " tool_choice: quotedAnswerTool,\n", - "});\n", - "const answerChain2 = prompt.pipe(llmWithTool2).pipe(outputParser2);\n", - "const map2 = RunnableMap.from({\n", - " question: new RunnablePassthrough(),\n", - " docs: retriever,\n", - "})\n", - "// complete chain that calls the retriever -> formats docs to string -> runs answer subchain -> returns just the answer and retrieved docs.\n", - "const chain2 = map2\n", - " .assign({ context: (input: { docs: Array }) => formatDocsWithId(input.docs) })\n", - " .assign({ quoted_answer: answerChain2 })\n", - " .pick([\"quoted_answer\", \"docs\"]);" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ + }, { - "data": { - "text/plain": [ - "{\n", - " quoted_answer: {\n", - " answer: \u001b[32m\"Cheetahs can reach speeds of up to 70 mph.\"\u001b[39m,\n", - " citations: [\n", - " {\n", - " sourceId: \u001b[33m0\u001b[39m,\n", - " quote: \u001b[32m\"We’ve mentioned that these guys can reach speeds of up to 70 mph\"\u001b[39m\n", - " },\n", - " {\n", - " sourceId: \u001b[33m2\u001b[39m,\n", - " quote: \u001b[32m\"The maximum speed cheetahs have been measured at is 114 km (71 miles) per hour, and they routinely r\"\u001b[39m... 72 more characters\n", - " },\n", - " {\n", - " sourceId: \u001b[33m5\u001b[39m,\n", - " quote: \u001b[32m\"Cheetahs—the fastest land mammals on the planet—are able to reach speeds of up to 70 mph\"\u001b[39m\n", - " }\n", - " ]\n", - " },\n", - " docs: [\n", - " Document {\n", - " pageContent: \u001b[32m\"They are surprisingly graceful\\n\"\u001b[39m +\n", - " \u001b[32m\"Cheetahs are very lithe-they move quickly and full-grown adults weigh\"\u001b[39m... 824 more characters,\n", - " metadata: {\n", - " title: \u001b[32m\"How Fast Are Cheetahs - Proud Animal\"\u001b[39m,\n", - " source: \u001b[32m\"https://www.proudanimal.com/2024/01/27/fast-cheetahs/\"\u001b[39m,\n", - " score: \u001b[33m0.97272\u001b[39m,\n", - " images: \u001b[1mnull\u001b[22m\n", - " }\n", - " },\n", - " Document {\n", - " pageContent: \u001b[32m\"The Science of Speed\\n\"\u001b[39m +\n", - " \u001b[32m\"Instead, previous research has shown that the fastest animals are not the large\"\u001b[39m... 743 more characters,\n", - " metadata: {\n", - " title: \u001b[32m\"Now Scientists Can Accurately Guess The Speed Of Any Animal\"\u001b[39m,\n", - " source: \u001b[32m\"https://www.nationalgeographic.com/animals/article/Animal-speed-size-cheetahs\"\u001b[39m,\n", - " score: \u001b[33m0.96532\u001b[39m,\n", - " images: \u001b[1mnull\u001b[22m\n", - " }\n", - " },\n", - " Document {\n", - " pageContent: \u001b[32m\"The maximum speed cheetahs have been measured at is 114 km (71 miles) per hour, and they routinely r\"\u001b[39m... 1048 more characters,\n", - " metadata: {\n", - " title: \u001b[32m\"Cheetah | Description, Speed, Habitat, Diet, Cubs, & Facts\"\u001b[39m,\n", - " source: \u001b[32m\"https://www.britannica.com/animal/cheetah-mammal\"\u001b[39m,\n", - " score: \u001b[33m0.95122\u001b[39m,\n", - " images: \u001b[1mnull\u001b[22m\n", - " }\n", - " },\n", - " Document {\n", - " pageContent: \u001b[32m\"Now, their only hope lies in the hands of human conservationists, working tirelessly to save the che\"\u001b[39m... 880 more characters,\n", - " metadata: {\n", - " title: \u001b[32m\"How Fast Are Cheetahs, and Other Fascinating Facts About the World's ...\"\u001b[39m,\n", - " source: \u001b[32m\"https://www.discovermagazine.com/planet-earth/how-fast-are-cheetahs-and-other-fascinating-facts-abou\"\u001b[39m... 21 more characters,\n", - " score: \u001b[33m0.92667\u001b[39m,\n", - " images: \u001b[1mnull\u001b[22m\n", - " }\n", - " },\n", - " Document {\n", - " pageContent: \u001b[32m\"Contact Us − +\\n\"\u001b[39m +\n", - " \u001b[32m\"Address\\n\"\u001b[39m +\n", - " \u001b[32m\"Smithsonian's National Zoo & Conservation Biology Institute  3001 Connecticut\"\u001b[39m... 1343 more characters,\n", - " metadata: {\n", - " title: \u001b[32m\"Cheetah | Smithsonian's National Zoo and Conservation Biology Institute\"\u001b[39m,\n", - " source: \u001b[32m\"https://nationalzoo.si.edu/animals/cheetah\"\u001b[39m,\n", - " score: \u001b[33m0.91253\u001b[39m,\n", - " images: \u001b[1mnull\u001b[22m\n", - " }\n", - " },\n", - " Document {\n", - " pageContent: \u001b[32m\"Cheetahs—the fastest land mammals on the planet—are incredible creatures. They're able to reach spee\"\u001b[39m... 95 more characters,\n", - " metadata: {\n", - " title: \u001b[32m\"Amazing Cheetah Facts | How Fast is a Cheetah? - Popular Mechanics\"\u001b[39m,\n", - " source: \u001b[32m\"https://www.popularmechanics.com/science/animals/g30021998/facts-about-cheetahs/\"\u001b[39m,\n", - " score: \u001b[33m0.87489\u001b[39m,\n", - " images: \u001b[1mnull\u001b[22m\n", - " }\n", - " }\n", - " ]\n", - "}" + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "import { TavilySearchAPIRetriever } from \"@langchain/community/retrievers/tavily_search_api\";\n", + "import { ChatPromptTemplate } from \"@langchain/core/prompts\";\n", + "import { ChatOpenAI } from \"@langchain/openai\";\n", + "\n", + "const llm = new ChatOpenAI({\n", + " model: \"gpt-3.5-turbo\",\n", + " temperature: 0,\n", + "});\n", + "const retriever = new TavilySearchAPIRetriever({\n", + " k: 6,\n", + "});\n", + "const prompt = ChatPromptTemplate.fromMessages([\n", + " [\"system\", \"You're a helpful AI assistant. Given a user question and some web article snippets, answer the user question. If none of the articles answer the question, just say you don't know.\\n\\nHere are the web articles:{context}\"],\n", + " [\"human\", \"{question}\"],\n", + "])" ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "await chain2.invoke(\"How fast are cheetahs?\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "LangSmith trace [here](https://smith.langchain.com/public/2a032bc5-5b04-4dc3-8d85-49e5ec7e0157/r)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Direct prompting\n", - "\n", - "Most models don't yet support function-calling. We can achieve similar results with direct prompting. Let's see what this looks like using an Anthropic chat model that is particularly proficient in working with XML:" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Setup\n", - "\n", - "Install the LangChain Anthropic integration package:\n", - "\n", - "```bash\n", - "npm install @langchain/anthropic\n", - "```\n", - "\n", - "Add your Anthropic API key to your environment:\n", - "\n", - "```bash\n", - "export ANTHROPIC_API_KEY=YOUR_KEY\n", - "```" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [], - "source": [ - "import { ChatAnthropic } from \"@langchain/anthropic\";\n", - "import { ChatPromptTemplate } from \"@langchain/core/prompts\";\n", - "\n", - "const anthropic = new ChatAnthropic({\n", - " modelName: \"claude-instant-1.2\",\n", - "});\n", - "const system = `You're a helpful AI assistant. Given a user question and some web article snippets,\n", - "answer the user question and provide citations. If none of the articles answer the question, just say you don't know.\n", - "\n", - "Remember, you must return both an answer and citations. A citation consists of a VERBATIM quote that\n", - "justifies the answer and the ID of the quote article. Return a citation for every quote across all articles\n", - "that justify the answer. Use the following format for your final output:\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " ...\n", - " \n", - "\n", - "\n", - "Here are the web articles:{context}`;\n", - "\n", - "const anthropicPrompt = ChatPromptTemplate.fromMessages([\n", - " [\"system\", system],\n", - " [\"human\", \"{question}\"]\n", - "]);" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [], - "source": [ - "import { XMLOutputParser } from \"@langchain/core/output_parsers\";\n", - "import { Document } from \"@langchain/core/documents\";\n", - "import { RunnableLambda, RunnablePassthrough, RunnableMap } from \"@langchain/core/runnables\";\n", - "\n", - "const formatDocsToXML = (docs: Array): string => {\n", - " const formatted: Array = [];\n", - " docs.forEach((doc, idx) => {\n", - " const docStr = `\n", - " ${doc.metadata.title}\n", - " ${doc.pageContent}\n", - "`\n", - " formatted.push(docStr);\n", - " });\n", - " return `\\n\\n${formatted.join(\"\\n\")}`;\n", - "}\n", - "\n", - "const format3 = new RunnableLambda({\n", - " func: (input: { docs: Array }) => formatDocsToXML(input.docs)\n", - "})\n", - "const answerChain = anthropicPrompt\n", - " .pipe(anthropic)\n", - " .pipe(new XMLOutputParser())\n", - " .pipe(\n", - " new RunnableLambda({ func: (input: { cited_answer: any }) => input.cited_answer })\n", - " );\n", - "const map3 = RunnableMap.from({\n", - " question: new RunnablePassthrough(),\n", - " docs: retriever,\n", - "});\n", - "const chain3 = map3.assign({ context: format3 }).assign({ cited_answer: answerChain }).pick([\"cited_answer\", \"docs\"])" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ + }, { - "data": { - "text/plain": [ - "{\n", - " cited_answer: [\n", - " {\n", - " answer: \u001b[32m\"Cheetahs can reach top speeds of between 60 to 70 mph.\"\u001b[39m\n", - " },\n", - " {\n", - " citations: [\n", - " { citation: \u001b[36m[Array]\u001b[39m },\n", - " { citation: \u001b[36m[Array]\u001b[39m },\n", - " { citation: \u001b[36m[Array]\u001b[39m }\n", - " ]\n", - " }\n", - " ],\n", - " docs: [\n", - " Document {\n", - " pageContent: \u001b[32m\"A cheetah's muscular tail helps control their steering and keep their balance when running very fast\"\u001b[39m... 210 more characters,\n", - " metadata: {\n", - " title: \u001b[32m\"75 Amazing Cheetah Facts Your Kids Will Love (2024)\"\u001b[39m,\n", - " source: \u001b[32m\"https://www.mkewithkids.com/post/cheetah-facts-for-kids/\"\u001b[39m,\n", - " score: \u001b[33m0.97081\u001b[39m,\n", - " images: \u001b[1mnull\u001b[22m\n", - " }\n", - " },\n", - " Document {\n", - " pageContent: \u001b[32m\"The maximum speed cheetahs have been measured at is 114 km (71 miles) per hour, and they routinely r\"\u001b[39m... 1048 more characters,\n", - " metadata: {\n", - " title: \u001b[32m\"Cheetah | Description, Speed, Habitat, Diet, Cubs, & Facts\"\u001b[39m,\n", - " source: \u001b[32m\"https://www.britannica.com/animal/cheetah-mammal\"\u001b[39m,\n", - " score: \u001b[33m0.96824\u001b[39m,\n", - " images: \u001b[1mnull\u001b[22m\n", - " }\n", - " },\n", - " Document {\n", - " pageContent: \u001b[32m\"The Science of Speed\\n\"\u001b[39m +\n", - " \u001b[32m\"Instead, previous research has shown that the fastest animals are not the large\"\u001b[39m... 743 more characters,\n", - " metadata: {\n", - " title: \u001b[32m\"Now Scientists Can Accurately Guess The Speed Of Any Animal\"\u001b[39m,\n", - " source: \u001b[32m\"https://www.nationalgeographic.com/animals/article/Animal-speed-size-cheetahs\"\u001b[39m,\n", - " score: \u001b[33m0.96237\u001b[39m,\n", - " images: \u001b[1mnull\u001b[22m\n", - " }\n", - " },\n", - " Document {\n", - " pageContent: \u001b[32m\"Contact Us − +\\n\"\u001b[39m +\n", - " \u001b[32m\"Address\\n\"\u001b[39m +\n", - " \u001b[32m\"Smithsonian's National Zoo & Conservation Biology Institute  3001 Connecticut\"\u001b[39m... 1343 more characters,\n", - " metadata: {\n", - " title: \u001b[32m\"Cheetah | Smithsonian's National Zoo and Conservation Biology Institute\"\u001b[39m,\n", - " source: \u001b[32m\"https://nationalzoo.si.edu/animals/cheetah\"\u001b[39m,\n", - " score: \u001b[33m0.94565\u001b[39m,\n", - " images: \u001b[1mnull\u001b[22m\n", - " }\n", - " },\n", - " Document {\n", - " pageContent: \u001b[32m\"They are surprisingly graceful\\n\"\u001b[39m +\n", - " \u001b[32m\"Cheetahs are very lithe-they move quickly and full-grown adults weigh\"\u001b[39m... 824 more characters,\n", - " metadata: {\n", - " title: \u001b[32m\"How Fast Are Cheetahs - Proud Animal\"\u001b[39m,\n", - " source: \u001b[32m\"https://www.proudanimal.com/2024/01/27/fast-cheetahs/\"\u001b[39m,\n", - " score: \u001b[33m0.91795\u001b[39m,\n", - " images: \u001b[1mnull\u001b[22m\n", - " }\n", - " },\n", - " Document {\n", - " pageContent: \u001b[32m\"Cheetahs are the world's fastest land animal. They can reach a speed of 69.5 miles per hour in just \"\u001b[39m... 100 more characters,\n", - " metadata: {\n", - " title: \u001b[32m\"How fast is Tyreek Hill? 'The Cheetah' lives up to 40 time, Next Gen ...\"\u001b[39m,\n", - " source: \u001b[32m\"https://www.sportingnews.com/us/nfl/news/fast-tyreek-hill-40-time-speed-chiefs/1cekgawhz39wr1tr472e4\"\u001b[39m... 5 more characters,\n", - " score: \u001b[33m0.83505\u001b[39m,\n", - " images: \u001b[1mnull\u001b[22m\n", - " }\n", - " }\n", - " ]\n", - "}" + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now that we've got a model, retriever and prompt, let's chain them all together. We'll need to add some logic for formatting our retrieved `Document`s to a string that can be passed to our prompt. We'll make it so our chain returns both the answer and the retrieved Documents." ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "await chain3.invoke(\"How fast are cheetahs?\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "LangSmith trace [here](https://smith.langchain.com/public/bebd86f5-ae9c-49ea-bc26-69c4fdf195b1/r)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Retrieval post-processing\n", - "\n", - "Another approach is to post-process our retrieved documents to compress the content, so that the source content is already minimal enough that we don't need the model to cite specific sources or spans. For example, we could break up each document into a sentence or two, embed those and keep only the most relevant ones. LangChain has some built-in components for this. Here we'll use a [RecursiveCharacterTextSplitter](https://js.langchain.com/docs/modules/data_connection/document_transformers/recursive_text_splitter), which creates chunks of a specified size by splitting on separator substrings, and an [EmbeddingsFilter](https://js.langchain.com/docs/modules/data_connection/retrievers/contextual_compression#embeddingsfilter), which keeps only the texts with the most relevant embeddings." - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [ + }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "The maximum speed cheetahs have been measured at is 114 km (71 miles) per hour, and they routinely reach velocities of 80–100 km (50–62 miles) per hour while pursuing prey.\n", - "cheetah,\n", - "(Acinonyx jubatus), \n", - "\n", - "\n", - "The science of cheetah speed\n", - "The cheetah (Acinonyx jubatus) is the fastest land animal on Earth, capable of reaching speeds as high as 75 mph or 120 km/h. Cheetahs are predators that sneak up on their prey and sprint a short distance to chase and attack.\n", - " Key Takeaways: How Fast Can a Cheetah Run?\n", - "Fastest Cheetah on Earth \n", - "\n", - "\n", - "Built for speed, the cheetah can accelerate from zero to 45 in just 2.5 seconds and reach top speeds of 60 to 70 mph, making it the fastest land mammal! Fun Facts\n", - "Conservation Status\n", - "Cheetah News\n", - "Taxonomic Information\n", - "Animal News\n", - "NZCBI staff in Front Royal, Virginia, are mourning the loss of Walnut, a white-naped crane who became an internet sensation for choosing one of her keepers as her mate. \n", - "\n", - "\n", - "Scientists calculate a cheetah's top speed is 75 mph, but the fastest recorded speed is somewhat slower. The top 10 fastest animals are: \n", - "\n", - "\n", - "The pronghorn, an American animal resembling an antelope, is the fastest land animal in the Western Hemisphere. While a cheetah's top speed ranges from 65 to 75 mph (104 to 120 km/h), its average speed is only 40 mph (64 km/hr), punctuated by short bursts at its top speed. Basically, if a predator threatens to take a cheetah's kill or attack its young, a cheetah has to run. \n", - "\n", - "\n", - "A cheetah eats a variety of small animals, including game birds, rabbits, small antelopes (including the springbok, impala, and gazelle), young warthogs, and larger antelopes (such as the kudu, hartebeest, oryx, and roan). Their faces are distinguished by prominent black lines that curve from the inner corner of each eye to the outer corners of the mouth, like a well-worn trail of inky tears. \n", - "\n", - "\n", - "4 kg) Cheetah moms spend a lot of time teaching their cubs to chase, sometimes dragging live animals back to the den so the cubs can practice the chase-and-catch process \n", - "\n", - "\n", - "Advertisement If confronted, a roughly 125-pound cheetah will always run rather than fight -- it's too weak, light and thin to have any chance against something like a lion, which can be twice as long as a cheetah and weigh more than 400 pounds (181 \n", - "\n", - "\n", - "Cheetahs eat a variety of small animals, including game birds, rabbits, small antelopes (including the springbok, impala, and gazelle), young warthogs, and larger antelopes (such as the kudu, hartebeest, oryx, and roan) \n", - "\n", - "\n", - "Historically, cheetahs ranged widely throughout Africa and Asia, from the Cape of Good Hope to the Mediterranean, throughout the Arabian Peninsula and the Middle East, from Israel, India and Pakistan north to the northern shores of the Caspian and Aral Seas, and west through Uzbekistan, Turkmenistan, Afghanistan, and Pakistan into central India. Header Links \n", - "\n", - "\n" - ] - } - ], - "source": [ - "import { RecursiveCharacterTextSplitter } from \"langchain/text_splitter\";\n", - "import { EmbeddingsFilter } from \"langchain/retrievers/document_compressors/embeddings_filter\";\n", - "import { OpenAIEmbeddings } from \"@langchain/openai\";\n", - "import { DocumentInterface } from \"@langchain/core/documents\";\n", - "import { RunnableMap, RunnablePassthrough } from \"@langchain/core/runnables\";\n", - "\n", - "const splitter = new RecursiveCharacterTextSplitter({\n", - " chunkSize: 400,\n", - " chunkOverlap: 0,\n", - " separators: [\"\\n\\n\", \"\\n\", \".\", \" \"],\n", - " keepSeparator: false,\n", - "});\n", - "\n", - "const compressor = new EmbeddingsFilter({\n", - " embeddings: new OpenAIEmbeddings(),\n", - " k: 10,\n", - "});\n", - "\n", - "const splitAndFilter = async (input): Promise> => {\n", - " const { docs, question } = input;\n", - " const splitDocs = await splitter.splitDocuments(docs);\n", - " const statefulDocs = await compressor.compressDocuments(splitDocs, question);\n", - " return statefulDocs;\n", - "};\n", - "\n", - "const retrieveMap = RunnableMap.from({\n", - " question: new RunnablePassthrough(),\n", - " docs: retriever,\n", - "});\n", - "\n", - "const retrieve = retrieveMap.pipe(splitAndFilter);\n", - "const docs = await retrieve.invoke(\"How fast are cheetahs?\");\n", - "for (const doc of docs) {\n", - " console.log(doc.pageContent, \"\\n\\n\");\n", - "}" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "LangSmith trace [here](https://smith.langchain.com/public/1bb61806-7d09-463d-909a-a7da410e79d4/r)" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [], - "source": [ - "const chain4 = retrieveMap\n", - " .assign({ context: formatDocs })\n", - " .assign({ answer: answerChain })\n", - " .pick([\"answer\", \"docs\"]);" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [ + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "import { Document } from \"@langchain/core/documents\";\n", + "import { StringOutputParser } from \"@langchain/core/output_parsers\";\n", + "import { RunnableMap, RunnablePassthrough } from \"@langchain/core/runnables\";\n", + "\n", + "/**\n", + " * Format the documents into a readable string.\n", + " */\n", + "const formatDocs = (input: Record): string => {\n", + " const { docs } = input;\n", + " return \"\\n\\n\" + docs.map((doc: Document) => `Article title: ${doc.metadata.title}\\nArticle Snippet: ${doc.pageContent}`).join(\"\\n\\n\");\n", + "}\n", + "// subchain for generating an answer once we've done retrieval\n", + "const answerChain = prompt.pipe(llm).pipe(new StringOutputParser());\n", + "const map = RunnableMap.from({\n", + " question: new RunnablePassthrough(),\n", + " docs: retriever,\n", + "})\n", + "// complete chain that calls the retriever -> formats docs to string -> runs answer subchain -> returns just the answer and retrieved docs.\n", + "const chain = map.assign({ context: formatDocs }).assign({ answer: answerChain }).pick([\"answer\", \"docs\"])" + ] + }, { - "data": { - "text/plain": [ - "{\n", - " answer: [\n", - " {\n", - " answer: \u001b[32m\"\\n\"\u001b[39m +\n", - " \u001b[32m\"Cheetahs are the fastest land animals. They can reach top speeds of around 75 mph (120 km/h) and ro\"\u001b[39m... 74 more characters\n", - " },\n", - " { citations: [ { citation: \u001b[36m[Array]\u001b[39m }, { citation: \u001b[36m[Array]\u001b[39m } ] }\n", - " ],\n", - " docs: [\n", - " Document {\n", - " pageContent: \u001b[32m\"The maximum speed cheetahs have been measured at is 114 km (71 miles) per hour, and they routinely r\"\u001b[39m... 1048 more characters,\n", - " metadata: {\n", - " title: \u001b[32m\"cheetah - Encyclopedia Britannica | Britannica\"\u001b[39m,\n", - " source: \u001b[32m\"https://www.britannica.com/animal/cheetah-mammal\"\u001b[39m,\n", - " score: \u001b[33m0.97059\u001b[39m,\n", - " images: \u001b[1mnull\u001b[22m\n", - " }\n", - " },\n", - " Document {\n", - " pageContent: \u001b[32m\"Contact Us − +\\n\"\u001b[39m +\n", - " \u001b[32m\"Address\\n\"\u001b[39m +\n", - " \u001b[32m\"Smithsonian's National Zoo & Conservation Biology Institute  3001 Connecticut\"\u001b[39m... 1343 more characters,\n", - " metadata: {\n", - " title: \u001b[32m\"Cheetah\"\u001b[39m,\n", - " source: \u001b[32m\"https://nationalzoo.si.edu/animals/cheetah\"\u001b[39m,\n", - " score: \u001b[33m0.95102\u001b[39m,\n", - " images: \u001b[1mnull\u001b[22m\n", - " }\n", - " },\n", - " Document {\n", - " pageContent: \u001b[32m\"The science of cheetah speed\\n\"\u001b[39m +\n", - " \u001b[32m\"The cheetah (Acinonyx jubatus) is the fastest land animal on Earth, cap\"\u001b[39m... 738 more characters,\n", - " metadata: {\n", - " title: \u001b[32m\"How Fast Can a Cheetah Run?\"\u001b[39m,\n", - " source: \u001b[32m\"https://www.thoughtco.com/how-fast-can-a-cheetah-run-4587031\"\u001b[39m,\n", - " score: \u001b[33m0.94974\u001b[39m,\n", - " images: \u001b[1mnull\u001b[22m\n", - " }\n", - " },\n", - " Document {\n", - " pageContent: \u001b[32m\"Now, their only hope lies in the hands of human conservationists, working tirelessly to save the che\"\u001b[39m... 880 more characters,\n", - " metadata: {\n", - " title: \u001b[32m\"How Fast Are Cheetahs, and Other Fascinating Facts About the World's ...\"\u001b[39m,\n", - " source: \u001b[32m\"https://www.discovermagazine.com/planet-earth/how-fast-are-cheetahs-and-other-fascinating-facts-abou\"\u001b[39m... 21 more characters,\n", - " score: \u001b[33m0.92695\u001b[39m,\n", - " images: \u001b[1mnull\u001b[22m\n", - " }\n", - " },\n", - " Document {\n", - " pageContent: \u001b[32m\"One of two videos from National Geographic's award-winning multimedia coverage of cheetahs in the ma\"\u001b[39m... 60 more characters,\n", - " metadata: {\n", - " title: \u001b[32m\"The Science of a Cheetah's Speed | National Geographic\"\u001b[39m,\n", - " source: \u001b[32m\"https://www.youtube.com/watch?v=icFMTB0Pi0g\"\u001b[39m,\n", - " score: \u001b[33m0.90754\u001b[39m,\n", - " images: \u001b[1mnull\u001b[22m\n", - " }\n", - " },\n", - " Document {\n", - " pageContent: \u001b[32m\"The speeds attained by the cheetah may be only slightly greater than those achieved by the pronghorn\"\u001b[39m... 2527 more characters,\n", - " metadata: {\n", - " title: \u001b[32m\"Cheetah - Wikipedia\"\u001b[39m,\n", - " source: \u001b[32m\"https://en.wikipedia.org/wiki/Cheetah\"\u001b[39m,\n", - " score: \u001b[33m0.89476\u001b[39m,\n", - " images: \u001b[1mnull\u001b[22m\n", - " }\n", - " }\n", - " ]\n", - "}" + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{\n", + " answer: \u001b[32m\"Cheetahs are capable of reaching speeds as high as 75 mph or 120 km/h. Their average speed, however,\"\u001b[39m... 29 more characters,\n", + " docs: [\n", + " Document {\n", + " pageContent: \u001b[32m\"Now, their only hope lies in the hands of human conservationists, working tirelessly to save the che\"\u001b[39m... 880 more characters,\n", + " metadata: {\n", + " title: \u001b[32m\"How Fast Are Cheetahs, and Other Fascinating Facts About the World's ...\"\u001b[39m,\n", + " source: \u001b[32m\"https://www.discovermagazine.com/planet-earth/how-fast-are-cheetahs-and-other-fascinating-facts-abou\"\u001b[39m... 21 more characters,\n", + " score: \u001b[33m0.93715\u001b[39m,\n", + " images: \u001b[1mnull\u001b[22m\n", + " }\n", + " },\n", + " Document {\n", + " pageContent: \u001b[32m\"If a lion comes along, the cheetah will abandon its catch -- it can't fight off a lion, and chances \"\u001b[39m... 911 more characters,\n", + " metadata: {\n", + " title: \u001b[32m\"What makes a cheetah run so fast? | HowStuffWorks\"\u001b[39m,\n", + " source: \u001b[32m\"https://animals.howstuffworks.com/mammals/cheetah-speed.htm\"\u001b[39m,\n", + " score: \u001b[33m0.93412\u001b[39m,\n", + " images: \u001b[1mnull\u001b[22m\n", + " }\n", + " },\n", + " Document {\n", + " pageContent: \u001b[32m\"The science of cheetah speed\\n\"\u001b[39m +\n", + " \u001b[32m\"The cheetah (Acinonyx jubatus) is the fastest land animal on Earth, cap\"\u001b[39m... 738 more characters,\n", + " metadata: {\n", + " title: \u001b[32m\"How Fast Can a Cheetah Run? - ThoughtCo\"\u001b[39m,\n", + " source: \u001b[32m\"https://www.thoughtco.com/how-fast-can-a-cheetah-run-4587031\"\u001b[39m,\n", + " score: \u001b[33m0.93134\u001b[39m,\n", + " images: \u001b[1mnull\u001b[22m\n", + " }\n", + " },\n", + " Document {\n", + " pageContent: \u001b[32m\"One of two videos from National Geographic's award-winning multimedia coverage of cheetahs in the ma\"\u001b[39m... 60 more characters,\n", + " metadata: {\n", + " title: \u001b[32m\"The Science of a Cheetah's Speed | National Geographic\"\u001b[39m,\n", + " source: \u001b[32m\"https://www.youtube.com/watch?v=icFMTB0Pi0g\"\u001b[39m,\n", + " score: \u001b[33m0.93109\u001b[39m,\n", + " images: \u001b[1mnull\u001b[22m\n", + " }\n", + " },\n", + " Document {\n", + " pageContent: \u001b[32m\"Contact Us − +\\n\"\u001b[39m +\n", + " \u001b[32m\"Address\\n\"\u001b[39m +\n", + " \u001b[32m\"Smithsonian's National Zoo & Conservation Biology Institute  3001 Connecticut\"\u001b[39m... 1343 more characters,\n", + " metadata: {\n", + " title: \u001b[32m\"Cheetah | Smithsonian's National Zoo and Conservation Biology Institute\"\u001b[39m,\n", + " source: \u001b[32m\"https://nationalzoo.si.edu/animals/cheetah\"\u001b[39m,\n", + " score: \u001b[33m0.92938\u001b[39m,\n", + " images: \u001b[1mnull\u001b[22m\n", + " }\n", + " },\n", + " Document {\n", + " pageContent: \u001b[32m\"Threats to the Cheetah’s Reign\\n\"\u001b[39m +\n", + " \u001b[32m\"As unparalleled as the cheetah’s speed might be, they face numerous c\"\u001b[39m... 907 more characters,\n", + " metadata: {\n", + " title: \u001b[32m\"How Fast Can a Cheetah Run? The Secrets Behind Its Incredible Speed\"\u001b[39m,\n", + " source: \u001b[32m\"https://www.explorationjunkie.com/how-fast-can-a-cheetah-run/\"\u001b[39m,\n", + " score: \u001b[33m0.871\u001b[39m,\n", + " images: \u001b[1mnull\u001b[22m\n", + " }\n", + " }\n", + " ]\n", + "}" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "await chain.invoke(\"How fast are cheetahs?\")" ] - }, - "execution_count": 29, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "// Note the documents have an article \"summary\" in the metadata that is now much longer than the\n", - "// actual document page content. This summary isn't actually passed to the model.\n", - "await chain4.invoke(\"How fast are cheetahs?\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "LangSmith trace [here](https://smith.langchain.com/public/f93302e6-a31b-454e-9fc7-94fb4a931a9d/r)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Generation post-processing\n", - "\n", - "Another approach is to post-process our model generation. In this example we'll first generate just an answer, and then we'll ask the model to annotate it's own answer with citations. The downside of this approach is of course that it is slower and more expensive, because two model calls need to be made.\n", - "\n", - "Let's apply this to our initial chain." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "import { StructuredTool } from \"@langchain/core/tools\";\n", - "import { formatToOpenAITool } from \"@langchain/openai\";\n", - "import { z } from \"zod\";\n", - "\n", - "class AnnotatedAnswer extends StructuredTool {\n", - " name = \"annotated_answer\";\n", - "\n", - " description = \"Annotate the answer to the user question with quote citations that justify the answer\";\n", - "\n", - " schema = z.object({\n", - " citations: z.array(citationSchema).describe(\"Citations from the given sources that justify the answer.\"),\n", - " })\n", - "\n", - " _call(input: z.infer): Promise {\n", - " return Promise.resolve(JSON.stringify(input, null, 2));\n", - " }\n", - "}\n", - "\n", - "const annotatedAnswerTool = formatToOpenAITool(new AnnotatedAnswer());\n", - "\n", - "const llmWithTools5 = llm.bind({\n", - " tools: [annotatedAnswerTool],\n", - " tool_choice: annotatedAnswerTool,\n", - "})" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [], - "source": [ - "import { ChatPromptTemplate, MessagesPlaceholder } from \"@langchain/core/prompts\";\n", - "import { RunnableSequence } from \"@langchain/core/runnables\";\n", - "import { JsonOutputKeyToolsParser } from \"langchain/output_parsers\";\n", - "import { RunnableMap, RunnablePassthrough } from \"@langchain/core/runnables\";\n", - "import { AIMessage, ToolMessage } from \"@langchain/core/messages\";\n", - "\n", - "const prompt5 = ChatPromptTemplate.fromMessages([\n", - " [\"system\", \"You're a helpful AI assistant. Given a user question and some web article snippets, answer the user question. If none of the articles answer the question, just say you don't know.\\n\\nHere are the web articles:{context}\"],\n", - " [\"human\", \"{question}\"],\n", - " new MessagesPlaceholder({\n", - " variableName: \"chat_history\",\n", - " optional: true,\n", - " }),\n", - " new MessagesPlaceholder({\n", - " variableName: \"toolMessage\",\n", - " optional: true,\n", - " })\n", - "]);\n", - "\n", - "const answerChain5 = prompt5.pipe(llmWithTools5);\n", - "const annotationChain = RunnableSequence.from([\n", - " prompt5,\n", - " llmWithTools5,\n", - " new JsonOutputKeyToolsParser({ keyName: \"annotated_answer\", returnSingle: true }),\n", - " (input: any) => input.citations\n", - "]);\n", - "const map5 = RunnableMap.from({\n", - " question: new RunnablePassthrough(),\n", - " docs: retriever,\n", - "});\n", - "const chain5 = map5\n", - " .assign({ context: formatDocs })\n", - " .assign({ aiMessage: answerChain5 })\n", - " .assign({\n", - " chat_history: (input) => input.aiMessage,\n", - " toolMessage: (input) => new ToolMessage({\n", - " tool_call_id: input.aiMessage.additional_kwargs.tool_calls[0].id,\n", - " content: input.aiMessage.additional_kwargs.content ?? \"\",\n", - " })\n", - " })\n", - " .assign({\n", - " annotations: annotationChain,\n", - " })\n", - " .pick([\"answer\", \"docs\", \"annotations\"]);" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [ + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "LangSmith trace [here](https://smith.langchain.com/public/bb0ed37e-b2be-4ae9-8b0d-ce2aff0b4b5e/r)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Function-calling\n", + "\n", + "### Cite documents\n", + "Let's try using [OpenAI function-calling](/docs/modules/model_io/chat/function_calling) to make the model specify which of the provided documents it's actually referencing when answering. LangChain has some utils for converting objects or zod objects to the JSONSchema format expected by OpenAI, so we'll use that to define our functions:" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "import { z } from \"zod\";\n", + "import { StructuredTool } from \"@langchain/core/tools\";\n", + "import { formatToOpenAITool } from \"@langchain/openai\";\n", + "\n", + "class CitedAnswer extends StructuredTool {\n", + " name = \"cited_answer\";\n", + " \n", + " description = \"Answer the user question based only on the given sources, and cite the sources used.\";\n", + "\n", + " schema = z.object({\n", + " answer: z.string().describe(\"The answer to the user question, which is based only on the given sources.\"),\n", + " citations: z.array(z.number()).describe(\"The integer IDs of the SPECIFIC sources which justify the answer.\")\n", + " });\n", + "\n", + " constructor() {\n", + " super();\n", + " }\n", + "\n", + " _call(input: z.infer): Promise {\n", + " return Promise.resolve(JSON.stringify(input, null, 2));\n", + " }\n", + "}\n", + "\n", + "const asOpenAITool = formatToOpenAITool(new CitedAnswer());\n", + "const tools1 = [asOpenAITool];" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's see what the model output is like when we pass in our functions and a user input:" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "AIMessage {\n", + " lc_serializable: \u001b[33mtrue\u001b[39m,\n", + " lc_kwargs: {\n", + " content: \u001b[32m\"\"\u001b[39m,\n", + " additional_kwargs: {\n", + " function_call: \u001b[90mundefined\u001b[39m,\n", + " tool_calls: [\n", + " {\n", + " id: \u001b[32m\"call_WzPoDCIRQ1pCah8k93cVrqex\"\u001b[39m,\n", + " type: \u001b[32m\"function\"\u001b[39m,\n", + " function: \u001b[36m[Object]\u001b[39m\n", + " }\n", + " ]\n", + " }\n", + " },\n", + " lc_namespace: [ \u001b[32m\"langchain_core\"\u001b[39m, \u001b[32m\"messages\"\u001b[39m ],\n", + " content: \u001b[32m\"\"\u001b[39m,\n", + " name: \u001b[90mundefined\u001b[39m,\n", + " additional_kwargs: {\n", + " function_call: \u001b[90mundefined\u001b[39m,\n", + " tool_calls: [\n", + " {\n", + " id: \u001b[32m\"call_WzPoDCIRQ1pCah8k93cVrqex\"\u001b[39m,\n", + " type: \u001b[32m\"function\"\u001b[39m,\n", + " function: {\n", + " name: \u001b[32m\"cited_answer\"\u001b[39m,\n", + " arguments: \u001b[32m\"{\\n\"\u001b[39m +\n", + " \u001b[32m` \"answer\": \"Brian's height is 6'2\\\\\" - 3 inches\",\\n`\u001b[39m +\n", + " \u001b[32m' \"citations\": [1, 3]\\n'\u001b[39m +\n", + " \u001b[32m\"}\"\u001b[39m\n", + " }\n", + " }\n", + " ]\n", + " }\n", + "}" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "const llmWithTool1 = llm.bind({\n", + " tools: tools1,\n", + " tool_choice: asOpenAITool\n", + "});\n", + "\n", + "const exampleQ = `What Brian's height?\n", + "\n", + "Source: 1\n", + "Information: Suzy is 6'2\"\n", + "\n", + "Source: 2\n", + "Information: Jeremiah is blonde\n", + "\n", + "Source: 3\n", + "Information: Brian is 3 inches shorted than Suzy`;\n", + "\n", + "await llmWithTool1.invoke(exampleQ);" + ] + }, { - "data": { - "text/plain": [ - "{\n", - " docs: [\n", - " Document {\n", - " pageContent: \u001b[32m\"They are surprisingly graceful\\n\"\u001b[39m +\n", - " \u001b[32m\"Cheetahs are very lithe-they move quickly and full-grown adults weigh\"\u001b[39m... 824 more characters,\n", - " metadata: {\n", - " title: \u001b[32m\"How Fast Are Cheetahs - Proud Animal\"\u001b[39m,\n", - " source: \u001b[32m\"https://www.proudanimal.com/2024/01/27/fast-cheetahs/\"\u001b[39m,\n", - " score: \u001b[33m0.96021\u001b[39m,\n", - " images: \u001b[1mnull\u001b[22m\n", - " }\n", - " },\n", - " Document {\n", - " pageContent: \u001b[32m\"Contact Us − +\\n\"\u001b[39m +\n", - " \u001b[32m\"Address\\n\"\u001b[39m +\n", - " \u001b[32m\"Smithsonian's National Zoo & Conservation Biology Institute  3001 Connecticut\"\u001b[39m... 1343 more characters,\n", - " metadata: {\n", - " title: \u001b[32m\"Cheetah | Smithsonian's National Zoo and Conservation Biology Institute\"\u001b[39m,\n", - " source: \u001b[32m\"https://nationalzoo.si.edu/animals/cheetah\"\u001b[39m,\n", - " score: \u001b[33m0.94798\u001b[39m,\n", - " images: \u001b[1mnull\u001b[22m\n", - " }\n", - " },\n", - " Document {\n", - " pageContent: \u001b[32m\"The science of cheetah speed\\n\"\u001b[39m +\n", - " \u001b[32m\"The cheetah (Acinonyx jubatus) is the fastest land animal on Earth, cap\"\u001b[39m... 738 more characters,\n", - " metadata: {\n", - " title: \u001b[32m\"How Fast Can a Cheetah Run? - ThoughtCo\"\u001b[39m,\n", - " source: \u001b[32m\"https://www.thoughtco.com/how-fast-can-a-cheetah-run-4587031\"\u001b[39m,\n", - " score: \u001b[33m0.92591\u001b[39m,\n", - " images: \u001b[1mnull\u001b[22m\n", - " }\n", - " },\n", - " Document {\n", - " pageContent: \u001b[32m\"The maximum speed cheetahs have been measured at is 114 km (71 miles) per hour, and they routinely r\"\u001b[39m... 1048 more characters,\n", - " metadata: {\n", - " title: \u001b[32m\"Cheetah | Description, Speed, Habitat, Diet, Cubs, & Facts\"\u001b[39m,\n", - " source: \u001b[32m\"https://www.britannica.com/animal/cheetah-mammal\"\u001b[39m,\n", - " score: \u001b[33m0.90128\u001b[39m,\n", - " images: \u001b[1mnull\u001b[22m\n", - " }\n", - " },\n", - " Document {\n", - " pageContent: \u001b[32m\"The Science of Speed\\n\"\u001b[39m +\n", - " \u001b[32m\"Instead, previous research has shown that the fastest animals are not the large\"\u001b[39m... 743 more characters,\n", - " metadata: {\n", - " title: \u001b[32m\"Now Scientists Can Accurately Guess The Speed Of Any Animal\"\u001b[39m,\n", - " source: \u001b[32m\"https://www.nationalgeographic.com/animals/article/Animal-speed-size-cheetahs\"\u001b[39m,\n", - " score: \u001b[33m0.90097\u001b[39m,\n", - " images: \u001b[1mnull\u001b[22m\n", - " }\n", - " },\n", - " Document {\n", - " pageContent: \u001b[32m\"Now, their only hope lies in the hands of human conservationists, working tirelessly to save the che\"\u001b[39m... 880 more characters,\n", - " metadata: {\n", - " title: \u001b[32m\"How Fast Are Cheetahs, and Other Fascinating Facts About the World's ...\"\u001b[39m,\n", - " source: \u001b[32m\"https://www.discovermagazine.com/planet-earth/how-fast-are-cheetahs-and-other-fascinating-facts-abou\"\u001b[39m... 21 more characters,\n", - " score: \u001b[33m0.89788\u001b[39m,\n", - " images: \u001b[1mnull\u001b[22m\n", - " }\n", - " }\n", - " ],\n", - " annotations: [\n", - " {\n", - " sourceId: \u001b[33m0\u001b[39m,\n", - " quote: \u001b[32m\"We’ve mentioned that these guys can reach speeds of up to 70 mph, but did you know they can go from \"\u001b[39m... 22 more characters\n", - " },\n", - " {\n", - " sourceId: \u001b[33m1\u001b[39m,\n", - " quote: \u001b[32m\"Built for speed, the cheetah can accelerate from zero to 45 in just 2.5 seconds and reach top speeds\"\u001b[39m... 52 more characters\n", - " },\n", - " {\n", - " sourceId: \u001b[33m2\u001b[39m,\n", - " quote: \u001b[32m\"The maximum speed cheetahs have been measured at is 114 km (71 miles) per hour, and they routinely r\"\u001b[39m... 72 more characters\n", - " }\n", - " ]\n", - "}" + "cell_type": "markdown", + "metadata": {}, + "source": [ + "LangSmith trace [here](https://smith.langchain.com/public/34441213-cbb9-4775-a67e-2294aa1ccf69/r)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We'll add an output parser to convert the OpenAI API response to a nice object. We use the [JsonOutputKeyToolsParser](https://api.js.langchain.com/classes/langchain_output_parsers.JsonOutputKeyToolsParser.html) for this:" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{ answer: \u001b[32m`Brian's height is 6'2\" - 3 inches`\u001b[39m, citations: [ \u001b[33m1\u001b[39m, \u001b[33m3\u001b[39m ] }" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import { JsonOutputKeyToolsParser } from \"langchain/output_parsers\";\n", + "\n", + "const outputParser = new JsonOutputKeyToolsParser({ keyName: \"cited_answer\", returnSingle: true });\n", + "\n", + "await llmWithTool1.pipe(outputParser).invoke(exampleQ);" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "LangSmith trace [here](https://smith.langchain.com/public/1a045c25-ec5c-49f5-9756-6022edfea6af/r)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we're ready to put together our chain" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "import { Document } from \"@langchain/core/documents\";\n", + "\n", + "const formatDocsWithId = (docs: Array): string => {\n", + " return \"\\n\\n\" + docs.map((doc: Document, idx: number) => `Source ID: ${idx}\\nArticle title: ${doc.metadata.title}\\nArticle Snippet: ${doc.pageContent}`).join(\"\\n\\n\");\n", + "}\n", + "// subchain for generating an answer once we've done retrieval\n", + "const answerChain1 = prompt.pipe(llmWithTool1).pipe(outputParser);\n", + "const map1 = RunnableMap.from({\n", + " question: new RunnablePassthrough(),\n", + " docs: retriever,\n", + "})\n", + "// complete chain that calls the retriever -> formats docs to string -> runs answer subchain -> returns just the answer and retrieved docs.\n", + "const chain1 = map1\n", + " .assign({ context: (input: { docs: Array }) => formatDocsWithId(input.docs) })\n", + " .assign({ cited_answer: answerChain1 })\n", + " .pick([\"cited_answer\", \"docs\"])" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{\n", + " cited_answer: {\n", + " answer: \u001b[32m\"Cheetahs can reach speeds of up to 75 mph (120 km/h).\"\u001b[39m,\n", + " citations: [ \u001b[33m3\u001b[39m ]\n", + " },\n", + " docs: [\n", + " Document {\n", + " pageContent: \u001b[32m\"The speeds attained by the cheetah may be only slightly greater than those achieved by the pronghorn\"\u001b[39m... 2527 more characters,\n", + " metadata: {\n", + " title: \u001b[32m\"Cheetah - Wikipedia\"\u001b[39m,\n", + " source: \u001b[32m\"https://en.wikipedia.org/wiki/Cheetah\"\u001b[39m,\n", + " score: \u001b[33m0.97773\u001b[39m,\n", + " images: \u001b[1mnull\u001b[22m\n", + " }\n", + " },\n", + " Document {\n", + " pageContent: \u001b[32m\"Contact Us − +\\n\"\u001b[39m +\n", + " \u001b[32m\"Address\\n\"\u001b[39m +\n", + " \u001b[32m\"Smithsonian's National Zoo & Conservation Biology Institute  3001 Connecticut\"\u001b[39m... 1343 more characters,\n", + " metadata: {\n", + " title: \u001b[32m\"Cheetah | Smithsonian's National Zoo and Conservation Biology Institute\"\u001b[39m,\n", + " source: \u001b[32m\"https://nationalzoo.si.edu/animals/cheetah\"\u001b[39m,\n", + " score: \u001b[33m0.9681\u001b[39m,\n", + " images: \u001b[1mnull\u001b[22m\n", + " }\n", + " },\n", + " Document {\n", + " pageContent: \u001b[32m\"The maximum speed cheetahs have been measured at is 114 km (71 miles) per hour, and they routinely r\"\u001b[39m... 1048 more characters,\n", + " metadata: {\n", + " title: \u001b[32m\"Cheetah | Description, Speed, Habitat, Diet, Cubs, & Facts\"\u001b[39m,\n", + " source: \u001b[32m\"https://www.britannica.com/animal/cheetah-mammal\"\u001b[39m,\n", + " score: \u001b[33m0.9459\u001b[39m,\n", + " images: \u001b[1mnull\u001b[22m\n", + " }\n", + " },\n", + " Document {\n", + " pageContent: \u001b[32m\"The science of cheetah speed\\n\"\u001b[39m +\n", + " \u001b[32m\"The cheetah (Acinonyx jubatus) is the fastest land animal on Earth, cap\"\u001b[39m... 738 more characters,\n", + " metadata: {\n", + " title: \u001b[32m\"How Fast Can a Cheetah Run? - ThoughtCo\"\u001b[39m,\n", + " source: \u001b[32m\"https://www.thoughtco.com/how-fast-can-a-cheetah-run-4587031\"\u001b[39m,\n", + " score: \u001b[33m0.93957\u001b[39m,\n", + " images: \u001b[1mnull\u001b[22m\n", + " }\n", + " },\n", + " Document {\n", + " pageContent: \u001b[32m\"One of two videos from National Geographic's award-winning multimedia coverage of cheetahs in the ma\"\u001b[39m... 60 more characters,\n", + " metadata: {\n", + " title: \u001b[32m\"The Science of a Cheetah's Speed | National Geographic\"\u001b[39m,\n", + " source: \u001b[32m\"https://www.youtube.com/watch?v=icFMTB0Pi0g\"\u001b[39m,\n", + " score: \u001b[33m0.92814\u001b[39m,\n", + " images: \u001b[1mnull\u001b[22m\n", + " }\n", + " },\n", + " Document {\n", + " pageContent: \u001b[32m\"If a lion comes along, the cheetah will abandon its catch -- it can't fight off a lion, and chances \"\u001b[39m... 911 more characters,\n", + " metadata: {\n", + " title: \u001b[32m\"What makes a cheetah run so fast? | HowStuffWorks\"\u001b[39m,\n", + " source: \u001b[32m\"https://animals.howstuffworks.com/mammals/cheetah-speed.htm\"\u001b[39m,\n", + " score: \u001b[33m0.85762\u001b[39m,\n", + " images: \u001b[1mnull\u001b[22m\n", + " }\n", + " }\n", + " ]\n", + "}" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "await chain1.invoke(\"How fast are cheetahs?\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "LangSmith trace [here](https://smith.langchain.com/public/2a29cfd6-89fa-45bb-9b2a-f730e81061c2/r)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Cite snippets\n", + "\n", + "What if we want to cite actual text spans? We can try to get our model to return these, too.\n", + "\n", + "*Aside: Note that if we break up our documents so that we have many documents with only a sentence or two instead of a few long documents, citing documents becomes roughly equivalent to citing snippets, and may be easier for the model because the model just needs to return an identifier for each snippet instead of the actual text. Probably worth trying both approaches and evaluating.*" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "const citationSchema = z.object({\n", + " sourceId: z.number().describe(\"The integer ID of a SPECIFIC source which justifies the answer.\"),\n", + " quote: z.string().describe(\"The VERBATIM quote from the specified source that justifies the answer.\")\n", + "})\n", + "\n", + "class QuotedAnswer extends StructuredTool {\n", + " name = \"quoted_answer\";\n", + " \n", + " description = \"Answer the user question based only on the given sources, and cite the sources used.\";\n", + "\n", + " schema = z.object({\n", + " answer: z.string().describe(\"The answer to the user question, which is based only on the given sources.\"),\n", + " citations: z.array(citationSchema).describe(\"Citations from the given sources that justify the answer.\")\n", + " });\n", + "\n", + " constructor() {\n", + " super();\n", + " }\n", + "\n", + " _call(input: z.infer): Promise {\n", + " return Promise.resolve(JSON.stringify(input, null, 2));\n", + " }\n", + "}\n", + "\n", + "const quotedAnswerTool = formatToOpenAITool(new QuotedAnswer());\n", + "const tools2 = [quotedAnswerTool];" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "import { Document } from \"@langchain/core/documents\";\n", + "\n", + "const outputParser2 = new JsonOutputKeyToolsParser({ keyName: \"quoted_answer\", returnSingle: true });\n", + "const llmWithTool2 = llm.bind({\n", + " tools: tools2,\n", + " tool_choice: quotedAnswerTool,\n", + "});\n", + "const answerChain2 = prompt.pipe(llmWithTool2).pipe(outputParser2);\n", + "const map2 = RunnableMap.from({\n", + " question: new RunnablePassthrough(),\n", + " docs: retriever,\n", + "})\n", + "// complete chain that calls the retriever -> formats docs to string -> runs answer subchain -> returns just the answer and retrieved docs.\n", + "const chain2 = map2\n", + " .assign({ context: (input: { docs: Array }) => formatDocsWithId(input.docs) })\n", + " .assign({ quoted_answer: answerChain2 })\n", + " .pick([\"quoted_answer\", \"docs\"]);" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{\n", + " quoted_answer: {\n", + " answer: \u001b[32m\"Cheetahs can reach speeds of up to 70 mph.\"\u001b[39m,\n", + " citations: [\n", + " {\n", + " sourceId: \u001b[33m0\u001b[39m,\n", + " quote: \u001b[32m\"We’ve mentioned that these guys can reach speeds of up to 70 mph\"\u001b[39m\n", + " },\n", + " {\n", + " sourceId: \u001b[33m2\u001b[39m,\n", + " quote: \u001b[32m\"The maximum speed cheetahs have been measured at is 114 km (71 miles) per hour, and they routinely r\"\u001b[39m... 72 more characters\n", + " },\n", + " {\n", + " sourceId: \u001b[33m5\u001b[39m,\n", + " quote: \u001b[32m\"Cheetahs—the fastest land mammals on the planet—are able to reach speeds of up to 70 mph\"\u001b[39m\n", + " }\n", + " ]\n", + " },\n", + " docs: [\n", + " Document {\n", + " pageContent: \u001b[32m\"They are surprisingly graceful\\n\"\u001b[39m +\n", + " \u001b[32m\"Cheetahs are very lithe-they move quickly and full-grown adults weigh\"\u001b[39m... 824 more characters,\n", + " metadata: {\n", + " title: \u001b[32m\"How Fast Are Cheetahs - Proud Animal\"\u001b[39m,\n", + " source: \u001b[32m\"https://www.proudanimal.com/2024/01/27/fast-cheetahs/\"\u001b[39m,\n", + " score: \u001b[33m0.97272\u001b[39m,\n", + " images: \u001b[1mnull\u001b[22m\n", + " }\n", + " },\n", + " Document {\n", + " pageContent: \u001b[32m\"The Science of Speed\\n\"\u001b[39m +\n", + " \u001b[32m\"Instead, previous research has shown that the fastest animals are not the large\"\u001b[39m... 743 more characters,\n", + " metadata: {\n", + " title: \u001b[32m\"Now Scientists Can Accurately Guess The Speed Of Any Animal\"\u001b[39m,\n", + " source: \u001b[32m\"https://www.nationalgeographic.com/animals/article/Animal-speed-size-cheetahs\"\u001b[39m,\n", + " score: \u001b[33m0.96532\u001b[39m,\n", + " images: \u001b[1mnull\u001b[22m\n", + " }\n", + " },\n", + " Document {\n", + " pageContent: \u001b[32m\"The maximum speed cheetahs have been measured at is 114 km (71 miles) per hour, and they routinely r\"\u001b[39m... 1048 more characters,\n", + " metadata: {\n", + " title: \u001b[32m\"Cheetah | Description, Speed, Habitat, Diet, Cubs, & Facts\"\u001b[39m,\n", + " source: \u001b[32m\"https://www.britannica.com/animal/cheetah-mammal\"\u001b[39m,\n", + " score: \u001b[33m0.95122\u001b[39m,\n", + " images: \u001b[1mnull\u001b[22m\n", + " }\n", + " },\n", + " Document {\n", + " pageContent: \u001b[32m\"Now, their only hope lies in the hands of human conservationists, working tirelessly to save the che\"\u001b[39m... 880 more characters,\n", + " metadata: {\n", + " title: \u001b[32m\"How Fast Are Cheetahs, and Other Fascinating Facts About the World's ...\"\u001b[39m,\n", + " source: \u001b[32m\"https://www.discovermagazine.com/planet-earth/how-fast-are-cheetahs-and-other-fascinating-facts-abou\"\u001b[39m... 21 more characters,\n", + " score: \u001b[33m0.92667\u001b[39m,\n", + " images: \u001b[1mnull\u001b[22m\n", + " }\n", + " },\n", + " Document {\n", + " pageContent: \u001b[32m\"Contact Us − +\\n\"\u001b[39m +\n", + " \u001b[32m\"Address\\n\"\u001b[39m +\n", + " \u001b[32m\"Smithsonian's National Zoo & Conservation Biology Institute  3001 Connecticut\"\u001b[39m... 1343 more characters,\n", + " metadata: {\n", + " title: \u001b[32m\"Cheetah | Smithsonian's National Zoo and Conservation Biology Institute\"\u001b[39m,\n", + " source: \u001b[32m\"https://nationalzoo.si.edu/animals/cheetah\"\u001b[39m,\n", + " score: \u001b[33m0.91253\u001b[39m,\n", + " images: \u001b[1mnull\u001b[22m\n", + " }\n", + " },\n", + " Document {\n", + " pageContent: \u001b[32m\"Cheetahs—the fastest land mammals on the planet—are incredible creatures. They're able to reach spee\"\u001b[39m... 95 more characters,\n", + " metadata: {\n", + " title: \u001b[32m\"Amazing Cheetah Facts | How Fast is a Cheetah? - Popular Mechanics\"\u001b[39m,\n", + " source: \u001b[32m\"https://www.popularmechanics.com/science/animals/g30021998/facts-about-cheetahs/\"\u001b[39m,\n", + " score: \u001b[33m0.87489\u001b[39m,\n", + " images: \u001b[1mnull\u001b[22m\n", + " }\n", + " }\n", + " ]\n", + "}" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "await chain2.invoke(\"How fast are cheetahs?\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "LangSmith trace [here](https://smith.langchain.com/public/2a032bc5-5b04-4dc3-8d85-49e5ec7e0157/r)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Direct prompting\n", + "\n", + "Most models don't yet support function-calling. We can achieve similar results with direct prompting. Let's see what this looks like using an Anthropic chat model that is particularly proficient in working with XML:" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Setup\n", + "\n", + "Install the LangChain Anthropic integration package:\n", + "\n", + "```bash\n", + "npm install @langchain/anthropic\n", + "```\n", + "\n", + "Add your Anthropic API key to your environment:\n", + "\n", + "```bash\n", + "export ANTHROPIC_API_KEY=YOUR_KEY\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [], + "source": [ + "import { ChatAnthropic } from \"@langchain/anthropic\";\n", + "import { ChatPromptTemplate } from \"@langchain/core/prompts\";\n", + "\n", + "const anthropic = new ChatAnthropic({\n", + " model: \"claude-instant-1.2\",\n", + "});\n", + "const system = `You're a helpful AI assistant. Given a user question and some web article snippets,\n", + "answer the user question and provide citations. If none of the articles answer the question, just say you don't know.\n", + "\n", + "Remember, you must return both an answer and citations. A citation consists of a VERBATIM quote that\n", + "justifies the answer and the ID of the quote article. Return a citation for every quote across all articles\n", + "that justify the answer. Use the following format for your final output:\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " ...\n", + " \n", + "\n", + "\n", + "Here are the web articles:{context}`;\n", + "\n", + "const anthropicPrompt = ChatPromptTemplate.fromMessages([\n", + " [\"system\", system],\n", + " [\"human\", \"{question}\"]\n", + "]);" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [], + "source": [ + "import { XMLOutputParser } from \"@langchain/core/output_parsers\";\n", + "import { Document } from \"@langchain/core/documents\";\n", + "import { RunnableLambda, RunnablePassthrough, RunnableMap } from \"@langchain/core/runnables\";\n", + "\n", + "const formatDocsToXML = (docs: Array): string => {\n", + " const formatted: Array = [];\n", + " docs.forEach((doc, idx) => {\n", + " const docStr = `\n", + " ${doc.metadata.title}\n", + " ${doc.pageContent}\n", + "`\n", + " formatted.push(docStr);\n", + " });\n", + " return `\\n\\n${formatted.join(\"\\n\")}`;\n", + "}\n", + "\n", + "const format3 = new RunnableLambda({\n", + " func: (input: { docs: Array }) => formatDocsToXML(input.docs)\n", + "})\n", + "const answerChain = anthropicPrompt\n", + " .pipe(anthropic)\n", + " .pipe(new XMLOutputParser())\n", + " .pipe(\n", + " new RunnableLambda({ func: (input: { cited_answer: any }) => input.cited_answer })\n", + " );\n", + "const map3 = RunnableMap.from({\n", + " question: new RunnablePassthrough(),\n", + " docs: retriever,\n", + "});\n", + "const chain3 = map3.assign({ context: format3 }).assign({ cited_answer: answerChain }).pick([\"cited_answer\", \"docs\"])" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{\n", + " cited_answer: [\n", + " {\n", + " answer: \u001b[32m\"Cheetahs can reach top speeds of between 60 to 70 mph.\"\u001b[39m\n", + " },\n", + " {\n", + " citations: [\n", + " { citation: \u001b[36m[Array]\u001b[39m },\n", + " { citation: \u001b[36m[Array]\u001b[39m },\n", + " { citation: \u001b[36m[Array]\u001b[39m }\n", + " ]\n", + " }\n", + " ],\n", + " docs: [\n", + " Document {\n", + " pageContent: \u001b[32m\"A cheetah's muscular tail helps control their steering and keep their balance when running very fast\"\u001b[39m... 210 more characters,\n", + " metadata: {\n", + " title: \u001b[32m\"75 Amazing Cheetah Facts Your Kids Will Love (2024)\"\u001b[39m,\n", + " source: \u001b[32m\"https://www.mkewithkids.com/post/cheetah-facts-for-kids/\"\u001b[39m,\n", + " score: \u001b[33m0.97081\u001b[39m,\n", + " images: \u001b[1mnull\u001b[22m\n", + " }\n", + " },\n", + " Document {\n", + " pageContent: \u001b[32m\"The maximum speed cheetahs have been measured at is 114 km (71 miles) per hour, and they routinely r\"\u001b[39m... 1048 more characters,\n", + " metadata: {\n", + " title: \u001b[32m\"Cheetah | Description, Speed, Habitat, Diet, Cubs, & Facts\"\u001b[39m,\n", + " source: \u001b[32m\"https://www.britannica.com/animal/cheetah-mammal\"\u001b[39m,\n", + " score: \u001b[33m0.96824\u001b[39m,\n", + " images: \u001b[1mnull\u001b[22m\n", + " }\n", + " },\n", + " Document {\n", + " pageContent: \u001b[32m\"The Science of Speed\\n\"\u001b[39m +\n", + " \u001b[32m\"Instead, previous research has shown that the fastest animals are not the large\"\u001b[39m... 743 more characters,\n", + " metadata: {\n", + " title: \u001b[32m\"Now Scientists Can Accurately Guess The Speed Of Any Animal\"\u001b[39m,\n", + " source: \u001b[32m\"https://www.nationalgeographic.com/animals/article/Animal-speed-size-cheetahs\"\u001b[39m,\n", + " score: \u001b[33m0.96237\u001b[39m,\n", + " images: \u001b[1mnull\u001b[22m\n", + " }\n", + " },\n", + " Document {\n", + " pageContent: \u001b[32m\"Contact Us − +\\n\"\u001b[39m +\n", + " \u001b[32m\"Address\\n\"\u001b[39m +\n", + " \u001b[32m\"Smithsonian's National Zoo & Conservation Biology Institute  3001 Connecticut\"\u001b[39m... 1343 more characters,\n", + " metadata: {\n", + " title: \u001b[32m\"Cheetah | Smithsonian's National Zoo and Conservation Biology Institute\"\u001b[39m,\n", + " source: \u001b[32m\"https://nationalzoo.si.edu/animals/cheetah\"\u001b[39m,\n", + " score: \u001b[33m0.94565\u001b[39m,\n", + " images: \u001b[1mnull\u001b[22m\n", + " }\n", + " },\n", + " Document {\n", + " pageContent: \u001b[32m\"They are surprisingly graceful\\n\"\u001b[39m +\n", + " \u001b[32m\"Cheetahs are very lithe-they move quickly and full-grown adults weigh\"\u001b[39m... 824 more characters,\n", + " metadata: {\n", + " title: \u001b[32m\"How Fast Are Cheetahs - Proud Animal\"\u001b[39m,\n", + " source: \u001b[32m\"https://www.proudanimal.com/2024/01/27/fast-cheetahs/\"\u001b[39m,\n", + " score: \u001b[33m0.91795\u001b[39m,\n", + " images: \u001b[1mnull\u001b[22m\n", + " }\n", + " },\n", + " Document {\n", + " pageContent: \u001b[32m\"Cheetahs are the world's fastest land animal. They can reach a speed of 69.5 miles per hour in just \"\u001b[39m... 100 more characters,\n", + " metadata: {\n", + " title: \u001b[32m\"How fast is Tyreek Hill? 'The Cheetah' lives up to 40 time, Next Gen ...\"\u001b[39m,\n", + " source: \u001b[32m\"https://www.sportingnews.com/us/nfl/news/fast-tyreek-hill-40-time-speed-chiefs/1cekgawhz39wr1tr472e4\"\u001b[39m... 5 more characters,\n", + " score: \u001b[33m0.83505\u001b[39m,\n", + " images: \u001b[1mnull\u001b[22m\n", + " }\n", + " }\n", + " ]\n", + "}" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "await chain3.invoke(\"How fast are cheetahs?\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "LangSmith trace [here](https://smith.langchain.com/public/bebd86f5-ae9c-49ea-bc26-69c4fdf195b1/r)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Retrieval post-processing\n", + "\n", + "Another approach is to post-process our retrieved documents to compress the content, so that the source content is already minimal enough that we don't need the model to cite specific sources or spans. For example, we could break up each document into a sentence or two, embed those and keep only the most relevant ones. LangChain has some built-in components for this. Here we'll use a [RecursiveCharacterTextSplitter](https://js.langchain.com/docs/modules/data_connection/document_transformers/recursive_text_splitter), which creates chunks of a specified size by splitting on separator substrings, and an [EmbeddingsFilter](https://js.langchain.com/docs/modules/data_connection/retrievers/contextual_compression#embeddingsfilter), which keeps only the texts with the most relevant embeddings." + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The maximum speed cheetahs have been measured at is 114 km (71 miles) per hour, and they routinely reach velocities of 80–100 km (50–62 miles) per hour while pursuing prey.\n", + "cheetah,\n", + "(Acinonyx jubatus), \n", + "\n", + "\n", + "The science of cheetah speed\n", + "The cheetah (Acinonyx jubatus) is the fastest land animal on Earth, capable of reaching speeds as high as 75 mph or 120 km/h. Cheetahs are predators that sneak up on their prey and sprint a short distance to chase and attack.\n", + " Key Takeaways: How Fast Can a Cheetah Run?\n", + "Fastest Cheetah on Earth \n", + "\n", + "\n", + "Built for speed, the cheetah can accelerate from zero to 45 in just 2.5 seconds and reach top speeds of 60 to 70 mph, making it the fastest land mammal! Fun Facts\n", + "Conservation Status\n", + "Cheetah News\n", + "Taxonomic Information\n", + "Animal News\n", + "NZCBI staff in Front Royal, Virginia, are mourning the loss of Walnut, a white-naped crane who became an internet sensation for choosing one of her keepers as her mate. \n", + "\n", + "\n", + "Scientists calculate a cheetah's top speed is 75 mph, but the fastest recorded speed is somewhat slower. The top 10 fastest animals are: \n", + "\n", + "\n", + "The pronghorn, an American animal resembling an antelope, is the fastest land animal in the Western Hemisphere. While a cheetah's top speed ranges from 65 to 75 mph (104 to 120 km/h), its average speed is only 40 mph (64 km/hr), punctuated by short bursts at its top speed. Basically, if a predator threatens to take a cheetah's kill or attack its young, a cheetah has to run. \n", + "\n", + "\n", + "A cheetah eats a variety of small animals, including game birds, rabbits, small antelopes (including the springbok, impala, and gazelle), young warthogs, and larger antelopes (such as the kudu, hartebeest, oryx, and roan). Their faces are distinguished by prominent black lines that curve from the inner corner of each eye to the outer corners of the mouth, like a well-worn trail of inky tears. \n", + "\n", + "\n", + "4 kg) Cheetah moms spend a lot of time teaching their cubs to chase, sometimes dragging live animals back to the den so the cubs can practice the chase-and-catch process \n", + "\n", + "\n", + "Advertisement If confronted, a roughly 125-pound cheetah will always run rather than fight -- it's too weak, light and thin to have any chance against something like a lion, which can be twice as long as a cheetah and weigh more than 400 pounds (181 \n", + "\n", + "\n", + "Cheetahs eat a variety of small animals, including game birds, rabbits, small antelopes (including the springbok, impala, and gazelle), young warthogs, and larger antelopes (such as the kudu, hartebeest, oryx, and roan) \n", + "\n", + "\n", + "Historically, cheetahs ranged widely throughout Africa and Asia, from the Cape of Good Hope to the Mediterranean, throughout the Arabian Peninsula and the Middle East, from Israel, India and Pakistan north to the northern shores of the Caspian and Aral Seas, and west through Uzbekistan, Turkmenistan, Afghanistan, and Pakistan into central India. Header Links \n", + "\n", + "\n" + ] + } + ], + "source": [ + "import { RecursiveCharacterTextSplitter } from \"langchain/text_splitter\";\n", + "import { EmbeddingsFilter } from \"langchain/retrievers/document_compressors/embeddings_filter\";\n", + "import { OpenAIEmbeddings } from \"@langchain/openai\";\n", + "import { DocumentInterface } from \"@langchain/core/documents\";\n", + "import { RunnableMap, RunnablePassthrough } from \"@langchain/core/runnables\";\n", + "\n", + "const splitter = new RecursiveCharacterTextSplitter({\n", + " chunkSize: 400,\n", + " chunkOverlap: 0,\n", + " separators: [\"\\n\\n\", \"\\n\", \".\", \" \"],\n", + " keepSeparator: false,\n", + "});\n", + "\n", + "const compressor = new EmbeddingsFilter({\n", + " embeddings: new OpenAIEmbeddings(),\n", + " k: 10,\n", + "});\n", + "\n", + "const splitAndFilter = async (input): Promise> => {\n", + " const { docs, question } = input;\n", + " const splitDocs = await splitter.splitDocuments(docs);\n", + " const statefulDocs = await compressor.compressDocuments(splitDocs, question);\n", + " return statefulDocs;\n", + "};\n", + "\n", + "const retrieveMap = RunnableMap.from({\n", + " question: new RunnablePassthrough(),\n", + " docs: retriever,\n", + "});\n", + "\n", + "const retrieve = retrieveMap.pipe(splitAndFilter);\n", + "const docs = await retrieve.invoke(\"How fast are cheetahs?\");\n", + "for (const doc of docs) {\n", + " console.log(doc.pageContent, \"\\n\\n\");\n", + "}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "LangSmith trace [here](https://smith.langchain.com/public/1bb61806-7d09-463d-909a-a7da410e79d4/r)" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [], + "source": [ + "const chain4 = retrieveMap\n", + " .assign({ context: formatDocs })\n", + " .assign({ answer: answerChain })\n", + " .pick([\"answer\", \"docs\"]);" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{\n", + " answer: [\n", + " {\n", + " answer: \u001b[32m\"\\n\"\u001b[39m +\n", + " \u001b[32m\"Cheetahs are the fastest land animals. They can reach top speeds of around 75 mph (120 km/h) and ro\"\u001b[39m... 74 more characters\n", + " },\n", + " { citations: [ { citation: \u001b[36m[Array]\u001b[39m }, { citation: \u001b[36m[Array]\u001b[39m } ] }\n", + " ],\n", + " docs: [\n", + " Document {\n", + " pageContent: \u001b[32m\"The maximum speed cheetahs have been measured at is 114 km (71 miles) per hour, and they routinely r\"\u001b[39m... 1048 more characters,\n", + " metadata: {\n", + " title: \u001b[32m\"cheetah - Encyclopedia Britannica | Britannica\"\u001b[39m,\n", + " source: \u001b[32m\"https://www.britannica.com/animal/cheetah-mammal\"\u001b[39m,\n", + " score: \u001b[33m0.97059\u001b[39m,\n", + " images: \u001b[1mnull\u001b[22m\n", + " }\n", + " },\n", + " Document {\n", + " pageContent: \u001b[32m\"Contact Us − +\\n\"\u001b[39m +\n", + " \u001b[32m\"Address\\n\"\u001b[39m +\n", + " \u001b[32m\"Smithsonian's National Zoo & Conservation Biology Institute  3001 Connecticut\"\u001b[39m... 1343 more characters,\n", + " metadata: {\n", + " title: \u001b[32m\"Cheetah\"\u001b[39m,\n", + " source: \u001b[32m\"https://nationalzoo.si.edu/animals/cheetah\"\u001b[39m,\n", + " score: \u001b[33m0.95102\u001b[39m,\n", + " images: \u001b[1mnull\u001b[22m\n", + " }\n", + " },\n", + " Document {\n", + " pageContent: \u001b[32m\"The science of cheetah speed\\n\"\u001b[39m +\n", + " \u001b[32m\"The cheetah (Acinonyx jubatus) is the fastest land animal on Earth, cap\"\u001b[39m... 738 more characters,\n", + " metadata: {\n", + " title: \u001b[32m\"How Fast Can a Cheetah Run?\"\u001b[39m,\n", + " source: \u001b[32m\"https://www.thoughtco.com/how-fast-can-a-cheetah-run-4587031\"\u001b[39m,\n", + " score: \u001b[33m0.94974\u001b[39m,\n", + " images: \u001b[1mnull\u001b[22m\n", + " }\n", + " },\n", + " Document {\n", + " pageContent: \u001b[32m\"Now, their only hope lies in the hands of human conservationists, working tirelessly to save the che\"\u001b[39m... 880 more characters,\n", + " metadata: {\n", + " title: \u001b[32m\"How Fast Are Cheetahs, and Other Fascinating Facts About the World's ...\"\u001b[39m,\n", + " source: \u001b[32m\"https://www.discovermagazine.com/planet-earth/how-fast-are-cheetahs-and-other-fascinating-facts-abou\"\u001b[39m... 21 more characters,\n", + " score: \u001b[33m0.92695\u001b[39m,\n", + " images: \u001b[1mnull\u001b[22m\n", + " }\n", + " },\n", + " Document {\n", + " pageContent: \u001b[32m\"One of two videos from National Geographic's award-winning multimedia coverage of cheetahs in the ma\"\u001b[39m... 60 more characters,\n", + " metadata: {\n", + " title: \u001b[32m\"The Science of a Cheetah's Speed | National Geographic\"\u001b[39m,\n", + " source: \u001b[32m\"https://www.youtube.com/watch?v=icFMTB0Pi0g\"\u001b[39m,\n", + " score: \u001b[33m0.90754\u001b[39m,\n", + " images: \u001b[1mnull\u001b[22m\n", + " }\n", + " },\n", + " Document {\n", + " pageContent: \u001b[32m\"The speeds attained by the cheetah may be only slightly greater than those achieved by the pronghorn\"\u001b[39m... 2527 more characters,\n", + " metadata: {\n", + " title: \u001b[32m\"Cheetah - Wikipedia\"\u001b[39m,\n", + " source: \u001b[32m\"https://en.wikipedia.org/wiki/Cheetah\"\u001b[39m,\n", + " score: \u001b[33m0.89476\u001b[39m,\n", + " images: \u001b[1mnull\u001b[22m\n", + " }\n", + " }\n", + " ]\n", + "}" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "// Note the documents have an article \"summary\" in the metadata that is now much longer than the\n", + "// actual document page content. This summary isn't actually passed to the model.\n", + "await chain4.invoke(\"How fast are cheetahs?\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "LangSmith trace [here](https://smith.langchain.com/public/f93302e6-a31b-454e-9fc7-94fb4a931a9d/r)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Generation post-processing\n", + "\n", + "Another approach is to post-process our model generation. In this example we'll first generate just an answer, and then we'll ask the model to annotate it's own answer with citations. The downside of this approach is of course that it is slower and more expensive, because two model calls need to be made.\n", + "\n", + "Let's apply this to our initial chain." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "import { StructuredTool } from \"@langchain/core/tools\";\n", + "import { formatToOpenAITool } from \"@langchain/openai\";\n", + "import { z } from \"zod\";\n", + "\n", + "class AnnotatedAnswer extends StructuredTool {\n", + " name = \"annotated_answer\";\n", + "\n", + " description = \"Annotate the answer to the user question with quote citations that justify the answer\";\n", + "\n", + " schema = z.object({\n", + " citations: z.array(citationSchema).describe(\"Citations from the given sources that justify the answer.\"),\n", + " })\n", + "\n", + " _call(input: z.infer): Promise {\n", + " return Promise.resolve(JSON.stringify(input, null, 2));\n", + " }\n", + "}\n", + "\n", + "const annotatedAnswerTool = formatToOpenAITool(new AnnotatedAnswer());\n", + "\n", + "const llmWithTools5 = llm.bind({\n", + " tools: [annotatedAnswerTool],\n", + " tool_choice: annotatedAnswerTool,\n", + "})" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [], + "source": [ + "import { ChatPromptTemplate, MessagesPlaceholder } from \"@langchain/core/prompts\";\n", + "import { RunnableSequence } from \"@langchain/core/runnables\";\n", + "import { JsonOutputKeyToolsParser } from \"langchain/output_parsers\";\n", + "import { RunnableMap, RunnablePassthrough } from \"@langchain/core/runnables\";\n", + "import { AIMessage, ToolMessage } from \"@langchain/core/messages\";\n", + "\n", + "const prompt5 = ChatPromptTemplate.fromMessages([\n", + " [\"system\", \"You're a helpful AI assistant. Given a user question and some web article snippets, answer the user question. If none of the articles answer the question, just say you don't know.\\n\\nHere are the web articles:{context}\"],\n", + " [\"human\", \"{question}\"],\n", + " new MessagesPlaceholder({\n", + " variableName: \"chat_history\",\n", + " optional: true,\n", + " }),\n", + " new MessagesPlaceholder({\n", + " variableName: \"toolMessage\",\n", + " optional: true,\n", + " })\n", + "]);\n", + "\n", + "const answerChain5 = prompt5.pipe(llmWithTools5);\n", + "const annotationChain = RunnableSequence.from([\n", + " prompt5,\n", + " llmWithTools5,\n", + " new JsonOutputKeyToolsParser({ keyName: \"annotated_answer\", returnSingle: true }),\n", + " (input: any) => input.citations\n", + "]);\n", + "const map5 = RunnableMap.from({\n", + " question: new RunnablePassthrough(),\n", + " docs: retriever,\n", + "});\n", + "const chain5 = map5\n", + " .assign({ context: formatDocs })\n", + " .assign({ aiMessage: answerChain5 })\n", + " .assign({\n", + " chat_history: (input) => input.aiMessage,\n", + " toolMessage: (input) => new ToolMessage({\n", + " tool_call_id: input.aiMessage.additional_kwargs.tool_calls[0].id,\n", + " content: input.aiMessage.additional_kwargs.content ?? \"\",\n", + " })\n", + " })\n", + " .assign({\n", + " annotations: annotationChain,\n", + " })\n", + " .pick([\"answer\", \"docs\", \"annotations\"]);" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{\n", + " docs: [\n", + " Document {\n", + " pageContent: \u001b[32m\"They are surprisingly graceful\\n\"\u001b[39m +\n", + " \u001b[32m\"Cheetahs are very lithe-they move quickly and full-grown adults weigh\"\u001b[39m... 824 more characters,\n", + " metadata: {\n", + " title: \u001b[32m\"How Fast Are Cheetahs - Proud Animal\"\u001b[39m,\n", + " source: \u001b[32m\"https://www.proudanimal.com/2024/01/27/fast-cheetahs/\"\u001b[39m,\n", + " score: \u001b[33m0.96021\u001b[39m,\n", + " images: \u001b[1mnull\u001b[22m\n", + " }\n", + " },\n", + " Document {\n", + " pageContent: \u001b[32m\"Contact Us − +\\n\"\u001b[39m +\n", + " \u001b[32m\"Address\\n\"\u001b[39m +\n", + " \u001b[32m\"Smithsonian's National Zoo & Conservation Biology Institute  3001 Connecticut\"\u001b[39m... 1343 more characters,\n", + " metadata: {\n", + " title: \u001b[32m\"Cheetah | Smithsonian's National Zoo and Conservation Biology Institute\"\u001b[39m,\n", + " source: \u001b[32m\"https://nationalzoo.si.edu/animals/cheetah\"\u001b[39m,\n", + " score: \u001b[33m0.94798\u001b[39m,\n", + " images: \u001b[1mnull\u001b[22m\n", + " }\n", + " },\n", + " Document {\n", + " pageContent: \u001b[32m\"The science of cheetah speed\\n\"\u001b[39m +\n", + " \u001b[32m\"The cheetah (Acinonyx jubatus) is the fastest land animal on Earth, cap\"\u001b[39m... 738 more characters,\n", + " metadata: {\n", + " title: \u001b[32m\"How Fast Can a Cheetah Run? - ThoughtCo\"\u001b[39m,\n", + " source: \u001b[32m\"https://www.thoughtco.com/how-fast-can-a-cheetah-run-4587031\"\u001b[39m,\n", + " score: \u001b[33m0.92591\u001b[39m,\n", + " images: \u001b[1mnull\u001b[22m\n", + " }\n", + " },\n", + " Document {\n", + " pageContent: \u001b[32m\"The maximum speed cheetahs have been measured at is 114 km (71 miles) per hour, and they routinely r\"\u001b[39m... 1048 more characters,\n", + " metadata: {\n", + " title: \u001b[32m\"Cheetah | Description, Speed, Habitat, Diet, Cubs, & Facts\"\u001b[39m,\n", + " source: \u001b[32m\"https://www.britannica.com/animal/cheetah-mammal\"\u001b[39m,\n", + " score: \u001b[33m0.90128\u001b[39m,\n", + " images: \u001b[1mnull\u001b[22m\n", + " }\n", + " },\n", + " Document {\n", + " pageContent: \u001b[32m\"The Science of Speed\\n\"\u001b[39m +\n", + " \u001b[32m\"Instead, previous research has shown that the fastest animals are not the large\"\u001b[39m... 743 more characters,\n", + " metadata: {\n", + " title: \u001b[32m\"Now Scientists Can Accurately Guess The Speed Of Any Animal\"\u001b[39m,\n", + " source: \u001b[32m\"https://www.nationalgeographic.com/animals/article/Animal-speed-size-cheetahs\"\u001b[39m,\n", + " score: \u001b[33m0.90097\u001b[39m,\n", + " images: \u001b[1mnull\u001b[22m\n", + " }\n", + " },\n", + " Document {\n", + " pageContent: \u001b[32m\"Now, their only hope lies in the hands of human conservationists, working tirelessly to save the che\"\u001b[39m... 880 more characters,\n", + " metadata: {\n", + " title: \u001b[32m\"How Fast Are Cheetahs, and Other Fascinating Facts About the World's ...\"\u001b[39m,\n", + " source: \u001b[32m\"https://www.discovermagazine.com/planet-earth/how-fast-are-cheetahs-and-other-fascinating-facts-abou\"\u001b[39m... 21 more characters,\n", + " score: \u001b[33m0.89788\u001b[39m,\n", + " images: \u001b[1mnull\u001b[22m\n", + " }\n", + " }\n", + " ],\n", + " annotations: [\n", + " {\n", + " sourceId: \u001b[33m0\u001b[39m,\n", + " quote: \u001b[32m\"We’ve mentioned that these guys can reach speeds of up to 70 mph, but did you know they can go from \"\u001b[39m... 22 more characters\n", + " },\n", + " {\n", + " sourceId: \u001b[33m1\u001b[39m,\n", + " quote: \u001b[32m\"Built for speed, the cheetah can accelerate from zero to 45 in just 2.5 seconds and reach top speeds\"\u001b[39m... 52 more characters\n", + " },\n", + " {\n", + " sourceId: \u001b[33m2\u001b[39m,\n", + " quote: \u001b[32m\"The maximum speed cheetahs have been measured at is 114 km (71 miles) per hour, and they routinely r\"\u001b[39m... 72 more characters\n", + " }\n", + " ]\n", + "}" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "await chain5.invoke(\"How fast are cheetahs?\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "LangSmith trace [here](https://smith.langchain.com/public/f4ca647d-b43d-49ba-8df5-65a9761f712e/r)" ] - }, - "execution_count": 28, - "metadata": {}, - "output_type": "execute_result" } - ], - "source": [ - "await chain5.invoke(\"How fast are cheetahs?\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "LangSmith trace [here](https://smith.langchain.com/public/f4ca647d-b43d-49ba-8df5-65a9761f712e/r)" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Deno", - "language": "typescript", - "name": "deno" + ], + "metadata": { + "kernelspec": { + "display_name": "Deno", + "language": "typescript", + "name": "deno" + }, + "language_info": { + "file_extension": ".ts", + "mimetype": "text/x.typescript", + "name": "typescript", + "nb_converter": "script", + "pygments_lexer": "typescript", + "version": "5.3.3" + } }, - "language_info": { - "file_extension": ".ts", - "mimetype": "text/x.typescript", - "name": "typescript", - "nb_converter": "script", - "pygments_lexer": "typescript", - "version": "5.3.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 + "nbformat": 4, + "nbformat_minor": 2 } diff --git a/docs/core_docs/docs/use_cases/question_answering/per_user.ipynb b/docs/core_docs/docs/use_cases/question_answering/per_user.ipynb index 2f06ef744c7b..59c442115e5f 100644 --- a/docs/core_docs/docs/use_cases/question_answering/per_user.ipynb +++ b/docs/core_docs/docs/use_cases/question_answering/per_user.ipynb @@ -1,396 +1,396 @@ { - "cells": [ - { - "cell_type": "raw", - "id": "0e77c293-4049-43be-ba49-ff9daeefeee7", - "metadata": {}, - "source": [ - "---\n", - "sidebar_position: 4\n", - "---" - ] - }, - { - "cell_type": "markdown", - "id": "14d3fd06", - "metadata": {}, - "source": [ - "# Per-User Retrieval\n", - "\n", - "When building a retrieval app, you often have to build it with multiple users in mind. This means that you may be storing data not just for one user, but for many different users, and they should not be able to see eachother's data. This means that you need to be able to configure your retrieval chain to only retrieve certain information. This generally involves two steps.\n", - "\n", - "**Step 1: Make sure the retriever you are using supports multiple users**\n", - "\n", - "At the moment, there is no unified flag or filter for this in LangChain. Rather, each vectorstore and retriever may have their own, and may be called different things (namespaces, multi-tenancy, etc). For vectorstores, this is generally exposed as a keyword argument that is passed in during `similaritySearch`. By reading the documentation or source code, figure out whether the retriever you are using supports multiple users, and, if so, how to use it.\n", - "\n", - "Note: adding documentation and/or support for multiple users for retrievers that do not support it (or document it) is a GREAT way to contribute to LangChain\n", - "\n", - "**Step 2: Add that parameter as a configurable field for the chain**\n", - "\n", - "The LangChain `config` object is passed through to every Runnable. Here you can add any fields you'd like to the `configurable` object. Later, inside the chain we can extract these fields.\n", - "\n", - "**Step 3: Call the chain with that configurable field**\n", - "\n", - "Now, at runtime you can call this chain with configurable field.\n", - "\n", - "## Code Example\n", - "\n", - "Let's see a concrete example of what this looks like in code. We will use Pinecone for this example." - ] - }, - { - "cell_type": "markdown", - "id": "c8ccbef7", - "metadata": {}, - "source": [ - "## Setup\n", - "\n", - "### Install dependencies\n", - "\n", - "```{=mdx}\n", - "import IntegrationInstallTooltip from \"@mdx_components/integration_install_tooltip.mdx\";\n", - "import Npm2Yarn from \"@theme/Npm2Yarn\";\n", - "\n", - "\n", - "\n", - "\n", - " @langchain/pinecone @langchain/openai @pinecone-database/pinecone @langchain/core\n", - "\n", - "```\n", - "\n", - "### Set environment variables\n", - "\n", - "We'll use OpenAI and Pinecone in this example:\n", - "\n", - "```env\n", - "OPENAI_API_KEY=your-api-key\n", - "\n", - "PINECONE_API_KEY=your-api-key\n", - "PINECONE_INDEX=your-index-name\n", - "\n", - "# Optional, use LangSmith for best-in-class observability\n", - "LANGSMITH_API_KEY=your-api-key\n", - "LANGCHAIN_TRACING_V2=true\n", - "```" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "75823b2d", - "metadata": {}, - "outputs": [], - "source": [ - "import { OpenAIEmbeddings } from \"@langchain/openai\";\n", - "import { PineconeStore } from \"@langchain/pinecone\";\n", - "import { Pinecone } from \"@pinecone-database/pinecone\";\n", - "import { Document } from \"@langchain/core/documents\";" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "7345de3c", - "metadata": {}, - "outputs": [], - "source": [ - "const embeddings = new OpenAIEmbeddings()\n", - "\n", - "const pinecone = new Pinecone();\n", - "\n", - "const pineconeIndex = pinecone.Index(Deno.env.get(\"PINECONE_INDEX\"));\n", - "\n", - "const vectorStore = await PineconeStore.fromExistingIndex(\n", - " new OpenAIEmbeddings(),\n", - " { pineconeIndex }\n", - ");" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "3436f41e", - "metadata": {}, - "outputs": [ + "cells": [ { - "data": { - "text/plain": [ - "[ \u001b[32m\"39d90a6d-7e97-45cc-a9dc-ebefa47220fc\"\u001b[39m ]" + "cell_type": "raw", + "id": "0e77c293-4049-43be-ba49-ff9daeefeee7", + "metadata": {}, + "source": [ + "---\n", + "sidebar_position: 4\n", + "---" ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "await vectorStore.addDocuments(\n", - " [new Document({ pageContent: \"i worked at kensho\" })],\n", - " { namespace: \"harrison\" }\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "7d808279", - "metadata": {}, - "outputs": [ + }, { - "data": { - "text/plain": [ - "[ \u001b[32m\"75f94962-9135-4385-b71c-36d8345e02aa\"\u001b[39m ]" + "cell_type": "markdown", + "id": "14d3fd06", + "metadata": {}, + "source": [ + "# Per-User Retrieval\n", + "\n", + "When building a retrieval app, you often have to build it with multiple users in mind. This means that you may be storing data not just for one user, but for many different users, and they should not be able to see eachother's data. This means that you need to be able to configure your retrieval chain to only retrieve certain information. This generally involves two steps.\n", + "\n", + "**Step 1: Make sure the retriever you are using supports multiple users**\n", + "\n", + "At the moment, there is no unified flag or filter for this in LangChain. Rather, each vectorstore and retriever may have their own, and may be called different things (namespaces, multi-tenancy, etc). For vectorstores, this is generally exposed as a keyword argument that is passed in during `similaritySearch`. By reading the documentation or source code, figure out whether the retriever you are using supports multiple users, and, if so, how to use it.\n", + "\n", + "Note: adding documentation and/or support for multiple users for retrievers that do not support it (or document it) is a GREAT way to contribute to LangChain\n", + "\n", + "**Step 2: Add that parameter as a configurable field for the chain**\n", + "\n", + "The LangChain `config` object is passed through to every Runnable. Here you can add any fields you'd like to the `configurable` object. Later, inside the chain we can extract these fields.\n", + "\n", + "**Step 3: Call the chain with that configurable field**\n", + "\n", + "Now, at runtime you can call this chain with configurable field.\n", + "\n", + "## Code Example\n", + "\n", + "Let's see a concrete example of what this looks like in code. We will use Pinecone for this example." ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "await vectorStore.addDocuments(\n", - " [new Document({ pageContent: \"i worked at facebook\" })],\n", - " { namespace: \"ankush\" }\n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "39c11920", - "metadata": {}, - "source": [ - "The pinecone kwarg for `namespace` can be used to separate documents" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "3c2a39fa", - "metadata": {}, - "outputs": [ + }, { - "data": { - "text/plain": [ - "[ Document { pageContent: \u001b[32m\"i worked at facebook\"\u001b[39m, metadata: {} } ]" + "cell_type": "markdown", + "id": "c8ccbef7", + "metadata": {}, + "source": [ + "## Setup\n", + "\n", + "### Install dependencies\n", + "\n", + "```{=mdx}\n", + "import IntegrationInstallTooltip from \"@mdx_components/integration_install_tooltip.mdx\";\n", + "import Npm2Yarn from \"@theme/Npm2Yarn\";\n", + "\n", + "\n", + "\n", + "\n", + " @langchain/pinecone @langchain/openai @pinecone-database/pinecone @langchain/core\n", + "\n", + "```\n", + "\n", + "### Set environment variables\n", + "\n", + "We'll use OpenAI and Pinecone in this example:\n", + "\n", + "```env\n", + "OPENAI_API_KEY=your-api-key\n", + "\n", + "PINECONE_API_KEY=your-api-key\n", + "PINECONE_INDEX=your-index-name\n", + "\n", + "# Optional, use LangSmith for best-in-class observability\n", + "LANGSMITH_API_KEY=your-api-key\n", + "LANGCHAIN_TRACING_V2=true\n", + "```" ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "// This will only get documents for Ankush\n", - "await vectorStore.asRetriever({\n", - " filter: {\n", - " namespace: \"ankush\",\n", - " }\n", - "}).getRelevantDocuments(\n", - " \"where did i work?\"\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "56393baa", - "metadata": {}, - "outputs": [ + }, { - "data": { - "text/plain": [ - "[ Document { pageContent: \u001b[32m\"i worked at kensho\"\u001b[39m, metadata: {} } ]" + "cell_type": "code", + "execution_count": 1, + "id": "75823b2d", + "metadata": {}, + "outputs": [], + "source": [ + "import { OpenAIEmbeddings } from \"@langchain/openai\";\n", + "import { PineconeStore } from \"@langchain/pinecone\";\n", + "import { Pinecone } from \"@pinecone-database/pinecone\";\n", + "import { Document } from \"@langchain/core/documents\";" ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "// This will only get documents for Harrison\n", - "await vectorStore.asRetriever({\n", - " filter: {\n", - " namespace: \"harrison\",\n", - " }\n", - "}).getRelevantDocuments(\n", - " \"where did i work?\"\n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "88ae97ed", - "metadata": {}, - "source": [ - "We can now create the chain that we will use to do question-answering over" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "62707b4f", - "metadata": {}, - "outputs": [], - "source": [ - "import { StringOutputParser } from \"@langchain/core/output_parsers\";\n", - "import { ChatPromptTemplate } from \"@langchain/core/prompts\";\n", - "import {\n", - " RunnableBinding,\n", - " RunnableLambda,\n", - " RunnablePassthrough,\n", - "} from \"@langchain/core/runnables\";\n", - "import { ChatOpenAI, OpenAIEmbeddings } from \"@langchain/openai\";" - ] - }, - { - "cell_type": "markdown", - "id": "b6778ffa", - "metadata": {}, - "source": [ - "This is basic question-answering chain set up." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "44a865f6", - "metadata": {}, - "outputs": [], - "source": [ - "const template = `Answer the question based only on the following context:\n", - "{context}\n", - "Question: {question}`\n", - "\n", - "const prompt = ChatPromptTemplate.fromTemplate(template)\n", - "\n", - "const model = new ChatOpenAI({\n", - " modelName: \"gpt-3.5-turbo-0125\",\n", - " temperature: 0,\n", - "})\n", - "\n", - "const retriever = vectorStore.asRetriever()" - ] - }, - { - "cell_type": "markdown", - "id": "2d481b70", - "metadata": {}, - "source": [ - "We can now create the chain using our configurable retriever. It is configurable because we can define any object which will be passed to the chain. From there, we extract the configurable object and pass it to the vectorstore." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "id": "210b0446", - "metadata": {}, - "outputs": [], - "source": [ - "import { RunnableSequence } from \"@langchain/core/runnables\"\n", - "\n", - "const chain = RunnableSequence.from([\n", - " {\n", - " context: async (input, config) => {\n", - " if (!config || !(\"configurable\" in config)) {\n", - " throw new Error(\"No config\")\n", - " }\n", - " const { configurable } = config;\n", - " return JSON.stringify(await vectorStore.asRetriever(configurable).getRelevantDocuments(input));\n", - " },\n", - " question: new RunnablePassthrough(),\n", - " },\n", - " prompt,\n", - " model,\n", - " new StringOutputParser(),\n", - "])\n" - ] - }, - { - "cell_type": "markdown", - "id": "7f6458c3", - "metadata": {}, - "source": [ - "We can now invoke the chain with configurable options. `search_kwargs` is the id of the configurable field. The value is the search kwargs to use for Pinecone" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "id": "a38037b2", - "metadata": {}, - "outputs": [ + }, { - "data": { - "text/plain": [ - "\u001b[32m\"The user worked at Kensho.\"\u001b[39m" + "cell_type": "code", + "execution_count": 2, + "id": "7345de3c", + "metadata": {}, + "outputs": [], + "source": [ + "const embeddings = new OpenAIEmbeddings()\n", + "\n", + "const pinecone = new Pinecone();\n", + "\n", + "const pineconeIndex = pinecone.Index(Deno.env.get(\"PINECONE_INDEX\"));\n", + "\n", + "const vectorStore = await PineconeStore.fromExistingIndex(\n", + " new OpenAIEmbeddings(),\n", + " { pineconeIndex }\n", + ");" ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "await chain.invoke(\n", - " \"where did the user work?\",\n", - " { configurable: { filter: { namespace: \"harrison\" }}},\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "0ff4f5f2", - "metadata": {}, - "outputs": [ + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "3436f41e", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[ \u001b[32m\"39d90a6d-7e97-45cc-a9dc-ebefa47220fc\"\u001b[39m ]" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "await vectorStore.addDocuments(\n", + " [new Document({ pageContent: \"i worked at kensho\" })],\n", + " { namespace: \"harrison\" }\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "7d808279", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[ \u001b[32m\"75f94962-9135-4385-b71c-36d8345e02aa\"\u001b[39m ]" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "await vectorStore.addDocuments(\n", + " [new Document({ pageContent: \"i worked at facebook\" })],\n", + " { namespace: \"ankush\" }\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "39c11920", + "metadata": {}, + "source": [ + "The pinecone kwarg for `namespace` can be used to separate documents" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "3c2a39fa", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[ Document { pageContent: \u001b[32m\"i worked at facebook\"\u001b[39m, metadata: {} } ]" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "// This will only get documents for Ankush\n", + "await vectorStore.asRetriever({\n", + " filter: {\n", + " namespace: \"ankush\",\n", + " }\n", + "}).getRelevantDocuments(\n", + " \"where did i work?\"\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "56393baa", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[ Document { pageContent: \u001b[32m\"i worked at kensho\"\u001b[39m, metadata: {} } ]" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "// This will only get documents for Harrison\n", + "await vectorStore.asRetriever({\n", + " filter: {\n", + " namespace: \"harrison\",\n", + " }\n", + "}).getRelevantDocuments(\n", + " \"where did i work?\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "88ae97ed", + "metadata": {}, + "source": [ + "We can now create the chain that we will use to do question-answering over" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "62707b4f", + "metadata": {}, + "outputs": [], + "source": [ + "import { StringOutputParser } from \"@langchain/core/output_parsers\";\n", + "import { ChatPromptTemplate } from \"@langchain/core/prompts\";\n", + "import {\n", + " RunnableBinding,\n", + " RunnableLambda,\n", + " RunnablePassthrough,\n", + "} from \"@langchain/core/runnables\";\n", + "import { ChatOpenAI, OpenAIEmbeddings } from \"@langchain/openai\";" + ] + }, + { + "cell_type": "markdown", + "id": "b6778ffa", + "metadata": {}, + "source": [ + "This is basic question-answering chain set up." + ] + }, { - "data": { - "text/plain": [ - "\u001b[32m\"The user worked at Facebook.\"\u001b[39m" + "cell_type": "code", + "execution_count": 9, + "id": "44a865f6", + "metadata": {}, + "outputs": [], + "source": [ + "const template = `Answer the question based only on the following context:\n", + "{context}\n", + "Question: {question}`\n", + "\n", + "const prompt = ChatPromptTemplate.fromTemplate(template)\n", + "\n", + "const model = new ChatOpenAI({\n", + " model: \"gpt-3.5-turbo-0125\",\n", + " temperature: 0,\n", + "})\n", + "\n", + "const retriever = vectorStore.asRetriever()" + ] + }, + { + "cell_type": "markdown", + "id": "2d481b70", + "metadata": {}, + "source": [ + "We can now create the chain using our configurable retriever. It is configurable because we can define any object which will be passed to the chain. From there, we extract the configurable object and pass it to the vectorstore." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "210b0446", + "metadata": {}, + "outputs": [], + "source": [ + "import { RunnableSequence } from \"@langchain/core/runnables\"\n", + "\n", + "const chain = RunnableSequence.from([\n", + " {\n", + " context: async (input, config) => {\n", + " if (!config || !(\"configurable\" in config)) {\n", + " throw new Error(\"No config\")\n", + " }\n", + " const { configurable } = config;\n", + " return JSON.stringify(await vectorStore.asRetriever(configurable).getRelevantDocuments(input));\n", + " },\n", + " question: new RunnablePassthrough(),\n", + " },\n", + " prompt,\n", + " model,\n", + " new StringOutputParser(),\n", + "])\n" + ] + }, + { + "cell_type": "markdown", + "id": "7f6458c3", + "metadata": {}, + "source": [ + "We can now invoke the chain with configurable options. `search_kwargs` is the id of the configurable field. The value is the search kwargs to use for Pinecone" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "a38037b2", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "\u001b[32m\"The user worked at Kensho.\"\u001b[39m" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "await chain.invoke(\n", + " \"where did the user work?\",\n", + " { configurable: { filter: { namespace: \"harrison\" }}},\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "0ff4f5f2", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "\u001b[32m\"The user worked at Facebook.\"\u001b[39m" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "await chain.invoke(\n", + " \"where did the user work?\",\n", + " { configurable: { filter: { namespace: \"ankush\" }}},\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "7fb27b941602401d91542211134fc71a", + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "For more vectorstore implementations for multi-user, please refer to specific pages, such as [Milvus](/docs/integrations/vectorstores/milvus)." ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" } - ], - "source": [ - "await chain.invoke(\n", - " \"where did the user work?\",\n", - " { configurable: { filter: { namespace: \"ankush\" }}},\n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "7fb27b941602401d91542211134fc71a", - "metadata": { - "collapsed": false, - "pycharm": { - "name": "#%% md\n" + ], + "metadata": { + "kernelspec": { + "display_name": "Deno", + "language": "typescript", + "name": "deno" + }, + "language_info": { + "file_extension": ".ts", + "mimetype": "text/x.typescript", + "name": "typescript", + "nb_converter": "script", + "pygments_lexer": "typescript", + "version": "5.3.3" } - }, - "source": [ - "For more vectorstore implementations for multi-user, please refer to specific pages, such as [Milvus](/docs/integrations/vectorstores/milvus)." - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Deno", - "language": "typescript", - "name": "deno" }, - "language_info": { - "file_extension": ".ts", - "mimetype": "text/x.typescript", - "name": "typescript", - "nb_converter": "script", - "pygments_lexer": "typescript", - "version": "5.3.3" - } - }, - "nbformat": 4, - "nbformat_minor": 5 + "nbformat": 4, + "nbformat_minor": 5 } diff --git a/docs/core_docs/docs/use_cases/question_answering/quickstart.ipynb b/docs/core_docs/docs/use_cases/question_answering/quickstart.ipynb index 8f258067950d..bebe124151fd 100644 --- a/docs/core_docs/docs/use_cases/question_answering/quickstart.ipynb +++ b/docs/core_docs/docs/use_cases/question_answering/quickstart.ipynb @@ -1,850 +1,850 @@ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "---\n", - "sidebar_position: 0\n", - "---" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Quickstart\n", - "\n", - "LangChain has a number of components designed to help build question-answering applications, and RAG applications more generally. To familiarize ourselves with these, we’ll build a simple Q&A application over a text data source. Along the way we’ll go over a typical Q&A architecture, discuss the relevant LangChain components, and highlight additional resources for more advanced Q&A techniques. We’ll also see how LangSmith can help us trace and understand our application. LangSmith will become increasingly helpful as our application grows in complexity." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Architecture\n", - "\n", - "We’ll create a typical RAG application as outlined in the [Q&A introduction](/docs/use_cases/question_answering), which has two main components:\n", - "\n", - "**Indexing**: a pipeline for ingesting data from a source and indexing it. This usually happens offline.\n", - "\n", - "**Retrieval and generation**: the actual RAG chain, which takes the user query at run time and retrieves the relevant data from the index, then passes that to the model.\n", - "\n", - "The full sequence from raw data to answer will look like:\n", - "\n", - "**Indexing**\n", - "1. **Load**: First we need to load our data. This is done with [DocumentLoaders](/docs/modules/data_connection/document_loaders/).\n", - "2. **Split**: [Text splitters](/docs/modules/data_connection/document_transformers/) break large `Documents` into smaller chunks. This is useful both for indexing data and for passing it in to a model, since large chunks are harder to search over and won't fit in a model's finite context window.\n", - "3. **Store**: We need somewhere to store and index our splits, so that they can later be searched over. This is often done using a [VectorStore](/docs/modules/data_connection/vectorstores/) and [Embeddings](/docs/modules/data_connection/text_embedding/) model.\n", - "\n", - "**Retrieval and generation**\n", - "1. **Retrieve**: Given a user input, relevant splits are retrieved from storage using a [Retriever](/docs/modules/data_connection/retrievers/).\n", - "2. **Generate**: A [ChatModel](/docs/modules/model_io/chat) / [LLM](/docs/modules/model_io/llms) produces an answer using a prompt that includes the question and the retrieved data" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Setup\n", - "### Dependencies\n", - "\n", - "We’ll use an OpenAI chat model and embeddings and a Memory vector store in this walkthrough, but everything shown here works with any [ChatModel](/docs/modules/model_io/chat) or [LLM](/docs/modules/model_io/llms), [Embeddings](/docs/modules/data_connection/text_embedding/), and [VectorStore](/docs/modules/data_connection/vectorstores/) or [Retriever](/docs/modules/data_connection/retrievers/).\n", - "\n", - "We’ll use the following packages:\n", - "\n", - "```bash\n", - "npm install --save langchain @langchain/openai cheerio\n", - "```\n", - "\n", - "We need to set environment variable `OPENAI_API_KEY`:\n", - "\n", - "```bash\n", - "export OPENAI_API_KEY=YOUR_KEY\n", - "```\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### LangSmith\n", - "\n", - "Many of the applications you build with LangChain will contain multiple steps with multiple invocations of LLM calls. As these applications get more and more complex, it becomes crucial to be able to inspect what exactly is going on inside your chain or agent. The best way to do this is with [LangSmith](https://smith.langchain.com/).\n", - "\n", - "Note that LangSmith is not needed, but it is helpful. If you do want to use LangSmith, after you sign up at the link above, make sure to set your environment variables to start logging traces:\n", - "\n", - "\n", - "```bash\n", - "export LANGCHAIN_TRACING_V2=true\n", - "export LANGCHAIN_API_KEY=YOUR_KEY\n", - "```" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Preview\n", - "\n", - "In this guide we’ll build a QA app over the [LLM Powered Autonomous Agents](https://lilianweng.github.io/posts/2023-06-23-agent/) blog post by Lilian Weng, which allows us to ask questions about the contents of the post.\n", - "\n", - "We can create a simple indexing pipeline and RAG chain to do this in only a few lines of code:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import \"cheerio\";\n", - "import { CheerioWebBaseLoader } from \"langchain/document_loaders/web/cheerio\";\n", - "import { RecursiveCharacterTextSplitter } from \"langchain/text_splitter\";\n", - "import { MemoryVectorStore } from \"langchain/vectorstores/memory\"\n", - "import { OpenAIEmbeddings, ChatOpenAI } from \"@langchain/openai\";\n", - "import { pull } from \"langchain/hub\";\n", - "import { ChatPromptTemplate } from \"@langchain/core/prompts\";\n", - "import { StringOutputParser } from \"@langchain/core/output_parsers\";" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "import { createStuffDocumentsChain } from \"langchain/chains/combine_documents\";\n", - "\n", - "const loader = new CheerioWebBaseLoader(\n", - " \"https://lilianweng.github.io/posts/2023-06-23-agent/\"\n", - ");\n", - "\n", - "const docs = await loader.load();\n", - "\n", - "const textSplitter = new RecursiveCharacterTextSplitter({ chunkSize: 1000, chunkOverlap: 200 });\n", - "const splits = await textSplitter.splitDocuments(docs);\n", - "const vectorStore = await MemoryVectorStore.fromDocuments(splits, new OpenAIEmbeddings());\n", - "\n", - "// Retrieve and generate using the relevant snippets of the blog.\n", - "const retriever = vectorStore.asRetriever();\n", - "const prompt = await pull(\"rlm/rag-prompt\");\n", - "const llm = new ChatOpenAI({ modelName: \"gpt-3.5-turbo\", temperature: 0 });\n", - "\n", - "const ragChain = await createStuffDocumentsChain({\n", - " llm,\n", - " prompt,\n", - " outputParser: new StringOutputParser(),\n", - "})\n", - "\n", - "const retrievedDocs = await retriever.getRelevantDocuments(\"what is task decomposition\")" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "\u001b[32m\"Task decomposition is a technique used to break down complex tasks into smaller and simpler steps. I\"\u001b[39m... 259 more characters" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "await ragChain.invoke({\n", - " question: \"What is task decomposition?\",\n", - " context: retrievedDocs,\n", - "})" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Checkout [this LangSmith trace](https://smith.langchain.com/public/54cffec3-5c26-477d-b56d-ebb66a254c8e/r) of the chain above." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "You can also construct the RAG chain above in a more declarative way using a `RunnableSequence`. `createStuffDocumentsChain` is basically a wrapper around `RunnableSequence`, so for more complex chains and customizability, you can use `RunnableSequence` directly." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "import { formatDocumentsAsString } from \"langchain/util/document\";\n", - "import { RunnableSequence, RunnablePassthrough } from \"@langchain/core/runnables\";\n", - "\n", - "const declarativeRagChain = RunnableSequence.from([\n", - " {\n", - " context: retriever.pipe(formatDocumentsAsString),\n", - " question: new RunnablePassthrough(),\n", - " },\n", - " prompt,\n", - " llm,\n", - " new StringOutputParser()\n", - "]);" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "\u001b[32m\"Task decomposition is a technique used to break down complex tasks into smaller and simpler steps. I\"\u001b[39m... 208 more characters" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "await declarativeRagChain.invoke(\"What is task decomposition?\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "LangSmith [trace](https://smith.langchain.com/public/c48e186c-c9da-4694-adf2-3a7c94362ec2/r)." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Detailed walkthrough\n", - "\n", - "Let’s go through the above code step-by-step to really understand what’s going on.\n", - "\n", - "## 1. Indexing: Load\n", - "We need to first load the blog post contents. We can use [DocumentLoaders](/docs/modules/data_connection/document_loaders/) for this, which are objects that load in data from a source and return a list of [Documents](https://api.js.langchain.com/classes/langchain_core_documents.Document.html). A Document is an object with some pageContent (`string`) and metadata (`Record`).\n", - "\n", - "In this case we’ll use the [CheerioWebBaseLoader](https://api.js.langchain.com/classes/langchain_document_loaders_web_cheerio.CheerioWebBaseLoader.html), which uses cheerio to load HTML form web URLs and parse it to text. We can pass custom selectors to the constructor to only parse specific elements:" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "22054\n" - ] - } - ], - "source": [ - "const pTagSelector = \"p\";\n", - "const loader = new CheerioWebBaseLoader(\n", - " \"https://lilianweng.github.io/posts/2023-06-23-agent/\",\n", - " {\n", - " selector: pTagSelector\n", - " }\n", - ");\n", - "\n", - "const docs = await loader.load();\n", - "console.log(docs[0].pageContent.length)" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Building agents with LLM (large language model) as its core controller is a cool concept. Several proof-of-concepts demos, such as AutoGPT, GPT-Engineer and BabyAGI, serve as inspiring examples. The potentiality of LLM extends beyond generating well-written copies, stories, essays and programs; it can be framed as a powerful general problem solver.In a LLM-powered autonomous agent system, LLM functions as the agent’s brain, complemented by several key components:A complicated task usually involves many steps. An agent needs to know what they are and plan ahead.Chain of thought (CoT; Wei et al. 2022) has become a standard prompting technique for enhancing model performance on complex tasks. The model is instructed to “think step by step” to utilize more test-time computation to decompose hard tasks into smaller and simpler steps. CoT transforms big tasks into multiple manageable tasks and shed lights into an interpretation of the model’s thinking process.Tree of Thoughts (Yao et al. 2023) extends CoT by exploring multiple reasoning possibilities at each step. It first decomposes the problem into multiple thought steps and generates multiple thoughts per step, creating a tree structure. The search process can be BFS (breadth-first search) or DFS (depth-first search) with each state evaluated by a classifier (via a prompt) or majority vote.Task decomposition can be done (1) by LLM with simple prompting like \"Steps for XYZ.\\n1.\", \"What are the subgoals for achieving XYZ?\", (2) by using task-specific instructions; e.g. \"Write a story outline.\" for writing a novel, or (3) with human inputs.Another quite distinct approach, LLM+P (Liu et al. 2023), involves relying on an external classical planner to do long-horizon planning. This approach utilizes the Planning Domain Definition Language (PDDL) as an intermediate interface to describe the planning problem. In this process, LLM (1) translates the problem into “Problem PDDL”, then (2) requests a classical planner to generate a PDDL plan based on an existing “Domain PDDL”, and finally (3) translates the PDDL plan back into natural language. Essentially, the planning step is outsourced to an external tool, assuming the availability of domain-specific PDDL and a suitable planner which is common in certain robotic setups but not in many other domains.Self-reflection is a vital aspect that allows autonomous agents to improve iteratively by refining past action decisions and correcting previous mistakes. It plays a crucial role in real-world tasks where trial and error are inevitable.ReAct (Yao et al. 2023) integrates reasoning and acting within LLM by extending the action space to be a combination of task-specific discrete actions and the language space. The former enables LLM to interact with the environment (e.g. use Wikipedia search API), while the latter prompting LLM to generate reasoning traces in natural language.The ReAct prompt template incorporates explicit steps for LLM to think, roughly formatted as:In both experiments on knowledge-intensive tasks and decision-making tasks, ReAct works better than the Act-only baseline where Thought: … step is removed.Reflexion (Shinn & Labash 2023) is a framework to equips agents with dynamic memory and self-reflection capabilities to improve reasoning skills. Reflexion has a standard RL setup, in which the reward model provides a simple binary reward and the action space follows the setup in ReAct where the task-specific action space is augmented with language to enable complex reasoning steps. After each action $a_t$, the agent computes a heuristic $h_t$ and optionally may decide to reset the environment to start a new trial depending on the self-reflection results.The heuristic function determines when the trajectory is inefficient or contains hallucination and should be stopped. Inefficient planning refers to trajectories that take too long without success. Hallucination is defined as encountering a sequence of consecutive identical actions that lead to the same observation in the environment.Self-reflection is created by showing two-shot examples to LLM and each example is a pair of (failed trajectory, ideal reflection for guiding future changes in the plan). Then reflections are added into the agent’s working memory, up to three, to be used as context for querying LLM.Chain of Hindsight (CoH; Liu et al. 2023) encourages the model to improve on its own outputs by explicitly presenting it with a sequence of past outputs, each annotated with feedback. Human feedback data is a collection of $D_h = \\{(x, y_i , r_i , z_i)\\}_{i=1}^n$, where $x$ is the prompt, each $y_i$ is a model completion, $r_i$ is the human rating of $y_i$, and $z_i$ is the corresponding human-provided hindsight feedback. Assume the feedback tuples are ranked by reward, $r_n \\geq r_{n-1} \\geq \\dots \\geq r_1$ The process is supervised fine-tuning where the data is a sequence in the form of $\\tau_h = (x, z_i, y_i, z_j, y_j, \\dots, z_n, y_n)$, where $\\leq i \\leq j \\leq n$. The model is finetuned to only predict $y_n$ where conditioned on the sequence prefix, such that the model can self-reflect to produce better output based on the feedback sequence. The model can optionally receive multiple rounds of instructions with human annotators at test time.To avoid overfitting, CoH adds a regularization term to maximize the log-likelihood of the pre-training dataset. To avoid shortcutting and copying (because there are many common words in feedback sequences), they randomly mask 0% - 5% of past tokens during training.The training dataset in their experiments is a combination of WebGPT comparisons, summarization from human feedback and human preference dataset.The idea of CoH is to present a history of sequentially improved outputs in context and train the model to take on the trend to produce better outputs. Algorithm Distillation (AD; Laskin et al. 2023) applies the same idea to cross-episode trajectories in reinforcement learning tasks, where an algorithm is encapsulated in a long history-conditioned policy. Considering that an agent interacts with the environment many times and in each episode the agent gets a little better, AD concatenates this learning history and feeds that into the model. Hence we should expect the next predicted action to lead to better performance than previous trials. The goal is to learn the process of RL instead of training a task-specific policy itself.The paper hypothesizes that any algorithm that generates a set of learning histories can be distilled into a neural network by performing behavioral cloning over actions. The history data is generated by a set of source policies, each trained for a specific task. At the training stage, during each RL run, a random task is sampled and a subsequence of multi-episode history is used for training, such that the learned policy is task-agnostic.In reality, the model has limited context window length, so episodes should be short enough to construct multi-episode history. Multi-episodic contexts of 2-4 episodes are necessary to learn a near-optimal in-context RL algorithm. The emergence of in-context RL requires long enough context.In comparison with three baselines, including ED (expert distillation, behavior cloning with expert trajectories instead of learning history), source policy (used for generating trajectories for distillation by UCB), RL^2 (Duan et al. 2017; used as upper bound since it needs online RL), AD demonstrates in-context RL with performance getting close to RL^2 despite only using offline RL and learns much faster than other baselines. When conditioned on partial training history of the source policy, AD also improves much faster than ED baseline.(Big thank you to ChatGPT for helping me draft this section. I’ve learned a lot about the human brain and data structure for fast MIPS in my conversations with ChatGPT.)Memory can be defined as the processes used to acquire, store, retain, and later retrieve information. There are several types of memory in human brains.Sensory Memory: This is the earliest stage of memory, providing the ability to retain impressions of sensory information (visual, auditory, etc) after the original stimuli have ended. Sensory memory typically only lasts for up to a few seconds. Subcategories include iconic memory (visual), echoic memory (auditory), and haptic memory (touch).Short-Term Memory (STM) or Working Memory: It stores information that we are currently aware of and needed to carry out complex cognitive tasks such as learning and reasoning. Short-term memory is believed to have the capacity of about 7 items (Miller 1956) and lasts for 20-30 seconds.Long-Term Memory (LTM): Long-term memory can store information for a remarkably long time, ranging from a few days to decades, with an essentially unlimited storage capacity. There are two subtypes of LTM:We can roughly consider the following mappings:The external memory can alleviate the restriction of finite attention span. A standard practice is to save the embedding representation of information into a vector store database that can support fast maximum inner-product search (MIPS). To optimize the retrieval speed, the common choice is the approximate nearest neighbors (ANN)​ algorithm to return approximately top k nearest neighbors to trade off a little accuracy lost for a huge speedup.A couple common choices of ANN algorithms for fast MIPS:Check more MIPS algorithms and performance comparison in ann-benchmarks.com.Tool use is a remarkable and distinguishing characteristic of human beings. We create, modify and utilize external objects to do things that go beyond our physical and cognitive limits. Equipping LLMs with external tools can significantly extend the model capabilities.MRKL (Karpas et al. 2022), short for “Modular Reasoning, Knowledge and Language”, is a neuro-symbolic architecture for autonomous agents. A MRKL system is proposed to contain a collection of “expert” modules and the general-purpose LLM works as a router to route inquiries to the best suitable expert module. These modules can be neural (e.g. deep learning models) or symbolic (e.g. math calculator, currency converter, weather API).They did an experiment on fine-tuning LLM to call a calculator, using arithmetic as a test case. Their experiments showed that it was harder to solve verbal math problems than explicitly stated math problems because LLMs (7B Jurassic1-large model) failed to extract the right arguments for the basic arithmetic reliably. The results highlight when the external symbolic tools can work reliably, knowing when to and how to use the tools are crucial, determined by the LLM capability.Both TALM (Tool Augmented Language Models; Parisi et al. 2022) and Toolformer (Schick et al. 2023) fine-tune a LM to learn to use external tool APIs. The dataset is expanded based on whether a newly added API call annotation can improve the quality of model outputs. See more details in the “External APIs” section of Prompt Engineering.ChatGPT Plugins and OpenAI API function calling are good examples of LLMs augmented with tool use capability working in practice. The collection of tool APIs can be provided by other developers (as in Plugins) or self-defined (as in function calls).HuggingGPT (Shen et al. 2023) is a framework to use ChatGPT as the task planner to select models available in HuggingFace platform according to the model descriptions and summarize the response based on the execution results.The system comprises of 4 stages:(1) Task planning: LLM works as the brain and parses the user requests into multiple tasks. There are four attributes associated with each task: task type, ID, dependencies, and arguments. They use few-shot examples to guide LLM to do task parsing and planning.Instruction:(2) Model selection: LLM distributes the tasks to expert models, where the request is framed as a multiple-choice question. LLM is presented with a list of models to choose from. Due to the limited context length, task type based filtration is needed.Instruction:(3) Task execution: Expert models execute on the specific tasks and log results.Instruction:(4) Response generation: LLM receives the execution results and provides summarized results to users.To put HuggingGPT into real world usage, a couple challenges need to solve: (1) Efficiency improvement is needed as both LLM inference rounds and interactions with other models slow down the process; (2) It relies on a long context window to communicate over complicated task content; (3) Stability improvement of LLM outputs and external model services.API-Bank (Li et al. 2023) is a benchmark for evaluating the performance of tool-augmented LLMs. It contains 53 commonly used API tools, a complete tool-augmented LLM workflow, and 264 annotated dialogues that involve 568 API calls. The selection of APIs is quite diverse, including search engines, calculator, calendar queries, smart home control, schedule management, health data management, account authentication workflow and more. Because there are a large number of APIs, LLM first has access to API search engine to find the right API to call and then uses the corresponding documentation to make a call.In the API-Bank workflow, LLMs need to make a couple of decisions and at each step we can evaluate how accurate that decision is. Decisions include:This benchmark evaluates the agent’s tool use capabilities at three levels:ChemCrow (Bran et al. 2023) is a domain-specific example in which LLM is augmented with 13 expert-designed tools to accomplish tasks across organic synthesis, drug discovery, and materials design. The workflow, implemented in LangChain, reflects what was previously described in the ReAct and MRKLs and combines CoT reasoning with tools relevant to the tasks:One interesting observation is that while the LLM-based evaluation concluded that GPT-4 and ChemCrow perform nearly equivalently, human evaluations with experts oriented towards the completion and chemical correctness of the solutions showed that ChemCrow outperforms GPT-4 by a large margin. This indicates a potential problem with using LLM to evaluate its own performance on domains that requires deep expertise. The lack of expertise may cause LLMs not knowing its flaws and thus cannot well judge the correctness of task results.Boiko et al. (2023) also looked into LLM-empowered agents for scientific discovery, to handle autonomous design, planning, and performance of complex scientific experiments. This agent can use tools to browse the Internet, read documentation, execute code, call robotics experimentation APIs and leverage other LLMs.For example, when requested to \"develop a novel anticancer drug\", the model came up with the following reasoning steps:They also discussed the risks, especially with illicit drugs and bioweapons. They developed a test set containing a list of known chemical weapon agents and asked the agent to synthesize them. 4 out of 11 requests (36%) were accepted to obtain a synthesis solution and the agent attempted to consult documentation to execute the procedure. 7 out of 11 were rejected and among these 7 rejected cases, 5 happened after a Web search while 2 were rejected based on prompt only.Generative Agents (Park, et al. 2023) is super fun experiment where 25 virtual characters, each controlled by a LLM-powered agent, are living and interacting in a sandbox environment, inspired by The Sims. Generative agents create believable simulacra of human behavior for interactive applications.The design of generative agents combines LLM with memory, planning and reflection mechanisms to enable agents to behave conditioned on past experience, as well as to interact with other agents.This fun simulation results in emergent social behavior, such as information diffusion, relationship memory (e.g. two agents continuing the conversation topic) and coordination of social events (e.g. host a party and invite many others).AutoGPT has drawn a lot of attention into the possibility of setting up autonomous agents with LLM as the main controller. It has quite a lot of reliability issues given the natural language interface, but nevertheless a cool proof-of-concept demo. A lot of code in AutoGPT is about format parsing.Here is the system message used by AutoGPT, where {{...}} are user inputs:GPT-Engineer is another project to create a whole repository of code given a task specified in natural language. The GPT-Engineer is instructed to think over a list of smaller components to build and ask for user input to clarify questions as needed.Here are a sample conversation for task clarification sent to OpenAI ChatCompletion endpoint used by GPT-Engineer. The user inputs are wrapped in {{user input text}}.Then after these clarification, the agent moved into the code writing mode with a different system message.\n", - "System message:Think step by step and reason yourself to the right decisions to make sure we get it right.\n", - "You will first lay out the names of the core classes, functions, methods that will be necessary, as well as a quick comment on their purpose.Then you will output the content of each file including ALL code.\n", - "Each file must strictly follow a markdown code block format, where the following tokens must be replaced such that\n", - "FILENAME is the lowercase file name including the file extension,\n", - "LANG is the markup code block language for the code’s language, and CODE is the code:FILENAMEYou will start with the “entrypoint” file, then go to the ones that are imported by that file, and so on.\n", - "Please note that the code should be fully functional. No placeholders.Follow a language and framework appropriate best practice file naming convention.\n", - "Make sure that files contain all imports, types etc. Make sure that code in different files are compatible with each other.\n", - "Ensure to implement all code, if you are unsure, write a plausible implementation.\n", - "Include module dependency or package manager dependency definition file.\n", - "Before you finish, double check that all parts of the architecture is present in the files.Useful to know:\n", - "You almost always put different classes in different files.\n", - "For Python, you always create an appropriate requirements.txt file.\n", - "For NodeJS, you always create an appropriate package.json file.\n", - "You always add a comment briefly describing the purpose of the function definition.\n", - "You try to add comments explaining very complex bits of logic.\n", - "You always follow the best practices for the requested languages in terms of describing the code written as a defined\n", - "package/project.Python toolbelt preferences:Conversatin samples:After going through key ideas and demos of building LLM-centered agents, I start to see a couple common limitations:Finite context length: The restricted context capacity limits the inclusion of historical information, detailed instructions, API call context, and responses. The design of the system has to work with this limited communication bandwidth, while mechanisms like self-reflection to learn from past mistakes would benefit a lot from long or infinite context windows. Although vector stores and retrieval can provide access to a larger knowledge pool, their representation power is not as powerful as full attention.Challenges in long-term planning and task decomposition: Planning over a lengthy history and effectively exploring the solution space remain challenging. LLMs struggle to adjust plans when faced with unexpected errors, making them less robust compared to humans who learn from trial and error.Reliability of natural language interface: Current agent system relies on natural language as an interface between LLMs and external components such as memory and tools. However, the reliability of model outputs is questionable, as LLMs may make formatting errors and occasionally exhibit rebellious behavior (e.g. refuse to follow an instruction). Consequently, much of the agent demo code focuses on parsing model output.Cited as:Weng, Lilian. (Jun 2023). LLM-powered Autonomous Agents\". Lil’Log. https://lilianweng.github.io/posts/2023-06-23-agent/.Or[1] Wei et al. “Chain of thought prompting elicits reasoning in large language models.” NeurIPS 2022[2] Yao et al. “Tree of Thoughts: Dliberate Problem Solving with Large Language Models.” arXiv preprint arXiv:2305.10601 (2023).[3] Liu et al. “Chain of Hindsight Aligns Language Models with Feedback\n", - "“ arXiv preprint arXiv:2302.02676 (2023).[4] Liu et al. “LLM+P: Empowering Large Language Models with Optimal Planning Proficiency” arXiv preprint arXiv:2304.11477 (2023).[5] Yao et al. “ReAct: Synergizing reasoning and acting in language models.” ICLR 2023.[6] Google Blog. “Announcing ScaNN: Efficient Vector Similarity Search” July 28, 2020.[7] https://chat.openai.com/share/46ff149e-a4c7-4dd7-a800-fc4a642ea389[8] Shinn & Labash. “Reflexion: an autonomous agent with dynamic memory and self-reflection” arXiv preprint arXiv:2303.11366 (2023).[9] Laskin et al. “In-context Reinforcement Learning with Algorithm Distillation” ICLR 2023.[10] Karpas et al. “MRKL Systems A modular, neuro-symbolic architecture that combines large language models, external knowledge sources and discrete reasoning.” arXiv preprint arXiv:2205.00445 (2022).[11] Weaviate Blog. Why is Vector Search so fast? Sep 13, 2022.[12] Li et al. “API-Bank: A Benchmark for Tool-Augmented LLMs” arXiv preprint arXiv:2304.08244 (2023).[13] Shen et al. “HuggingGPT: Solving AI Tasks with ChatGPT and its Friends in HuggingFace” arXiv preprint arXiv:2303.17580 (2023).[14] Bran et al. “ChemCrow: Augmenting large-language models with chemistry tools.” arXiv preprint arXiv:2304.05376 (2023).[15] Boiko et al. “Emergent autonomous scientific research capabilities of large language models.” arXiv preprint arXiv:2304.05332 (2023).[16] Joon Sung Park, et al. “Generative Agents: Interactive Simulacra of Human Behavior.” arXiv preprint arXiv:2304.03442 (2023).[17] AutoGPT. https://github.com/Significant-Gravitas/Auto-GPT[18] GPT-Engineer. https://github.com/AntonOsika/gpt-engineer\n" - ] - } - ], - "source": [ - "console.log(docs[0].pageContent)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Go deeper\n", - "`DocumentLoader`: Class that loads data from a source as list of Documents. - [Docs](/docs/modules/data_connection/document_loaders/): Detailed documentation on how to use\n", - "\n", - "`DocumentLoaders`. - [Integrations](/docs/integrations/document_loaders/) - [Interface](https://api.js.langchain.com/classes/langchain_document_loaders_base.BaseDocumentLoader.html): API reference for the base interface." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 2. Indexing: Split\n", - "Our loaded document is over 42k characters long. This is too long to fit in the context window of many models. Even for those models that could fit the full post in their context window, models can struggle to find information in very long inputs.\n", - "\n", - "To handle this we’ll split the `Document` into chunks for embedding and vector storage. This should help us retrieve only the most relevant bits of the blog post at run time.\n", - "\n", - "In this case we’ll split our documents into chunks of 1000 characters with 200 characters of overlap between chunks. The overlap helps mitigate the possibility of separating a statement from important context related to it. We use the [RecursiveCharacterTextSplitter](/docs/modules/data_connection/document_transformers/recursive_text_splitter), which will recursively split the document using common separators like new lines until each chunk is the appropriate size. This is the recommended text splitter for generic text use cases." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "const textSplitter = new RecursiveCharacterTextSplitter({\n", - " chunkSize: 1000, chunkOverlap: 200\n", - "});\n", - "const allSplits = await textSplitter.splitDocuments(docs);" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "28\n" - ] - } - ], - "source": [ - "console.log(allSplits.length);" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "996\n" - ] - } - ], - "source": [ - "console.log(allSplits[0].pageContent.length);" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{\n", - " source: \u001b[32m\"https://lilianweng.github.io/posts/2023-06-23-agent/\"\u001b[39m,\n", - " loc: { lines: { from: \u001b[33m1\u001b[39m, to: \u001b[33m1\u001b[39m } }\n", - "}" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "allSplits[10].metadata" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Go deeper\n", - "\n", - "`TextSplitter`: Object that splits a list of `Document`s into smaller chunks. Subclass of `DocumentTransformers`. - Explore `Context-aware splitters`, which keep the location (“context”) of each split in the original `Document`: - [Markdown files](/docs/modules/data_connection/document_transformers/code_splitter#markdown) - [Code](/docs/modules/data_connection/document_transformers/code_splitter) (15+ langs) - [Interface](https://api.js.langchain.com/classes/langchain_text_splitter.TextSplitter.html): API reference for the base interface.\n", - "\n", - "`DocumentTransformer`: Object that performs a transformation on a list of `Document`s. - Docs: Detailed documentation on how to use `DocumentTransformer`s - [Integrations](/docs/integrations/document_transformers) - [Interface](https://api.js.langchain.com/modules/langchain_schema_document.html#BaseDocumentTransformer): API reference for the base interface." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 3. Indexing: Store\n", - "Now we need to index our 28 text chunks so that we can search over them at runtime. The most common way to do this is to embed the contents of each document split and insert these embeddings into a vector database (or vector store). When we want to search over our splits, we take a text search query, embed it, and perform some sort of “similarity” search to identify the stored splits with the most similar embeddings to our query embedding. The simplest similarity measure is cosine similarity — we measure the cosine of the angle between each pair of embeddings (which are high dimensional vectors).\n", - "\n", - "We can embed and store all of our document splits in a single command using the [Memory](/docs/integrations/vectorstores/memory) vector store and [OpenAIEmbeddings](/docs/integrations/text_embedding/openai) model." - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [], - "source": [ - "import { MemoryVectorStore } from \"langchain/vectorstores/memory\"\n", - "import { OpenAIEmbeddings } from \"@langchain/openai\";\n", - "\n", - "const vectorStore = await MemoryVectorStore.fromDocuments(allSplits, new OpenAIEmbeddings());" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Go deeper\n", - "\n", - "`Embeddings`: Wrapper around a text embedding model, used for converting text to embeddings. - [Docs](/docs/modules/data_connection/text_embedding/): Detailed documentation on how to use embeddings. - [Integrations](/docs/integrations/text_embedding): 30+ integrations to choose from. - [Interface](https://api.js.langchain.com/classes/langchain_core_embeddings.Embeddings.html): API reference for the base interface.\n", - "\n", - "`VectorStore`: Wrapper around a vector database, used for storing and querying embeddings. - [Docs](/docs/modules/data_connection/vectorstores/): Detailed documentation on how to use vector stores. - [Integrations](/docs/integrations/vectorstores): 40+ integrations to choose from. - [Interface](https://api.js.langchain.com/classes/langchain_core_vectorstores.VectorStore.html): API reference for the base interface.\n", - "\n", - "This completes the **Indexing** portion of the pipeline. At this point we have a query-able vector store containing the chunked contents of our blog post. Given a user question, we should ideally be able to return the snippets of the blog post that answer the question." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 4. Retrieval and Generation: Retrieve\n", - "\n", - "Now let’s write the actual application logic. We want to create a simple application that takes a user question, searches for documents relevant to that question, passes the retrieved documents and initial question to a model, and returns an answer.\n", - "\n", - "First we need to define our logic for searching over documents. LangChain defines a [Retriever](/docs/modules/data_connection/retrievers/) interface which wraps an index that can return relevant `Document`s given a string query.\n", - "\n", - "The most common type of Retriever is the [VectorStoreRetriever](https://api.js.langchain.com/classes/langchain_core_vectorstores.VectorStoreRetriever.html), which uses the similarity search capabilities of a vector store to facilitate retrieval. Any `VectorStore` can easily be turned into a `Retriever` with `VectorStore.asRetriever()`:" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [], - "source": [ - "const retriever = vectorStore.asRetriever({ k: 6, searchType: \"similarity\" });" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [], - "source": [ - "const retrievedDocs = await retriever.invoke(\"What are the approaches to task decomposition?\");" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "6\n" - ] - } - ], - "source": [ - "console.log(retrievedDocs.length);" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "hard tasks into smaller and simpler steps. CoT transforms big tasks into multiple manageable tasks and shed lights into an interpretation of the model’s thinking process.Tree of Thoughts (Yao et al. 2023) extends CoT by exploring multiple reasoning possibilities at each step. It first decomposes the problem into multiple thought steps and generates multiple thoughts per step, creating a tree structure. The search process can be BFS (breadth-first search) or DFS (depth-first search) with each state evaluated by a classifier (via a prompt) or majority vote.Task decomposition can be done (1) by LLM with simple prompting like \"Steps for XYZ.\\n1.\", \"What are the subgoals for achieving XYZ?\", (2) by using task-specific instructions; e.g. \"Write a story outline.\" for writing a novel, or (3) with human inputs.Another quite distinct approach, LLM+P (Liu et al. 2023), involves relying on an external classical planner to do long-horizon planning. This approach utilizes the Planning Domain\n" - ] - } - ], - "source": [ - "console.log(retrievedDocs[0].pageContent);" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Go deeper\n", - "\n", - "Vector stores are commonly used for retrieval, but there are other ways to do retrieval, too.\n", - "\n", - "`Retriever`: An object that returns `Document`s given a text query - [Docs](/docs/modules/data_connection/retrievers/): Further documentation on the interface and built-in retrieval techniques. Some of which include: - `MultiQueryRetriever` [generates variants of the input question](/docs/modules/data_connection/retrievers/multi-query-retriever) to improve retrieval hit rate. - `MultiVectorRetriever` (diagram below) instead generates variants of the embeddings, also in order to improve retrieval hit rate. - Max marginal relevance selects for relevance and diversity among the retrieved documents to avoid passing in duplicate context. - Documents can be filtered during vector store retrieval using metadata filters. - Integrations: Integrations with retrieval services. - Interface: API reference for the base interface." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 5. Retrieval and Generation: Generate\n", - "\n", - "Let’s put it all together into a chain that takes a question, retrieves relevant documents, constructs a prompt, passes that to a model, and parses the output.\n", - "\n", - "We’ll use the gpt-3.5-turbo OpenAI chat model, but any LangChain `LLM` or `ChatModel` could be substituted in." - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [], - "source": [ - "import { ChatOpenAI } from \"@langchain/openai\";\n", - "\n", - "const llm = new ChatOpenAI({ modelName: \"gpt-3.5-turbo\", temperature: 0 });" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We’ll use a prompt for RAG that is checked into the LangChain prompt hub ([here](https://smith.langchain.com/hub/rlm/rag-prompt?organizationId=9213bdc8-a184-442b-901a-cd86ebf8ca6f))." - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [], - "source": [ - "import { ChatPromptTemplate } from \"@langchain/core/prompts\";\n", - "import { pull } from \"langchain/hub\";\n", - "\n", - "const prompt = await pull(\"rlm/rag-prompt\");" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "ChatPromptValue {\n", - " lc_serializable: \u001b[33mtrue\u001b[39m,\n", - " lc_kwargs: {\n", - " messages: [\n", - " HumanMessage {\n", - " lc_serializable: \u001b[33mtrue\u001b[39m,\n", - " lc_kwargs: {\n", - " content: \u001b[32m\"You are an assistant for question-answering tasks. Use the following pieces of retrieved context to \"\u001b[39m... 197 more characters,\n", - " additional_kwargs: {}\n", - " },\n", - " lc_namespace: [ \u001b[32m\"langchain_core\"\u001b[39m, \u001b[32m\"messages\"\u001b[39m ],\n", - " content: \u001b[32m\"You are an assistant for question-answering tasks. Use the following pieces of retrieved context to \"\u001b[39m... 197 more characters,\n", - " name: \u001b[90mundefined\u001b[39m,\n", - " additional_kwargs: {}\n", - " }\n", - " ]\n", - " },\n", - " lc_namespace: [ \u001b[32m\"langchain_core\"\u001b[39m, \u001b[32m\"prompt_values\"\u001b[39m ],\n", - " messages: [\n", - " HumanMessage {\n", - " lc_serializable: \u001b[33mtrue\u001b[39m,\n", - " lc_kwargs: {\n", - " content: \u001b[32m\"You are an assistant for question-answering tasks. Use the following pieces of retrieved context to \"\u001b[39m... 197 more characters,\n", - " additional_kwargs: {}\n", - " },\n", - " lc_namespace: [ \u001b[32m\"langchain_core\"\u001b[39m, \u001b[32m\"messages\"\u001b[39m ],\n", - " content: \u001b[32m\"You are an assistant for question-answering tasks. Use the following pieces of retrieved context to \"\u001b[39m... 197 more characters,\n", - " name: \u001b[90mundefined\u001b[39m,\n", - " additional_kwargs: {}\n", - " }\n", - " ]\n", - "}" - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "const exampleMessages = await prompt.invoke({ context: \"filler context\", question: \"filler question\" });\n", - "exampleMessages" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "You are an assistant for question-answering tasks. Use the following pieces of retrieved context to answer the question. If you don't know the answer, just say that you don't know. Use three sentences maximum and keep the answer concise.\n", - "Question: filler question \n", - "Context: filler context \n", - "Answer:\n" - ] - } - ], - "source": [ - "console.log(exampleMessages.messages[0].content);" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We’ll use the [LCEL Runnable](/docs/expression_language/) protocol to define the chain, allowing us to - pipe together components and functions in a transparent way - automatically trace our chain in LangSmith - get streaming, async, and batched calling out of the box" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [], - "source": [ - "import { StringOutputParser } from \"@langchain/core/output_parsers\";\n", - "import { RunnablePassthrough, RunnableSequence } from \"@langchain/core/runnables\";\n", - "import { formatDocumentsAsString } from \"langchain/util/document\";\n", - "\n", - "const ragChain = RunnableSequence.from([\n", - " {\n", - " context: retriever.pipe(formatDocumentsAsString),\n", - " question: new RunnablePassthrough(),\n", - " },\n", - " prompt,\n", - " llm,\n", - " new StringOutputParser()\n", - "]);" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Task\n", - " decomposition\n", - " is\n", - " the\n", - " process\n", - " of\n", - " breaking\n", - " down\n", - " a\n", - " complex\n", - " task\n", - " into\n", - " smaller\n", - " and\n", - " simpler\n", - " steps\n", - ".\n", - " It\n", - " allows\n", - " for\n", - " easier\n", - " management\n", - " and\n", - " interpretation\n", - " of\n", - " the\n", - " model\n", - "'s\n", - " thinking\n", - " process\n", - ".\n", - " Different\n", - " approaches\n", - ",\n", - " such\n", - " as\n", - " Chain\n", - " of\n", - " Thought\n", - " (\n", - "Co\n", - "T\n", - ")\n", - " and\n", - " Tree\n", - " of\n", - " Thoughts\n", - ",\n", - " can\n", - " be\n", - " used\n", - " to\n", - " decom\n", - "pose\n", - " tasks\n", - " and\n", - " explore\n", - " multiple\n", - " reasoning\n", - " possibilities\n", - " at\n", - " each\n", - " step\n", - ".\n", - "\n" - ] + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "sidebar_position: 0\n", + "---" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Quickstart\n", + "\n", + "LangChain has a number of components designed to help build question-answering applications, and RAG applications more generally. To familiarize ourselves with these, we’ll build a simple Q&A application over a text data source. Along the way we’ll go over a typical Q&A architecture, discuss the relevant LangChain components, and highlight additional resources for more advanced Q&A techniques. We’ll also see how LangSmith can help us trace and understand our application. LangSmith will become increasingly helpful as our application grows in complexity." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Architecture\n", + "\n", + "We’ll create a typical RAG application as outlined in the [Q&A introduction](/docs/use_cases/question_answering), which has two main components:\n", + "\n", + "**Indexing**: a pipeline for ingesting data from a source and indexing it. This usually happens offline.\n", + "\n", + "**Retrieval and generation**: the actual RAG chain, which takes the user query at run time and retrieves the relevant data from the index, then passes that to the model.\n", + "\n", + "The full sequence from raw data to answer will look like:\n", + "\n", + "**Indexing**\n", + "1. **Load**: First we need to load our data. This is done with [DocumentLoaders](/docs/modules/data_connection/document_loaders/).\n", + "2. **Split**: [Text splitters](/docs/modules/data_connection/document_transformers/) break large `Documents` into smaller chunks. This is useful both for indexing data and for passing it in to a model, since large chunks are harder to search over and won't fit in a model's finite context window.\n", + "3. **Store**: We need somewhere to store and index our splits, so that they can later be searched over. This is often done using a [VectorStore](/docs/modules/data_connection/vectorstores/) and [Embeddings](/docs/modules/data_connection/text_embedding/) model.\n", + "\n", + "**Retrieval and generation**\n", + "1. **Retrieve**: Given a user input, relevant splits are retrieved from storage using a [Retriever](/docs/modules/data_connection/retrievers/).\n", + "2. **Generate**: A [ChatModel](/docs/modules/model_io/chat) / [LLM](/docs/modules/model_io/llms) produces an answer using a prompt that includes the question and the retrieved data" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Setup\n", + "### Dependencies\n", + "\n", + "We’ll use an OpenAI chat model and embeddings and a Memory vector store in this walkthrough, but everything shown here works with any [ChatModel](/docs/modules/model_io/chat) or [LLM](/docs/modules/model_io/llms), [Embeddings](/docs/modules/data_connection/text_embedding/), and [VectorStore](/docs/modules/data_connection/vectorstores/) or [Retriever](/docs/modules/data_connection/retrievers/).\n", + "\n", + "We’ll use the following packages:\n", + "\n", + "```bash\n", + "npm install --save langchain @langchain/openai cheerio\n", + "```\n", + "\n", + "We need to set environment variable `OPENAI_API_KEY`:\n", + "\n", + "```bash\n", + "export OPENAI_API_KEY=YOUR_KEY\n", + "```\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### LangSmith\n", + "\n", + "Many of the applications you build with LangChain will contain multiple steps with multiple invocations of LLM calls. As these applications get more and more complex, it becomes crucial to be able to inspect what exactly is going on inside your chain or agent. The best way to do this is with [LangSmith](https://smith.langchain.com/).\n", + "\n", + "Note that LangSmith is not needed, but it is helpful. If you do want to use LangSmith, after you sign up at the link above, make sure to set your environment variables to start logging traces:\n", + "\n", + "\n", + "```bash\n", + "export LANGCHAIN_TRACING_V2=true\n", + "export LANGCHAIN_API_KEY=YOUR_KEY\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Preview\n", + "\n", + "In this guide we’ll build a QA app over the [LLM Powered Autonomous Agents](https://lilianweng.github.io/posts/2023-06-23-agent/) blog post by Lilian Weng, which allows us to ask questions about the contents of the post.\n", + "\n", + "We can create a simple indexing pipeline and RAG chain to do this in only a few lines of code:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import \"cheerio\";\n", + "import { CheerioWebBaseLoader } from \"langchain/document_loaders/web/cheerio\";\n", + "import { RecursiveCharacterTextSplitter } from \"langchain/text_splitter\";\n", + "import { MemoryVectorStore } from \"langchain/vectorstores/memory\"\n", + "import { OpenAIEmbeddings, ChatOpenAI } from \"@langchain/openai\";\n", + "import { pull } from \"langchain/hub\";\n", + "import { ChatPromptTemplate } from \"@langchain/core/prompts\";\n", + "import { StringOutputParser } from \"@langchain/core/output_parsers\";" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "import { createStuffDocumentsChain } from \"langchain/chains/combine_documents\";\n", + "\n", + "const loader = new CheerioWebBaseLoader(\n", + " \"https://lilianweng.github.io/posts/2023-06-23-agent/\"\n", + ");\n", + "\n", + "const docs = await loader.load();\n", + "\n", + "const textSplitter = new RecursiveCharacterTextSplitter({ chunkSize: 1000, chunkOverlap: 200 });\n", + "const splits = await textSplitter.splitDocuments(docs);\n", + "const vectorStore = await MemoryVectorStore.fromDocuments(splits, new OpenAIEmbeddings());\n", + "\n", + "// Retrieve and generate using the relevant snippets of the blog.\n", + "const retriever = vectorStore.asRetriever();\n", + "const prompt = await pull(\"rlm/rag-prompt\");\n", + "const llm = new ChatOpenAI({ model: \"gpt-3.5-turbo\", temperature: 0 });\n", + "\n", + "const ragChain = await createStuffDocumentsChain({\n", + " llm,\n", + " prompt,\n", + " outputParser: new StringOutputParser(),\n", + "})\n", + "\n", + "const retrievedDocs = await retriever.getRelevantDocuments(\"what is task decomposition\")" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "\u001b[32m\"Task decomposition is a technique used to break down complex tasks into smaller and simpler steps. I\"\u001b[39m... 259 more characters" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "await ragChain.invoke({\n", + " question: \"What is task decomposition?\",\n", + " context: retrievedDocs,\n", + "})" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Checkout [this LangSmith trace](https://smith.langchain.com/public/54cffec3-5c26-477d-b56d-ebb66a254c8e/r) of the chain above." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can also construct the RAG chain above in a more declarative way using a `RunnableSequence`. `createStuffDocumentsChain` is basically a wrapper around `RunnableSequence`, so for more complex chains and customizability, you can use `RunnableSequence` directly." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "import { formatDocumentsAsString } from \"langchain/util/document\";\n", + "import { RunnableSequence, RunnablePassthrough } from \"@langchain/core/runnables\";\n", + "\n", + "const declarativeRagChain = RunnableSequence.from([\n", + " {\n", + " context: retriever.pipe(formatDocumentsAsString),\n", + " question: new RunnablePassthrough(),\n", + " },\n", + " prompt,\n", + " llm,\n", + " new StringOutputParser()\n", + "]);" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "\u001b[32m\"Task decomposition is a technique used to break down complex tasks into smaller and simpler steps. I\"\u001b[39m... 208 more characters" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "await declarativeRagChain.invoke(\"What is task decomposition?\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "LangSmith [trace](https://smith.langchain.com/public/c48e186c-c9da-4694-adf2-3a7c94362ec2/r)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Detailed walkthrough\n", + "\n", + "Let’s go through the above code step-by-step to really understand what’s going on.\n", + "\n", + "## 1. Indexing: Load\n", + "We need to first load the blog post contents. We can use [DocumentLoaders](/docs/modules/data_connection/document_loaders/) for this, which are objects that load in data from a source and return a list of [Documents](https://api.js.langchain.com/classes/langchain_core_documents.Document.html). A Document is an object with some pageContent (`string`) and metadata (`Record`).\n", + "\n", + "In this case we’ll use the [CheerioWebBaseLoader](https://api.js.langchain.com/classes/langchain_document_loaders_web_cheerio.CheerioWebBaseLoader.html), which uses cheerio to load HTML form web URLs and parse it to text. We can pass custom selectors to the constructor to only parse specific elements:" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "22054\n" + ] + } + ], + "source": [ + "const pTagSelector = \"p\";\n", + "const loader = new CheerioWebBaseLoader(\n", + " \"https://lilianweng.github.io/posts/2023-06-23-agent/\",\n", + " {\n", + " selector: pTagSelector\n", + " }\n", + ");\n", + "\n", + "const docs = await loader.load();\n", + "console.log(docs[0].pageContent.length)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Building agents with LLM (large language model) as its core controller is a cool concept. Several proof-of-concepts demos, such as AutoGPT, GPT-Engineer and BabyAGI, serve as inspiring examples. The potentiality of LLM extends beyond generating well-written copies, stories, essays and programs; it can be framed as a powerful general problem solver.In a LLM-powered autonomous agent system, LLM functions as the agent’s brain, complemented by several key components:A complicated task usually involves many steps. An agent needs to know what they are and plan ahead.Chain of thought (CoT; Wei et al. 2022) has become a standard prompting technique for enhancing model performance on complex tasks. The model is instructed to “think step by step” to utilize more test-time computation to decompose hard tasks into smaller and simpler steps. CoT transforms big tasks into multiple manageable tasks and shed lights into an interpretation of the model’s thinking process.Tree of Thoughts (Yao et al. 2023) extends CoT by exploring multiple reasoning possibilities at each step. It first decomposes the problem into multiple thought steps and generates multiple thoughts per step, creating a tree structure. The search process can be BFS (breadth-first search) or DFS (depth-first search) with each state evaluated by a classifier (via a prompt) or majority vote.Task decomposition can be done (1) by LLM with simple prompting like \"Steps for XYZ.\\n1.\", \"What are the subgoals for achieving XYZ?\", (2) by using task-specific instructions; e.g. \"Write a story outline.\" for writing a novel, or (3) with human inputs.Another quite distinct approach, LLM+P (Liu et al. 2023), involves relying on an external classical planner to do long-horizon planning. This approach utilizes the Planning Domain Definition Language (PDDL) as an intermediate interface to describe the planning problem. In this process, LLM (1) translates the problem into “Problem PDDL”, then (2) requests a classical planner to generate a PDDL plan based on an existing “Domain PDDL”, and finally (3) translates the PDDL plan back into natural language. Essentially, the planning step is outsourced to an external tool, assuming the availability of domain-specific PDDL and a suitable planner which is common in certain robotic setups but not in many other domains.Self-reflection is a vital aspect that allows autonomous agents to improve iteratively by refining past action decisions and correcting previous mistakes. It plays a crucial role in real-world tasks where trial and error are inevitable.ReAct (Yao et al. 2023) integrates reasoning and acting within LLM by extending the action space to be a combination of task-specific discrete actions and the language space. The former enables LLM to interact with the environment (e.g. use Wikipedia search API), while the latter prompting LLM to generate reasoning traces in natural language.The ReAct prompt template incorporates explicit steps for LLM to think, roughly formatted as:In both experiments on knowledge-intensive tasks and decision-making tasks, ReAct works better than the Act-only baseline where Thought: … step is removed.Reflexion (Shinn & Labash 2023) is a framework to equips agents with dynamic memory and self-reflection capabilities to improve reasoning skills. Reflexion has a standard RL setup, in which the reward model provides a simple binary reward and the action space follows the setup in ReAct where the task-specific action space is augmented with language to enable complex reasoning steps. After each action $a_t$, the agent computes a heuristic $h_t$ and optionally may decide to reset the environment to start a new trial depending on the self-reflection results.The heuristic function determines when the trajectory is inefficient or contains hallucination and should be stopped. Inefficient planning refers to trajectories that take too long without success. Hallucination is defined as encountering a sequence of consecutive identical actions that lead to the same observation in the environment.Self-reflection is created by showing two-shot examples to LLM and each example is a pair of (failed trajectory, ideal reflection for guiding future changes in the plan). Then reflections are added into the agent’s working memory, up to three, to be used as context for querying LLM.Chain of Hindsight (CoH; Liu et al. 2023) encourages the model to improve on its own outputs by explicitly presenting it with a sequence of past outputs, each annotated with feedback. Human feedback data is a collection of $D_h = \\{(x, y_i , r_i , z_i)\\}_{i=1}^n$, where $x$ is the prompt, each $y_i$ is a model completion, $r_i$ is the human rating of $y_i$, and $z_i$ is the corresponding human-provided hindsight feedback. Assume the feedback tuples are ranked by reward, $r_n \\geq r_{n-1} \\geq \\dots \\geq r_1$ The process is supervised fine-tuning where the data is a sequence in the form of $\\tau_h = (x, z_i, y_i, z_j, y_j, \\dots, z_n, y_n)$, where $\\leq i \\leq j \\leq n$. The model is finetuned to only predict $y_n$ where conditioned on the sequence prefix, such that the model can self-reflect to produce better output based on the feedback sequence. The model can optionally receive multiple rounds of instructions with human annotators at test time.To avoid overfitting, CoH adds a regularization term to maximize the log-likelihood of the pre-training dataset. To avoid shortcutting and copying (because there are many common words in feedback sequences), they randomly mask 0% - 5% of past tokens during training.The training dataset in their experiments is a combination of WebGPT comparisons, summarization from human feedback and human preference dataset.The idea of CoH is to present a history of sequentially improved outputs in context and train the model to take on the trend to produce better outputs. Algorithm Distillation (AD; Laskin et al. 2023) applies the same idea to cross-episode trajectories in reinforcement learning tasks, where an algorithm is encapsulated in a long history-conditioned policy. Considering that an agent interacts with the environment many times and in each episode the agent gets a little better, AD concatenates this learning history and feeds that into the model. Hence we should expect the next predicted action to lead to better performance than previous trials. The goal is to learn the process of RL instead of training a task-specific policy itself.The paper hypothesizes that any algorithm that generates a set of learning histories can be distilled into a neural network by performing behavioral cloning over actions. The history data is generated by a set of source policies, each trained for a specific task. At the training stage, during each RL run, a random task is sampled and a subsequence of multi-episode history is used for training, such that the learned policy is task-agnostic.In reality, the model has limited context window length, so episodes should be short enough to construct multi-episode history. Multi-episodic contexts of 2-4 episodes are necessary to learn a near-optimal in-context RL algorithm. The emergence of in-context RL requires long enough context.In comparison with three baselines, including ED (expert distillation, behavior cloning with expert trajectories instead of learning history), source policy (used for generating trajectories for distillation by UCB), RL^2 (Duan et al. 2017; used as upper bound since it needs online RL), AD demonstrates in-context RL with performance getting close to RL^2 despite only using offline RL and learns much faster than other baselines. When conditioned on partial training history of the source policy, AD also improves much faster than ED baseline.(Big thank you to ChatGPT for helping me draft this section. I’ve learned a lot about the human brain and data structure for fast MIPS in my conversations with ChatGPT.)Memory can be defined as the processes used to acquire, store, retain, and later retrieve information. There are several types of memory in human brains.Sensory Memory: This is the earliest stage of memory, providing the ability to retain impressions of sensory information (visual, auditory, etc) after the original stimuli have ended. Sensory memory typically only lasts for up to a few seconds. Subcategories include iconic memory (visual), echoic memory (auditory), and haptic memory (touch).Short-Term Memory (STM) or Working Memory: It stores information that we are currently aware of and needed to carry out complex cognitive tasks such as learning and reasoning. Short-term memory is believed to have the capacity of about 7 items (Miller 1956) and lasts for 20-30 seconds.Long-Term Memory (LTM): Long-term memory can store information for a remarkably long time, ranging from a few days to decades, with an essentially unlimited storage capacity. There are two subtypes of LTM:We can roughly consider the following mappings:The external memory can alleviate the restriction of finite attention span. A standard practice is to save the embedding representation of information into a vector store database that can support fast maximum inner-product search (MIPS). To optimize the retrieval speed, the common choice is the approximate nearest neighbors (ANN)​ algorithm to return approximately top k nearest neighbors to trade off a little accuracy lost for a huge speedup.A couple common choices of ANN algorithms for fast MIPS:Check more MIPS algorithms and performance comparison in ann-benchmarks.com.Tool use is a remarkable and distinguishing characteristic of human beings. We create, modify and utilize external objects to do things that go beyond our physical and cognitive limits. Equipping LLMs with external tools can significantly extend the model capabilities.MRKL (Karpas et al. 2022), short for “Modular Reasoning, Knowledge and Language”, is a neuro-symbolic architecture for autonomous agents. A MRKL system is proposed to contain a collection of “expert” modules and the general-purpose LLM works as a router to route inquiries to the best suitable expert module. These modules can be neural (e.g. deep learning models) or symbolic (e.g. math calculator, currency converter, weather API).They did an experiment on fine-tuning LLM to call a calculator, using arithmetic as a test case. Their experiments showed that it was harder to solve verbal math problems than explicitly stated math problems because LLMs (7B Jurassic1-large model) failed to extract the right arguments for the basic arithmetic reliably. The results highlight when the external symbolic tools can work reliably, knowing when to and how to use the tools are crucial, determined by the LLM capability.Both TALM (Tool Augmented Language Models; Parisi et al. 2022) and Toolformer (Schick et al. 2023) fine-tune a LM to learn to use external tool APIs. The dataset is expanded based on whether a newly added API call annotation can improve the quality of model outputs. See more details in the “External APIs” section of Prompt Engineering.ChatGPT Plugins and OpenAI API function calling are good examples of LLMs augmented with tool use capability working in practice. The collection of tool APIs can be provided by other developers (as in Plugins) or self-defined (as in function calls).HuggingGPT (Shen et al. 2023) is a framework to use ChatGPT as the task planner to select models available in HuggingFace platform according to the model descriptions and summarize the response based on the execution results.The system comprises of 4 stages:(1) Task planning: LLM works as the brain and parses the user requests into multiple tasks. There are four attributes associated with each task: task type, ID, dependencies, and arguments. They use few-shot examples to guide LLM to do task parsing and planning.Instruction:(2) Model selection: LLM distributes the tasks to expert models, where the request is framed as a multiple-choice question. LLM is presented with a list of models to choose from. Due to the limited context length, task type based filtration is needed.Instruction:(3) Task execution: Expert models execute on the specific tasks and log results.Instruction:(4) Response generation: LLM receives the execution results and provides summarized results to users.To put HuggingGPT into real world usage, a couple challenges need to solve: (1) Efficiency improvement is needed as both LLM inference rounds and interactions with other models slow down the process; (2) It relies on a long context window to communicate over complicated task content; (3) Stability improvement of LLM outputs and external model services.API-Bank (Li et al. 2023) is a benchmark for evaluating the performance of tool-augmented LLMs. It contains 53 commonly used API tools, a complete tool-augmented LLM workflow, and 264 annotated dialogues that involve 568 API calls. The selection of APIs is quite diverse, including search engines, calculator, calendar queries, smart home control, schedule management, health data management, account authentication workflow and more. Because there are a large number of APIs, LLM first has access to API search engine to find the right API to call and then uses the corresponding documentation to make a call.In the API-Bank workflow, LLMs need to make a couple of decisions and at each step we can evaluate how accurate that decision is. Decisions include:This benchmark evaluates the agent’s tool use capabilities at three levels:ChemCrow (Bran et al. 2023) is a domain-specific example in which LLM is augmented with 13 expert-designed tools to accomplish tasks across organic synthesis, drug discovery, and materials design. The workflow, implemented in LangChain, reflects what was previously described in the ReAct and MRKLs and combines CoT reasoning with tools relevant to the tasks:One interesting observation is that while the LLM-based evaluation concluded that GPT-4 and ChemCrow perform nearly equivalently, human evaluations with experts oriented towards the completion and chemical correctness of the solutions showed that ChemCrow outperforms GPT-4 by a large margin. This indicates a potential problem with using LLM to evaluate its own performance on domains that requires deep expertise. The lack of expertise may cause LLMs not knowing its flaws and thus cannot well judge the correctness of task results.Boiko et al. (2023) also looked into LLM-empowered agents for scientific discovery, to handle autonomous design, planning, and performance of complex scientific experiments. This agent can use tools to browse the Internet, read documentation, execute code, call robotics experimentation APIs and leverage other LLMs.For example, when requested to \"develop a novel anticancer drug\", the model came up with the following reasoning steps:They also discussed the risks, especially with illicit drugs and bioweapons. They developed a test set containing a list of known chemical weapon agents and asked the agent to synthesize them. 4 out of 11 requests (36%) were accepted to obtain a synthesis solution and the agent attempted to consult documentation to execute the procedure. 7 out of 11 were rejected and among these 7 rejected cases, 5 happened after a Web search while 2 were rejected based on prompt only.Generative Agents (Park, et al. 2023) is super fun experiment where 25 virtual characters, each controlled by a LLM-powered agent, are living and interacting in a sandbox environment, inspired by The Sims. Generative agents create believable simulacra of human behavior for interactive applications.The design of generative agents combines LLM with memory, planning and reflection mechanisms to enable agents to behave conditioned on past experience, as well as to interact with other agents.This fun simulation results in emergent social behavior, such as information diffusion, relationship memory (e.g. two agents continuing the conversation topic) and coordination of social events (e.g. host a party and invite many others).AutoGPT has drawn a lot of attention into the possibility of setting up autonomous agents with LLM as the main controller. It has quite a lot of reliability issues given the natural language interface, but nevertheless a cool proof-of-concept demo. A lot of code in AutoGPT is about format parsing.Here is the system message used by AutoGPT, where {{...}} are user inputs:GPT-Engineer is another project to create a whole repository of code given a task specified in natural language. The GPT-Engineer is instructed to think over a list of smaller components to build and ask for user input to clarify questions as needed.Here are a sample conversation for task clarification sent to OpenAI ChatCompletion endpoint used by GPT-Engineer. The user inputs are wrapped in {{user input text}}.Then after these clarification, the agent moved into the code writing mode with a different system message.\n", + "System message:Think step by step and reason yourself to the right decisions to make sure we get it right.\n", + "You will first lay out the names of the core classes, functions, methods that will be necessary, as well as a quick comment on their purpose.Then you will output the content of each file including ALL code.\n", + "Each file must strictly follow a markdown code block format, where the following tokens must be replaced such that\n", + "FILENAME is the lowercase file name including the file extension,\n", + "LANG is the markup code block language for the code’s language, and CODE is the code:FILENAMEYou will start with the “entrypoint” file, then go to the ones that are imported by that file, and so on.\n", + "Please note that the code should be fully functional. No placeholders.Follow a language and framework appropriate best practice file naming convention.\n", + "Make sure that files contain all imports, types etc. Make sure that code in different files are compatible with each other.\n", + "Ensure to implement all code, if you are unsure, write a plausible implementation.\n", + "Include module dependency or package manager dependency definition file.\n", + "Before you finish, double check that all parts of the architecture is present in the files.Useful to know:\n", + "You almost always put different classes in different files.\n", + "For Python, you always create an appropriate requirements.txt file.\n", + "For NodeJS, you always create an appropriate package.json file.\n", + "You always add a comment briefly describing the purpose of the function definition.\n", + "You try to add comments explaining very complex bits of logic.\n", + "You always follow the best practices for the requested languages in terms of describing the code written as a defined\n", + "package/project.Python toolbelt preferences:Conversatin samples:After going through key ideas and demos of building LLM-centered agents, I start to see a couple common limitations:Finite context length: The restricted context capacity limits the inclusion of historical information, detailed instructions, API call context, and responses. The design of the system has to work with this limited communication bandwidth, while mechanisms like self-reflection to learn from past mistakes would benefit a lot from long or infinite context windows. Although vector stores and retrieval can provide access to a larger knowledge pool, their representation power is not as powerful as full attention.Challenges in long-term planning and task decomposition: Planning over a lengthy history and effectively exploring the solution space remain challenging. LLMs struggle to adjust plans when faced with unexpected errors, making them less robust compared to humans who learn from trial and error.Reliability of natural language interface: Current agent system relies on natural language as an interface between LLMs and external components such as memory and tools. However, the reliability of model outputs is questionable, as LLMs may make formatting errors and occasionally exhibit rebellious behavior (e.g. refuse to follow an instruction). Consequently, much of the agent demo code focuses on parsing model output.Cited as:Weng, Lilian. (Jun 2023). LLM-powered Autonomous Agents\". Lil’Log. https://lilianweng.github.io/posts/2023-06-23-agent/.Or[1] Wei et al. “Chain of thought prompting elicits reasoning in large language models.” NeurIPS 2022[2] Yao et al. “Tree of Thoughts: Dliberate Problem Solving with Large Language Models.” arXiv preprint arXiv:2305.10601 (2023).[3] Liu et al. “Chain of Hindsight Aligns Language Models with Feedback\n", + "“ arXiv preprint arXiv:2302.02676 (2023).[4] Liu et al. “LLM+P: Empowering Large Language Models with Optimal Planning Proficiency” arXiv preprint arXiv:2304.11477 (2023).[5] Yao et al. “ReAct: Synergizing reasoning and acting in language models.” ICLR 2023.[6] Google Blog. “Announcing ScaNN: Efficient Vector Similarity Search” July 28, 2020.[7] https://chat.openai.com/share/46ff149e-a4c7-4dd7-a800-fc4a642ea389[8] Shinn & Labash. “Reflexion: an autonomous agent with dynamic memory and self-reflection” arXiv preprint arXiv:2303.11366 (2023).[9] Laskin et al. “In-context Reinforcement Learning with Algorithm Distillation” ICLR 2023.[10] Karpas et al. “MRKL Systems A modular, neuro-symbolic architecture that combines large language models, external knowledge sources and discrete reasoning.” arXiv preprint arXiv:2205.00445 (2022).[11] Weaviate Blog. Why is Vector Search so fast? Sep 13, 2022.[12] Li et al. “API-Bank: A Benchmark for Tool-Augmented LLMs” arXiv preprint arXiv:2304.08244 (2023).[13] Shen et al. “HuggingGPT: Solving AI Tasks with ChatGPT and its Friends in HuggingFace” arXiv preprint arXiv:2303.17580 (2023).[14] Bran et al. “ChemCrow: Augmenting large-language models with chemistry tools.” arXiv preprint arXiv:2304.05376 (2023).[15] Boiko et al. “Emergent autonomous scientific research capabilities of large language models.” arXiv preprint arXiv:2304.05332 (2023).[16] Joon Sung Park, et al. “Generative Agents: Interactive Simulacra of Human Behavior.” arXiv preprint arXiv:2304.03442 (2023).[17] AutoGPT. https://github.com/Significant-Gravitas/Auto-GPT[18] GPT-Engineer. https://github.com/AntonOsika/gpt-engineer\n" + ] + } + ], + "source": [ + "console.log(docs[0].pageContent)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Go deeper\n", + "`DocumentLoader`: Class that loads data from a source as list of Documents. - [Docs](/docs/modules/data_connection/document_loaders/): Detailed documentation on how to use\n", + "\n", + "`DocumentLoaders`. - [Integrations](/docs/integrations/document_loaders/) - [Interface](https://api.js.langchain.com/classes/langchain_document_loaders_base.BaseDocumentLoader.html): API reference for the base interface." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2. Indexing: Split\n", + "Our loaded document is over 42k characters long. This is too long to fit in the context window of many models. Even for those models that could fit the full post in their context window, models can struggle to find information in very long inputs.\n", + "\n", + "To handle this we’ll split the `Document` into chunks for embedding and vector storage. This should help us retrieve only the most relevant bits of the blog post at run time.\n", + "\n", + "In this case we’ll split our documents into chunks of 1000 characters with 200 characters of overlap between chunks. The overlap helps mitigate the possibility of separating a statement from important context related to it. We use the [RecursiveCharacterTextSplitter](/docs/modules/data_connection/document_transformers/recursive_text_splitter), which will recursively split the document using common separators like new lines until each chunk is the appropriate size. This is the recommended text splitter for generic text use cases." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "const textSplitter = new RecursiveCharacterTextSplitter({\n", + " chunkSize: 1000, chunkOverlap: 200\n", + "});\n", + "const allSplits = await textSplitter.splitDocuments(docs);" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "28\n" + ] + } + ], + "source": [ + "console.log(allSplits.length);" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "996\n" + ] + } + ], + "source": [ + "console.log(allSplits[0].pageContent.length);" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{\n", + " source: \u001b[32m\"https://lilianweng.github.io/posts/2023-06-23-agent/\"\u001b[39m,\n", + " loc: { lines: { from: \u001b[33m1\u001b[39m, to: \u001b[33m1\u001b[39m } }\n", + "}" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "allSplits[10].metadata" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Go deeper\n", + "\n", + "`TextSplitter`: Object that splits a list of `Document`s into smaller chunks. Subclass of `DocumentTransformers`. - Explore `Context-aware splitters`, which keep the location (“context”) of each split in the original `Document`: - [Markdown files](/docs/modules/data_connection/document_transformers/code_splitter#markdown) - [Code](/docs/modules/data_connection/document_transformers/code_splitter) (15+ langs) - [Interface](https://api.js.langchain.com/classes/langchain_text_splitter.TextSplitter.html): API reference for the base interface.\n", + "\n", + "`DocumentTransformer`: Object that performs a transformation on a list of `Document`s. - Docs: Detailed documentation on how to use `DocumentTransformer`s - [Integrations](/docs/integrations/document_transformers) - [Interface](https://api.js.langchain.com/modules/langchain_schema_document.html#BaseDocumentTransformer): API reference for the base interface." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3. Indexing: Store\n", + "Now we need to index our 28 text chunks so that we can search over them at runtime. The most common way to do this is to embed the contents of each document split and insert these embeddings into a vector database (or vector store). When we want to search over our splits, we take a text search query, embed it, and perform some sort of “similarity” search to identify the stored splits with the most similar embeddings to our query embedding. The simplest similarity measure is cosine similarity — we measure the cosine of the angle between each pair of embeddings (which are high dimensional vectors).\n", + "\n", + "We can embed and store all of our document splits in a single command using the [Memory](/docs/integrations/vectorstores/memory) vector store and [OpenAIEmbeddings](/docs/integrations/text_embedding/openai) model." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [], + "source": [ + "import { MemoryVectorStore } from \"langchain/vectorstores/memory\"\n", + "import { OpenAIEmbeddings } from \"@langchain/openai\";\n", + "\n", + "const vectorStore = await MemoryVectorStore.fromDocuments(allSplits, new OpenAIEmbeddings());" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Go deeper\n", + "\n", + "`Embeddings`: Wrapper around a text embedding model, used for converting text to embeddings. - [Docs](/docs/modules/data_connection/text_embedding/): Detailed documentation on how to use embeddings. - [Integrations](/docs/integrations/text_embedding): 30+ integrations to choose from. - [Interface](https://api.js.langchain.com/classes/langchain_core_embeddings.Embeddings.html): API reference for the base interface.\n", + "\n", + "`VectorStore`: Wrapper around a vector database, used for storing and querying embeddings. - [Docs](/docs/modules/data_connection/vectorstores/): Detailed documentation on how to use vector stores. - [Integrations](/docs/integrations/vectorstores): 40+ integrations to choose from. - [Interface](https://api.js.langchain.com/classes/langchain_core_vectorstores.VectorStore.html): API reference for the base interface.\n", + "\n", + "This completes the **Indexing** portion of the pipeline. At this point we have a query-able vector store containing the chunked contents of our blog post. Given a user question, we should ideally be able to return the snippets of the blog post that answer the question." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 4. Retrieval and Generation: Retrieve\n", + "\n", + "Now let’s write the actual application logic. We want to create a simple application that takes a user question, searches for documents relevant to that question, passes the retrieved documents and initial question to a model, and returns an answer.\n", + "\n", + "First we need to define our logic for searching over documents. LangChain defines a [Retriever](/docs/modules/data_connection/retrievers/) interface which wraps an index that can return relevant `Document`s given a string query.\n", + "\n", + "The most common type of Retriever is the [VectorStoreRetriever](https://api.js.langchain.com/classes/langchain_core_vectorstores.VectorStoreRetriever.html), which uses the similarity search capabilities of a vector store to facilitate retrieval. Any `VectorStore` can easily be turned into a `Retriever` with `VectorStore.asRetriever()`:" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "const retriever = vectorStore.asRetriever({ k: 6, searchType: \"similarity\" });" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [], + "source": [ + "const retrievedDocs = await retriever.invoke(\"What are the approaches to task decomposition?\");" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "6\n" + ] + } + ], + "source": [ + "console.log(retrievedDocs.length);" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "hard tasks into smaller and simpler steps. CoT transforms big tasks into multiple manageable tasks and shed lights into an interpretation of the model’s thinking process.Tree of Thoughts (Yao et al. 2023) extends CoT by exploring multiple reasoning possibilities at each step. It first decomposes the problem into multiple thought steps and generates multiple thoughts per step, creating a tree structure. The search process can be BFS (breadth-first search) or DFS (depth-first search) with each state evaluated by a classifier (via a prompt) or majority vote.Task decomposition can be done (1) by LLM with simple prompting like \"Steps for XYZ.\\n1.\", \"What are the subgoals for achieving XYZ?\", (2) by using task-specific instructions; e.g. \"Write a story outline.\" for writing a novel, or (3) with human inputs.Another quite distinct approach, LLM+P (Liu et al. 2023), involves relying on an external classical planner to do long-horizon planning. This approach utilizes the Planning Domain\n" + ] + } + ], + "source": [ + "console.log(retrievedDocs[0].pageContent);" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Go deeper\n", + "\n", + "Vector stores are commonly used for retrieval, but there are other ways to do retrieval, too.\n", + "\n", + "`Retriever`: An object that returns `Document`s given a text query - [Docs](/docs/modules/data_connection/retrievers/): Further documentation on the interface and built-in retrieval techniques. Some of which include: - `MultiQueryRetriever` [generates variants of the input question](/docs/modules/data_connection/retrievers/multi-query-retriever) to improve retrieval hit rate. - `MultiVectorRetriever` (diagram below) instead generates variants of the embeddings, also in order to improve retrieval hit rate. - Max marginal relevance selects for relevance and diversity among the retrieved documents to avoid passing in duplicate context. - Documents can be filtered during vector store retrieval using metadata filters. - Integrations: Integrations with retrieval services. - Interface: API reference for the base interface." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 5. Retrieval and Generation: Generate\n", + "\n", + "Let’s put it all together into a chain that takes a question, retrieves relevant documents, constructs a prompt, passes that to a model, and parses the output.\n", + "\n", + "We’ll use the gpt-3.5-turbo OpenAI chat model, but any LangChain `LLM` or `ChatModel` could be substituted in." + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [], + "source": [ + "import { ChatOpenAI } from \"@langchain/openai\";\n", + "\n", + "const llm = new ChatOpenAI({ model: \"gpt-3.5-turbo\", temperature: 0 });" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We’ll use a prompt for RAG that is checked into the LangChain prompt hub ([here](https://smith.langchain.com/hub/rlm/rag-prompt?organizationId=9213bdc8-a184-442b-901a-cd86ebf8ca6f))." + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [], + "source": [ + "import { ChatPromptTemplate } from \"@langchain/core/prompts\";\n", + "import { pull } from \"langchain/hub\";\n", + "\n", + "const prompt = await pull(\"rlm/rag-prompt\");" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "ChatPromptValue {\n", + " lc_serializable: \u001b[33mtrue\u001b[39m,\n", + " lc_kwargs: {\n", + " messages: [\n", + " HumanMessage {\n", + " lc_serializable: \u001b[33mtrue\u001b[39m,\n", + " lc_kwargs: {\n", + " content: \u001b[32m\"You are an assistant for question-answering tasks. Use the following pieces of retrieved context to \"\u001b[39m... 197 more characters,\n", + " additional_kwargs: {}\n", + " },\n", + " lc_namespace: [ \u001b[32m\"langchain_core\"\u001b[39m, \u001b[32m\"messages\"\u001b[39m ],\n", + " content: \u001b[32m\"You are an assistant for question-answering tasks. Use the following pieces of retrieved context to \"\u001b[39m... 197 more characters,\n", + " name: \u001b[90mundefined\u001b[39m,\n", + " additional_kwargs: {}\n", + " }\n", + " ]\n", + " },\n", + " lc_namespace: [ \u001b[32m\"langchain_core\"\u001b[39m, \u001b[32m\"prompt_values\"\u001b[39m ],\n", + " messages: [\n", + " HumanMessage {\n", + " lc_serializable: \u001b[33mtrue\u001b[39m,\n", + " lc_kwargs: {\n", + " content: \u001b[32m\"You are an assistant for question-answering tasks. Use the following pieces of retrieved context to \"\u001b[39m... 197 more characters,\n", + " additional_kwargs: {}\n", + " },\n", + " lc_namespace: [ \u001b[32m\"langchain_core\"\u001b[39m, \u001b[32m\"messages\"\u001b[39m ],\n", + " content: \u001b[32m\"You are an assistant for question-answering tasks. Use the following pieces of retrieved context to \"\u001b[39m... 197 more characters,\n", + " name: \u001b[90mundefined\u001b[39m,\n", + " additional_kwargs: {}\n", + " }\n", + " ]\n", + "}" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "const exampleMessages = await prompt.invoke({ context: \"filler context\", question: \"filler question\" });\n", + "exampleMessages" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "You are an assistant for question-answering tasks. Use the following pieces of retrieved context to answer the question. If you don't know the answer, just say that you don't know. Use three sentences maximum and keep the answer concise.\n", + "Question: filler question \n", + "Context: filler context \n", + "Answer:\n" + ] + } + ], + "source": [ + "console.log(exampleMessages.messages[0].content);" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We’ll use the [LCEL Runnable](/docs/expression_language/) protocol to define the chain, allowing us to - pipe together components and functions in a transparent way - automatically trace our chain in LangSmith - get streaming, async, and batched calling out of the box" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [], + "source": [ + "import { StringOutputParser } from \"@langchain/core/output_parsers\";\n", + "import { RunnablePassthrough, RunnableSequence } from \"@langchain/core/runnables\";\n", + "import { formatDocumentsAsString } from \"langchain/util/document\";\n", + "\n", + "const ragChain = RunnableSequence.from([\n", + " {\n", + " context: retriever.pipe(formatDocumentsAsString),\n", + " question: new RunnablePassthrough(),\n", + " },\n", + " prompt,\n", + " llm,\n", + " new StringOutputParser()\n", + "]);" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Task\n", + " decomposition\n", + " is\n", + " the\n", + " process\n", + " of\n", + " breaking\n", + " down\n", + " a\n", + " complex\n", + " task\n", + " into\n", + " smaller\n", + " and\n", + " simpler\n", + " steps\n", + ".\n", + " It\n", + " allows\n", + " for\n", + " easier\n", + " management\n", + " and\n", + " interpretation\n", + " of\n", + " the\n", + " model\n", + "'s\n", + " thinking\n", + " process\n", + ".\n", + " Different\n", + " approaches\n", + ",\n", + " such\n", + " as\n", + " Chain\n", + " of\n", + " Thought\n", + " (\n", + "Co\n", + "T\n", + ")\n", + " and\n", + " Tree\n", + " of\n", + " Thoughts\n", + ",\n", + " can\n", + " be\n", + " used\n", + " to\n", + " decom\n", + "pose\n", + " tasks\n", + " and\n", + " explore\n", + " multiple\n", + " reasoning\n", + " possibilities\n", + " at\n", + " each\n", + " step\n", + ".\n", + "\n" + ] + } + ], + "source": [ + "for await (const chunk of await ragChain.stream(\"What is task decomposition?\")) {\n", + " console.log(chunk);\n", + "}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Checkout the LangSmith trace [here](https://smith.langchain.com/public/6f89b333-de55-4ac2-9d93-ea32d41c9e71/r)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Go deeper\n", + "\n", + "#### Choosing a model\n", + "`ChatModel`: An LLM-backed chat model. Takes in a sequence of messages and returns a message. - [Docs](/docs/modules/model_io/chat/): Detailed documentation on - [Integrations](/docs/integrations/chat/): 25+ integrations to choose from. - [Interface](https://api.js.langchain.com/classes/langchain_core_language_models_chat_models.BaseChatModel.html): API reference for the base interface.\n", + "\n", + "`LLM`: A text-in-text-out LLM. Takes in a string and returns a string. - [Docs](/docs/modules/model_io/llms/) - [Integrations](/docs/integrations/llms/): 75+ integrations to choose from. - [Interface](https://api.js.langchain.com/classes/langchain_core_language_models_llms.BaseLLM.html): API reference for the base interface.\n", + "\n", + "See a guide on RAG with locally-running models [here](/docs/use_cases/question_answering/local_retrieval_qa).\n", + "\n", + "#### Customizing the prompt\n", + "\n", + "As shown above, we can load prompts (e.g., [this RAG prompt](https://smith.langchain.com/hub/rlm/rag-prompt?organizationId=9213bdc8-a184-442b-901a-cd86ebf8ca6f)) from the prompt hub. The prompt can also be easily customized:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "\u001b[32m\"Task decomposition is a technique used to break down complex tasks into smaller and simpler steps. I\"\u001b[39m... 336 more characters" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import { PromptTemplate } from \"@langchain/core/prompts\";\n", + "import { createStuffDocumentsChain } from \"langchain/chains/combine_documents\";\n", + "\n", + "const template = `Use the following pieces of context to answer the question at the end.\n", + "If you don't know the answer, just say that you don't know, don't try to make up an answer.\n", + "Use three sentences maximum and keep the answer as concise as possible.\n", + "Always say \"thanks for asking!\" at the end of the answer.\n", + "\n", + "{context}\n", + "\n", + "Question: {question}\n", + "\n", + "Helpful Answer:`;\n", + "\n", + "const customRagPrompt = PromptTemplate.fromTemplate(template);\n", + "\n", + "const ragChain = await createStuffDocumentsChain({\n", + " llm,\n", + " prompt: customRagPrompt,\n", + " outputParser: new StringOutputParser(),\n", + "})\n", + "const context = await retriever.getRelevantDocuments(\"what is task decomposition\");\n", + "\n", + "await ragChain.invoke({\n", + " question: \"What is Task Decomposition?\",\n", + " context,\n", + "});" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Checkout the LangSmith trace [here](https://smith.langchain.com/public/47ef2e53-acec-4b74-acdc-e0ea64088279/r)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Next steps\n", + "\n", + "That’s a lot of content we’ve covered in a short amount of time. There’s plenty of features, integrations, and extensions to explore in each of the above sections. Along from the Go deeper sources mentioned above, good next steps include:\n", + "\n", + "- [Return sources](/docs/use_cases/question_answering/sources): Learn how to return source documents\n", + "- [Streaming](/docs/use_cases/question_answering/streaming): Learn how to stream outputs and intermediate steps\n", + "- [Add chat history](/docs/use_cases/question_answering/chat_history): Learn how to add chat history to your app" + ] } - ], - "source": [ - "for await (const chunk of await ragChain.stream(\"What is task decomposition?\")) {\n", - " console.log(chunk);\n", - "}" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Checkout the LangSmith trace [here](https://smith.langchain.com/public/6f89b333-de55-4ac2-9d93-ea32d41c9e71/r)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Go deeper\n", - "\n", - "#### Choosing a model\n", - "`ChatModel`: An LLM-backed chat model. Takes in a sequence of messages and returns a message. - [Docs](/docs/modules/model_io/chat/): Detailed documentation on - [Integrations](/docs/integrations/chat/): 25+ integrations to choose from. - [Interface](https://api.js.langchain.com/classes/langchain_core_language_models_chat_models.BaseChatModel.html): API reference for the base interface.\n", - "\n", - "`LLM`: A text-in-text-out LLM. Takes in a string and returns a string. - [Docs](/docs/modules/model_io/llms/) - [Integrations](/docs/integrations/llms/): 75+ integrations to choose from. - [Interface](https://api.js.langchain.com/classes/langchain_core_language_models_llms.BaseLLM.html): API reference for the base interface.\n", - "\n", - "See a guide on RAG with locally-running models [here](/docs/use_cases/question_answering/local_retrieval_qa).\n", - "\n", - "#### Customizing the prompt\n", - "\n", - "As shown above, we can load prompts (e.g., [this RAG prompt](https://smith.langchain.com/hub/rlm/rag-prompt?organizationId=9213bdc8-a184-442b-901a-cd86ebf8ca6f)) from the prompt hub. The prompt can also be easily customized:" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "\u001b[32m\"Task decomposition is a technique used to break down complex tasks into smaller and simpler steps. I\"\u001b[39m... 336 more characters" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" + ], + "metadata": { + "kernelspec": { + "display_name": "Deno", + "language": "typescript", + "name": "deno" + }, + "language_info": { + "file_extension": ".ts", + "mimetype": "text/x.typescript", + "name": "typescript", + "nb_converter": "script", + "pygments_lexer": "typescript", + "version": "5.3.3" } - ], - "source": [ - "import { PromptTemplate } from \"@langchain/core/prompts\";\n", - "import { createStuffDocumentsChain } from \"langchain/chains/combine_documents\";\n", - "\n", - "const template = `Use the following pieces of context to answer the question at the end.\n", - "If you don't know the answer, just say that you don't know, don't try to make up an answer.\n", - "Use three sentences maximum and keep the answer as concise as possible.\n", - "Always say \"thanks for asking!\" at the end of the answer.\n", - "\n", - "{context}\n", - "\n", - "Question: {question}\n", - "\n", - "Helpful Answer:`;\n", - "\n", - "const customRagPrompt = PromptTemplate.fromTemplate(template);\n", - "\n", - "const ragChain = await createStuffDocumentsChain({\n", - " llm,\n", - " prompt: customRagPrompt,\n", - " outputParser: new StringOutputParser(),\n", - "})\n", - "const context = await retriever.getRelevantDocuments(\"what is task decomposition\");\n", - "\n", - "await ragChain.invoke({\n", - " question: \"What is Task Decomposition?\",\n", - " context,\n", - "});" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Checkout the LangSmith trace [here](https://smith.langchain.com/public/47ef2e53-acec-4b74-acdc-e0ea64088279/r)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Next steps\n", - "\n", - "That’s a lot of content we’ve covered in a short amount of time. There’s plenty of features, integrations, and extensions to explore in each of the above sections. Along from the Go deeper sources mentioned above, good next steps include:\n", - "\n", - "- [Return sources](/docs/use_cases/question_answering/sources): Learn how to return source documents\n", - "- [Streaming](/docs/use_cases/question_answering/streaming): Learn how to stream outputs and intermediate steps\n", - "- [Add chat history](/docs/use_cases/question_answering/chat_history): Learn how to add chat history to your app" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Deno", - "language": "typescript", - "name": "deno" }, - "language_info": { - "file_extension": ".ts", - "mimetype": "text/x.typescript", - "name": "typescript", - "nb_converter": "script", - "pygments_lexer": "typescript", - "version": "5.3.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 + "nbformat": 4, + "nbformat_minor": 2 } diff --git a/docs/core_docs/docs/use_cases/question_answering/sources.ipynb b/docs/core_docs/docs/use_cases/question_answering/sources.ipynb index 90493c659390..cda57ef3fe7f 100644 --- a/docs/core_docs/docs/use_cases/question_answering/sources.ipynb +++ b/docs/core_docs/docs/use_cases/question_answering/sources.ipynb @@ -96,7 +96,7 @@ "// Retrieve and generate using the relevant snippets of the blog.\n", "const retriever = vectorStore.asRetriever();\n", "const prompt = await pull(\"rlm/rag-prompt\");\n", - "const llm = new ChatOpenAI({ modelName: \"gpt-3.5-turbo\", temperature: 0 });\n", + "const llm = new ChatOpenAI({ model: \"gpt-3.5-turbo\", temperature: 0 });\n", "\n", "const ragChain = RunnableSequence.from([\n", " {\n", diff --git a/docs/core_docs/docs/use_cases/question_answering/streaming.ipynb b/docs/core_docs/docs/use_cases/question_answering/streaming.ipynb index 74c3cdcf1176..dc2d46c07c9f 100644 --- a/docs/core_docs/docs/use_cases/question_answering/streaming.ipynb +++ b/docs/core_docs/docs/use_cases/question_answering/streaming.ipynb @@ -147,7 +147,7 @@ "// Retrieve and generate using the relevant snippets of the blog.\n", "const retriever = vectorStore.asRetriever();\n", "const prompt = await pull(\"rlm/rag-prompt\");\n", - "const llm = new ChatOpenAI({ modelName: \"gpt-3.5-turbo\", temperature: 0 });\n", + "const llm = new ChatOpenAI({ model: \"gpt-3.5-turbo\", temperature: 0 });\n", "\n", "const ragChainFromDocs = RunnableSequence.from([\n", " RunnablePassthrough.assign({ context: (input) => formatDocumentsAsString(input.context) }),\n", diff --git a/docs/core_docs/docs/use_cases/tool_use/agents.mdx b/docs/core_docs/docs/use_cases/tool_use/agents.mdx index 80d8d276e25e..155ea485a4f4 100644 --- a/docs/core_docs/docs/use_cases/tool_use/agents.mdx +++ b/docs/core_docs/docs/use_cases/tool_use/agents.mdx @@ -103,7 +103,7 @@ import { ChatOpenAI } from "@langchain/openai"; import { AgentExecutor, createOpenAIToolsAgent } from "langchain/agents"; const model = new ChatOpenAI({ - modelName: "gpt-3.5-turbo-1106", + model: "gpt-3.5-turbo-1106", temperature: 0, }); diff --git a/docs/core_docs/docs/use_cases/tool_use/human_in_the_loop.ipynb b/docs/core_docs/docs/use_cases/tool_use/human_in_the_loop.ipynb index 14a36c6fa232..a897332a2995 100644 --- a/docs/core_docs/docs/use_cases/tool_use/human_in_the_loop.ipynb +++ b/docs/core_docs/docs/use_cases/tool_use/human_in_the_loop.ipynb @@ -1,200 +1,200 @@ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Human-in-the-loop\n", - "\n", - "There are certain tools that we don't trust a model to execute on its own. One thing we can do in such situations is require human approval before the tool is invoked." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Setup\n", - "\n", - "We'll need to install the following packages:\n", - "\n", - "```bash\n", - "npm install langchain @langchain/core @langchain/openai readline zod\n", - "```\n", - "\n", - "We'll use `readline` to handle accepting input from the user." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### LangSmith\n", - "\n", - "Many of the applications you build with LangChain will contain multiple steps with multiple invocations of LLM calls. As these applications get more and more complex, it becomes crucial to be able to inspect what exactly is going on inside your chain or agent. The best way to do this is with [LangSmith](https://smith.langchain.com/).\n", - "\n", - "Note that LangSmith is not needed, but it is helpful. If you do want to use LangSmith, after you sign up at the link above, make sure to set your environment variables to start logging traces:\n", - "\n", - "\n", - "```bash\n", - "export LANGCHAIN_TRACING_V2=true\n", - "export LANGCHAIN_API_KEY=YOUR_KEY\n", - "```" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Chain\n", - "\n", - "Suppose we have the following (dummy) tools and tool-calling chain:" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import { ChatOpenAI } from \"@langchain/openai\";\n", - "import { Runnable, RunnableLambda, RunnablePassthrough } from \"@langchain/core/runnables\"\n", - "import { StructuredTool } from \"@langchain/core/tools\";\n", - "import { JsonOutputToolsParser } from \"langchain/output_parsers\";\n", - "import { z } from \"zod\";\n", - "\n", - "class CountEmails extends StructuredTool {\n", - " schema = z.object({\n", - " lastNDays: z.number(),\n", - " })\n", - "\n", - " name = \"count_emails\";\n", - "\n", - " description = \"Count the number of emails sent in the last N days.\";\n", - "\n", - " async _call(input: z.infer): Promise {\n", - " return (input.lastNDays * 2).toString();\n", - " }\n", - "}\n", - "\n", - "class SendEmail extends StructuredTool {\n", - " schema = z.object({\n", - " message: z.string(),\n", - " recipient: z.string(),\n", - " })\n", - "\n", - " name = \"send_email\";\n", - "\n", - " description = \"Send an email.\";\n", - "\n", - " async _call(input: z.infer): Promise {\n", - " return `Successfully sent email to ${input.recipient}`;\n", - " }\n", - "}\n", - "\n", - "const tools = [new CountEmails(), new SendEmail()];" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "const model = new ChatOpenAI({\n", - " modelName: \"gpt-3.5-turbo\",\n", - " temperature: 0\n", - "}).bind({\n", - " tools,\n", - "});\n", - "\n", - "/**\n", - " * Function for dynamically constructing the end of the chain based on the model-selected tool.\n", - " */\n", - "const callTool = (toolInvocation: Record): Runnable => {\n", - " const toolMap: Record = tools.reduce((acc, tool) => {\n", - " acc[tool.name] = tool;\n", - " return acc;\n", - " }, {});\n", - " const tool = toolMap[toolInvocation.type];\n", - " return RunnablePassthrough.assign({ output: (input, config) => tool.invoke(input.args, config) });\n", - "}" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "// .map() allows us to apply a function to a list of inputs.\n", - "const callToolList = new RunnableLambda({ func: callTool }).map();\n", - "const chain = model.pipe(new JsonOutputToolsParser()).pipe(callToolList);" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Human-in-the-loop\n", + "\n", + "There are certain tools that we don't trust a model to execute on its own. One thing we can do in such situations is require human approval before the tool is invoked." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Setup\n", + "\n", + "We'll need to install the following packages:\n", + "\n", + "```bash\n", + "npm install langchain @langchain/core @langchain/openai readline zod\n", + "```\n", + "\n", + "We'll use `readline` to handle accepting input from the user." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### LangSmith\n", + "\n", + "Many of the applications you build with LangChain will contain multiple steps with multiple invocations of LLM calls. As these applications get more and more complex, it becomes crucial to be able to inspect what exactly is going on inside your chain or agent. The best way to do this is with [LangSmith](https://smith.langchain.com/).\n", + "\n", + "Note that LangSmith is not needed, but it is helpful. If you do want to use LangSmith, after you sign up at the link above, make sure to set your environment variables to start logging traces:\n", + "\n", + "\n", + "```bash\n", + "export LANGCHAIN_TRACING_V2=true\n", + "export LANGCHAIN_API_KEY=YOUR_KEY\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Chain\n", + "\n", + "Suppose we have the following (dummy) tools and tool-calling chain:" + ] + }, { - "data": { - "text/plain": [ - "[ { type: \u001b[32m\"count_emails\"\u001b[39m, args: { lastNDays: \u001b[33m5\u001b[39m }, output: \u001b[32m\"10\"\u001b[39m } ]" + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import { ChatOpenAI } from \"@langchain/openai\";\n", + "import { Runnable, RunnableLambda, RunnablePassthrough } from \"@langchain/core/runnables\"\n", + "import { StructuredTool } from \"@langchain/core/tools\";\n", + "import { JsonOutputToolsParser } from \"langchain/output_parsers\";\n", + "import { z } from \"zod\";\n", + "\n", + "class CountEmails extends StructuredTool {\n", + " schema = z.object({\n", + " lastNDays: z.number(),\n", + " })\n", + "\n", + " name = \"count_emails\";\n", + "\n", + " description = \"Count the number of emails sent in the last N days.\";\n", + "\n", + " async _call(input: z.infer): Promise {\n", + " return (input.lastNDays * 2).toString();\n", + " }\n", + "}\n", + "\n", + "class SendEmail extends StructuredTool {\n", + " schema = z.object({\n", + " message: z.string(),\n", + " recipient: z.string(),\n", + " })\n", + "\n", + " name = \"send_email\";\n", + "\n", + " description = \"Send an email.\";\n", + "\n", + " async _call(input: z.infer): Promise {\n", + " return `Successfully sent email to ${input.recipient}`;\n", + " }\n", + "}\n", + "\n", + "const tools = [new CountEmails(), new SendEmail()];" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "const model = new ChatOpenAI({\n", + " model: \"gpt-3.5-turbo\",\n", + " temperature: 0\n", + "}).bind({\n", + " tools,\n", + "});\n", + "\n", + "/**\n", + " * Function for dynamically constructing the end of the chain based on the model-selected tool.\n", + " */\n", + "const callTool = (toolInvocation: Record): Runnable => {\n", + " const toolMap: Record = tools.reduce((acc, tool) => {\n", + " acc[tool.name] = tool;\n", + " return acc;\n", + " }, {});\n", + " const tool = toolMap[toolInvocation.type];\n", + " return RunnablePassthrough.assign({ output: (input, config) => tool.invoke(input.args, config) });\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "// .map() allows us to apply a function to a list of inputs.\n", + "const callToolList = new RunnableLambda({ func: callTool }).map();\n", + "const chain = model.pipe(new JsonOutputToolsParser()).pipe(callToolList);" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[ { type: \u001b[32m\"count_emails\"\u001b[39m, args: { lastNDays: \u001b[33m5\u001b[39m }, output: \u001b[32m\"10\"\u001b[39m } ]" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "await chain.invoke(\"How many emails did I get in the last 5 days?\");" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Adding human approval\n", + "\n", + "We can add a simple human approval step to our `toolChain` function:" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "```{=mdx}\n", + "import CodeBlock from \"@theme/CodeBlock\";\n", + "import HumanFeedback from \"@examples/use_cases/human_in_the_loop/accept-feedback.ts\";\n", + "\n", + "{HumanFeedback}\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "> #### Examine the LangSmith traces from the code above [here](https://smith.langchain.com/public/aac711ff-b1a1-4fd7-a298-0f20909259b6/r) and [here](https://smith.langchain.com/public/7b35ee77-b369-4b95-af4f-b83510f9a93b/r)." ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" } - ], - "source": [ - "await chain.invoke(\"How many emails did I get in the last 5 days?\");" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Adding human approval\n", - "\n", - "We can add a simple human approval step to our `toolChain` function:" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "```{=mdx}\n", - "import CodeBlock from \"@theme/CodeBlock\";\n", - "import HumanFeedback from \"@examples/use_cases/human_in_the_loop/accept-feedback.ts\";\n", - "\n", - "{HumanFeedback}\n", - "```" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "> #### Examine the LangSmith traces from the code above [here](https://smith.langchain.com/public/aac711ff-b1a1-4fd7-a298-0f20909259b6/r) and [here](https://smith.langchain.com/public/7b35ee77-b369-4b95-af4f-b83510f9a93b/r)." - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Deno", - "language": "typescript", - "name": "deno" + ], + "metadata": { + "kernelspec": { + "display_name": "Deno", + "language": "typescript", + "name": "deno" + }, + "language_info": { + "file_extension": ".ts", + "mimetype": "text/x.typescript", + "name": "typescript", + "nb_converter": "script", + "pygments_lexer": "typescript", + "version": "5.3.3" + } }, - "language_info": { - "file_extension": ".ts", - "mimetype": "text/x.typescript", - "name": "typescript", - "nb_converter": "script", - "pygments_lexer": "typescript", - "version": "5.3.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 + "nbformat": 4, + "nbformat_minor": 2 } diff --git a/docs/core_docs/docs/use_cases/tool_use/multiple_tools.mdx b/docs/core_docs/docs/use_cases/tool_use/multiple_tools.mdx index 8a1fb8ec8058..7f7279dc6020 100644 --- a/docs/core_docs/docs/use_cases/tool_use/multiple_tools.mdx +++ b/docs/core_docs/docs/use_cases/tool_use/multiple_tools.mdx @@ -96,7 +96,7 @@ import { } from "@langchain/core/runnables"; const model = new ChatOpenAI({ - modelName: "gpt-3.5-turbo-1106", + model: "gpt-3.5-turbo-1106", }); const tools = [multiplyTool, exponentiateTool, addTool]; diff --git a/docs/core_docs/docs/use_cases/tool_use/parallel.mdx b/docs/core_docs/docs/use_cases/tool_use/parallel.mdx index 9fe792e9ae7b..aa7320665708 100644 --- a/docs/core_docs/docs/use_cases/tool_use/parallel.mdx +++ b/docs/core_docs/docs/use_cases/tool_use/parallel.mdx @@ -91,7 +91,7 @@ import { } from "@langchain/core/runnables"; const model = new ChatOpenAI({ - modelName: "gpt-3.5-turbo-1106", + model: "gpt-3.5-turbo-1106", }); const tools = [multiplyTool, exponentiateTool, addTool]; diff --git a/docs/core_docs/docs/use_cases/tool_use/quickstart.mdx b/docs/core_docs/docs/use_cases/tool_use/quickstart.mdx index 8fede31a5ad9..f970c98e6417 100644 --- a/docs/core_docs/docs/use_cases/tool_use/quickstart.mdx +++ b/docs/core_docs/docs/use_cases/tool_use/quickstart.mdx @@ -69,7 +69,7 @@ First we’ll define our model: import { ChatOpenAI } from "@langchain/openai"; const model = new ChatOpenAI({ - modelName: "gpt-3.5-turbo-1106", + model: "gpt-3.5-turbo-1106", }); ``` @@ -251,7 +251,7 @@ const exponentiateTool = new DynamicStructuredTool({ }); const model = new ChatOpenAI({ - modelName: "gpt-3.5-turbo-1106", + model: "gpt-3.5-turbo-1106", temperature: 0, }); diff --git a/docs/core_docs/docs/use_cases/tool_use/tool_error_handling.mdx b/docs/core_docs/docs/use_cases/tool_use/tool_error_handling.mdx index 6b5849eaf689..105873d904da 100644 --- a/docs/core_docs/docs/use_cases/tool_use/tool_error_handling.mdx +++ b/docs/core_docs/docs/use_cases/tool_use/tool_error_handling.mdx @@ -57,7 +57,7 @@ const complexTool = new DynamicStructuredTool({ import { ChatOpenAI } from "@langchain/openai"; const model = new ChatOpenAI({ - modelName: "gpt-3.5-turbo-1106", + model: "gpt-3.5-turbo-1106", temperature: 0, }); @@ -107,7 +107,7 @@ One way to solve this is to fallback to a better model in the event of a tool in ```ts const betterModel = new ChatOpenAI({ - modelName: "gpt-4-1106-preview", + model: "gpt-4-1106-preview", temperature: 0, }).bind({ tools: formattedTools, diff --git a/docs/core_docs/src/theme/ChatModelTabs.js b/docs/core_docs/src/theme/ChatModelTabs.js index 4b6be3420b70..ef98c883fceb 100644 --- a/docs/core_docs/src/theme/ChatModelTabs.js +++ b/docs/core_docs/src/theme/ChatModelTabs.js @@ -25,18 +25,18 @@ function InstallationInfo({ children }) { } const DEFAULTS = { - openaiParams: `{\n modelName: "gpt-3.5-turbo-0125",\n temperature: 0\n}`, - anthropicParams: `{\n modelName: "claude-3-sonnet-20240229",\n temperature: 0\n}`, - fireworksParams: `{\n modelName: "accounts/fireworks/models/firefunction-v1",\n temperature: 0\n}`, - mistralParams: `{\n modelName: "mistral-large-latest",\n temperature: 0\n}`, + openaiParams: `{\n model: "gpt-3.5-turbo-0125",\n temperature: 0\n}`, + anthropicParams: `{\n model: "claude-3-sonnet-20240229",\n temperature: 0\n}`, + fireworksParams: `{\n model: "accounts/fireworks/models/firefunction-v1",\n temperature: 0\n}`, + mistralParams: `{\n model: "mistral-large-latest",\n temperature: 0\n}`, }; /** * @typedef {Object} ChatModelTabsProps - Component props. - * @property {string} [openaiParams] - Parameters for OpenAI chat model. Defaults to `"{\n modelName: "gpt-3.5-turbo-0125",\n temperature: 0\n}"` - * @property {string} [anthropicParams] - Parameters for Anthropic chat model. Defaults to `"{\n modelName: "claude-3-sonnet-20240229",\n temperature: 0\n}"` - * @property {string} [fireworksParams] - Parameters for Fireworks chat model. Defaults to `"{\n modelName: "accounts/fireworks/models/firefunction-v1",\n temperature: 0\n}"` - * @property {string} [mistralParams] - Parameters for Mistral chat model. Defaults to `"{\n modelName: "mistral-large-latest",\n temperature: 0\n}"` + * @property {string} [openaiParams] - Parameters for OpenAI chat model. Defaults to `"{\n model: "gpt-3.5-turbo-0125",\n temperature: 0\n}"` + * @property {string} [anthropicParams] - Parameters for Anthropic chat model. Defaults to `"{\n model: "claude-3-sonnet-20240229",\n temperature: 0\n}"` + * @property {string} [fireworksParams] - Parameters for Fireworks chat model. Defaults to `"{\n model: "accounts/fireworks/models/firefunction-v1",\n temperature: 0\n}"` + * @property {string} [mistralParams] - Parameters for Mistral chat model. Defaults to `"{\n model: "mistral-large-latest",\n temperature: 0\n}"` * @property {boolean} [hideOpenai] - Whether or not to hide OpenAI chat model. * @property {boolean} [hideAnthropic] - Whether or not to hide Anthropic chat model. * @property {boolean} [hideFireworks] - Whether or not to hide Fireworks chat model. diff --git a/examples/src/agents/agent_structured.ts b/examples/src/agents/agent_structured.ts index 9b59c5b68efe..2ef00db447d9 100644 --- a/examples/src/agents/agent_structured.ts +++ b/examples/src/agents/agent_structured.ts @@ -20,7 +20,7 @@ import { import { DynamicTool } from "@langchain/core/tools"; const llm = new ChatOpenAI({ - modelName: "gpt-4-1106-preview", + model: "gpt-4-1106-preview", }); const searchTool = new DynamicTool({ diff --git a/examples/src/agents/chat_convo_with_tracing_runnable.ts b/examples/src/agents/chat_convo_with_tracing_runnable.ts index f3beabe089f5..ef7119a2bdc4 100644 --- a/examples/src/agents/chat_convo_with_tracing_runnable.ts +++ b/examples/src/agents/chat_convo_with_tracing_runnable.ts @@ -13,7 +13,7 @@ import { BaseMessage } from "@langchain/core/messages"; import { SerpAPI } from "@langchain/community/tools/serpapi"; /** Define your chat model */ -const model = new ChatOpenAI({ modelName: "gpt-4" }); +const model = new ChatOpenAI({ model: "gpt-4" }); /** Bind a stop token to the model */ const modelWithStop = model.bind({ stop: ["\nObservation"], diff --git a/examples/src/agents/custom_agent.ts b/examples/src/agents/custom_agent.ts index d182aa9ae23b..fee67f5505ed 100644 --- a/examples/src/agents/custom_agent.ts +++ b/examples/src/agents/custom_agent.ts @@ -14,7 +14,7 @@ import { DynamicTool } from "@langchain/core/tools"; /** * Define your chat model to use. */ -const model = new ChatOpenAI({ modelName: "gpt-3.5-turbo", temperature: 0 }); +const model = new ChatOpenAI({ model: "gpt-3.5-turbo", temperature: 0 }); const customTool = new DynamicTool({ name: "get_word_length", diff --git a/examples/src/agents/custom_tool.ts b/examples/src/agents/custom_tool.ts index 288c4a9407d3..c344ad988c47 100644 --- a/examples/src/agents/custom_tool.ts +++ b/examples/src/agents/custom_tool.ts @@ -7,7 +7,7 @@ import { z } from "zod"; import { DynamicTool, DynamicStructuredTool } from "@langchain/core/tools"; const llm = new ChatOpenAI({ - modelName: "gpt-3.5-turbo", + model: "gpt-3.5-turbo", temperature: 0, }); diff --git a/examples/src/agents/intermediate_steps.ts b/examples/src/agents/intermediate_steps.ts index 1e3511fe2d0e..7caa6cca5d7f 100644 --- a/examples/src/agents/intermediate_steps.ts +++ b/examples/src/agents/intermediate_steps.ts @@ -10,7 +10,7 @@ import { AgentExecutor, createOpenAIFunctionsAgent } from "langchain/agents"; const tools = [new TavilySearchResults({}), new Calculator()]; const llm = new ChatOpenAI({ - modelName: "gpt-3.5-turbo-1106", + model: "gpt-3.5-turbo-1106", temperature: 0, }); diff --git a/examples/src/agents/max_iterations.ts b/examples/src/agents/max_iterations.ts index 1b4dbbcbe12b..a2334513e60f 100644 --- a/examples/src/agents/max_iterations.ts +++ b/examples/src/agents/max_iterations.ts @@ -9,7 +9,7 @@ import { AgentExecutor, createReactAgent } from "langchain/agents"; const tools = [new Calculator()]; const llm = new ChatOpenAI({ - modelName: "gpt-3.5-turbo", + model: "gpt-3.5-turbo", temperature: 0, }); diff --git a/examples/src/agents/openai_custom_prompt.ts b/examples/src/agents/openai_custom_prompt.ts index 097a0ed0b57b..bc077158f31c 100644 --- a/examples/src/agents/openai_custom_prompt.ts +++ b/examples/src/agents/openai_custom_prompt.ts @@ -4,7 +4,7 @@ import { Calculator } from "@langchain/community/tools/calculator"; import { SerpAPI } from "@langchain/community/tools/serpapi"; const tools = [new Calculator(), new SerpAPI()]; -const chat = new ChatOpenAI({ modelName: "gpt-4", temperature: 0 }); +const chat = new ChatOpenAI({ model: "gpt-4", temperature: 0 }); const prefix = "You are a helpful AI assistant. However, all final response to the user must be in pirate dialect."; diff --git a/examples/src/agents/openai_functions.ts b/examples/src/agents/openai_functions.ts index 19381160d5a5..ea1dd2f1c0c6 100644 --- a/examples/src/agents/openai_functions.ts +++ b/examples/src/agents/openai_functions.ts @@ -17,7 +17,7 @@ const prompt = await pull( ); const llm = new ChatOpenAI({ - modelName: "gpt-3.5-turbo-1106", + model: "gpt-3.5-turbo-1106", temperature: 0, }); diff --git a/examples/src/agents/openai_runnable.ts b/examples/src/agents/openai_runnable.ts index 8182d77a29d3..cf11a22bbc5f 100644 --- a/examples/src/agents/openai_runnable.ts +++ b/examples/src/agents/openai_runnable.ts @@ -23,7 +23,7 @@ const tools = [new Calculator(), new SerpAPI()]; * In this example we'll use gpt-4 as it is much better * at following directions in an agent than other models. */ -const model = new ChatOpenAI({ modelName: "gpt-4", temperature: 0 }); +const model = new ChatOpenAI({ model: "gpt-4", temperature: 0 }); /** * Define your prompt for the agent to follow * Here we're using `MessagesPlaceholder` to contain our agent scratchpad diff --git a/examples/src/agents/openai_runnable_stream.ts b/examples/src/agents/openai_runnable_stream.ts index 527ffa5b1e0f..d1fec395f44c 100644 --- a/examples/src/agents/openai_runnable_stream.ts +++ b/examples/src/agents/openai_runnable_stream.ts @@ -19,7 +19,7 @@ import { SerpAPI } from "@langchain/community/tools/serpapi"; /** Define your list of tools. */ const tools = [new Calculator(), new SerpAPI()]; -const model = new ChatOpenAI({ modelName: "gpt-4", temperature: 0 }); +const model = new ChatOpenAI({ model: "gpt-4", temperature: 0 }); const prompt = ChatPromptTemplate.fromMessages([ ["ai", "You are a helpful assistant"], diff --git a/examples/src/agents/openai_runnable_stream_log.ts b/examples/src/agents/openai_runnable_stream_log.ts index ec23db4cf5fb..45308e95af0f 100644 --- a/examples/src/agents/openai_runnable_stream_log.ts +++ b/examples/src/agents/openai_runnable_stream_log.ts @@ -20,7 +20,7 @@ import { SerpAPI } from "@langchain/community/tools/serpapi"; const tools = [new Calculator(), new SerpAPI()]; const model = new ChatOpenAI({ - modelName: "gpt-4", + model: "gpt-4", streaming: true, temperature: 0, }); diff --git a/examples/src/agents/openai_runnable_with_memory.ts b/examples/src/agents/openai_runnable_with_memory.ts index ec7198ed2bd8..6b2f6f14558e 100644 --- a/examples/src/agents/openai_runnable_with_memory.ts +++ b/examples/src/agents/openai_runnable_with_memory.ts @@ -24,7 +24,7 @@ const tools = [new Calculator(), new SerpAPI()]; * In this example we'll use gpt-4 as it is much better * at following directions in an agent than other models. */ -const model = new ChatOpenAI({ modelName: "gpt-4", temperature: 0 }); +const model = new ChatOpenAI({ model: "gpt-4", temperature: 0 }); /** * Bind the tools to the LLM. diff --git a/examples/src/agents/openai_tools.ts b/examples/src/agents/openai_tools.ts index 84567f23eca8..0f62b5abe1a0 100644 --- a/examples/src/agents/openai_tools.ts +++ b/examples/src/agents/openai_tools.ts @@ -15,7 +15,7 @@ const tools = [new TavilySearchResults({ maxResults: 1 })]; const prompt = await pull("hwchase17/openai-tools-agent"); const llm = new ChatOpenAI({ - modelName: "gpt-3.5-turbo-1106", + model: "gpt-3.5-turbo-1106", temperature: 0, }); diff --git a/examples/src/agents/openai_tools_runnable.ts b/examples/src/agents/openai_tools_runnable.ts index 37a00b8429df..d1619d6af374 100644 --- a/examples/src/agents/openai_tools_runnable.ts +++ b/examples/src/agents/openai_tools_runnable.ts @@ -16,7 +16,7 @@ import { RunnableSequence } from "@langchain/core/runnables"; import { DynamicStructuredTool } from "@langchain/core/tools"; const model = new ChatOpenAI({ - modelName: "gpt-3.5-turbo-1106", + model: "gpt-3.5-turbo-1106", temperature: 0, }); diff --git a/examples/src/agents/plan_and_execute.ts b/examples/src/agents/plan_and_execute.ts index 165ff14cacd9..95d51fe3d8f6 100644 --- a/examples/src/agents/plan_and_execute.ts +++ b/examples/src/agents/plan_and_execute.ts @@ -6,7 +6,7 @@ import { SerpAPI } from "@langchain/community/tools/serpapi"; const tools = [new Calculator(), new SerpAPI()]; const model = new ChatOpenAI({ temperature: 0, - modelName: "gpt-3.5-turbo", + model: "gpt-3.5-turbo", verbose: true, }); const executor = await PlanAndExecuteAgentExecutor.fromLLMAndTools({ diff --git a/examples/src/agents/quickstart.ts b/examples/src/agents/quickstart.ts index 100042197bac..8584febbda67 100644 --- a/examples/src/agents/quickstart.ts +++ b/examples/src/agents/quickstart.ts @@ -61,7 +61,7 @@ const retrieverTool = createRetrieverTool(retriever, { const tools = [searchTool, retrieverTool]; const llm = new ChatOpenAI({ - modelName: "gpt-3.5-turbo-1106", + model: "gpt-3.5-turbo-1106", temperature: 0, }); diff --git a/examples/src/agents/react.ts b/examples/src/agents/react.ts index c2c92dc8e1df..4db91290044d 100644 --- a/examples/src/agents/react.ts +++ b/examples/src/agents/react.ts @@ -9,7 +9,7 @@ import { AgentExecutor, createReactAgent } from "langchain/agents"; const tools = [new TavilySearchResults({ maxResults: 1 })]; const llm = new OpenAI({ - modelName: "gpt-3.5-turbo-instruct", + model: "gpt-3.5-turbo-instruct", temperature: 0, }); diff --git a/examples/src/agents/stream_events.ts b/examples/src/agents/stream_events.ts index 8fb4913d8941..9224db65c344 100644 --- a/examples/src/agents/stream_events.ts +++ b/examples/src/agents/stream_events.ts @@ -9,7 +9,7 @@ import { AgentExecutor, createOpenAIFunctionsAgent } from "langchain/agents"; const tools = [new TavilySearchResults({})]; const llm = new ChatOpenAI({ - modelName: "gpt-3.5-turbo-1106", + model: "gpt-3.5-turbo-1106", temperature: 0, streaming: true, }); diff --git a/examples/src/agents/stream_intermediate_steps.ts b/examples/src/agents/stream_intermediate_steps.ts index 67ca5ba8732f..78cd77b91044 100644 --- a/examples/src/agents/stream_intermediate_steps.ts +++ b/examples/src/agents/stream_intermediate_steps.ts @@ -10,7 +10,7 @@ import { AgentExecutor, createOpenAIFunctionsAgent } from "langchain/agents"; const tools = [new TavilySearchResults({}), new Calculator()]; const llm = new ChatOpenAI({ - modelName: "gpt-3.5-turbo-1106", + model: "gpt-3.5-turbo-1106", temperature: 0, }); diff --git a/examples/src/agents/stream_log.ts b/examples/src/agents/stream_log.ts index a4592b75a987..7cf2d408502f 100644 --- a/examples/src/agents/stream_log.ts +++ b/examples/src/agents/stream_log.ts @@ -9,7 +9,7 @@ import { AgentExecutor, createOpenAIFunctionsAgent } from "langchain/agents"; const tools = [new TavilySearchResults({})]; const llm = new ChatOpenAI({ - modelName: "gpt-3.5-turbo-1106", + model: "gpt-3.5-turbo-1106", temperature: 0, streaming: true, }); diff --git a/examples/src/agents/structured_chat.ts b/examples/src/agents/structured_chat.ts index 29565fe30252..2362d9a51cb4 100644 --- a/examples/src/agents/structured_chat.ts +++ b/examples/src/agents/structured_chat.ts @@ -17,7 +17,7 @@ const prompt = await pull( ); const llm = new ChatOpenAI({ - modelName: "gpt-3.5-turbo-1106", + model: "gpt-3.5-turbo-1106", temperature: 0, }); diff --git a/examples/src/agents/xml.ts b/examples/src/agents/xml.ts index 990d72d7f901..d87e93a04e84 100644 --- a/examples/src/agents/xml.ts +++ b/examples/src/agents/xml.ts @@ -14,7 +14,7 @@ const tools = [new TavilySearchResults({ maxResults: 1 })]; const prompt = await pull("hwchase17/xml-agent-convo"); const llm = new ChatAnthropic({ - modelName: "claude-3-opus-20240229", + model: "claude-3-opus-20240229", temperature: 0, }); diff --git a/examples/src/agents/xml_runnable.ts b/examples/src/agents/xml_runnable.ts index 8a6274e18d2f..1dad8626703a 100644 --- a/examples/src/agents/xml_runnable.ts +++ b/examples/src/agents/xml_runnable.ts @@ -18,7 +18,7 @@ import { SerpAPI } from "@langchain/community/tools/serpapi"; * In this case we'll use Claude since it preforms well on XML related tasks */ const model = new ChatAnthropic({ - modelName: "claude-3-opus-20240229", + model: "claude-3-opus-20240229", temperature: 0, }).bind({ stop: ["", ""], diff --git a/examples/src/cache/chat_models/cloudflare_kv.ts b/examples/src/cache/chat_models/cloudflare_kv.ts index 5ab8f2537bb2..f06e0515bd8e 100644 --- a/examples/src/cache/chat_models/cloudflare_kv.ts +++ b/examples/src/cache/chat_models/cloudflare_kv.ts @@ -14,8 +14,8 @@ export default { const cache = new CloudflareKVCache(env.KV_NAMESPACE); const model = new ChatOpenAI({ cache, - modelName: "gpt-3.5-turbo", - openAIApiKey: env.OPENAI_API_KEY, + model: "gpt-3.5-turbo", + apiKey: env.OPENAI_API_KEY, }); const response = await model.invoke("How are you today?"); return new Response(JSON.stringify(response), { diff --git a/examples/src/cache/cloudflare_kv.ts b/examples/src/cache/cloudflare_kv.ts index e1a14220bb94..2bd7fe27c16a 100644 --- a/examples/src/cache/cloudflare_kv.ts +++ b/examples/src/cache/cloudflare_kv.ts @@ -14,8 +14,8 @@ export default { const cache = new CloudflareKVCache(env.KV_NAMESPACE); const model = new OpenAI({ cache, - modelName: "gpt-3.5-turbo-instruct", - openAIApiKey: env.OPENAI_API_KEY, + model: "gpt-3.5-turbo-instruct", + apiKey: env.OPENAI_API_KEY, }); const response = await model.invoke("How are you today?"); return new Response(JSON.stringify(response), { diff --git a/examples/src/callbacks/lunary_custom_agent.ts b/examples/src/callbacks/lunary_custom_agent.ts index bbeefe176eb4..2646c97ea9fb 100644 --- a/examples/src/callbacks/lunary_custom_agent.ts +++ b/examples/src/callbacks/lunary_custom_agent.ts @@ -5,7 +5,7 @@ import { HumanMessage, SystemMessage } from "@langchain/core/messages"; import lunary from "lunary"; const chat = new ChatOpenAI({ - modelName: "gpt-4", + model: "gpt-4", callbacks: [new LunaryHandler()], }); diff --git a/examples/src/callbacks/lunary_langchain_agent.ts b/examples/src/callbacks/lunary_langchain_agent.ts index 6febb463e34b..88ee55d3b6f6 100644 --- a/examples/src/callbacks/lunary_langchain_agent.ts +++ b/examples/src/callbacks/lunary_langchain_agent.ts @@ -6,7 +6,7 @@ import { Calculator } from "@langchain/community/tools/calculator"; const tools = [new Calculator()]; const chat = new ChatOpenAI({ - modelName: "gpt-3.5-turbo", + model: "gpt-3.5-turbo", temperature: 0, callbacks: [new LunaryHandler()], }); diff --git a/examples/src/callbacks/lunary_tags.ts b/examples/src/callbacks/lunary_tags.ts index 5f1b97610c93..a879e76fc796 100644 --- a/examples/src/callbacks/lunary_tags.ts +++ b/examples/src/callbacks/lunary_tags.ts @@ -2,7 +2,7 @@ import { LunaryHandler } from "@langchain/community/callbacks/handlers/lunary"; import { ChatOpenAI } from "@langchain/openai"; const chat = new ChatOpenAI({ - modelName: "gpt-3.5-turbo", + model: "gpt-3.5-turbo", temperature: 0, callbacks: [new LunaryHandler()], }); diff --git a/examples/src/callbacks/lunary_users.ts b/examples/src/callbacks/lunary_users.ts index 4b3b5c87b3f9..9fc7def1e966 100644 --- a/examples/src/callbacks/lunary_users.ts +++ b/examples/src/callbacks/lunary_users.ts @@ -5,7 +5,7 @@ import { Calculator } from "@langchain/community/tools/calculator"; const tools = [new Calculator()]; const chat = new ChatOpenAI({ - modelName: "gpt-3.5-turbo", + model: "gpt-3.5-turbo", temperature: 0, callbacks: [new LunaryHandler()], }); diff --git a/examples/src/chains/api_chain.ts b/examples/src/chains/api_chain.ts index b88a9a393031..c9b236fe20ce 100644 --- a/examples/src/chains/api_chain.ts +++ b/examples/src/chains/api_chain.ts @@ -32,7 +32,7 @@ freezinglevel_height Instant meters Altitude above sea level of the 0°C level visibility Instant meters Viewing distance in meters. Influenced by low clouds, humidity and aerosols. Maximum visibility is approximately 24 km.`; export async function run() { - const model = new OpenAI({ modelName: "gpt-3.5-turbo-instruct" }); + const model = new OpenAI({ model: "gpt-3.5-turbo-instruct" }); const chain = APIChain.fromLLMAndAPIDocs(model, OPEN_METEO_DOCS, { headers: { // These headers will be used for API requests made by the chain. diff --git a/examples/src/chains/conversation_qa_custom_prompt_legacy.ts b/examples/src/chains/conversation_qa_custom_prompt_legacy.ts index e0ecb9d3dd7f..e31861868cd2 100644 --- a/examples/src/chains/conversation_qa_custom_prompt_legacy.ts +++ b/examples/src/chains/conversation_qa_custom_prompt_legacy.ts @@ -18,7 +18,7 @@ Standalone question: Your answer:`; const model = new ChatOpenAI({ - modelName: "gpt-3.5-turbo", + model: "gpt-3.5-turbo", temperature: 0, }); diff --git a/examples/src/chains/conversational_qa_built_in_memory.ts b/examples/src/chains/conversational_qa_built_in_memory.ts index 468b6c9f380e..367dbd4df462 100644 --- a/examples/src/chains/conversational_qa_built_in_memory.ts +++ b/examples/src/chains/conversational_qa_built_in_memory.ts @@ -65,7 +65,7 @@ Standalone question:` // Initialize fast and slow LLMs, along with chains for each const fasterModel = new ChatOpenAI({ - modelName: "gpt-3.5-turbo", + model: "gpt-3.5-turbo", }); const fasterChain = new LLMChain({ llm: fasterModel, @@ -73,7 +73,7 @@ const fasterChain = new LLMChain({ }); const slowerModel = new ChatOpenAI({ - modelName: "gpt-4", + model: "gpt-4", }); const slowerChain = new LLMChain({ llm: slowerModel, diff --git a/examples/src/chains/conversational_qa_built_in_memory_legacy.ts b/examples/src/chains/conversational_qa_built_in_memory_legacy.ts index 0b66161402ec..5e4a1ef18ea3 100644 --- a/examples/src/chains/conversational_qa_built_in_memory_legacy.ts +++ b/examples/src/chains/conversational_qa_built_in_memory_legacy.ts @@ -12,10 +12,10 @@ export const run = async () => { const docs = await textSplitter.createDocuments([text]); const vectorStore = await HNSWLib.fromDocuments(docs, new OpenAIEmbeddings()); const fasterModel = new ChatOpenAI({ - modelName: "gpt-3.5-turbo", + model: "gpt-3.5-turbo", }); const slowerModel = new ChatOpenAI({ - modelName: "gpt-4", + model: "gpt-4", }); const chain = ConversationalRetrievalQAChain.fromLLM( slowerModel, diff --git a/examples/src/chains/openai_functions_extraction.ts b/examples/src/chains/openai_functions_extraction.ts index e5234356e09d..f9eb16bf4463 100644 --- a/examples/src/chains/openai_functions_extraction.ts +++ b/examples/src/chains/openai_functions_extraction.ts @@ -10,7 +10,7 @@ const zodSchema = z.object({ "dog-breed": z.string().optional(), }); const chatModel = new ChatOpenAI({ - modelName: "gpt-3.5-turbo-0613", + model: "gpt-3.5-turbo-0613", temperature: 0, }); const chain = createExtractionChainFromZod(zodSchema, chatModel); diff --git a/examples/src/chains/openai_functions_openapi_customization.ts b/examples/src/chains/openai_functions_openapi_customization.ts index c8b9e9e2cf88..5f19127f4e42 100644 --- a/examples/src/chains/openai_functions_openapi_customization.ts +++ b/examples/src/chains/openai_functions_openapi_customization.ts @@ -1,7 +1,7 @@ import { createOpenAPIChain } from "langchain/chains"; import { ChatOpenAI } from "@langchain/openai"; -const chatModel = new ChatOpenAI({ modelName: "gpt-4-0613", temperature: 0 }); +const chatModel = new ChatOpenAI({ model: "gpt-4-0613", temperature: 0 }); const chain = await createOpenAPIChain("https://api.speak.com/openapi.yaml", { llm: chatModel, diff --git a/examples/src/chains/openai_functions_structured_format.ts b/examples/src/chains/openai_functions_structured_format.ts index 758347d54c88..c1284f2aaea0 100644 --- a/examples/src/chains/openai_functions_structured_format.ts +++ b/examples/src/chains/openai_functions_structured_format.ts @@ -31,7 +31,7 @@ const prompt = new ChatPromptTemplate({ inputVariables: ["inputText"], }); -const llm = new ChatOpenAI({ modelName: "gpt-3.5-turbo-0613", temperature: 0 }); +const llm = new ChatOpenAI({ model: "gpt-3.5-turbo-0613", temperature: 0 }); // Binding "function_call" below makes the model always call the specified function. // If you want to allow the model to call functions selectively, omit it. diff --git a/examples/src/chains/openai_functions_structured_generate.ts b/examples/src/chains/openai_functions_structured_generate.ts index 2d3c4f8d64c0..995b51d675fb 100644 --- a/examples/src/chains/openai_functions_structured_generate.ts +++ b/examples/src/chains/openai_functions_structured_generate.ts @@ -31,7 +31,7 @@ const prompt = new ChatPromptTemplate({ inputVariables: ["inputText"], }); -const llm = new ChatOpenAI({ modelName: "gpt-3.5-turbo-0613", temperature: 1 }); +const llm = new ChatOpenAI({ model: "gpt-3.5-turbo-0613", temperature: 1 }); const chain = createStructuredOutputChainFromZod(zodSchema, { prompt, diff --git a/examples/src/chains/openai_functions_tagging.ts b/examples/src/chains/openai_functions_tagging.ts index 4d686fb42a35..19d4e4e89f8f 100644 --- a/examples/src/chains/openai_functions_tagging.ts +++ b/examples/src/chains/openai_functions_tagging.ts @@ -12,7 +12,7 @@ const schema: FunctionParameters = { required: ["tone"], }; -const chatModel = new ChatOpenAI({ modelName: "gpt-4-0613", temperature: 0 }); +const chatModel = new ChatOpenAI({ model: "gpt-4-0613", temperature: 0 }); const chain = createTaggingChain(schema, chatModel); diff --git a/examples/src/chains/summarization_separate_output_llm.ts b/examples/src/chains/summarization_separate_output_llm.ts index 0844b4de8f07..a7054a421983 100644 --- a/examples/src/chains/summarization_separate_output_llm.ts +++ b/examples/src/chains/summarization_separate_output_llm.ts @@ -8,7 +8,7 @@ import { ChatAnthropic } from "@langchain/anthropic"; const text = fs.readFileSync("state_of_the_union.txt", "utf8"); const model = new ChatAnthropic({ temperature: 0 }); const combineModel = new ChatOpenAI({ - modelName: "gpt-4", + model: "gpt-4", temperature: 0, streaming: true, callbacks: [ diff --git a/examples/src/document_loaders/searchapi.ts b/examples/src/document_loaders/searchapi.ts index 9e1d13a3195e..07ce832d91e1 100644 --- a/examples/src/document_loaders/searchapi.ts +++ b/examples/src/document_loaders/searchapi.ts @@ -8,7 +8,7 @@ import { createRetrievalChain } from "langchain/chains/retrieval"; // Initialize the necessary components const llm = new ChatOpenAI({ - modelName: "gpt-3.5-turbo-1106", + model: "gpt-3.5-turbo-1106", }); const embeddings = new OpenAIEmbeddings(); const apiKey = "Your SearchApi API key"; diff --git a/examples/src/document_transformers/metadata_tagger.ts b/examples/src/document_transformers/metadata_tagger.ts index 1083dbaf2b15..ece466abd372 100644 --- a/examples/src/document_transformers/metadata_tagger.ts +++ b/examples/src/document_transformers/metadata_tagger.ts @@ -13,7 +13,7 @@ const zodSchema = z.object({ }); const metadataTagger = createMetadataTaggerFromZod(zodSchema, { - llm: new ChatOpenAI({ modelName: "gpt-3.5-turbo" }), + llm: new ChatOpenAI({ model: "gpt-3.5-turbo" }), }); const documents = [ diff --git a/examples/src/document_transformers/metadata_tagger_custom_prompt.ts b/examples/src/document_transformers/metadata_tagger_custom_prompt.ts index b211c3f34043..3ddbf1c99e56 100644 --- a/examples/src/document_transformers/metadata_tagger_custom_prompt.ts +++ b/examples/src/document_transformers/metadata_tagger_custom_prompt.ts @@ -21,7 +21,7 @@ const zodSchema = z.object({ }); const metadataTagger = createMetadataTaggerFromZod(zodSchema, { - llm: new ChatOpenAI({ modelName: "gpt-3.5-turbo" }), + llm: new ChatOpenAI({ model: "gpt-3.5-turbo" }), prompt: PromptTemplate.fromTemplate(taggingChainTemplate), }); diff --git a/examples/src/embeddings/openai_dimensions.ts b/examples/src/embeddings/openai_dimensions.ts index efde6c87aea7..860b3f390ab5 100644 --- a/examples/src/embeddings/openai_dimensions.ts +++ b/examples/src/embeddings/openai_dimensions.ts @@ -1,14 +1,14 @@ import { OpenAIEmbeddings } from "@langchain/openai"; const embeddings = new OpenAIEmbeddings({ - modelName: "text-embedding-3-large", + model: "text-embedding-3-large", }); const vectors = await embeddings.embedDocuments(["some text"]); console.log(vectors[0].length); const embeddings1024 = new OpenAIEmbeddings({ - modelName: "text-embedding-3-large", + model: "text-embedding-3-large", dimensions: 1024, }); diff --git a/examples/src/embeddings/togetherai.ts b/examples/src/embeddings/togetherai.ts index 19add65ad0a3..125b132195b8 100644 --- a/examples/src/embeddings/togetherai.ts +++ b/examples/src/embeddings/togetherai.ts @@ -2,7 +2,7 @@ import { TogetherAIEmbeddings } from "@langchain/community/embeddings/togetherai const embeddings = new TogetherAIEmbeddings({ apiKey: process.env.TOGETHER_AI_API_KEY, // Default value - modelName: "togethercomputer/m2-bert-80M-8k-retrieval", // Default value + model: "togethercomputer/m2-bert-80M-8k-retrieval", // Default value }); const res = await embeddings.embedQuery( diff --git a/examples/src/extraction/openai_tool_calling_extraction.ts b/examples/src/extraction/openai_tool_calling_extraction.ts index f62573e76b0b..a650cf789c02 100644 --- a/examples/src/extraction/openai_tool_calling_extraction.ts +++ b/examples/src/extraction/openai_tool_calling_extraction.ts @@ -20,7 +20,7 @@ const person = z.object({ }); const model = new ChatOpenAI({ - modelName: "gpt-3.5-turbo-1106", + model: "gpt-3.5-turbo-1106", temperature: 0, }).bind({ tools: [ diff --git a/examples/src/get_started/quickstart3.ts b/examples/src/get_started/quickstart3.ts index 59c95e706858..53cd77b97b99 100644 --- a/examples/src/get_started/quickstart3.ts +++ b/examples/src/get_started/quickstart3.ts @@ -90,7 +90,7 @@ const agentPrompt = await pull( ); const agentModel = new ChatOpenAI({ - modelName: "gpt-3.5-turbo-1106", + model: "gpt-3.5-turbo-1106", temperature: 0, }); diff --git a/examples/src/guides/debugging/simple_agent.ts b/examples/src/guides/debugging/simple_agent.ts index c5e130780f5d..8516763c4d9e 100644 --- a/examples/src/guides/debugging/simple_agent.ts +++ b/examples/src/guides/debugging/simple_agent.ts @@ -8,7 +8,7 @@ import { Calculator } from "@langchain/community/tools/calculator"; const tools = [new TavilySearchResults(), new Calculator()]; const prompt = await pull("hwchase17/openai-tools-agent"); const llm = new ChatOpenAI({ - modelName: "gpt-4-1106-preview", + model: "gpt-4-1106-preview", temperature: 0, }); const agent = await createOpenAIToolsAgent({ diff --git a/examples/src/guides/debugging/simple_agent_verbose.ts b/examples/src/guides/debugging/simple_agent_verbose.ts index c959e107f1f1..c21ef84c8e09 100644 --- a/examples/src/guides/debugging/simple_agent_verbose.ts +++ b/examples/src/guides/debugging/simple_agent_verbose.ts @@ -11,7 +11,7 @@ const tools = [ ]; const prompt = await pull("hwchase17/openai-tools-agent"); const llm = new ChatOpenAI({ - modelName: "gpt-4-1106-preview", + model: "gpt-4-1106-preview", temperature: 0, verbose: true, }); diff --git a/examples/src/guides/debugging/simple_agent_verbose_some.ts b/examples/src/guides/debugging/simple_agent_verbose_some.ts index f10576241ded..80c8e097c024 100644 --- a/examples/src/guides/debugging/simple_agent_verbose_some.ts +++ b/examples/src/guides/debugging/simple_agent_verbose_some.ts @@ -11,7 +11,7 @@ const tools = [ ]; const prompt = await pull("hwchase17/openai-tools-agent"); const llm = new ChatOpenAI({ - modelName: "gpt-4-1106-preview", + model: "gpt-4-1106-preview", temperature: 0, verbose: false, }); diff --git a/examples/src/guides/deployment/error_handling.ts b/examples/src/guides/deployment/error_handling.ts index 3d1860f7683d..d1bfaff80317 100644 --- a/examples/src/guides/deployment/error_handling.ts +++ b/examples/src/guides/deployment/error_handling.ts @@ -10,8 +10,8 @@ const prompt = ChatPromptTemplate.fromTemplate(TEMPLATE); const model = new ChatOpenAI({ temperature: 0.8, - modelName: "gpt-3.5-turbo-1106", - openAIApiKey: "INVALID_KEY", + model: "gpt-3.5-turbo-1106", + apiKey: "INVALID_KEY", }); const outputParser = new HttpResponseOutputParser(); diff --git a/examples/src/guides/deployment/stream_error_handling.ts b/examples/src/guides/deployment/stream_error_handling.ts index 4d4a0d48c3aa..95c0aecb20b5 100644 --- a/examples/src/guides/deployment/stream_error_handling.ts +++ b/examples/src/guides/deployment/stream_error_handling.ts @@ -10,8 +10,8 @@ const prompt = ChatPromptTemplate.fromTemplate(TEMPLATE); const model = new ChatOpenAI({ temperature: 0.8, - modelName: "gpt-3.5-turbo-1106", - openAIApiKey: "INVALID_KEY", + model: "gpt-3.5-turbo-1106", + apiKey: "INVALID_KEY", }); const outputParser = new HttpResponseOutputParser(); diff --git a/examples/src/guides/deployment/streaming.ts b/examples/src/guides/deployment/streaming.ts index 46b0af04a27c..2116621cbb4b 100644 --- a/examples/src/guides/deployment/streaming.ts +++ b/examples/src/guides/deployment/streaming.ts @@ -11,7 +11,7 @@ const prompt = ChatPromptTemplate.fromTemplate(TEMPLATE); export async function POST() { const model = new ChatOpenAI({ temperature: 0.8, - modelName: "gpt-3.5-turbo-1106", + model: "gpt-3.5-turbo-1106", }); const outputParser = new HttpResponseOutputParser(); diff --git a/examples/src/guides/evaluation/examples/comparisons.ts b/examples/src/guides/evaluation/examples/comparisons.ts index fafbfbc0ba7c..73be4511aa67 100644 --- a/examples/src/guides/evaluation/examples/comparisons.ts +++ b/examples/src/guides/evaluation/examples/comparisons.ts @@ -43,7 +43,7 @@ const dataset = [ const model = new ChatOpenAI({ temperature: 0, - modelName: "gpt-3.5-turbo-16k-0613", + model: "gpt-3.5-turbo-16k-0613", }); const serpAPI = new SerpAPI(process.env.SERPAPI_API_KEY, { location: "Austin,Texas,United States", diff --git a/examples/src/guides/expression_language/how_to_routing_custom_function.ts b/examples/src/guides/expression_language/how_to_routing_custom_function.ts index b2039b6ea822..f0520ff46950 100644 --- a/examples/src/guides/expression_language/how_to_routing_custom_function.ts +++ b/examples/src/guides/expression_language/how_to_routing_custom_function.ts @@ -15,7 +15,7 @@ Do not respond with more than one word. Classification:`); const model = new ChatAnthropic({ - modelName: "claude-3-sonnet-20240229", + model: "claude-3-sonnet-20240229", }); const classificationChain = RunnableSequence.from([ diff --git a/examples/src/guides/expression_language/how_to_routing_runnable_branch.ts b/examples/src/guides/expression_language/how_to_routing_runnable_branch.ts index da53d3e5129f..b61214f96dce 100644 --- a/examples/src/guides/expression_language/how_to_routing_runnable_branch.ts +++ b/examples/src/guides/expression_language/how_to_routing_runnable_branch.ts @@ -15,7 +15,7 @@ Do not respond with more than one word. Classification:`); const model = new ChatAnthropic({ - modelName: "claude-3-sonnet-20240229", + model: "claude-3-sonnet-20240229", }); const classificationChain = RunnableSequence.from([ diff --git a/examples/src/guides/expression_language/interface_batch_with_options.ts b/examples/src/guides/expression_language/interface_batch_with_options.ts index 83a50dbdf50e..b448859cbfc3 100644 --- a/examples/src/guides/expression_language/interface_batch_with_options.ts +++ b/examples/src/guides/expression_language/interface_batch_with_options.ts @@ -2,7 +2,7 @@ import { ChatOpenAI } from "@langchain/openai"; import { PromptTemplate } from "@langchain/core/prompts"; const model = new ChatOpenAI({ - modelName: "badmodel", + model: "badmodel", }); const promptTemplate = PromptTemplate.fromTemplate( "Tell me a joke about {topic}" diff --git a/examples/src/guides/expression_language/message_history.ts b/examples/src/guides/expression_language/message_history.ts index 7d7c8cbe2410..5b8772a57b2d 100644 --- a/examples/src/guides/expression_language/message_history.ts +++ b/examples/src/guides/expression_language/message_history.ts @@ -16,7 +16,7 @@ const prompt = ChatPromptTemplate.fromMessages([ ]); const chain = prompt.pipe( - new ChatAnthropic({ modelName: "claude-3-sonnet-20240229" }) + new ChatAnthropic({ model: "claude-3-sonnet-20240229" }) ); const chainWithHistory = new RunnableWithMessageHistory({ diff --git a/examples/src/guides/fallbacks/better_model.ts b/examples/src/guides/fallbacks/better_model.ts index 8d9fc34363e8..f205d036ae46 100644 --- a/examples/src/guides/fallbacks/better_model.ts +++ b/examples/src/guides/fallbacks/better_model.ts @@ -9,11 +9,11 @@ const prompt = PromptTemplate.fromTemplate( const badModel = new OpenAI({ maxRetries: 0, - modelName: "gpt-3.5-turbo-instruct", + model: "gpt-3.5-turbo-instruct", }); const normalModel = new ChatOpenAI({ - modelName: "gpt-4", + model: "gpt-4", }); const outputParser = StructuredOutputParser.fromZodSchema( diff --git a/examples/src/guides/fallbacks/chain.ts b/examples/src/guides/fallbacks/chain.ts index 562b4c755e9e..2573c2ac8792 100644 --- a/examples/src/guides/fallbacks/chain.ts +++ b/examples/src/guides/fallbacks/chain.ts @@ -12,7 +12,7 @@ const chatPrompt = ChatPromptTemplate.fromMessages<{ animal: string }>([ // Use a fake model name that will always throw an error const fakeOpenAIChatModel = new ChatOpenAI({ - modelName: "potato!", + model: "potato!", maxRetries: 0, }); diff --git a/examples/src/guides/fallbacks/long_inputs.ts b/examples/src/guides/fallbacks/long_inputs.ts index c96acedc2519..e571ad193506 100644 --- a/examples/src/guides/fallbacks/long_inputs.ts +++ b/examples/src/guides/fallbacks/long_inputs.ts @@ -2,12 +2,12 @@ import { ChatOpenAI } from "@langchain/openai"; // Use a model with a shorter context window const shorterLlm = new ChatOpenAI({ - modelName: "gpt-3.5-turbo", + model: "gpt-3.5-turbo", maxRetries: 0, }); const longerLlm = new ChatOpenAI({ - modelName: "gpt-3.5-turbo-16k", + model: "gpt-3.5-turbo-16k", }); const modelWithFallback = shorterLlm.withFallbacks({ diff --git a/examples/src/guides/fallbacks/model.ts b/examples/src/guides/fallbacks/model.ts index f83bd70f3164..ac69234ceffe 100644 --- a/examples/src/guides/fallbacks/model.ts +++ b/examples/src/guides/fallbacks/model.ts @@ -3,7 +3,7 @@ import { ChatAnthropic } from "@langchain/anthropic"; // Use a fake model name that will always throw an error const fakeOpenAIModel = new ChatOpenAI({ - modelName: "potato!", + model: "potato!", maxRetries: 0, }); diff --git a/examples/src/guides/langsmith/eval_walkthrough.ts b/examples/src/guides/langsmith/eval_walkthrough.ts index 87130a3c17f5..6b1ad0901173 100644 --- a/examples/src/guides/langsmith/eval_walkthrough.ts +++ b/examples/src/guides/langsmith/eval_walkthrough.ts @@ -25,7 +25,7 @@ const prompt = await pull( ); const llm = new ChatOpenAI({ - modelName: "gpt-3.5-turbo-1106", + model: "gpt-3.5-turbo-1106", temperature: 0, }); diff --git a/examples/src/indexes/text_splitter_with_chunk_header.ts b/examples/src/indexes/text_splitter_with_chunk_header.ts index 077a60cbf125..6a1b14f96b54 100644 --- a/examples/src/indexes/text_splitter_with_chunk_header.ts +++ b/examples/src/indexes/text_splitter_with_chunk_header.ts @@ -34,7 +34,7 @@ const vectorstore = await HNSWLib.fromDocuments( ); const llm = new ChatOpenAI({ - modelName: "gpt-3.5-turbo-1106", + model: "gpt-3.5-turbo-1106", temperature: 0, }); diff --git a/examples/src/indexes/vector_stores/azure_aisearch/azure_aisearch.ts b/examples/src/indexes/vector_stores/azure_aisearch/azure_aisearch.ts index 365935e59125..eff44b3bac76 100644 --- a/examples/src/indexes/vector_stores/azure_aisearch/azure_aisearch.ts +++ b/examples/src/indexes/vector_stores/azure_aisearch/azure_aisearch.ts @@ -51,7 +51,7 @@ console.log(resultDocuments[0].pageContent); */ // Use the store as part of a chain -const model = new ChatOpenAI({ modelName: "gpt-3.5-turbo-1106" }); +const model = new ChatOpenAI({ model: "gpt-3.5-turbo-1106" }); const questionAnsweringPrompt = ChatPromptTemplate.fromMessages([ [ "system", diff --git a/examples/src/indexes/vector_stores/azure_cosmosdb/azure_cosmosdb.ts b/examples/src/indexes/vector_stores/azure_cosmosdb/azure_cosmosdb.ts index 9bd9936cffe4..7a26cf3244ba 100644 --- a/examples/src/indexes/vector_stores/azure_cosmosdb/azure_cosmosdb.ts +++ b/examples/src/indexes/vector_stores/azure_cosmosdb/azure_cosmosdb.ts @@ -52,7 +52,7 @@ console.log(resultDocuments[0].pageContent); */ // Use the store as part of a chain -const model = new ChatOpenAI({ modelName: "gpt-3.5-turbo-1106" }); +const model = new ChatOpenAI({ model: "gpt-3.5-turbo-1106" }); const questionAnsweringPrompt = ChatPromptTemplate.fromMessages([ [ "system", diff --git a/examples/src/indexes/vector_stores/cloudflare_vectorize/example.ts b/examples/src/indexes/vector_stores/cloudflare_vectorize/example.ts index 8c743ce0526a..41e9d020d13d 100644 --- a/examples/src/indexes/vector_stores/cloudflare_vectorize/example.ts +++ b/examples/src/indexes/vector_stores/cloudflare_vectorize/example.ts @@ -21,7 +21,7 @@ export default { const { pathname } = new URL(request.url); const embeddings = new CloudflareWorkersAIEmbeddings({ binding: env.AI, - modelName: "@cf/baai/bge-small-en-v1.5", + model: "@cf/baai/bge-small-en-v1.5", }); const store = new CloudflareVectorizeStore(embeddings, { index: env.VECTORIZE_INDEX, diff --git a/examples/src/indexes/vector_stores/couchbase/similaritySearch.ts b/examples/src/indexes/vector_stores/couchbase/similaritySearch.ts index fe063bfe8c53..94fec3d73497 100644 --- a/examples/src/indexes/vector_stores/couchbase/similaritySearch.ts +++ b/examples/src/indexes/vector_stores/couchbase/similaritySearch.ts @@ -29,7 +29,7 @@ const couchbaseClient = await Cluster.connect(connectionString, { // Open AI API Key is required to use OpenAIEmbeddings, some other embeddings may also be used const embeddings = new OpenAIEmbeddings({ - openAIApiKey: process.env.OPENAI_API_KEY, + apiKey: process.env.OPENAI_API_KEY, }); const couchbaseConfig: CouchbaseVectorStoreArgs = { diff --git a/examples/src/indexes/vector_stores/redis/redis_query.ts b/examples/src/indexes/vector_stores/redis/redis_query.ts index 830b9604c3f8..8eefd8f4d14a 100644 --- a/examples/src/indexes/vector_stores/redis/redis_query.ts +++ b/examples/src/indexes/vector_stores/redis/redis_query.ts @@ -44,7 +44,7 @@ console.log(filterRes); */ /* Usage as part of a chain */ -const model = new ChatOpenAI({ modelName: "gpt-3.5-turbo-1106" }); +const model = new ChatOpenAI({ model: "gpt-3.5-turbo-1106" }); const questionAnsweringPrompt = ChatPromptTemplate.fromMessages([ [ "system", diff --git a/examples/src/indexes/vector_stores/rockset.ts b/examples/src/indexes/vector_stores/rockset.ts index af4c75bede5d..0cb1ec48fb85 100644 --- a/examples/src/indexes/vector_stores/rockset.ts +++ b/examples/src/indexes/vector_stores/rockset.ts @@ -15,7 +15,7 @@ const store = await RocksetStore.withNewCollection(new OpenAIEmbeddings(), { collectionName: "langchain_demo", }); -const model = new ChatOpenAI({ modelName: "gpt-3.5-turbo-1106" }); +const model = new ChatOpenAI({ model: "gpt-3.5-turbo-1106" }); const questionAnsweringPrompt = ChatPromptTemplate.fromMessages([ [ "system", diff --git a/examples/src/llms/azure_openai-chat.ts b/examples/src/llms/azure_openai-chat.ts index f98bdd605e64..02383cd21de7 100644 --- a/examples/src/llms/azure_openai-chat.ts +++ b/examples/src/llms/azure_openai-chat.ts @@ -2,7 +2,7 @@ import { AzureChatOpenAI } from "@langchain/azure-openai"; export const run = async () => { const model = new AzureChatOpenAI({ - modelName: "gpt-4", + model: "gpt-4", prefixMessages: [ { role: "system", diff --git a/examples/src/llms/azure_openai.ts b/examples/src/llms/azure_openai.ts index f7dc791c9aa5..3a54b3bd99c1 100644 --- a/examples/src/llms/azure_openai.ts +++ b/examples/src/llms/azure_openai.ts @@ -2,7 +2,7 @@ import { AzureOpenAI } from "@langchain/azure-openai"; export const run = async () => { const model = new AzureOpenAI({ - modelName: "gpt-4", + model: "gpt-4", temperature: 0.7, maxTokens: 1000, maxRetries: 5, diff --git a/examples/src/llms/openai.ts b/examples/src/llms/openai.ts index 943bb6821ba6..3bac06881f8c 100644 --- a/examples/src/llms/openai.ts +++ b/examples/src/llms/openai.ts @@ -2,7 +2,7 @@ import { OpenAI } from "@langchain/openai"; export const run = async () => { const model = new OpenAI({ - modelName: "gpt-4", + model: "gpt-4", temperature: 0.7, maxTokens: 1000, maxRetries: 5, diff --git a/examples/src/memory/astradb.ts b/examples/src/memory/astradb.ts index fae92bf9f332..865514e72850 100644 --- a/examples/src/memory/astradb.ts +++ b/examples/src/memory/astradb.ts @@ -8,7 +8,7 @@ import { ChatOpenAI } from "@langchain/openai"; import { AstraDBChatMessageHistory } from "@langchain/community/stores/message/astradb"; const model = new ChatOpenAI({ - modelName: "gpt-3.5-turbo", + model: "gpt-3.5-turbo", temperature: 0, }); diff --git a/examples/src/memory/cloudflare_d1.ts b/examples/src/memory/cloudflare_d1.ts index 0ec3acaf5f23..3e9560d27c98 100644 --- a/examples/src/memory/cloudflare_d1.ts +++ b/examples/src/memory/cloudflare_d1.ts @@ -37,7 +37,7 @@ export default { ["human", "{input}"], ]); const model = new ChatAnthropic({ - anthropicApiKey: env.ANTHROPIC_API_KEY, + apiKey: env.ANTHROPIC_API_KEY, }); const chain = RunnableSequence.from([ diff --git a/examples/src/memory/combined.ts b/examples/src/memory/combined.ts index f0668fcf18e2..208253d8e18d 100644 --- a/examples/src/memory/combined.ts +++ b/examples/src/memory/combined.ts @@ -15,7 +15,7 @@ const bufferMemory = new BufferMemory({ // summary memory const summaryMemory = new ConversationSummaryMemory({ - llm: new ChatOpenAI({ modelName: "gpt-3.5-turbo", temperature: 0 }), + llm: new ChatOpenAI({ model: "gpt-3.5-turbo", temperature: 0 }), inputKey: "input", memoryKey: "conversation_summary", }); diff --git a/examples/src/memory/convex/convex.ts b/examples/src/memory/convex/convex.ts index aeb21cfe1bc4..2d4a98d169fc 100644 --- a/examples/src/memory/convex/convex.ts +++ b/examples/src/memory/convex/convex.ts @@ -18,7 +18,7 @@ export const ask = action({ }); const model = new ChatOpenAI({ - modelName: "gpt-3.5-turbo", + model: "gpt-3.5-turbo", temperature: 0, }); diff --git a/examples/src/memory/momento.ts b/examples/src/memory/momento.ts index d6fc95402810..5db8a4d29e77 100644 --- a/examples/src/memory/momento.ts +++ b/examples/src/memory/momento.ts @@ -34,7 +34,7 @@ console.log( ); const model = new ChatOpenAI({ - modelName: "gpt-3.5-turbo", + model: "gpt-3.5-turbo", temperature: 0, }); diff --git a/examples/src/memory/mongodb.ts b/examples/src/memory/mongodb.ts index d4e6b50df7c1..5961c5073c67 100644 --- a/examples/src/memory/mongodb.ts +++ b/examples/src/memory/mongodb.ts @@ -21,7 +21,7 @@ const memory = new BufferMemory({ }); const model = new ChatOpenAI({ - modelName: "gpt-3.5-turbo", + model: "gpt-3.5-turbo", temperature: 0, }); diff --git a/examples/src/memory/motorhead.ts b/examples/src/memory/motorhead.ts index 40bfc41d7057..efc569e99a94 100644 --- a/examples/src/memory/motorhead.ts +++ b/examples/src/memory/motorhead.ts @@ -18,7 +18,7 @@ const memory = new MotorheadMemory({ }); const model = new ChatOpenAI({ - modelName: "gpt-3.5-turbo", + model: "gpt-3.5-turbo", temperature: 0, }); diff --git a/examples/src/memory/redis-advanced.ts b/examples/src/memory/redis-advanced.ts index 7f66e0c755ec..1f54672b46bc 100644 --- a/examples/src/memory/redis-advanced.ts +++ b/examples/src/memory/redis-advanced.ts @@ -15,7 +15,7 @@ const memory = new BufferMemory({ }); const model = new ChatOpenAI({ - modelName: "gpt-3.5-turbo", + model: "gpt-3.5-turbo", temperature: 0, }); diff --git a/examples/src/memory/redis.ts b/examples/src/memory/redis.ts index fa7cac76c000..db8500d1790d 100644 --- a/examples/src/memory/redis.ts +++ b/examples/src/memory/redis.ts @@ -12,7 +12,7 @@ const memory = new BufferMemory({ }); const model = new ChatOpenAI({ - modelName: "gpt-3.5-turbo", + model: "gpt-3.5-turbo", temperature: 0, }); diff --git a/examples/src/memory/summary_buffer.ts b/examples/src/memory/summary_buffer.ts index 7c73f05e0cb1..cb40333193da 100644 --- a/examples/src/memory/summary_buffer.ts +++ b/examples/src/memory/summary_buffer.ts @@ -10,7 +10,7 @@ import { // summary buffer memory const memory = new ConversationSummaryBufferMemory({ - llm: new OpenAI({ modelName: "gpt-3.5-turbo-instruct", temperature: 0 }), + llm: new OpenAI({ model: "gpt-3.5-turbo-instruct", temperature: 0 }), maxTokenLimit: 10, }); @@ -31,7 +31,7 @@ console.log({ history }); // We can also get the history as a list of messages (this is useful if you are using this with a chat prompt). const chatPromptMemory = new ConversationSummaryBufferMemory({ - llm: new ChatOpenAI({ modelName: "gpt-3.5-turbo", temperature: 0 }), + llm: new ChatOpenAI({ model: "gpt-3.5-turbo", temperature: 0 }), maxTokenLimit: 10, returnMessages: true, }); diff --git a/examples/src/memory/summary_chat.ts b/examples/src/memory/summary_chat.ts index 01f418bc9a01..e9554dc2469d 100644 --- a/examples/src/memory/summary_chat.ts +++ b/examples/src/memory/summary_chat.ts @@ -6,7 +6,7 @@ import { PromptTemplate } from "@langchain/core/prompts"; export const run = async () => { const memory = new ConversationSummaryMemory({ memoryKey: "chat_history", - llm: new ChatOpenAI({ modelName: "gpt-3.5-turbo", temperature: 0 }), + llm: new ChatOpenAI({ model: "gpt-3.5-turbo", temperature: 0 }), }); const model = new ChatOpenAI(); diff --git a/examples/src/memory/summary_llm.ts b/examples/src/memory/summary_llm.ts index b724a9f5903c..3f4c4c26bd35 100644 --- a/examples/src/memory/summary_llm.ts +++ b/examples/src/memory/summary_llm.ts @@ -6,7 +6,7 @@ import { PromptTemplate } from "@langchain/core/prompts"; export const run = async () => { const memory = new ConversationSummaryMemory({ memoryKey: "chat_history", - llm: new OpenAI({ modelName: "gpt-3.5-turbo", temperature: 0 }), + llm: new OpenAI({ model: "gpt-3.5-turbo", temperature: 0 }), }); const model = new OpenAI({ temperature: 0.9 }); diff --git a/examples/src/memory/upstash_redis.ts b/examples/src/memory/upstash_redis.ts index 6f67daea99bf..233520252aa0 100644 --- a/examples/src/memory/upstash_redis.ts +++ b/examples/src/memory/upstash_redis.ts @@ -15,7 +15,7 @@ const memory = new BufferMemory({ }); const model = new ChatOpenAI({ - modelName: "gpt-3.5-turbo", + model: "gpt-3.5-turbo", temperature: 0, }); diff --git a/examples/src/memory/upstash_redis_advanced.ts b/examples/src/memory/upstash_redis_advanced.ts index 12d5745d9dea..4a89c252a4ec 100644 --- a/examples/src/memory/upstash_redis_advanced.ts +++ b/examples/src/memory/upstash_redis_advanced.ts @@ -19,7 +19,7 @@ const memory = new BufferMemory({ }); const model = new ChatOpenAI({ - modelName: "gpt-3.5-turbo", + model: "gpt-3.5-turbo", temperature: 0, }); diff --git a/examples/src/memory/zep.ts b/examples/src/memory/zep.ts index 1b9d7f358bad..152bd5a62645 100644 --- a/examples/src/memory/zep.ts +++ b/examples/src/memory/zep.ts @@ -15,7 +15,7 @@ const memory = new ZepMemory({ }); const model = new ChatOpenAI({ - modelName: "gpt-3.5-turbo", + model: "gpt-3.5-turbo", temperature: 0, }); diff --git a/examples/src/models/chat/anthropic_tools/extraction.ts b/examples/src/models/chat/anthropic_tools/extraction.ts index ba7343f78679..7eeeb8e1a454 100644 --- a/examples/src/models/chat/anthropic_tools/extraction.ts +++ b/examples/src/models/chat/anthropic_tools/extraction.ts @@ -22,7 +22,7 @@ const schema = z.object({ const model = new ChatAnthropicTools({ temperature: 0.1, - modelName: "claude-3-sonnet-20240229", + model: "claude-3-sonnet-20240229", }).bind({ tools: [ { diff --git a/examples/src/models/chat/anthropic_tools/tool_calling.ts b/examples/src/models/chat/anthropic_tools/tool_calling.ts index f7323ef101b4..43eecc79dcfe 100644 --- a/examples/src/models/chat/anthropic_tools/tool_calling.ts +++ b/examples/src/models/chat/anthropic_tools/tool_calling.ts @@ -3,7 +3,7 @@ import { HumanMessage } from "@langchain/core/messages"; const model = new ChatAnthropicTools({ temperature: 0.1, - modelName: "claude-3-sonnet-20240229", + model: "claude-3-sonnet-20240229", }).bind({ tools: [ { diff --git a/examples/src/models/chat/caching.ts b/examples/src/models/chat/caching.ts index 0d41b0480bc9..ac62fc03cb7b 100644 --- a/examples/src/models/chat/caching.ts +++ b/examples/src/models/chat/caching.ts @@ -2,7 +2,7 @@ import { ChatOpenAI } from "@langchain/openai"; // To make the caching really obvious, lets use a slower model. const model = new ChatOpenAI({ - modelName: "gpt-4", + model: "gpt-4", cache: true, }); diff --git a/examples/src/models/chat/chat.ts b/examples/src/models/chat/chat.ts index 50f0d773679f..3a4aed6ab60c 100644 --- a/examples/src/models/chat/chat.ts +++ b/examples/src/models/chat/chat.ts @@ -2,7 +2,7 @@ import { ChatOpenAI } from "@langchain/openai"; import { HumanMessage, SystemMessage } from "@langchain/core/messages"; export const run = async () => { - const chat = new ChatOpenAI({ modelName: "gpt-3.5-turbo" }); + const chat = new ChatOpenAI({ model: "gpt-3.5-turbo" }); // Pass in a list of messages to `call` to start a conversation. In this simple example, we only pass in one message. const responseA = await chat.call([ new HumanMessage( diff --git a/examples/src/models/chat/chat_mistralai.ts b/examples/src/models/chat/chat_mistralai.ts index 060ee69f1099..a59de3c78d04 100644 --- a/examples/src/models/chat/chat_mistralai.ts +++ b/examples/src/models/chat/chat_mistralai.ts @@ -3,7 +3,7 @@ import { ChatPromptTemplate } from "@langchain/core/prompts"; const model = new ChatMistralAI({ apiKey: process.env.MISTRAL_API_KEY, - modelName: "mistral-small", + model: "mistral-small", }); const prompt = ChatPromptTemplate.fromMessages([ ["system", "You are a helpful assistant"], diff --git a/examples/src/models/chat/chat_mistralai_agents.ts b/examples/src/models/chat/chat_mistralai_agents.ts index 8e4cbc267679..eb07c7423d66 100644 --- a/examples/src/models/chat/chat_mistralai_agents.ts +++ b/examples/src/models/chat/chat_mistralai_agents.ts @@ -9,7 +9,7 @@ import type { ChatPromptTemplate } from "@langchain/core/prompts"; const llm: any = new ChatMistralAI({ temperature: 0, - modelName: "mistral-large-latest", + model: "mistral-large-latest", }); // Get the prompt to use - you can modify this! diff --git a/examples/src/models/chat/chat_mistralai_tools.ts b/examples/src/models/chat/chat_mistralai_tools.ts index 829fc6f2504a..7e6e9ebf3928 100644 --- a/examples/src/models/chat/chat_mistralai_tools.ts +++ b/examples/src/models/chat/chat_mistralai_tools.ts @@ -33,7 +33,7 @@ class CalculatorTool extends StructuredTool { const model = new ChatMistralAI({ apiKey: process.env.MISTRAL_API_KEY, - modelName: "mistral-large", + model: "mistral-large", }); // Bind the tool to the model diff --git a/examples/src/models/chat/chat_mistralai_wsa.ts b/examples/src/models/chat/chat_mistralai_wsa.ts index daa5d1db9234..37d36fecca64 100644 --- a/examples/src/models/chat/chat_mistralai_wsa.ts +++ b/examples/src/models/chat/chat_mistralai_wsa.ts @@ -14,7 +14,7 @@ const calculatorSchema = z const model = new ChatMistralAI({ apiKey: process.env.MISTRAL_API_KEY, - modelName: "mistral-large", + model: "mistral-large", }); // Pass the schema and tool name to the withStructuredOutput method diff --git a/examples/src/models/chat/chat_mistralai_wsa_json.ts b/examples/src/models/chat/chat_mistralai_wsa_json.ts index 484e5dc7b900..4a9553055edd 100644 --- a/examples/src/models/chat/chat_mistralai_wsa_json.ts +++ b/examples/src/models/chat/chat_mistralai_wsa_json.ts @@ -21,7 +21,7 @@ const calculatorJsonSchema = { const model = new ChatMistralAI({ apiKey: process.env.MISTRAL_API_KEY, - modelName: "mistral-large", + model: "mistral-large", }); // Pass the schema and tool name to the withStructuredOutput method diff --git a/examples/src/models/chat/chat_stream_mistralai.ts b/examples/src/models/chat/chat_stream_mistralai.ts index 8b5f974b2a89..c0f1307d0230 100644 --- a/examples/src/models/chat/chat_stream_mistralai.ts +++ b/examples/src/models/chat/chat_stream_mistralai.ts @@ -4,7 +4,7 @@ import { StringOutputParser } from "@langchain/core/output_parsers"; const model = new ChatMistralAI({ apiKey: process.env.MISTRAL_API_KEY, - modelName: "mistral-small", + model: "mistral-small", }); const prompt = ChatPromptTemplate.fromMessages([ ["system", "You are a helpful assistant"], diff --git a/examples/src/models/chat/chat_vertexai_agents.ts b/examples/src/models/chat/chat_vertexai_agents.ts index 43e64990e8ec..2bd1ba62b495 100644 --- a/examples/src/models/chat/chat_vertexai_agents.ts +++ b/examples/src/models/chat/chat_vertexai_agents.ts @@ -11,7 +11,7 @@ import { ChatVertexAI } from "@langchain/google-vertexai"; const llm: any = new ChatVertexAI({ temperature: 0, - modelName: "gemini-1.0-pro", + model: "gemini-1.0-pro", }); // Get the prompt to use - you can modify this! diff --git a/examples/src/models/chat/googlegenerativeai.ts b/examples/src/models/chat/googlegenerativeai.ts index 40b5181560b1..5b83139b9ba0 100644 --- a/examples/src/models/chat/googlegenerativeai.ts +++ b/examples/src/models/chat/googlegenerativeai.ts @@ -12,7 +12,7 @@ import { HarmBlockThreshold, HarmCategory } from "@google/generative-ai"; // Text const model = new ChatGoogleGenerativeAI({ - modelName: "gemini-pro", + model: "gemini-pro", maxOutputTokens: 2048, safetySettings: [ { diff --git a/examples/src/models/chat/googlegenerativeai_multimodal.ts b/examples/src/models/chat/googlegenerativeai_multimodal.ts index e8fa6fbe429a..5b75d79a10c9 100644 --- a/examples/src/models/chat/googlegenerativeai_multimodal.ts +++ b/examples/src/models/chat/googlegenerativeai_multimodal.ts @@ -4,7 +4,7 @@ import { HumanMessage } from "@langchain/core/messages"; // Multi-modal const vision = new ChatGoogleGenerativeAI({ - modelName: "gemini-pro-vision", + model: "gemini-pro-vision", maxOutputTokens: 2048, }); const image = fs.readFileSync("./hotdog.jpg").toString("base64"); diff --git a/examples/src/models/chat/integration_alitongyi.ts b/examples/src/models/chat/integration_alitongyi.ts index d1f343c3eded..6dafe44a365f 100644 --- a/examples/src/models/chat/integration_alitongyi.ts +++ b/examples/src/models/chat/integration_alitongyi.ts @@ -8,7 +8,7 @@ const qwenTurbo = new ChatAlibabaTongyi({ // Use qwen-plus const qwenPlus = new ChatAlibabaTongyi({ - modelName: "qwen-plus", // Available models: qwen-turbo, qwen-plus, qwen-max + model: "qwen-plus", // Available models: qwen-turbo, qwen-plus, qwen-max temperature: 1, alibabaApiKey: "YOUR-API-KEY", // In Node.js defaults to process.env.ALIBABA_API_KEY }); diff --git a/examples/src/models/chat/integration_anthropic.ts b/examples/src/models/chat/integration_anthropic.ts index bfc8ebdf47a0..1c51452dd8c8 100644 --- a/examples/src/models/chat/integration_anthropic.ts +++ b/examples/src/models/chat/integration_anthropic.ts @@ -2,9 +2,9 @@ import { ChatAnthropic } from "@langchain/anthropic"; const model = new ChatAnthropic({ temperature: 0.9, - modelName: "claude-3-sonnet-20240229", + model: "claude-3-sonnet-20240229", // In Node.js defaults to process.env.ANTHROPIC_API_KEY, - // anthropicApiKey: "YOUR-API-KEY", + // apiKey: "YOUR-API-KEY", maxTokens: 1024, }); diff --git a/examples/src/models/chat/integration_anthropic_custom_headers.ts b/examples/src/models/chat/integration_anthropic_custom_headers.ts index ecfa3a217911..d44d93e68d5c 100644 --- a/examples/src/models/chat/integration_anthropic_custom_headers.ts +++ b/examples/src/models/chat/integration_anthropic_custom_headers.ts @@ -1,7 +1,7 @@ import { ChatAnthropic } from "@langchain/anthropic"; const model = new ChatAnthropic({ - modelName: "claude-3-sonnet-20240229", + model: "claude-3-sonnet-20240229", maxTokens: 1024, clientOptions: { defaultHeaders: { diff --git a/examples/src/models/chat/integration_anthropic_legacy.ts b/examples/src/models/chat/integration_anthropic_legacy.ts index e309b57aaf5f..e130049d7fc1 100644 --- a/examples/src/models/chat/integration_anthropic_legacy.ts +++ b/examples/src/models/chat/integration_anthropic_legacy.ts @@ -2,6 +2,6 @@ import { ChatAnthropic } from "@langchain/anthropic"; const model = new ChatAnthropic({ temperature: 0.9, - anthropicApiKey: "YOUR-API-KEY", // In Node.js defaults to process.env.ANTHROPIC_API_KEY + apiKey: "YOUR-API-KEY", // In Node.js defaults to process.env.ANTHROPIC_API_KEY maxTokensToSample: 1024, }); diff --git a/examples/src/models/chat/integration_anthropic_multi_tool.ts b/examples/src/models/chat/integration_anthropic_multi_tool.ts index 1ad34e7b63d3..a1eee1ae4f13 100644 --- a/examples/src/models/chat/integration_anthropic_multi_tool.ts +++ b/examples/src/models/chat/integration_anthropic_multi_tool.ts @@ -32,8 +32,8 @@ const tools = [ ]; const model = new ChatAnthropic({ - anthropicApiKey: process.env.ANTHROPIC_API_KEY, - modelName: "claude-3-opus-20240229", + apiKey: process.env.ANTHROPIC_API_KEY, + model: "claude-3-opus-20240229", }).bind({ tools, }); diff --git a/examples/src/models/chat/integration_anthropic_multimodal.ts b/examples/src/models/chat/integration_anthropic_multimodal.ts index d13928887314..87e9375d4f52 100644 --- a/examples/src/models/chat/integration_anthropic_multimodal.ts +++ b/examples/src/models/chat/integration_anthropic_multimodal.ts @@ -5,7 +5,7 @@ import { HumanMessage } from "@langchain/core/messages"; const imageData = await fs.readFile("./hotdog.jpg"); const chat = new ChatAnthropic({ - modelName: "claude-3-sonnet-20240229", + model: "claude-3-sonnet-20240229", }); const message = new HumanMessage({ content: [ diff --git a/examples/src/models/chat/integration_anthropic_single_tool.ts b/examples/src/models/chat/integration_anthropic_single_tool.ts index 7571fe8b8956..675623fbc3cc 100644 --- a/examples/src/models/chat/integration_anthropic_single_tool.ts +++ b/examples/src/models/chat/integration_anthropic_single_tool.ts @@ -18,8 +18,8 @@ const tool = { }; const model = new ChatAnthropic({ - anthropicApiKey: process.env.ANTHROPIC_API_KEY, - modelName: "claude-3-haiku-20240307", + apiKey: process.env.ANTHROPIC_API_KEY, + model: "claude-3-haiku-20240307", }).bind({ tools: [tool], }); diff --git a/examples/src/models/chat/integration_anthropic_tools_wsa.ts b/examples/src/models/chat/integration_anthropic_tools_wsa.ts index 8876a958bd1e..67d89bb71499 100644 --- a/examples/src/models/chat/integration_anthropic_tools_wsa.ts +++ b/examples/src/models/chat/integration_anthropic_tools_wsa.ts @@ -11,7 +11,7 @@ const calculatorSchema = z.object({ }); const model = new ChatAnthropicTools({ - modelName: "claude-3-sonnet-20240229", + model: "claude-3-sonnet-20240229", temperature: 0.1, }); diff --git a/examples/src/models/chat/integration_anthropic_tools_wsa_json.ts b/examples/src/models/chat/integration_anthropic_tools_wsa_json.ts index 9c3e33c9c9ec..e6f345b61fa9 100644 --- a/examples/src/models/chat/integration_anthropic_tools_wsa_json.ts +++ b/examples/src/models/chat/integration_anthropic_tools_wsa_json.ts @@ -20,7 +20,7 @@ const calculatorJsonSchema = { }; const model = new ChatAnthropicTools({ - modelName: "claude-3-sonnet-20240229", + model: "claude-3-sonnet-20240229", temperature: 0.1, }); diff --git a/examples/src/models/chat/integration_anthropic_wsa.ts b/examples/src/models/chat/integration_anthropic_wsa.ts index 0d24c0e6e775..5de929d59863 100644 --- a/examples/src/models/chat/integration_anthropic_wsa.ts +++ b/examples/src/models/chat/integration_anthropic_wsa.ts @@ -13,8 +13,8 @@ const calculatorSchema = z .describe("A simple calculator tool"); const model = new ChatAnthropic({ - anthropicApiKey: process.env.ANTHROPIC_API_KEY, - modelName: "claude-3-haiku-20240307", + apiKey: process.env.ANTHROPIC_API_KEY, + model: "claude-3-haiku-20240307", }); // Pass the schema and tool name to the withStructuredOutput method diff --git a/examples/src/models/chat/integration_azure_chat_openai.ts b/examples/src/models/chat/integration_azure_chat_openai.ts index 2db9da7406a4..6397063b6bb6 100644 --- a/examples/src/models/chat/integration_azure_chat_openai.ts +++ b/examples/src/models/chat/integration_azure_chat_openai.ts @@ -1,7 +1,7 @@ import { AzureChatOpenAI } from "@langchain/azure-openai"; const model = new AzureChatOpenAI({ - modelName: "gpt-4", + model: "gpt-4", prefixMessages: [ { role: "system", diff --git a/examples/src/models/chat/integration_baiduwenxin.ts b/examples/src/models/chat/integration_baiduwenxin.ts index eb540961ee3d..10b6505a87da 100644 --- a/examples/src/models/chat/integration_baiduwenxin.ts +++ b/examples/src/models/chat/integration_baiduwenxin.ts @@ -9,7 +9,7 @@ const ernieTurbo = new ChatBaiduWenxin({ // Use ERNIE-Bot const ernie = new ChatBaiduWenxin({ - modelName: "ERNIE-Bot", // Available models: ERNIE-Bot, ERNIE-Bot-turbo, ERNIE-Bot-4, ERNIE-Speed-8K, ERNIE-Speed-128K + model: "ERNIE-Bot", // Available models: ERNIE-Bot, ERNIE-Bot-turbo, ERNIE-Bot-4, ERNIE-Speed-8K, ERNIE-Speed-128K temperature: 1, baiduApiKey: "YOUR-API-KEY", // In Node.js defaults to process.env.BAIDU_API_KEY baiduSecretKey: "YOUR-SECRET-KEY", // In Node.js defaults to process.env.BAIDU_SECRET_KEY diff --git a/examples/src/models/chat/integration_fireworks.ts b/examples/src/models/chat/integration_fireworks.ts index 5bab8b0d7f6f..596a5e4b6461 100644 --- a/examples/src/models/chat/integration_fireworks.ts +++ b/examples/src/models/chat/integration_fireworks.ts @@ -3,5 +3,5 @@ import { ChatFireworks } from "@langchain/community/chat_models/fireworks"; const model = new ChatFireworks({ temperature: 0.9, // In Node.js defaults to process.env.FIREWORKS_API_KEY - fireworksApiKey: "YOUR-API-KEY", + apiKey: "YOUR-API-KEY", }); diff --git a/examples/src/models/chat/integration_googlepalm.ts b/examples/src/models/chat/integration_googlepalm.ts index e1e0ee7c5e38..5b0d5c1dcd41 100644 --- a/examples/src/models/chat/integration_googlepalm.ts +++ b/examples/src/models/chat/integration_googlepalm.ts @@ -9,7 +9,7 @@ export const run = async () => { const model = new ChatGooglePaLM({ apiKey: "", // or set it in environment variable as `GOOGLE_PALM_API_KEY` temperature: 0.7, // OPTIONAL - modelName: "models/chat-bison-001", // OPTIONAL + model: "models/chat-bison-001", // OPTIONAL topK: 40, // OPTIONAL topP: 1, // OPTIONAL examples: [ diff --git a/examples/src/models/chat/integration_googlevertexai-tools.ts b/examples/src/models/chat/integration_googlevertexai-tools.ts index e95e77c32c5c..6188f99bd95a 100644 --- a/examples/src/models/chat/integration_googlevertexai-tools.ts +++ b/examples/src/models/chat/integration_googlevertexai-tools.ts @@ -25,7 +25,7 @@ const geminiCalculatorTool: GeminiTool = { const model = new ChatVertexAI({ temperature: 0.7, - modelName: "gemini-1.0-pro", + model: "gemini-1.0-pro", }).bind({ tools: [geminiCalculatorTool], }); diff --git a/examples/src/models/chat/integration_googlevertexai-wsa.ts b/examples/src/models/chat/integration_googlevertexai-wsa.ts index c7f566220375..16225211e26b 100644 --- a/examples/src/models/chat/integration_googlevertexai-wsa.ts +++ b/examples/src/models/chat/integration_googlevertexai-wsa.ts @@ -13,7 +13,7 @@ const calculatorSchema = z.object({ const model = new ChatVertexAI({ temperature: 0.7, - modelName: "gemini-1.0-pro", + model: "gemini-1.0-pro", }).withStructuredOutput(calculatorSchema); const response = await model.invoke("What is 1628253239 times 81623836?"); diff --git a/examples/src/models/chat/integration_googlevertexai.ts b/examples/src/models/chat/integration_googlevertexai.ts index 37d174f46892..4cc32e7471e9 100644 --- a/examples/src/models/chat/integration_googlevertexai.ts +++ b/examples/src/models/chat/integration_googlevertexai.ts @@ -4,7 +4,7 @@ import { ChatVertexAI } from "@langchain/google-vertexai"; const model = new ChatVertexAI({ temperature: 0.7, - modelName: "gemini-1.0-pro", + model: "gemini-1.0-pro", }); const response = await model.invoke("Why is the ocean blue?"); diff --git a/examples/src/models/chat/integration_groq_tool_calls.ts b/examples/src/models/chat/integration_groq_tool_calls.ts index 7e25d21f70e3..e59f65db7707 100644 --- a/examples/src/models/chat/integration_groq_tool_calls.ts +++ b/examples/src/models/chat/integration_groq_tool_calls.ts @@ -17,7 +17,7 @@ function getCurrentWeather(location: string, _unit?: string) { // Bind function to the model as a tool const chat = new ChatGroq({ - modelName: "mixtral-8x7b-32768", + model: "mixtral-8x7b-32768", maxTokens: 128, }).bind({ tools: [ diff --git a/examples/src/models/chat/integration_groq_wsa_zod.ts b/examples/src/models/chat/integration_groq_wsa_zod.ts index b9a08b7516a4..3b1ac094b443 100644 --- a/examples/src/models/chat/integration_groq_wsa_zod.ts +++ b/examples/src/models/chat/integration_groq_wsa_zod.ts @@ -4,7 +4,7 @@ import { z } from "zod"; const model = new ChatGroq({ temperature: 0, - modelName: "mixtral-8x7b-32768", + model: "mixtral-8x7b-32768", }); const calculatorSchema = z.object({ diff --git a/examples/src/models/chat/integration_minimax.ts b/examples/src/models/chat/integration_minimax.ts index 1c21c4b75656..634bf4d80009 100644 --- a/examples/src/models/chat/integration_minimax.ts +++ b/examples/src/models/chat/integration_minimax.ts @@ -3,7 +3,7 @@ import { HumanMessage } from "@langchain/core/messages"; // Use abab5.5 const abab5_5 = new ChatMinimax({ - modelName: "abab5.5-chat", + model: "abab5.5-chat", botSetting: [ { bot_name: "MM Assistant", @@ -32,7 +32,7 @@ AIChatMessage { // use abab5 const abab5 = new ChatMinimax({ proVersion: false, - modelName: "abab5-chat", + model: "abab5-chat", minimaxGroupId: process.env.MINIMAX_GROUP_ID, // In Node.js defaults to process.env.MINIMAX_GROUP_ID minimaxApiKey: process.env.MINIMAX_API_KEY, // In Node.js defaults to process.env.MINIMAX_API_KEY }); diff --git a/examples/src/models/chat/integration_openai.ts b/examples/src/models/chat/integration_openai.ts index de5a06ed1bf8..f6257d3a513b 100644 --- a/examples/src/models/chat/integration_openai.ts +++ b/examples/src/models/chat/integration_openai.ts @@ -3,14 +3,14 @@ import { HumanMessage } from "@langchain/core/messages"; const model = new ChatOpenAI({ temperature: 0.9, - openAIApiKey: "YOUR-API-KEY", // In Node.js defaults to process.env.OPENAI_API_KEY + apiKey: "YOUR-API-KEY", // In Node.js defaults to process.env.OPENAI_API_KEY }); // You can also pass tools or functions to the model, learn more here // https://platform.openai.com/docs/guides/gpt/function-calling const modelForFunctionCalling = new ChatOpenAI({ - modelName: "gpt-4", + model: "gpt-4", temperature: 0, }); @@ -56,7 +56,7 @@ AIMessage { // Coerce response type with JSON mode. // Requires "gpt-4-1106-preview" or later const jsonModeModel = new ChatOpenAI({ - modelName: "gpt-4-1106-preview", + model: "gpt-4-1106-preview", maxTokens: 128, }).bind({ response_format: { diff --git a/examples/src/models/chat/integration_openai_fine_tune.ts b/examples/src/models/chat/integration_openai_fine_tune.ts index 14da3691f973..3bc34ad73dee 100644 --- a/examples/src/models/chat/integration_openai_fine_tune.ts +++ b/examples/src/models/chat/integration_openai_fine_tune.ts @@ -2,7 +2,7 @@ import { ChatOpenAI } from "@langchain/openai"; const model = new ChatOpenAI({ temperature: 0.9, - modelName: "ft:gpt-3.5-turbo-0613:{ORG_NAME}::{MODEL_ID}", + model: "ft:gpt-3.5-turbo-0613:{ORG_NAME}::{MODEL_ID}", }); const message = await model.invoke("Hi there!"); diff --git a/examples/src/models/chat/integration_openai_tool_calls.ts b/examples/src/models/chat/integration_openai_tool_calls.ts index 31555c11b4e2..f8e8b426e15d 100644 --- a/examples/src/models/chat/integration_openai_tool_calls.ts +++ b/examples/src/models/chat/integration_openai_tool_calls.ts @@ -18,7 +18,7 @@ function getCurrentWeather(location: string, _unit?: string) { // Bind function to the model as a tool const chat = new ChatOpenAI({ - modelName: "gpt-3.5-turbo-1106", + model: "gpt-3.5-turbo-1106", maxTokens: 128, }).bind({ tools: [ diff --git a/examples/src/models/chat/integration_openai_vision.ts b/examples/src/models/chat/integration_openai_vision.ts index d600f480f549..f0d495468a96 100644 --- a/examples/src/models/chat/integration_openai_vision.ts +++ b/examples/src/models/chat/integration_openai_vision.ts @@ -5,7 +5,7 @@ import { HumanMessage } from "@langchain/core/messages"; const imageData = await fs.readFile("./hotdog.jpg"); const chat = new ChatOpenAI({ - modelName: "gpt-4-vision-preview", + model: "gpt-4-vision-preview", maxTokens: 1024, }); const message = new HumanMessage({ diff --git a/examples/src/models/chat/integration_openai_wsa_json_schema.ts b/examples/src/models/chat/integration_openai_wsa_json_schema.ts index 3d23d2ec895f..d21bc3a1d490 100644 --- a/examples/src/models/chat/integration_openai_wsa_json_schema.ts +++ b/examples/src/models/chat/integration_openai_wsa_json_schema.ts @@ -3,7 +3,7 @@ import { ChatOpenAI } from "@langchain/openai"; const model = new ChatOpenAI({ temperature: 0, - modelName: "gpt-4-turbo-preview", + model: "gpt-4-turbo-preview", }); const calculatorSchema = { diff --git a/examples/src/models/chat/integration_openai_wsa_zod.ts b/examples/src/models/chat/integration_openai_wsa_zod.ts index 090356b0c9d9..64d83b00b6ad 100644 --- a/examples/src/models/chat/integration_openai_wsa_zod.ts +++ b/examples/src/models/chat/integration_openai_wsa_zod.ts @@ -4,7 +4,7 @@ import { z } from "zod"; const model = new ChatOpenAI({ temperature: 0, - modelName: "gpt-4-turbo-preview", + model: "gpt-4-turbo-preview", }); const calculatorSchema = z.object({ diff --git a/examples/src/models/chat/integration_togetherai.ts b/examples/src/models/chat/integration_togetherai.ts index 2bf3a77bb9dd..6382a2ac7aac 100644 --- a/examples/src/models/chat/integration_togetherai.ts +++ b/examples/src/models/chat/integration_togetherai.ts @@ -4,7 +4,7 @@ import { HumanMessage } from "@langchain/core/messages"; const model = new ChatTogetherAI({ temperature: 0.9, // In Node.js defaults to process.env.TOGETHER_AI_API_KEY - togetherAIApiKey: "YOUR-API-KEY", + apiKey: "YOUR-API-KEY", }); console.log(await model.invoke([new HumanMessage("Hello there!")])); diff --git a/examples/src/models/chat/integration_togetherai_json.ts b/examples/src/models/chat/integration_togetherai_json.ts index 994809633a1b..eef1cbb14195 100644 --- a/examples/src/models/chat/integration_togetherai_json.ts +++ b/examples/src/models/chat/integration_togetherai_json.ts @@ -16,8 +16,8 @@ const responseSchema = { }; const modelWithJsonSchema = new ChatTogetherAI({ temperature: 0, - togetherAIApiKey: process.env.TOGETHER_AI_API_KEY, - modelName: "mistralai/Mixtral-8x7B-Instruct-v0.1", + apiKey: process.env.TOGETHER_AI_API_KEY, + model: "mistralai/Mixtral-8x7B-Instruct-v0.1", }).bind({ response_format: { type: "json_object", // Define the response format as a JSON object diff --git a/examples/src/models/chat/integration_togetherai_tools.ts b/examples/src/models/chat/integration_togetherai_tools.ts index 29e1d2461363..a7c4f466cd16 100644 --- a/examples/src/models/chat/integration_togetherai_tools.ts +++ b/examples/src/models/chat/integration_togetherai_tools.ts @@ -9,9 +9,9 @@ const calculatorTool = convertToOpenAITool(new Calculator()); const modelWithCalculator = new ChatTogetherAI({ temperature: 0, // This is the default env variable name it will look for if none is passed. - togetherAIApiKey: process.env.TOGETHER_AI_API_KEY, + apiKey: process.env.TOGETHER_AI_API_KEY, // Together JSON mode/tool calling only supports a select number of models - modelName: "mistralai/Mixtral-8x7B-Instruct-v0.1", + model: "mistralai/Mixtral-8x7B-Instruct-v0.1", }).bind({ // Bind the tool to the model. tools: [calculatorTool], diff --git a/examples/src/models/chat/integration_zhipuai.ts b/examples/src/models/chat/integration_zhipuai.ts index 045ad859ec1c..c3caf2af7f4a 100644 --- a/examples/src/models/chat/integration_zhipuai.ts +++ b/examples/src/models/chat/integration_zhipuai.ts @@ -8,7 +8,7 @@ const glm3turbo = new ChatZhipuAI({ // Use glm-4 const glm4 = new ChatZhipuAI({ - modelName: "glm-4", // Available models: + model: "glm-4", // Available models: temperature: 1, zhipuAIApiKey: "YOUR-API-KEY", // In Node.js defaults to process.env.ZHIPUAI_API_KEY }); diff --git a/examples/src/models/chat/llm_caching.ts b/examples/src/models/chat/llm_caching.ts index fea781dff82a..84e92ed19c03 100644 --- a/examples/src/models/chat/llm_caching.ts +++ b/examples/src/models/chat/llm_caching.ts @@ -2,7 +2,7 @@ import { OpenAI } from "@langchain/openai"; // To make the caching really obvious, lets use a slower model. const model = new OpenAI({ - modelName: "gpt-3.5-turbo-instruct", + model: "gpt-3.5-turbo-instruct", cache: true, }); diff --git a/examples/src/models/chat/minimax_functions.ts b/examples/src/models/chat/minimax_functions.ts index 4c9858c75fa4..7babff7cf318 100644 --- a/examples/src/models/chat/minimax_functions.ts +++ b/examples/src/models/chat/minimax_functions.ts @@ -55,7 +55,7 @@ AIMessage { // Alternatively, you can pass function call arguments as an additional argument as a one-off: const minimax = new ChatMinimax({ - modelName: "abab5.5-chat", + model: "abab5.5-chat", botSetting: [ { bot_name: "MM Assistant", diff --git a/examples/src/models/chat/minimax_functions_zod.ts b/examples/src/models/chat/minimax_functions_zod.ts index 176182c97862..a55b6bafcd28 100644 --- a/examples/src/models/chat/minimax_functions_zod.ts +++ b/examples/src/models/chat/minimax_functions_zod.ts @@ -12,7 +12,7 @@ const extractionFunctionZodSchema = z.object({ // We translate the above Zod schema into JSON schema using the "zodToJsonSchema" package. const model = new ChatMinimax({ - modelName: "abab5.5-chat", + model: "abab5.5-chat", botSetting: [ { bot_name: "MM Assistant", diff --git a/examples/src/models/chat/minimax_glyph.ts b/examples/src/models/chat/minimax_glyph.ts index d7565d5bb562..400c36a61c76 100644 --- a/examples/src/models/chat/minimax_glyph.ts +++ b/examples/src/models/chat/minimax_glyph.ts @@ -6,7 +6,7 @@ import { import { HumanMessage } from "@langchain/core/messages"; const model = new ChatMinimax({ - modelName: "abab5.5-chat", + model: "abab5.5-chat", botSetting: [ { bot_name: "MM Assistant", @@ -52,7 +52,7 @@ AIMessage { // use json_value const modelMinimax = new ChatMinimax({ - modelName: "abab5.5-chat", + model: "abab5.5-chat", botSetting: [ { bot_name: "MM Assistant", diff --git a/examples/src/models/chat/minimax_plugins.ts b/examples/src/models/chat/minimax_plugins.ts index 0d709c756330..cf88d6679b12 100644 --- a/examples/src/models/chat/minimax_plugins.ts +++ b/examples/src/models/chat/minimax_plugins.ts @@ -2,7 +2,7 @@ import { ChatMinimax } from "@langchain/community/chat_models/minimax"; import { HumanMessage } from "@langchain/core/messages"; const model = new ChatMinimax({ - modelName: "abab5.5-chat", + model: "abab5.5-chat", botSetting: [ { bot_name: "MM Assistant", diff --git a/examples/src/models/chat/minimax_sample_messages.ts b/examples/src/models/chat/minimax_sample_messages.ts index 48badf4aa6b2..6caab829e96e 100644 --- a/examples/src/models/chat/minimax_sample_messages.ts +++ b/examples/src/models/chat/minimax_sample_messages.ts @@ -2,7 +2,7 @@ import { ChatMinimax } from "@langchain/community/chat_models/minimax"; import { AIMessage, HumanMessage } from "@langchain/core/messages"; const model = new ChatMinimax({ - modelName: "abab5.5-chat", + model: "abab5.5-chat", botSetting: [ { bot_name: "MM Assistant", diff --git a/examples/src/models/chat/openai_functions.ts b/examples/src/models/chat/openai_functions.ts index 0df5c68ae99e..831e5bd6476e 100644 --- a/examples/src/models/chat/openai_functions.ts +++ b/examples/src/models/chat/openai_functions.ts @@ -26,7 +26,7 @@ const extractionFunctionSchema = { }; const model = new ChatOpenAI({ - modelName: "gpt-4", + model: "gpt-4", }).bind({ functions: [extractionFunctionSchema], function_call: { name: "extractor" }, diff --git a/examples/src/models/chat/openai_functions_zod.ts b/examples/src/models/chat/openai_functions_zod.ts index 4f4df93a1b8e..86919351e157 100644 --- a/examples/src/models/chat/openai_functions_zod.ts +++ b/examples/src/models/chat/openai_functions_zod.ts @@ -22,7 +22,7 @@ const extractionFunctionSchema = { }; const model = new ChatOpenAI({ - modelName: "gpt-4", + model: "gpt-4", }).bind({ functions: [extractionFunctionSchema], function_call: { name: "extractor" }, diff --git a/examples/src/models/chat/token_usage_tracking.ts b/examples/src/models/chat/token_usage_tracking.ts index afae7ad84005..02d3833ec088 100644 --- a/examples/src/models/chat/token_usage_tracking.ts +++ b/examples/src/models/chat/token_usage_tracking.ts @@ -1,7 +1,7 @@ import { ChatOpenAI } from "@langchain/openai"; const chatModel = new ChatOpenAI({ - modelName: "gpt-4", + model: "gpt-4", callbacks: [ { handleLLMEnd(output) { diff --git a/examples/src/models/embeddings/googlegenerativeai.ts b/examples/src/models/embeddings/googlegenerativeai.ts index 6138f1e46dee..a37bab2a3d54 100644 --- a/examples/src/models/embeddings/googlegenerativeai.ts +++ b/examples/src/models/embeddings/googlegenerativeai.ts @@ -11,7 +11,7 @@ import { TaskType } from "@google/generative-ai"; */ const embeddings = new GoogleGenerativeAIEmbeddings({ - modelName: "embedding-001", // 768 dimensions + model: "embedding-001", // 768 dimensions taskType: TaskType.RETRIEVAL_DOCUMENT, title: "Document title", }); diff --git a/examples/src/models/embeddings/googlepalm.ts b/examples/src/models/embeddings/googlepalm.ts index 6493a173c0bc..99a09f19ad2b 100644 --- a/examples/src/models/embeddings/googlepalm.ts +++ b/examples/src/models/embeddings/googlepalm.ts @@ -2,7 +2,7 @@ import { GooglePaLMEmbeddings } from "@langchain/community/embeddings/googlepalm const model = new GooglePaLMEmbeddings({ apiKey: "", // or set it in environment variable as `GOOGLE_PALM_API_KEY` - modelName: "models/embedding-gecko-001", // OPTIONAL + model: "models/embedding-gecko-001", // OPTIONAL }); /* Embed queries */ const res = await model.embedQuery( diff --git a/examples/src/models/embeddings/hf_transformers.ts b/examples/src/models/embeddings/hf_transformers.ts index bdf20b1671a5..2643eabe7c38 100644 --- a/examples/src/models/embeddings/hf_transformers.ts +++ b/examples/src/models/embeddings/hf_transformers.ts @@ -1,7 +1,7 @@ import { HuggingFaceTransformersEmbeddings } from "@langchain/community/embeddings/hf_transformers"; const model = new HuggingFaceTransformersEmbeddings({ - modelName: "Xenova/all-MiniLM-L6-v2", + model: "Xenova/all-MiniLM-L6-v2", }); /* Embed queries */ diff --git a/examples/src/models/llm/fireworks.ts b/examples/src/models/llm/fireworks.ts index 5f947564aa26..57b81601e11a 100644 --- a/examples/src/models/llm/fireworks.ts +++ b/examples/src/models/llm/fireworks.ts @@ -3,5 +3,5 @@ import { Fireworks } from "@langchain/community/llms/fireworks"; const model = new Fireworks({ temperature: 0.9, // In Node.js defaults to process.env.FIREWORKS_API_KEY - fireworksApiKey: "YOUR-API-KEY", + apiKey: "YOUR-API-KEY", }); diff --git a/examples/src/models/llm/googlepalm.ts b/examples/src/models/llm/googlepalm.ts index 8b6323748f8f..4e8074e8fb0e 100644 --- a/examples/src/models/llm/googlepalm.ts +++ b/examples/src/models/llm/googlepalm.ts @@ -5,7 +5,7 @@ export const run = async () => { apiKey: "", // or set it in environment variable as `GOOGLE_PALM_API_KEY` // other params temperature: 1, // OPTIONAL - modelName: "models/text-bison-001", // OPTIONAL + model: "models/text-bison-001", // OPTIONAL maxOutputTokens: 1024, // OPTIONAL topK: 40, // OPTIONAL topP: 3, // OPTIONAL diff --git a/examples/src/models/llm/llm_advanced.ts b/examples/src/models/llm/llm_advanced.ts index ae96b37a2068..4e5a9c8f5ca1 100644 --- a/examples/src/models/llm/llm_advanced.ts +++ b/examples/src/models/llm/llm_advanced.ts @@ -2,7 +2,7 @@ import { OpenAI } from "@langchain/openai"; const model = new OpenAI({ // customize openai model that's used, `gpt-3.5-turbo-instruct` is the default - modelName: "gpt-3.5-turbo-instruct", + model: "gpt-3.5-turbo-instruct", // `max_tokens` supports a magic -1 param where the max token length for the specified modelName // is calculated and included in the request to OpenAI as the `max_tokens` param diff --git a/examples/src/models/llm/openai-batch.ts b/examples/src/models/llm/openai-batch.ts index d9f482b90ae2..0bca2514f656 100644 --- a/examples/src/models/llm/openai-batch.ts +++ b/examples/src/models/llm/openai-batch.ts @@ -17,7 +17,7 @@ const res = await model.generate(prompts); console.log({ res }); const chat = new ChatOpenAI({ - modelName: "gpt-3.5-turbo", + model: "gpt-3.5-turbo", }); const messages = prompts.map((prompt) => [new HumanMessage(prompt)]); diff --git a/examples/src/models/llm/togetherai.ts b/examples/src/models/llm/togetherai.ts index b815c9817998..3f880f5d7125 100644 --- a/examples/src/models/llm/togetherai.ts +++ b/examples/src/models/llm/togetherai.ts @@ -2,7 +2,7 @@ import { TogetherAI } from "@langchain/community/llms/togetherai"; import { PromptTemplate } from "@langchain/core/prompts"; const model = new TogetherAI({ - modelName: "mistralai/Mixtral-8x7B-Instruct-v0.1", + model: "mistralai/Mixtral-8x7B-Instruct-v0.1", }); const prompt = PromptTemplate.fromTemplate(`System: You are a helpful assistant. User: {input}. diff --git a/examples/src/models/llm/togetherai_stream.ts b/examples/src/models/llm/togetherai_stream.ts index 819656f26fa1..da975982811d 100644 --- a/examples/src/models/llm/togetherai_stream.ts +++ b/examples/src/models/llm/togetherai_stream.ts @@ -2,7 +2,7 @@ import { TogetherAI } from "@langchain/community/llms/togetherai"; import { ChatPromptTemplate } from "@langchain/core/prompts"; const model = new TogetherAI({ - modelName: "mistralai/Mixtral-8x7B-Instruct-v0.1", + model: "mistralai/Mixtral-8x7B-Instruct-v0.1", streaming: true, }); const prompt = ChatPromptTemplate.fromMessages([ diff --git a/examples/src/models/llm/token_usage_tracking.ts b/examples/src/models/llm/token_usage_tracking.ts index f7b5447e41f1..a325ca898a2c 100644 --- a/examples/src/models/llm/token_usage_tracking.ts +++ b/examples/src/models/llm/token_usage_tracking.ts @@ -1,7 +1,7 @@ import { OpenAI } from "@langchain/openai"; const llm = new OpenAI({ - modelName: "gpt-3.5-turbo-instruct", + model: "gpt-3.5-turbo-instruct", callbacks: [ { handleLLMEnd(output) { diff --git a/examples/src/prompts/json_structured_output_parser.ts b/examples/src/prompts/json_structured_output_parser.ts index be3e2f6f057f..c61fa44a153e 100644 --- a/examples/src/prompts/json_structured_output_parser.ts +++ b/examples/src/prompts/json_structured_output_parser.ts @@ -31,7 +31,7 @@ const extractionFunctionSchema = { }; // Instantiate the ChatOpenAI class -const model = new ChatOpenAI({ modelName: "gpt-4" }); +const model = new ChatOpenAI({ model: "gpt-4" }); // Create a new runnable, bind the function to the model, and pipe the output through the parser const runnable = model diff --git a/examples/src/prompts/use_with_llm_chain.ts b/examples/src/prompts/use_with_llm_chain.ts index 1d98e0446d70..ebb6868c1fa4 100644 --- a/examples/src/prompts/use_with_llm_chain.ts +++ b/examples/src/prompts/use_with_llm_chain.ts @@ -21,7 +21,7 @@ const outputParser = StructuredOutputParser.fromZodSchema( ); const chatModel = new ChatOpenAI({ - modelName: "gpt-4", // Or gpt-3.5-turbo + model: "gpt-4", // Or gpt-3.5-turbo temperature: 0, // For best results with the output fixing parser }); diff --git a/examples/src/retrievers/contextual_compression.ts b/examples/src/retrievers/contextual_compression.ts index 0d33fbf4beb7..2e8be18a4f0a 100644 --- a/examples/src/retrievers/contextual_compression.ts +++ b/examples/src/retrievers/contextual_compression.ts @@ -7,7 +7,7 @@ import { ContextualCompressionRetriever } from "langchain/retrievers/contextual_ import { LLMChainExtractor } from "langchain/retrievers/document_compressors/chain_extract"; const model = new OpenAI({ - modelName: "gpt-3.5-turbo-instruct", + model: "gpt-3.5-turbo-instruct", }); const baseCompressor = LLMChainExtractor.fromLLM(model); diff --git a/examples/src/retrievers/matryoshka_retriever.ts b/examples/src/retrievers/matryoshka_retriever.ts index 7daec8a4bcad..02d00ed44ea7 100644 --- a/examples/src/retrievers/matryoshka_retriever.ts +++ b/examples/src/retrievers/matryoshka_retriever.ts @@ -5,11 +5,11 @@ import { Document } from "@langchain/core/documents"; import { faker } from "@faker-js/faker"; const smallEmbeddings = new OpenAIEmbeddings({ - modelName: "text-embedding-3-small", + model: "text-embedding-3-small", dimensions: 512, // Min num for small }); const largeEmbeddings = new OpenAIEmbeddings({ - modelName: "text-embedding-3-large", + model: "text-embedding-3-large", dimensions: 3072, // Max num for large }); diff --git a/examples/src/retrievers/multi_vector_hypothetical.ts b/examples/src/retrievers/multi_vector_hypothetical.ts index 2cb4c36a440a..bd02e8f30030 100644 --- a/examples/src/retrievers/multi_vector_hypothetical.ts +++ b/examples/src/retrievers/multi_vector_hypothetical.ts @@ -42,7 +42,7 @@ const functionsSchema = [ const functionCallingModel = new ChatOpenAI({ maxRetries: 0, - modelName: "gpt-4", + model: "gpt-4", }).bind({ functions: functionsSchema, function_call: { name: "hypothetical_questions" }, diff --git a/examples/src/tools/dalle_image_generation.ts b/examples/src/tools/dalle_image_generation.ts index 7c4edb5b360b..24deeb7feb48 100644 --- a/examples/src/tools/dalle_image_generation.ts +++ b/examples/src/tools/dalle_image_generation.ts @@ -3,8 +3,8 @@ import { DallEAPIWrapper } from "@langchain/openai"; const tool = new DallEAPIWrapper({ n: 1, // Default - modelName: "dall-e-3", // Default - openAIApiKey: process.env.OPENAI_API_KEY, // Default + model: "dall-e-3", // Default + apiKey: process.env.OPENAI_API_KEY, // Default }); const imageURL = await tool.invoke("a painting of a cat"); diff --git a/examples/src/tools/duckduckgo_search_agent.ts b/examples/src/tools/duckduckgo_search_agent.ts index e2766b5d2180..90b0d549ac12 100644 --- a/examples/src/tools/duckduckgo_search_agent.ts +++ b/examples/src/tools/duckduckgo_search_agent.ts @@ -15,7 +15,7 @@ const prompt = await pull( "hwchase17/openai-functions-agent" ); const llm = new ChatOpenAI({ - modelName: "gpt-4-turbo-preview", + model: "gpt-4-turbo-preview", temperature: 0, }); const agent = await createOpenAIFunctionsAgent({ diff --git a/examples/src/tools/exa_agent.ts b/examples/src/tools/exa_agent.ts index f2f73c66f40e..967577010417 100644 --- a/examples/src/tools/exa_agent.ts +++ b/examples/src/tools/exa_agent.ts @@ -25,7 +25,7 @@ const searchTool = createRetrieverTool(exaRetriever, { }); const tools = [searchTool]; -const llm = new ChatOpenAI({ modelName: "gpt-4", temperature: 0 }); +const llm = new ChatOpenAI({ model: "gpt-4", temperature: 0 }); const prompt = ChatPromptTemplate.fromMessages([ [ "system", diff --git a/examples/src/tools/exa_search.ts b/examples/src/tools/exa_search.ts index 0fd17df1d41b..4b59f05a5c72 100644 --- a/examples/src/tools/exa_search.ts +++ b/examples/src/tools/exa_search.ts @@ -21,7 +21,7 @@ const prompt = await pull( ); const llm = new ChatOpenAI({ - modelName: "gpt-3.5-turbo-1106", + model: "gpt-3.5-turbo-1106", temperature: 0, }); diff --git a/examples/src/tools/gmail.ts b/examples/src/tools/gmail.ts index 6fd73c3a92a1..677636fbfbe4 100644 --- a/examples/src/tools/gmail.ts +++ b/examples/src/tools/gmail.ts @@ -12,7 +12,7 @@ import { StructuredTool } from "@langchain/core/tools"; export async function run() { const model = new OpenAI({ temperature: 0, - openAIApiKey: process.env.OPENAI_API_KEY, + apiKey: process.env.OPENAI_API_KEY, }); // These are the default parameters for the Gmail tools diff --git a/examples/src/tools/google_calendar.ts b/examples/src/tools/google_calendar.ts index e9c69288cec6..75458fc6cf27 100644 --- a/examples/src/tools/google_calendar.ts +++ b/examples/src/tools/google_calendar.ts @@ -9,7 +9,7 @@ import { export async function run() { const model = new OpenAI({ temperature: 0, - openAIApiKey: process.env.OPENAI_API_KEY, + apiKey: process.env.OPENAI_API_KEY, }); const googleCalendarParams = { diff --git a/examples/src/tools/searxng_search.ts b/examples/src/tools/searxng_search.ts index db09a309572b..f3e0e435e596 100644 --- a/examples/src/tools/searxng_search.ts +++ b/examples/src/tools/searxng_search.ts @@ -8,7 +8,7 @@ import { SearxngSearch } from "@langchain/community/tools/searxng_search"; const model = new ChatOpenAI({ maxTokens: 1000, - modelName: "gpt-4", + model: "gpt-4", }); // `apiBase` will be automatically parsed from .env file, set "SEARXNG_API_BASE" in .env, diff --git a/examples/src/tools/tavily_search.ts b/examples/src/tools/tavily_search.ts index 4f37ad2071bb..105faa9403ff 100644 --- a/examples/src/tools/tavily_search.ts +++ b/examples/src/tools/tavily_search.ts @@ -16,7 +16,7 @@ const prompt = await pull( ); const llm = new ChatOpenAI({ - modelName: "gpt-3.5-turbo-1106", + model: "gpt-3.5-turbo-1106", temperature: 0, }); diff --git a/examples/src/use_cases/advanced/violation_of_expectations_chain.ts b/examples/src/use_cases/advanced/violation_of_expectations_chain.ts index 33c5219cc7be..5a317af2a51b 100644 --- a/examples/src/use_cases/advanced/violation_of_expectations_chain.ts +++ b/examples/src/use_cases/advanced/violation_of_expectations_chain.ts @@ -47,7 +47,7 @@ const retriever = vectorStore.asRetriever(); // Instantiate the LLM, const llm = new ChatOpenAI({ - modelName: "gpt-4", + model: "gpt-4", }); // And the chain. diff --git a/examples/src/use_cases/chatbots/memory_management.ts b/examples/src/use_cases/chatbots/memory_management.ts index 9405494b33e8..84cbc29689bc 100644 --- a/examples/src/use_cases/chatbots/memory_management.ts +++ b/examples/src/use_cases/chatbots/memory_management.ts @@ -5,7 +5,7 @@ import { ChatOpenAI } from "@langchain/openai"; const chat = new ChatOpenAI({ - modelName: "gpt-3.5-turbo-1106", + model: "gpt-3.5-turbo-1106", }); import { HumanMessage, AIMessage } from "@langchain/core/messages"; diff --git a/examples/src/use_cases/chatbots/quickstart.ts b/examples/src/use_cases/chatbots/quickstart.ts index f379612769c5..3f5513e0d96f 100644 --- a/examples/src/use_cases/chatbots/quickstart.ts +++ b/examples/src/use_cases/chatbots/quickstart.ts @@ -5,7 +5,7 @@ import { ChatOpenAI } from "@langchain/openai"; const chat = new ChatOpenAI({ - modelName: "gpt-3.5-turbo-1106", + model: "gpt-3.5-turbo-1106", temperature: 0.2, }); diff --git a/examples/src/use_cases/chatbots/retrieval.ts b/examples/src/use_cases/chatbots/retrieval.ts index cbe2775b8134..af9f39b42eeb 100644 --- a/examples/src/use_cases/chatbots/retrieval.ts +++ b/examples/src/use_cases/chatbots/retrieval.ts @@ -5,7 +5,7 @@ import { ChatOpenAI } from "@langchain/openai"; const chat = new ChatOpenAI({ - modelName: "gpt-3.5-turbo-1106", + model: "gpt-3.5-turbo-1106", temperature: 0.2, }); diff --git a/examples/src/use_cases/chatbots/tool_usage.ts b/examples/src/use_cases/chatbots/tool_usage.ts index d36a6d44f755..7f88d5fbf1ec 100644 --- a/examples/src/use_cases/chatbots/tool_usage.ts +++ b/examples/src/use_cases/chatbots/tool_usage.ts @@ -12,7 +12,7 @@ const tools = [ ]; const chat = new ChatOpenAI({ - modelName: "gpt-3.5-turbo-1106", + model: "gpt-3.5-turbo-1106", temperature: 0, }); diff --git a/examples/src/use_cases/human_in_the_loop/helpers.ts b/examples/src/use_cases/human_in_the_loop/helpers.ts index 5e8c961bd52b..d1a568484ac3 100644 --- a/examples/src/use_cases/human_in_the_loop/helpers.ts +++ b/examples/src/use_cases/human_in_the_loop/helpers.ts @@ -38,7 +38,7 @@ class SendEmail extends StructuredTool { const tools = [new CountEmails(), new SendEmail()]; export const model = new ChatOpenAI({ - modelName: "gpt-3.5-turbo", + model: "gpt-3.5-turbo", temperature: 0, }).bind({ tools, diff --git a/examples/src/use_cases/query_analysis/quickstart/index_docs.ts b/examples/src/use_cases/query_analysis/quickstart/index_docs.ts index ffd1b1d29646..c69f04723bb0 100644 --- a/examples/src/use_cases/query_analysis/quickstart/index_docs.ts +++ b/examples/src/use_cases/query_analysis/quickstart/index_docs.ts @@ -7,7 +7,7 @@ const docs = await getDocs(); const textSplitter = new RecursiveCharacterTextSplitter({ chunkSize: 2000 }); const chunkedDocs = await textSplitter.splitDocuments(docs); const embeddings = new OpenAIEmbeddings({ - modelName: "text-embedding-3-small", + model: "text-embedding-3-small", }); const vectorStore = await Chroma.fromDocuments(chunkedDocs, embeddings, { collectionName: "yt-videos", diff --git a/examples/src/use_cases/sql/agents/example_selector.ts b/examples/src/use_cases/sql/agents/example_selector.ts index 42656b02cc53..e6d9818414df 100644 --- a/examples/src/use_cases/sql/agents/example_selector.ts +++ b/examples/src/use_cases/sql/agents/example_selector.ts @@ -61,7 +61,7 @@ const fullPrompt = ChatPromptTemplate.fromMessages([ // And now we can create our agent with our custom prompt: -const llm = new ChatOpenAI({ modelName: "gpt-4", temperature: 0 }); +const llm = new ChatOpenAI({ model: "gpt-4", temperature: 0 }); const datasource = new DataSource({ type: "sqlite", database: "../../../../Chinook.db", diff --git a/examples/src/use_cases/sql/agents/high_cardinality_columns.ts b/examples/src/use_cases/sql/agents/high_cardinality_columns.ts index db4a95454dc5..3ba35fc1dc5a 100644 --- a/examples/src/use_cases/sql/agents/high_cardinality_columns.ts +++ b/examples/src/use_cases/sql/agents/high_cardinality_columns.ts @@ -82,7 +82,7 @@ const prompt = ChatPromptTemplate.fromMessages([ ["human", "{input}"], new MessagesPlaceholder("agent_scratchpad"), ]); -const llm = new ChatOpenAI({ modelName: "gpt-4", temperature: 0 }); +const llm = new ChatOpenAI({ model: "gpt-4", temperature: 0 }); const sqlToolKit = new SqlToolkit(db, llm); const newPrompt = await prompt.partial({ dialect: sqlToolKit.dialect, diff --git a/examples/src/use_cases/sql/agents/index.ts b/examples/src/use_cases/sql/agents/index.ts index 6b4ab2d76f37..f51938daebee 100644 --- a/examples/src/use_cases/sql/agents/index.ts +++ b/examples/src/use_cases/sql/agents/index.ts @@ -17,7 +17,7 @@ const datasource = new DataSource({ const db = await SqlDatabase.fromDataSourceParams({ appDataSource: datasource, }); -const llm = new ChatOpenAI({ modelName: "gpt-3.5-turbo", temperature: 0 }); +const llm = new ChatOpenAI({ model: "gpt-3.5-turbo", temperature: 0 }); const sqlToolKit = new SqlToolkit(db, llm); const tools = sqlToolKit.getTools(); const SQL_PREFIX = `You are an agent designed to interact with a SQL database. diff --git a/examples/src/use_cases/sql/large_db.ts b/examples/src/use_cases/sql/large_db.ts index e64bdde233b3..496861b16f9d 100644 --- a/examples/src/use_cases/sql/large_db.ts +++ b/examples/src/use_cases/sql/large_db.ts @@ -17,7 +17,7 @@ const datasource = new DataSource({ const db = await SqlDatabase.fromDataSourceParams({ appDataSource: datasource, }); -const llm = new ChatOpenAI({ modelName: "gpt-4", temperature: 0 }); +const llm = new ChatOpenAI({ model: "gpt-4", temperature: 0 }); const Table = z.object({ names: z.array(z.string()).describe("Names of tables in SQL database"), diff --git a/examples/src/use_cases/sql/large_db_high_cardinality.ts b/examples/src/use_cases/sql/large_db_high_cardinality.ts index 3bc6965fdcab..d340b237a076 100644 --- a/examples/src/use_cases/sql/large_db_high_cardinality.ts +++ b/examples/src/use_cases/sql/large_db_high_cardinality.ts @@ -80,7 +80,7 @@ const prompt = ChatPromptTemplate.fromMessages([ ["human", "{input}"], ]); -const llm = new ChatOpenAI({ modelName: "gpt-4", temperature: 0 }); +const llm = new ChatOpenAI({ model: "gpt-4", temperature: 0 }); const queryChain = await createSqlQueryChain({ llm, diff --git a/examples/src/use_cases/sql/query_checking.ts b/examples/src/use_cases/sql/query_checking.ts index ab39de3bfeb4..3032ae3e3ea8 100644 --- a/examples/src/use_cases/sql/query_checking.ts +++ b/examples/src/use_cases/sql/query_checking.ts @@ -14,7 +14,7 @@ const db = await SqlDatabase.fromDataSourceParams({ appDataSource: datasource, }); -const llm = new ChatOpenAI({ modelName: "gpt-4", temperature: 0 }); +const llm = new ChatOpenAI({ model: "gpt-4", temperature: 0 }); const chain = await createSqlQueryChain({ llm, db, diff --git a/examples/src/use_cases/sql/quickstart_answer_question.ts b/examples/src/use_cases/sql/quickstart_answer_question.ts index 1e6ccc1d3226..e0f45876e88b 100644 --- a/examples/src/use_cases/sql/quickstart_answer_question.ts +++ b/examples/src/use_cases/sql/quickstart_answer_question.ts @@ -17,7 +17,7 @@ const datasource = new DataSource({ const db = await SqlDatabase.fromDataSourceParams({ appDataSource: datasource, }); -const llm = new ChatOpenAI({ modelName: "gpt-4", temperature: 0 }); +const llm = new ChatOpenAI({ model: "gpt-4", temperature: 0 }); const executeQuery = new QuerySqlTool(db); const writeQuery = await createSqlQueryChain({ diff --git a/examples/src/use_cases/sql/quickstart_chain.ts b/examples/src/use_cases/sql/quickstart_chain.ts index 87d5c6410929..d0f49bf7b5db 100644 --- a/examples/src/use_cases/sql/quickstart_chain.ts +++ b/examples/src/use_cases/sql/quickstart_chain.ts @@ -11,7 +11,7 @@ const db = await SqlDatabase.fromDataSourceParams({ appDataSource: datasource, }); -const llm = new ChatOpenAI({ modelName: "gpt-4", temperature: 0 }); +const llm = new ChatOpenAI({ model: "gpt-4", temperature: 0 }); const chain = await createSqlQueryChain({ llm, db, diff --git a/examples/src/use_cases/sql/quickstart_execute_sql.ts b/examples/src/use_cases/sql/quickstart_execute_sql.ts index c47c50035594..8cd8e2c8fe10 100644 --- a/examples/src/use_cases/sql/quickstart_execute_sql.ts +++ b/examples/src/use_cases/sql/quickstart_execute_sql.ts @@ -11,7 +11,7 @@ const datasource = new DataSource({ const db = await SqlDatabase.fromDataSourceParams({ appDataSource: datasource, }); -const llm = new ChatOpenAI({ modelName: "gpt-4", temperature: 0 }); +const llm = new ChatOpenAI({ model: "gpt-4", temperature: 0 }); const executeQuery = new QuerySqlTool(db); const writeQuery = await createSqlQueryChain({ diff --git a/examples/src/use_cases/tool_use/agents.ts b/examples/src/use_cases/tool_use/agents.ts index a1761255b7c9..7ff0bf671ba5 100644 --- a/examples/src/use_cases/tool_use/agents.ts +++ b/examples/src/use_cases/tool_use/agents.ts @@ -54,7 +54,7 @@ import { ChatOpenAI } from "@langchain/openai"; import { AgentExecutor, createOpenAIToolsAgent } from "langchain/agents"; const model = new ChatOpenAI({ - modelName: "gpt-3.5-turbo-1106", + model: "gpt-3.5-turbo-1106", temperature: 0, }); diff --git a/examples/src/use_cases/tool_use/multiple_tools.ts b/examples/src/use_cases/tool_use/multiple_tools.ts index f719ab22cfda..cf03f8ea4a5a 100644 --- a/examples/src/use_cases/tool_use/multiple_tools.ts +++ b/examples/src/use_cases/tool_use/multiple_tools.ts @@ -50,7 +50,7 @@ import { } from "@langchain/core/runnables"; const model = new ChatOpenAI({ - modelName: "gpt-3.5-turbo-1106", + model: "gpt-3.5-turbo-1106", }); const tools = [multiplyTool, exponentiateTool, addTool]; diff --git a/examples/src/use_cases/tool_use/parallel.ts b/examples/src/use_cases/tool_use/parallel.ts index c30dd84122a4..eaf83e7de62a 100644 --- a/examples/src/use_cases/tool_use/parallel.ts +++ b/examples/src/use_cases/tool_use/parallel.ts @@ -50,7 +50,7 @@ import { } from "@langchain/core/runnables"; const model = new ChatOpenAI({ - modelName: "gpt-3.5-turbo-1106", + model: "gpt-3.5-turbo-1106", }); const tools = [multiplyTool, exponentiateTool, addTool]; diff --git a/examples/src/use_cases/tool_use/quickstart_agents.ts b/examples/src/use_cases/tool_use/quickstart_agents.ts index a8c92ce32e96..a61ace957db8 100644 --- a/examples/src/use_cases/tool_use/quickstart_agents.ts +++ b/examples/src/use_cases/tool_use/quickstart_agents.ts @@ -51,7 +51,7 @@ const exponentiateTool = new DynamicStructuredTool({ }); const model = new ChatOpenAI({ - modelName: "gpt-3.5-turbo-1106", + model: "gpt-3.5-turbo-1106", temperature: 0, }); diff --git a/examples/src/use_cases/tool_use/quickstart_chains.ts b/examples/src/use_cases/tool_use/quickstart_chains.ts index bea67d6c6970..ba01f947863a 100644 --- a/examples/src/use_cases/tool_use/quickstart_chains.ts +++ b/examples/src/use_cases/tool_use/quickstart_chains.ts @@ -21,7 +21,7 @@ console.log(await multiplyTool.invoke({ firstInt: 4, secondInt: 5 })); import { ChatOpenAI } from "@langchain/openai"; const model = new ChatOpenAI({ - modelName: "gpt-3.5-turbo-1106", + model: "gpt-3.5-turbo-1106", }); import { convertToOpenAITool } from "@langchain/core/utils/function_calling"; diff --git a/examples/src/use_cases/tool_use/tool_error_handling_fallbacks.ts b/examples/src/use_cases/tool_use/tool_error_handling_fallbacks.ts index e3c6d5e0d06a..3b49263f3340 100644 --- a/examples/src/use_cases/tool_use/tool_error_handling_fallbacks.ts +++ b/examples/src/use_cases/tool_use/tool_error_handling_fallbacks.ts @@ -20,7 +20,7 @@ const complexTool = new DynamicStructuredTool({ import { ChatOpenAI } from "@langchain/openai"; const model = new ChatOpenAI({ - modelName: "gpt-3.5-turbo-1106", + model: "gpt-3.5-turbo-1106", temperature: 0, }); @@ -47,7 +47,7 @@ const chain = RunnableSequence.from([ ]); const betterModel = new ChatOpenAI({ - modelName: "gpt-4-1106-preview", + model: "gpt-4-1106-preview", temperature: 0, }).bind({ tools: formattedTools, diff --git a/examples/src/use_cases/tool_use/tool_error_handling_intro.ts b/examples/src/use_cases/tool_use/tool_error_handling_intro.ts index 2f0b90195d45..9d5260c358ac 100644 --- a/examples/src/use_cases/tool_use/tool_error_handling_intro.ts +++ b/examples/src/use_cases/tool_use/tool_error_handling_intro.ts @@ -20,7 +20,7 @@ const complexTool = new DynamicStructuredTool({ import { ChatOpenAI } from "@langchain/openai"; const model = new ChatOpenAI({ - modelName: "gpt-3.5-turbo", + model: "gpt-3.5-turbo", temperature: 0, }); diff --git a/examples/src/use_cases/youtube/chat_with_podcast.ts b/examples/src/use_cases/youtube/chat_with_podcast.ts index 14f753c6fd57..c5ae6e5d06ae 100644 --- a/examples/src/use_cases/youtube/chat_with_podcast.ts +++ b/examples/src/use_cases/youtube/chat_with_podcast.ts @@ -21,7 +21,7 @@ const textSplitterQA = new TokenTextSplitter({ const docsQA = await textSplitterQA.splitDocuments(docs); const llm = new ChatOpenAI({ - modelName: "gpt-3.5-turbo-1106", + model: "gpt-3.5-turbo-1106", temperature: 0.2, }); diff --git a/examples/src/use_cases/youtube/podcast_summary.ts b/examples/src/use_cases/youtube/podcast_summary.ts index 194ba0f9de6e..edb58b019b50 100644 --- a/examples/src/use_cases/youtube/podcast_summary.ts +++ b/examples/src/use_cases/youtube/podcast_summary.ts @@ -19,7 +19,7 @@ const splitter = new TokenTextSplitter({ const docsSummary = await splitter.splitDocuments(docs); const llmSummary = new ChatAnthropic({ - modelName: "claude-3-sonnet-20240229", + model: "claude-3-sonnet-20240229", temperature: 0.3, }); diff --git a/libs/langchain-anthropic/README.md b/libs/langchain-anthropic/README.md index 04d1cd5cdc0d..db6ea90488ff 100644 --- a/libs/langchain-anthropic/README.md +++ b/libs/langchain-anthropic/README.md @@ -52,7 +52,7 @@ Then initialize import { ChatAnthropicMessages } from "@langchain/anthropic"; const model = new ChatAnthropic({ - anthropicApiKey: process.env.ANTHROPIC_API_KEY, + apiKey: process.env.ANTHROPIC_API_KEY, }); const response = await model.invoke(new HumanMessage("Hello world!")); ``` @@ -63,8 +63,8 @@ const response = await model.invoke(new HumanMessage("Hello world!")); import { ChatAnthropicMessages } from "@langchain/anthropic"; const model = new ChatAnthropic({ - anthropicApiKey: process.env.ANTHROPIC_API_KEY, - modelName: "claude-3-sonnet-20240229", + apiKey: process.env.ANTHROPIC_API_KEY, + model: "claude-3-sonnet-20240229", }); const response = await model.stream(new HumanMessage("Hello world!")); ``` diff --git a/libs/langchain-anthropic/src/chat_models.ts b/libs/langchain-anthropic/src/chat_models.ts index 6fb46b39d0b6..7d535feb89c0 100644 --- a/libs/langchain-anthropic/src/chat_models.ts +++ b/libs/langchain-anthropic/src/chat_models.ts @@ -155,12 +155,16 @@ export interface AnthropicInput { /** Anthropic API key */ anthropicApiKey?: string; + /** Anthropic API key */ + apiKey?: string; /** Anthropic API URL */ anthropicApiUrl?: string; /** Model name to use */ modelName: string; + /** Model name to use */ + model: string; /** Overridable Anthropic ClientOptions */ clientOptions: ClientOptions; @@ -196,7 +200,7 @@ type Kwargs = Record; * * const model = new ChatAnthropic({ * temperature: 0.9, - * anthropicApiKey: 'YOUR-API-KEY', + * apiKey: 'YOUR-API-KEY', * }); * const res = await model.invoke({ input: 'Hello!' }); * console.log(res); @@ -215,6 +219,7 @@ export class ChatAnthropicMessages< get lc_secrets(): { [key: string]: string } | undefined { return { anthropicApiKey: "ANTHROPIC_API_KEY", + apiKey: "ANTHROPIC_API_KEY", }; } @@ -228,6 +233,8 @@ export class ChatAnthropicMessages< anthropicApiKey?: string; + apiKey?: string; + apiUrl?: string; temperature = 1; @@ -240,6 +247,8 @@ export class ChatAnthropicMessages< modelName = "claude-2.1"; + model = "claude-2.1"; + invocationKwargs?: Kwargs; stopSequences?: string[]; @@ -258,15 +267,22 @@ export class ChatAnthropicMessages< super(fields ?? {}); this.anthropicApiKey = - fields?.anthropicApiKey ?? getEnvironmentVariable("ANTHROPIC_API_KEY"); + fields?.apiKey ?? + fields?.anthropicApiKey ?? + getEnvironmentVariable("ANTHROPIC_API_KEY"); if (!this.anthropicApiKey) { throw new Error("Anthropic API key not found"); } + /** Keep anthropicApiKey for backwards compatibility */ + this.apiKey = this.anthropicApiKey; // Support overriding the default API URL (i.e., https://api.anthropic.com) this.apiUrl = fields?.anthropicApiUrl; - this.modelName = fields?.modelName ?? this.modelName; + /** Keep modelName for backwards compatibility */ + this.modelName = fields?.model ?? fields?.modelName ?? this.model; + this.model = this.modelName; + this.invocationKwargs = fields?.invocationKwargs ?? {}; this.temperature = fields?.temperature ?? this.temperature; @@ -325,7 +341,7 @@ export class ChatAnthropicMessages< > & Kwargs { return { - model: this.modelName, + model: this.model, temperature: this.temperature, top_k: this.topK, top_p: this.topP, @@ -368,7 +384,7 @@ export class ChatAnthropicMessages< /** @ignore */ _identifyingParams() { return { - model_name: this.modelName, + model_name: this.model, ...this.invocationParams(), }; } @@ -378,7 +394,7 @@ export class ChatAnthropicMessages< */ identifyingParams() { return { - model_name: this.modelName, + model_name: this.model, ...this.invocationParams(), }; } @@ -668,7 +684,7 @@ export class ChatAnthropicMessages< this.streamingClient = new Anthropic({ ...this.clientOptions, ...options_, - apiKey: this.anthropicApiKey, + apiKey: this.apiKey, // Prefer LangChain built-in retries maxRetries: 0, }); @@ -690,7 +706,7 @@ export class ChatAnthropicMessages< request: AnthropicMessageCreateParams & Kwargs, options: AnthropicRequestOptions ): Promise { - if (!this.anthropicApiKey) { + if (!this.apiKey) { throw new Error("Missing Anthropic API key."); } if (!this.batchClient) { @@ -698,7 +714,7 @@ export class ChatAnthropicMessages< this.batchClient = new Anthropic({ ...this.clientOptions, ...options, - apiKey: this.anthropicApiKey, + apiKey: this.apiKey, maxRetries: 0, }); } diff --git a/libs/langchain-anthropic/src/tests/chat_models.int.test.ts b/libs/langchain-anthropic/src/tests/chat_models.int.test.ts index 34cadf253af6..09a0dce719e6 100644 --- a/libs/langchain-anthropic/src/tests/chat_models.int.test.ts +++ b/libs/langchain-anthropic/src/tests/chat_models.int.test.ts @@ -289,7 +289,7 @@ test("Test ChatAnthropic headers passed through", async () => { const chat = new ChatAnthropic({ modelName: "claude-3-sonnet-20240229", maxRetries: 0, - anthropicApiKey: "NOT_REAL", + apiKey: "NOT_REAL", clientOptions: { defaultHeaders: { "X-Api-Key": process.env.ANTHROPIC_API_KEY, diff --git a/libs/langchain-azure-openai/src/chat_models.ts b/libs/langchain-azure-openai/src/chat_models.ts index 9206b426bd79..686285bbedc2 100644 --- a/libs/langchain-azure-openai/src/chat_models.ts +++ b/libs/langchain-azure-openai/src/chat_models.ts @@ -226,10 +226,14 @@ export class AzureChatOpenAI stop?: string[] | undefined; + stopSequences?: string[] | undefined; + streaming: boolean; modelName: string; + model: string; + modelKwargs?: OpenAIChatInput["modelKwargs"]; timeout?: number | undefined; @@ -238,6 +242,8 @@ export class AzureChatOpenAI azureOpenAIApiKey?: string; + apiKey?: string; + azureOpenAIApiDeploymentName?: string; private client: AzureOpenAIClient; @@ -264,20 +270,22 @@ export class AzureChatOpenAI fields?.openAIApiKey ?? getEnvironmentVariable("OPENAI_API_KEY"); this.azureOpenAIApiKey = + fields?.apiKey ?? fields?.azureOpenAIApiKey ?? getEnvironmentVariable("AZURE_OPENAI_API_KEY") ?? openAiApiKey; + this.apiKey = this.azureOpenAIApiKey; const azureCredential = fields?.credentials ?? - (this.azureOpenAIApiKey === openAiApiKey - ? new OpenAIKeyCredential(this.azureOpenAIApiKey ?? "") - : new AzureKeyCredential(this.azureOpenAIApiKey ?? "")); + (this.apiKey === openAiApiKey + ? new OpenAIKeyCredential(this.apiKey ?? "") + : new AzureKeyCredential(this.apiKey ?? "")); // eslint-disable-next-line no-instanceof/no-instanceof const isOpenAIApiKey = azureCredential instanceof OpenAIKeyCredential; - if (!this.azureOpenAIApiKey && !fields?.credentials) { + if (!this.apiKey && !fields?.credentials) { throw new Error("Azure OpenAI API key not found"); } @@ -289,7 +297,8 @@ export class AzureChatOpenAI throw new Error("Azure OpenAI Deployment name not found"); } - this.modelName = fields?.modelName ?? this.modelName; + this.modelName = fields?.model ?? fields?.modelName ?? this.model; + this.model = this.modelName; this.modelKwargs = fields?.modelKwargs ?? {}; this.timeout = fields?.timeout; this.temperature = fields?.temperature ?? this.temperature; @@ -299,7 +308,8 @@ export class AzureChatOpenAI this.maxTokens = fields?.maxTokens; this.n = fields?.n ?? this.n; this.logitBias = fields?.logitBias; - this.stop = fields?.stop; + this.stop = fields?.stopSequences ?? fields?.stop; + this.stopSequences = this.stop; this.user = fields?.user; this.azureExtensionOptions = fields?.azureExtensionOptions; @@ -347,8 +357,7 @@ export class AzureChatOpenAI options: this["ParsedCallOptions"] ): Promise> { return this.caller.call(async () => { - const deploymentName = - this.azureOpenAIApiDeploymentName || this.modelName; + const deploymentName = this.azureOpenAIApiDeploymentName || this.model; const res = await this.client.streamChatCompletions( deploymentName, @@ -362,7 +371,7 @@ export class AzureChatOpenAI logitBias: this.logitBias, user: this.user, n: this.n, - stop: this.stop, + stop: this.stopSequences, presencePenalty: this.presencePenalty, frequencyPenalty: this.frequencyPenalty, azureExtensionOptions: this.azureExtensionOptions, @@ -442,7 +451,7 @@ export class AzureChatOpenAI options: this["ParsedCallOptions"], runManager?: CallbackManagerForLLMRun ): Promise { - const deploymentName = this.azureOpenAIApiDeploymentName || this.modelName; + const deploymentName = this.azureOpenAIApiDeploymentName || this.model; const tokenUsage: TokenUsage = {}; const azureOpenAIMessages: ChatRequestMessage[] = this.formatMessages(messages); @@ -458,7 +467,7 @@ export class AzureChatOpenAI logitBias: this.logitBias, user: this.user, n: this.n, - stop: this.stop, + stop: this.stopSequences, presencePenalty: this.presencePenalty, frequencyPenalty: this.frequencyPenalty, azureExtensionOptions: this.azureExtensionOptions, @@ -615,7 +624,7 @@ export class AzureChatOpenAI let tokensPerName = 0; // From: https://github.com/openai/openai-cookbook/blob/main/examples/How_to_format_inputs_to_ChatGPT_models.ipynb - if (this.modelName === "gpt-3.5-turbo-0301") { + if (this.model === "gpt-3.5-turbo-0301") { tokensPerMessage = 4; tokensPerName = -1; } else { diff --git a/libs/langchain-azure-openai/src/embeddings.ts b/libs/langchain-azure-openai/src/embeddings.ts index 02ed6d6b9a34..c49807ad6801 100644 --- a/libs/langchain-azure-openai/src/embeddings.ts +++ b/libs/langchain-azure-openai/src/embeddings.ts @@ -21,6 +21,8 @@ export class AzureOpenAIEmbeddings { modelName = "text-embedding-ada-002"; + model = "text-embedding-ada-002"; + batchSize = 512; stripNewLines = false; @@ -31,6 +33,8 @@ export class AzureOpenAIEmbeddings azureOpenAIApiKey?: string; + apiKey?: string; + azureOpenAIEndpoint?: string; azureOpenAIApiDeploymentName?: string; @@ -61,20 +65,22 @@ export class AzureOpenAIEmbeddings fields?.openAIApiKey ?? getEnvironmentVariable("OPENAI_API_KEY"); this.azureOpenAIApiKey = + fields?.apiKey ?? fields?.azureOpenAIApiKey ?? getEnvironmentVariable("AZURE_OPENAI_API_KEY") ?? openAiApiKey; + this.apiKey = this.azureOpenAIApiKey; const azureCredential = fields?.credentials ?? - (this.azureOpenAIApiKey === openAiApiKey - ? new OpenAIKeyCredential(this.azureOpenAIApiKey ?? "") - : new AzureKeyCredential(this.azureOpenAIApiKey ?? "")); + (this.apiKey === openAiApiKey + ? new OpenAIKeyCredential(this.apiKey ?? "") + : new AzureKeyCredential(this.apiKey ?? "")); // eslint-disable-next-line no-instanceof/no-instanceof const isOpenAIApiKey = azureCredential instanceof OpenAIKeyCredential; - if (!this.azureOpenAIApiKey && !fields?.credentials) { + if (!this.apiKey && !fields?.credentials) { throw new Error("Azure OpenAI API key not found"); } @@ -86,11 +92,12 @@ export class AzureOpenAIEmbeddings throw new Error("Azure OpenAI Deployment name not found"); } - this.modelName = fieldsWithDefaults?.modelName ?? this.modelName; + this.modelName = + fieldsWithDefaults?.model ?? fieldsWithDefaults?.modelName ?? this.model; + this.model = this.modelName; this.batchSize = - fieldsWithDefaults?.batchSize ?? - (this.azureOpenAIApiKey ? 1 : this.batchSize); + fieldsWithDefaults?.batchSize ?? (this.apiKey ? 1 : this.batchSize); this.stripNewLines = fieldsWithDefaults?.stripNewLines ?? this.stripNewLines; @@ -140,12 +147,12 @@ export class AzureOpenAIEmbeddings } private async getEmbeddings(input: string[]) { - const deploymentName = this.azureOpenAIApiDeploymentName || this.modelName; + const deploymentName = this.azureOpenAIApiDeploymentName || this.model; const res = await this.caller.call(() => this.client.getEmbeddings(deploymentName, input, { user: this.user, - model: this.modelName, + model: this.model, requestOptions: { timeout: this.timeout, }, diff --git a/libs/langchain-azure-openai/src/llms.ts b/libs/langchain-azure-openai/src/llms.ts index 0ede9cec24e6..d3c36dd0a8e7 100644 --- a/libs/langchain-azure-openai/src/llms.ts +++ b/libs/langchain-azure-openai/src/llms.ts @@ -51,6 +51,7 @@ export class AzureOpenAI< get lc_secrets(): { [key: string]: string } | undefined { return { + apiKey: "AZURE_OPENAI_API_KEY", openAIApiKey: "OPENAI_API_KEY", azureOpenAIApiKey: "AZURE_OPENAI_API_KEY", azureOpenAIEndpoint: "AZURE_OPENAI_API_ENDPOINT", @@ -86,6 +87,8 @@ export class AzureOpenAI< modelName = "gpt-3.5-turbo-instruct"; + model = "gpt-3.5-turbo-instruct"; + modelKwargs?: OpenAIInput["modelKwargs"]; batchSize = 20; @@ -94,12 +97,16 @@ export class AzureOpenAI< stop?: string[]; + stopSequences?: string[]; + user?: string; streaming = false; azureOpenAIApiKey?: string; + apiKey?: string; + azureOpenAIEndpoint?: string; azureOpenAIApiDeploymentName?: string; @@ -131,20 +138,22 @@ export class AzureOpenAI< fields?.openAIApiKey ?? getEnvironmentVariable("OPENAI_API_KEY"); this.azureOpenAIApiKey = + fields?.apiKey ?? fields?.azureOpenAIApiKey ?? getEnvironmentVariable("AZURE_OPENAI_API_KEY") ?? openAiApiKey; + this.apiKey = this.azureOpenAIApiKey; const azureCredential = fields?.credentials ?? - (this.azureOpenAIApiKey === openAiApiKey - ? new OpenAIKeyCredential(this.azureOpenAIApiKey ?? "") - : new AzureKeyCredential(this.azureOpenAIApiKey ?? "")); + (this.apiKey === openAiApiKey + ? new OpenAIKeyCredential(this.apiKey ?? "") + : new AzureKeyCredential(this.apiKey ?? "")); // eslint-disable-next-line no-instanceof/no-instanceof const isOpenAIApiKey = azureCredential instanceof OpenAIKeyCredential; - if (!this.azureOpenAIApiKey && !fields?.credentials) { + if (!this.apiKey && !fields?.credentials) { throw new Error("Azure OpenAI API key not found"); } @@ -164,11 +173,13 @@ export class AzureOpenAI< this.n = fields?.n ?? this.n; this.logprobs = fields?.logprobs; this.echo = fields?.echo; - this.stop = fields?.stop; + this.stop = fields?.stopSequences ?? fields?.stop; + this.stopSequences = this.stop; this.presencePenalty = fields?.presencePenalty ?? this.presencePenalty; this.frequencyPenalty = fields?.frequencyPenalty ?? this.frequencyPenalty; this.bestOf = fields?.bestOf ?? this.bestOf; - this.modelName = fields?.modelName ?? this.modelName; + this.modelName = fields?.model ?? fields?.modelName ?? this.model; + this.model = this.modelName; this.modelKwargs = fields?.modelKwargs ?? {}; this.streaming = fields?.streaming ?? false; this.batchSize = fields?.batchSize ?? this.batchSize; @@ -205,7 +216,7 @@ export class AzureOpenAI< options: this["ParsedCallOptions"], runManager?: CallbackManagerForLLMRun ): AsyncGenerator { - const deploymentName = this.azureOpenAIApiDeploymentName || this.modelName; + const deploymentName = this.azureOpenAIApiDeploymentName || this.model; const stream = await this.caller.call(() => this.client.streamCompletions(deploymentName, [input], { @@ -217,7 +228,7 @@ export class AzureOpenAI< n: this.n, logprobs: this.logprobs, echo: this.echo, - stop: this.stop, + stop: this.stopSequences, presencePenalty: this.presencePenalty, frequencyPenalty: this.frequencyPenalty, bestOf: this.bestOf, @@ -255,7 +266,7 @@ export class AzureOpenAI< options: this["ParsedCallOptions"], runManager?: CallbackManagerForLLMRun ): Promise { - const deploymentName = this.azureOpenAIApiDeploymentName || this.modelName; + const deploymentName = this.azureOpenAIApiDeploymentName || this.model; if (this.maxTokens === -1) { if (prompts.length !== 1) { @@ -266,7 +277,7 @@ export class AzureOpenAI< this.maxTokens = await calculateMaxTokens({ prompt: prompts[0], // Cast here to allow for other models that may not fit the union - modelName: this.modelName as TiktokenModel, + modelName: this.model as TiktokenModel, }); } @@ -288,7 +299,7 @@ export class AzureOpenAI< n: this.n, logprobs: this.logprobs, echo: this.echo, - stop: this.stop, + stop: this.stopSequences, presencePenalty: this.presencePenalty, frequencyPenalty: this.frequencyPenalty, bestOf: this.bestOf, @@ -363,7 +374,7 @@ export class AzureOpenAI< n: this.n, logprobs: this.logprobs, echo: this.echo, - stop: this.stop, + stop: this.stopSequences, presencePenalty: this.presencePenalty, frequencyPenalty: this.frequencyPenalty, bestOf: this.bestOf, diff --git a/libs/langchain-azure-openai/src/types.ts b/libs/langchain-azure-openai/src/types.ts index 113a42ae3637..5434c29d2560 100644 --- a/libs/langchain-azure-openai/src/types.ts +++ b/libs/langchain-azure-openai/src/types.ts @@ -17,8 +17,13 @@ export declare interface AzureOpenAIInput { /** * API key to use when making requests to Azure OpenAI. + * Alias for `apiKey` */ azureOpenAIApiKey?: string; + /** + * API key to use when making requests to Azure OpenAI. + */ + apiKey?: string; /** * Endpoint to use when making requests to Azure OpenAI @@ -111,12 +116,19 @@ export declare interface OpenAIBaseInput { /** A collection of textual sequences that will end completions generation. */ stop?: string[]; + /** A collection of textual sequences that will end completions generation. */ + stopSequences?: string[]; /** Whether to stream the results or not. Enabling disables tokenUsage reporting */ streaming: boolean; - /** Model name to use */ + /** + * Model name to use + * Alias for `model` + */ modelName: string; + /** Model name to use */ + model?: string; /** Holds any additional parameters that are valid to pass to {@link * https://platform.openai.com/docs/api-reference/completions/create | @@ -186,8 +198,15 @@ export interface AzureOpenAIEmbeddingsParams extends EmbeddingsParams { * The model name to provide as part of this embeddings request. * Not applicable to Azure OpenAI, where deployment information should be included in the Azure * resource URI that's connected to. + * Alias for `model` */ modelName?: string; + /** + * The model name to provide as part of this embeddings request. + * Not applicable to Azure OpenAI, where deployment information should be included in the Azure + * resource URI that's connected to. + */ + model?: string; /** * The maximum number of documents to embed in a single request. This is diff --git a/libs/langchain-cloudflare/src/embeddings.ts b/libs/langchain-cloudflare/src/embeddings.ts index faa708ca99fd..1c1ba479f8d5 100644 --- a/libs/langchain-cloudflare/src/embeddings.ts +++ b/libs/langchain-cloudflare/src/embeddings.ts @@ -16,8 +16,15 @@ export interface CloudflareWorkersAIEmbeddingsParams extends EmbeddingsParams { /** Binding */ binding: Fetcher; - /** Model name to use */ + /** + * Model name to use + * Alias for `model` + */ modelName?: string; + /** + * Model name to use + */ + model?: string; /** * The maximum number of documents to embed in a single request. @@ -34,6 +41,8 @@ export interface CloudflareWorkersAIEmbeddingsParams extends EmbeddingsParams { export class CloudflareWorkersAIEmbeddings extends Embeddings { modelName = "@cf/baai/bge-base-en-v1.5"; + model = "@cf/baai/bge-base-en-v1.5"; + batchSize = 50; stripNewLines = true; @@ -49,7 +58,8 @@ export class CloudflareWorkersAIEmbeddings extends Embeddings { ); } this.ai = new Ai(fields.binding); - this.modelName = fields.modelName ?? this.modelName; + this.modelName = fields?.model ?? fields.modelName ?? this.model; + this.model = this.modelName; this.stripNewLines = fields.stripNewLines ?? this.stripNewLines; } @@ -84,7 +94,7 @@ export class CloudflareWorkersAIEmbeddings extends Embeddings { return this.caller.call(async () => { const response: AiTextEmbeddingsOutput = await this.ai.run( // eslint-disable-next-line @typescript-eslint/no-explicit-any - this.modelName as any, + this.model as any, { text: texts, } as AiTextEmbeddingsInput diff --git a/libs/langchain-community/src/chat_models/alibaba_tongyi.ts b/libs/langchain-community/src/chat_models/alibaba_tongyi.ts index 4509132fdeac..30740cd94351 100644 --- a/libs/langchain-community/src/chat_models/alibaba_tongyi.ts +++ b/libs/langchain-community/src/chat_models/alibaba_tongyi.ts @@ -90,11 +90,18 @@ interface ChatCompletionResponse { * Interface defining the input to the ChatAlibabaTongyi class. */ interface AlibabaTongyiChatInput { - /** Model name to use. Available options are: qwen-turbo, qwen-plus, qwen-max, or Other compatible models. + /** + * Model name to use. Available options are: qwen-turbo, qwen-plus, qwen-max, or Other compatible models. + * Alias for `model` * @default "qwen-turbo" */ modelName: string; + /** Model name to use. Available options are: qwen-turbo, qwen-plus, qwen-max, or Other compatible models. + * @default "qwen-turbo" + */ + model: string; + /** Whether to stream the results or not. Defaults to false. */ streaming?: boolean; @@ -187,7 +194,7 @@ function messageToTongyiRole(message: BaseMessage): TongyiMessageRole { * }); * * const qwen = new ChatAlibabaTongyi({ - * modelName: "qwen-turbo", + * model: "qwen-turbo", * temperature: 1, * alibabaApiKey: "YOUR-API-KEY", * }); @@ -229,6 +236,8 @@ export class ChatAlibabaTongyi modelName: ChatCompletionRequest["model"]; + model: ChatCompletionRequest["model"]; + apiUrl: string; maxTokens?: number | undefined; @@ -268,7 +277,8 @@ export class ChatAlibabaTongyi this.maxTokens = fields.maxTokens; this.repetitionPenalty = fields.repetitionPenalty; this.enableSearch = fields.enableSearch; - this.modelName = fields.modelName ?? "qwen-turbo"; + this.modelName = fields?.model ?? fields.modelName ?? "qwen-turbo"; + this.model = this.modelName; } /** @@ -301,7 +311,7 @@ export class ChatAlibabaTongyi identifyingParams(): ChatCompletionRequest["parameters"] & Pick { return { - model: this.modelName, + model: this.model, ...this.invocationParams(), }; } @@ -326,7 +336,7 @@ export class ChatAlibabaTongyi let resolved = false; this.completionWithRetry( { - model: this.modelName, + model: this.model, parameters, input: { messages: messagesMapped, @@ -373,7 +383,7 @@ export class ChatAlibabaTongyi }) : await this.completionWithRetry( { - model: this.modelName, + model: this.model, parameters, input: { messages: messagesMapped, diff --git a/libs/langchain-community/src/chat_models/baiduwenxin.ts b/libs/langchain-community/src/chat_models/baiduwenxin.ts index 10bce65e4c71..ada080c560a6 100644 --- a/libs/langchain-community/src/chat_models/baiduwenxin.ts +++ b/libs/langchain-community/src/chat_models/baiduwenxin.ts @@ -58,10 +58,16 @@ interface ChatCompletionResponse { * Interface defining the input to the ChatBaiduWenxin class. */ declare interface BaiduWenxinChatInput { - /** Model name to use. Available options are: ERNIE-Bot, ERNIE-Bot-turbo, ERNIE-Bot-4 + /** + * Model name to use. Available options are: ERNIE-Bot, ERNIE-Bot-turbo, ERNIE-Bot-4 + * Alias for `model` * @default "ERNIE-Bot-turbo" */ modelName: string; + /** Model name to use. Available options are: ERNIE-Bot, ERNIE-Bot-turbo, ERNIE-Bot-4 + * @default "ERNIE-Bot-turbo" + */ + model: string; /** Whether to stream the results or not. Defaults to false. */ streaming?: boolean; @@ -77,8 +83,14 @@ declare interface BaiduWenxinChatInput { /** * API key to use when making requests. Defaults to the value of * `BAIDU_API_KEY` environment variable. + * Alias for `apiKey` */ baiduApiKey?: string; + /** + * API key to use when making requests. Defaults to the value of + * `BAIDU_API_KEY` environment variable. + */ + apiKey?: string; /** * Secret key to use when making requests. Defaults to the value of @@ -154,14 +166,14 @@ function messageToWenxinRole(message: BaseMessage): WenxinMessageRole { * @example * ```typescript * const ernieTurbo = new ChatBaiduWenxin({ - * baiduApiKey: "YOUR-API-KEY", + * apiKey: "YOUR-API-KEY", * baiduSecretKey: "YOUR-SECRET-KEY", * }); * * const ernie = new ChatBaiduWenxin({ - * modelName: "ERNIE-Bot", + * model: "ERNIE-Bot", * temperature: 1, - * baiduApiKey: "YOUR-API-KEY", + * apiKey: "YOUR-API-KEY", * baiduSecretKey: "YOUR-SECRET-KEY", * }); * @@ -187,6 +199,7 @@ export class ChatBaiduWenxin get lc_secrets(): { [key: string]: string } | undefined { return { baiduApiKey: "BAIDU_API_KEY", + apiKey: "BAIDU_API_KEY", baiduSecretKey: "BAIDU_SECRET_KEY", }; } @@ -199,6 +212,8 @@ export class ChatBaiduWenxin baiduApiKey?: string; + apiKey?: string; + baiduSecretKey?: string; accessToken: string; @@ -211,6 +226,8 @@ export class ChatBaiduWenxin modelName = "ERNIE-Bot-turbo"; + model = "ERNIE-Bot-turbo"; + apiUrl: string; temperature?: number | undefined; @@ -223,10 +240,13 @@ export class ChatBaiduWenxin super(fields ?? {}); this.baiduApiKey = - fields?.baiduApiKey ?? getEnvironmentVariable("BAIDU_API_KEY"); + fields?.apiKey ?? + fields?.baiduApiKey ?? + getEnvironmentVariable("BAIDU_API_KEY"); if (!this.baiduApiKey) { throw new Error("Baidu API key not found"); } + this.apiKey = this.baiduApiKey; this.baiduSecretKey = fields?.baiduSecretKey ?? getEnvironmentVariable("BAIDU_SECRET_KEY"); @@ -241,25 +261,26 @@ export class ChatBaiduWenxin this.topP = fields?.topP ?? this.topP; this.penaltyScore = fields?.penaltyScore ?? this.penaltyScore; - this.modelName = fields?.modelName ?? this.modelName; + this.modelName = fields?.model ?? fields?.modelName ?? this.model; + this.model = this.modelName; - if (this.modelName === "ERNIE-Bot") { + if (this.model === "ERNIE-Bot") { this.apiUrl = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions"; - } else if (this.modelName === "ERNIE-Bot-turbo") { + } else if (this.model === "ERNIE-Bot-turbo") { this.apiUrl = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/eb-instant"; - } else if (this.modelName === "ERNIE-Bot-4") { + } else if (this.model === "ERNIE-Bot-4") { this.apiUrl = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions_pro"; - } else if (this.modelName === "ERNIE-Speed-8K") { + } else if (this.model === "ERNIE-Speed-8K") { this.apiUrl = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/ernie_speed"; - } else if (this.modelName === "ERNIE-Speed-128K") { + } else if (this.model === "ERNIE-Speed-128K") { this.apiUrl = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/ernie-speed-128k"; } else { - throw new Error(`Invalid model name: ${this.modelName}`); + throw new Error(`Invalid model name: ${this.model}`); } } @@ -270,7 +291,7 @@ export class ChatBaiduWenxin * @returns The access token for making requests to the Baidu API. */ async getAccessToken(options?: this["ParsedCallOptions"]) { - const url = `https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=${this.baiduApiKey}&client_secret=${this.baiduSecretKey}`; + const url = `https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=${this.apiKey}&client_secret=${this.baiduSecretKey}`; const response = await fetch(url, { method: "POST", headers: { @@ -310,7 +331,7 @@ export class ChatBaiduWenxin */ identifyingParams() { return { - model_name: this.modelName, + model_name: this.model, ...this.invocationParams(), }; } diff --git a/libs/langchain-community/src/chat_models/fireworks.ts b/libs/langchain-community/src/chat_models/fireworks.ts index b9de098bf2b2..3bacc53f0dbb 100644 --- a/libs/langchain-community/src/chat_models/fireworks.ts +++ b/libs/langchain-community/src/chat_models/fireworks.ts @@ -33,7 +33,7 @@ export type ChatFireworksCallOptions = Partial< * ```typescript * const model = new ChatFireworks({ * temperature: 0.9, - * fireworksApiKey: "YOUR-API-KEY", + * apiKey: "YOUR-API-KEY", * }); * * const response = await model.invoke("Hello, how are you?"); @@ -52,6 +52,7 @@ export class ChatFireworks extends ChatOpenAI { get lc_secrets(): { [key: string]: string } | undefined { return { fireworksApiKey: "FIREWORKS_API_KEY", + apiKey: "FIREWORKS_API_KEY", }; } @@ -59,14 +60,27 @@ export class ChatFireworks extends ChatOpenAI { fireworksApiKey?: string; + apiKey?: string; + constructor( fields?: Partial< Omit > & - BaseChatModelParams & { fireworksApiKey?: string } + BaseChatModelParams & { + /** + * Prefer `apiKey` + */ + fireworksApiKey?: string; + /** + * The Fireworks API key to use. + */ + apiKey?: string; + } ) { const fireworksApiKey = - fields?.fireworksApiKey || getEnvironmentVariable("FIREWORKS_API_KEY"); + fields?.apiKey || + fields?.fireworksApiKey || + getEnvironmentVariable("FIREWORKS_API_KEY"); if (!fireworksApiKey) { throw new Error( @@ -76,15 +90,15 @@ export class ChatFireworks extends ChatOpenAI { super({ ...fields, - modelName: - fields?.modelName || "accounts/fireworks/models/llama-v2-13b-chat", - openAIApiKey: fireworksApiKey, + model: fields?.model || "accounts/fireworks/models/llama-v2-13b-chat", + apiKey: fireworksApiKey, configuration: { baseURL: "https://api.fireworks.ai/inference/v1", }, }); this.fireworksApiKey = fireworksApiKey; + this.apiKey = fireworksApiKey; } toJSON() { diff --git a/libs/langchain-community/src/chat_models/googlepalm.ts b/libs/langchain-community/src/chat_models/googlepalm.ts index a00959cd4fe8..d9310714f863 100644 --- a/libs/langchain-community/src/chat_models/googlepalm.ts +++ b/libs/langchain-community/src/chat_models/googlepalm.ts @@ -28,8 +28,15 @@ export interface GooglePaLMChatInput extends BaseChatModelParams { * Model Name to use * * Note: The format must follow the pattern - `models/{model}` + * Alias for `model` */ modelName?: string; + /** + * Model Name to use + * + * Note: The format must follow the pattern - `models/{model}` + */ + model?: string; /** * Controls the randomness of the output. @@ -95,7 +102,7 @@ function getMessageAuthor(message: BaseMessage) { * const model = new ChatGooglePaLM({ * apiKey: "", * temperature: 0.7, - * modelName: "models/chat-bison-001", + * model: "models/chat-bison-001", * topK: 40, * topP: 1, * examples: [ @@ -133,6 +140,8 @@ export class ChatGooglePaLM modelName = "models/chat-bison-001"; + model = "models/chat-bison-001"; + temperature?: number; // default value chosen based on model topP?: number; // default value chosen based on model @@ -148,7 +157,8 @@ export class ChatGooglePaLM constructor(fields?: GooglePaLMChatInput) { super(fields ?? {}); - this.modelName = fields?.modelName ?? this.modelName; + this.modelName = fields?.model ?? fields?.modelName ?? this.model; + this.model = this.modelName; this.temperature = fields?.temperature ?? this.temperature; if (this.temperature && (this.temperature < 0 || this.temperature > 1)) { @@ -240,7 +250,7 @@ export class ChatGooglePaLM ): Promise { const [palmMessages] = await this.client.generateMessage({ candidateCount: 1, - model: this.modelName, + model: this.model, temperature: this.temperature, topK: this.topK, topP: this.topP, diff --git a/libs/langchain-community/src/chat_models/minimax.ts b/libs/langchain-community/src/chat_models/minimax.ts index 7ac6f490e87e..4943a1cd835f 100644 --- a/libs/langchain-community/src/chat_models/minimax.ts +++ b/libs/langchain-community/src/chat_models/minimax.ts @@ -96,10 +96,17 @@ export declare interface ConfigurationParameters { * Interface defining the input to the ChatMinimax class. */ declare interface MinimaxChatInputBase { - /** Model name to use + /** + * Model name to use + * Alias for `model` * @default "abab5.5-chat" */ modelName: string; + /** + * Model name to use + * @default "abab5.5-chat" + */ + model: string; /** Whether to stream the results or not. Defaults to false. */ streaming?: boolean; @@ -115,8 +122,14 @@ declare interface MinimaxChatInputBase { /** * Secret key to use when making requests. Defaults to the value of * `MINIMAX_API_KEY` environment variable. + * Alias for `apiKey` */ minimaxApiKey?: string; + /** + * Secret key to use when making requests. Defaults to the value of + * `MINIMAX_API_KEY` environment variable. + */ + apiKey?: string; /** Amount of randomness injected into the response. Ranges * from 0 to 1 (0 is not included). Use temp closer to 0 for analytical / @@ -326,6 +339,7 @@ export class ChatMinimax get lc_secrets(): { [key: string]: string } | undefined { return { minimaxApiKey: "MINIMAX_API_KEY", + apiKey: "MINIMAX_API_KEY", minimaxGroupId: "MINIMAX_GROUP_ID", }; } @@ -336,12 +350,16 @@ export class ChatMinimax minimaxApiKey?: string; + apiKey?: string; + streaming = false; prompt?: string; modelName = "abab5.5-chat"; + model = "abab5.5-chat"; + defaultBotName?: string = "Assistant"; defaultUserName?: string = "I"; @@ -393,11 +411,14 @@ export class ChatMinimax } this.minimaxApiKey = - fields?.minimaxApiKey ?? getEnvironmentVariable("MINIMAX_API_KEY"); + fields?.apiKey ?? + fields?.minimaxApiKey ?? + getEnvironmentVariable("MINIMAX_API_KEY"); if (!this.minimaxApiKey) { throw new Error("Minimax ApiKey not found"); } + this.apiKey = this.minimaxApiKey; this.streaming = fields?.streaming ?? this.streaming; this.prompt = fields?.prompt ?? this.prompt; @@ -417,7 +438,8 @@ export class ChatMinimax this.replyConstraints = fields?.replyConstraints ?? this.replyConstraints; this.defaultBotName = fields?.defaultBotName ?? this.defaultBotName; - this.modelName = fields?.modelName ?? this.modelName; + this.modelName = fields?.model ?? fields?.modelName ?? this.model; + this.model = this.modelName; this.basePath = fields?.configuration?.basePath ?? this.basePath; this.headers = fields?.configuration?.headers ?? this.headers; this.proVersion = fields?.proVersion ?? this.proVersion; @@ -460,7 +482,7 @@ export class ChatMinimax options?: this["ParsedCallOptions"] ): Omit { return { - model: this.modelName, + model: this.model, stream: this.streaming, prompt: this.prompt, temperature: this.temperature, @@ -674,7 +696,7 @@ export class ChatMinimax method: "POST", headers: { "Content-Type": "application/json", - Authorization: `Bearer ${this.minimaxApiKey}`, + Authorization: `Bearer ${this.apiKey}`, ...this.headers, }, body: JSON.stringify(request), diff --git a/libs/langchain-community/src/chat_models/togetherai.ts b/libs/langchain-community/src/chat_models/togetherai.ts index af80edb470d6..bec0f1d8b9a3 100644 --- a/libs/langchain-community/src/chat_models/togetherai.ts +++ b/libs/langchain-community/src/chat_models/togetherai.ts @@ -29,9 +29,15 @@ export interface ChatTogetherAIInput BaseChatModelParams { /** * The TogetherAI API key to use for requests. + * Alias for `apiKey` * @default process.env.TOGETHER_AI_API_KEY */ togetherAIApiKey?: string; + /** + * The TogetherAI API key to use for requests. + * @default process.env.TOGETHER_AI_API_KEY + */ + apiKey?: string; } /** @@ -46,7 +52,7 @@ export interface ChatTogetherAIInput * ```typescript * const model = new ChatTogetherAI({ * temperature: 0.9, - * togetherAIApiKey: process.env.TOGETHER_AI_API_KEY, + * apiKey: process.env.TOGETHER_AI_API_KEY, * }); * * const response = await model.invoke([new HumanMessage("Hello there!")]); @@ -65,6 +71,7 @@ export class ChatTogetherAI extends ChatOpenAI { get lc_secrets(): { [key: string]: string } | undefined { return { togetherAIApiKey: "TOGETHER_AI_API_KEY", + apiKey: "TOGETHER_AI_API_KEY", }; } @@ -74,10 +81,21 @@ export class ChatTogetherAI extends ChatOpenAI { fields?: Partial< Omit > & - BaseChatModelParams & { togetherAIApiKey?: string } + BaseChatModelParams & { + /** + * Prefer `apiKey` + */ + togetherAIApiKey?: string; + /** + * The TogetherAI API key to use. + */ + apiKey?: string; + } ) { const togetherAIApiKey = - fields?.togetherAIApiKey || getEnvironmentVariable("TOGETHER_AI_API_KEY"); + fields?.apiKey || + fields?.togetherAIApiKey || + getEnvironmentVariable("TOGETHER_AI_API_KEY"); if (!togetherAIApiKey) { throw new Error( @@ -87,8 +105,8 @@ export class ChatTogetherAI extends ChatOpenAI { super({ ...fields, - modelName: fields?.modelName || "mistralai/Mixtral-8x7B-Instruct-v0.1", - openAIApiKey: togetherAIApiKey, + model: fields?.model || "mistralai/Mixtral-8x7B-Instruct-v0.1", + apiKey: togetherAIApiKey, configuration: { baseURL: "https://api.together.xyz/v1/", }, diff --git a/libs/langchain-community/src/chat_models/zhipuai.ts b/libs/langchain-community/src/chat_models/zhipuai.ts index e30e078b9949..d7a82279f274 100644 --- a/libs/langchain-community/src/chat_models/zhipuai.ts +++ b/libs/langchain-community/src/chat_models/zhipuai.ts @@ -93,8 +93,13 @@ interface ChatCompletionResponse extends BaseResponse { export interface ChatZhipuAIParams { /** * @default "glm-3-turbo" + * Alias for `model` */ modelName: ModelName; + /** + * @default "glm-3-turbo" + */ + model: ModelName; /** Whether to stream the results or not. Defaults to false. */ streaming?: boolean; @@ -105,9 +110,16 @@ export interface ChatZhipuAIParams { /** * API key to use when making requests. Defaults to the value of * `ZHIPUAI_API_KEY` environment variable. + * Alias for `apiKey` */ zhipuAIApiKey?: string; + /** + * API key to use when making requests. Defaults to the value of + * `ZHIPUAI_API_KEY` environment variable. + */ + apiKey?: string; + /** Amount of randomness injected into the response. Ranges * from 0 to 1 (0 is not included). Use temp closer to 0 for analytical / * multiple choice, and temp closer to 1 for creative @@ -176,6 +188,7 @@ export class ChatZhipuAI extends BaseChatModel implements ChatZhipuAIParams { get lc_secrets() { return { zhipuAIApiKey: "ZHIPUAI_API_KEY", + apiKey: "ZHIPUAI_API_KEY", }; } @@ -185,6 +198,8 @@ export class ChatZhipuAI extends BaseChatModel implements ChatZhipuAIParams { zhipuAIApiKey?: string; + apiKey?: string; + streaming: boolean; doSample?: boolean; @@ -195,6 +210,8 @@ export class ChatZhipuAI extends BaseChatModel implements ChatZhipuAIParams { modelName: ChatCompletionRequest["model"]; + model: ChatCompletionRequest["model"]; + apiUrl: string; maxTokens?: number | undefined; @@ -209,9 +226,12 @@ export class ChatZhipuAI extends BaseChatModel implements ChatZhipuAIParams { super(fields); this.zhipuAIApiKey = encodeApiKey( - fields?.zhipuAIApiKey ?? getEnvironmentVariable("ZHIPUAI_API_KEY") + fields?.apiKey ?? + fields?.zhipuAIApiKey ?? + getEnvironmentVariable("ZHIPUAI_API_KEY") ); - if (!this.zhipuAIApiKey) { + this.apiKey = this.zhipuAIApiKey; + if (!this.apiKey) { throw new Error("ZhipuAI API key not found"); } @@ -222,7 +242,8 @@ export class ChatZhipuAI extends BaseChatModel implements ChatZhipuAIParams { this.topP = fields.topP ?? 0.7; this.stop = fields.stop; this.maxTokens = fields.maxTokens; - this.modelName = fields.modelName ?? "glm-3-turbo"; + this.modelName = fields?.model ?? fields.modelName ?? "glm-3-turbo"; + this.model = this.modelName; this.doSample = fields.doSample; } @@ -231,7 +252,7 @@ export class ChatZhipuAI extends BaseChatModel implements ChatZhipuAIParams { */ invocationParams(): Omit { return { - model: this.modelName, + model: this.model, request_id: this.requestId, do_sample: this.doSample, stream: this.streaming, @@ -369,7 +390,7 @@ export class ChatZhipuAI extends BaseChatModel implements ChatZhipuAIParams { method: "POST", headers: { ...(stream ? { Accept: "text/event-stream" } : {}), - Authorization: `Bearer ${this.zhipuAIApiKey}`, + Authorization: `Bearer ${this.apiKey}`, "Content-Type": "application/json", }, body: JSON.stringify(request), diff --git a/libs/langchain-community/src/embeddings/cloudflare_workersai.ts b/libs/langchain-community/src/embeddings/cloudflare_workersai.ts index 6ba4f8071268..380db9e5b752 100644 --- a/libs/langchain-community/src/embeddings/cloudflare_workersai.ts +++ b/libs/langchain-community/src/embeddings/cloudflare_workersai.ts @@ -17,8 +17,13 @@ export interface CloudflareWorkersAIEmbeddingsParams extends EmbeddingsParams { /** Binding */ binding: Fetcher; - /** Model name to use */ + /** + * Model name to use + * Alias for `model` + */ modelName?: string; + /** Model name to use */ + model?: string; /** * The maximum number of documents to embed in a single request. @@ -36,6 +41,8 @@ export interface CloudflareWorkersAIEmbeddingsParams extends EmbeddingsParams { export class CloudflareWorkersAIEmbeddings extends Embeddings { modelName = "@cf/baai/bge-base-en-v1.5"; + model = "@cf/baai/bge-base-en-v1.5"; + batchSize = 50; stripNewLines = true; @@ -51,7 +58,8 @@ export class CloudflareWorkersAIEmbeddings extends Embeddings { ); } this.ai = new Ai(fields.binding); - this.modelName = fields.modelName ?? this.modelName; + this.modelName = fields?.model ?? fields.modelName ?? this.model; + this.model = this.modelName; this.stripNewLines = fields.stripNewLines ?? this.stripNewLines; } @@ -84,12 +92,9 @@ export class CloudflareWorkersAIEmbeddings extends Embeddings { private async runEmbedding(texts: string[]) { return this.caller.call(async () => { - const response: AiTextEmbeddingsOutput = await this.ai.run( - this.modelName, - { - text: texts, - } as AiTextEmbeddingsInput - ); + const response: AiTextEmbeddingsOutput = await this.ai.run(this.model, { + text: texts, + } as AiTextEmbeddingsInput); return response.data; }); } diff --git a/libs/langchain-community/src/embeddings/googlepalm.ts b/libs/langchain-community/src/embeddings/googlepalm.ts index 911619f2d37c..c64581c51a38 100644 --- a/libs/langchain-community/src/embeddings/googlepalm.ts +++ b/libs/langchain-community/src/embeddings/googlepalm.ts @@ -11,9 +11,17 @@ export interface GooglePaLMEmbeddingsParams extends EmbeddingsParams { /** * Model Name to use * + * Alias for `model` + * * Note: The format must follow the pattern - `models/{model}` */ modelName?: string; + /** + * Model Name to use + * + * Note: The format must follow the pattern - `models/{model}` + */ + model?: string; /** * Google Palm API key to use */ @@ -28,7 +36,7 @@ export interface GooglePaLMEmbeddingsParams extends EmbeddingsParams { * ```typescript * const model = new GooglePaLMEmbeddings({ * apiKey: "", - * modelName: "models/embedding-gecko-001", + * model: "models/embedding-gecko-001", * }); * * // Embed a single query @@ -50,12 +58,15 @@ export class GooglePaLMEmbeddings modelName = "models/embedding-gecko-001"; + model = "models/embedding-gecko-001"; + private client: TextServiceClient; constructor(fields?: GooglePaLMEmbeddingsParams) { super(fields ?? {}); - this.modelName = fields?.modelName ?? this.modelName; + this.modelName = fields?.model ?? fields?.modelName ?? this.model; + this.model = this.modelName; this.apiKey = fields?.apiKey ?? getEnvironmentVariable("GOOGLE_PALM_API_KEY"); @@ -74,7 +85,7 @@ export class GooglePaLMEmbeddings // replace newlines, which can negatively affect performance. const cleanedText = text.replace(/\n/g, " "); const res = await this.client.embedText({ - model: this.modelName, + model: this.model, text: cleanedText, }); return res[0].embedding?.value ?? []; diff --git a/libs/langchain-community/src/embeddings/hf_transformers.ts b/libs/langchain-community/src/embeddings/hf_transformers.ts index 71664790ec19..0de31abdd139 100644 --- a/libs/langchain-community/src/embeddings/hf_transformers.ts +++ b/libs/langchain-community/src/embeddings/hf_transformers.ts @@ -4,8 +4,13 @@ import { chunkArray } from "@langchain/core/utils/chunk_array"; export interface HuggingFaceTransformersEmbeddingsParams extends EmbeddingsParams { - /** Model name to use */ + /** + * Model name to use + * Alias for `model` + */ modelName: string; + /** Model name to use */ + model: string; /** * Timeout to use when making requests to OpenAI. @@ -28,7 +33,7 @@ export interface HuggingFaceTransformersEmbeddingsParams * @example * ```typescript * const model = new HuggingFaceTransformersEmbeddings({ - * modelName: "Xenova/all-MiniLM-L6-v2", + * model: "Xenova/all-MiniLM-L6-v2", * }); * * // Embed a single query @@ -48,6 +53,8 @@ export class HuggingFaceTransformersEmbeddings { modelName = "Xenova/all-MiniLM-L6-v2"; + model = "Xenova/all-MiniLM-L6-v2"; + batchSize = 512; stripNewLines = true; @@ -59,7 +66,8 @@ export class HuggingFaceTransformersEmbeddings constructor(fields?: Partial) { super(fields ?? {}); - this.modelName = fields?.modelName ?? this.modelName; + this.modelName = fields?.model ?? fields?.modelName ?? this.model; + this.model = this.modelName; this.stripNewLines = fields?.stripNewLines ?? this.stripNewLines; this.timeout = fields?.timeout; } @@ -94,7 +102,7 @@ export class HuggingFaceTransformersEmbeddings private async runEmbedding(texts: string[]) { const pipe = await (this.pipelinePromise ??= pipeline( "feature-extraction", - this.modelName + this.model )); return this.caller.call(async () => { diff --git a/libs/langchain-community/src/embeddings/minimax.ts b/libs/langchain-community/src/embeddings/minimax.ts index c7d53e8d98ed..f5c66cc378a2 100644 --- a/libs/langchain-community/src/embeddings/minimax.ts +++ b/libs/langchain-community/src/embeddings/minimax.ts @@ -8,8 +8,13 @@ import { ConfigurationParameters } from "../chat_models/minimax.js"; * defines additional parameters specific to the MinimaxEmbeddings class. */ export interface MinimaxEmbeddingsParams extends EmbeddingsParams { - /** Model name to use */ + /** + * Model name to use + * Alias for `model` + */ modelName: string; + /** Model name to use */ + model: string; /** * API key to use when making requests. Defaults to the value of @@ -20,8 +25,14 @@ export interface MinimaxEmbeddingsParams extends EmbeddingsParams { /** * Secret key to use when making requests. Defaults to the value of * `MINIMAX_API_KEY` environment variable. + * Alias for `apiKey` */ minimaxApiKey?: string; + /** + * Secret key to use when making requests. Defaults to the value of + * `MINIMAX_API_KEY` environment variable. + */ + apiKey?: string; /** * The maximum number of documents to embed in a single request. This is @@ -98,6 +109,8 @@ export class MinimaxEmbeddings { modelName = "embo-01"; + model = "embo-01"; + batchSize = 512; stripNewLines = true; @@ -106,6 +119,8 @@ export class MinimaxEmbeddings minimaxApiKey?: string; + apiKey?: string; + type: "db" | "query" = "db"; apiUrl: string; @@ -129,13 +144,17 @@ export class MinimaxEmbeddings } this.minimaxApiKey = - fields?.minimaxApiKey ?? getEnvironmentVariable("MINIMAX_API_KEY"); - - if (!this.minimaxApiKey) { + fields?.apiKey ?? + fields?.minimaxApiKey ?? + getEnvironmentVariable("MINIMAX_API_KEY"); + this.apiKey = this.minimaxApiKey; + if (!this.apiKey) { throw new Error("Minimax ApiKey not found"); } - this.modelName = fieldsWithDefaults?.modelName ?? this.modelName; + this.modelName = + fieldsWithDefaults?.model ?? fieldsWithDefaults?.modelName ?? this.model; + this.model = this.modelName; this.batchSize = fieldsWithDefaults?.batchSize ?? this.batchSize; this.type = fieldsWithDefaults?.type ?? this.type; this.stripNewLines = @@ -160,7 +179,7 @@ export class MinimaxEmbeddings const batchRequests = batches.map((batch) => this.embeddingWithRetry({ - model: this.modelName, + model: this.model, texts: batch, type: this.type, }) @@ -186,7 +205,7 @@ export class MinimaxEmbeddings */ async embedQuery(text: string): Promise { const { vectors } = await this.embeddingWithRetry({ - model: this.modelName, + model: this.model, texts: [this.stripNewLines ? text.replace(/\n/g, " ") : text], type: this.type, }); @@ -207,7 +226,7 @@ export class MinimaxEmbeddings method: "POST", headers: { "Content-Type": "application/json", - Authorization: `Bearer ${this.minimaxApiKey}`, + Authorization: `Bearer ${this.apiKey}`, ...this.headers, }, body: JSON.stringify(request), diff --git a/libs/langchain-community/src/embeddings/togetherai.ts b/libs/langchain-community/src/embeddings/togetherai.ts index 758912e5e9d1..27b3546873cb 100644 --- a/libs/langchain-community/src/embeddings/togetherai.ts +++ b/libs/langchain-community/src/embeddings/togetherai.ts @@ -15,9 +15,15 @@ export interface TogetherAIEmbeddingsParams extends EmbeddingsParams { /** * Model name to use + * Alias for `model` * @default {"togethercomputer/m2-bert-80M-8k-retrieval"} */ modelName?: string; + /** + * Model name to use + * @default {"togethercomputer/m2-bert-80M-8k-retrieval"} + */ + model?: string; /** * Timeout to use when making requests to TogetherAI. @@ -71,6 +77,8 @@ export class TogetherAIEmbeddings { modelName = "togethercomputer/m2-bert-80M-8k-retrieval"; + model = "togethercomputer/m2-bert-80M-8k-retrieval"; + apiKey: string; batchSize = 512; @@ -91,7 +99,8 @@ export class TogetherAIEmbeddings } this.apiKey = apiKey; - this.modelName = fields?.modelName ?? this.modelName; + this.modelName = fields?.model ?? fields?.modelName ?? this.model; + this.model = this.modelName; this.timeout = fields?.timeout; this.batchSize = fields?.batchSize ?? this.batchSize; this.stripNewLines = fields?.stripNewLines ?? this.stripNewLines; @@ -107,7 +116,7 @@ export class TogetherAIEmbeddings private constructBody(input: string) { const body = { - model: this?.modelName, + model: this?.model, input, }; return body; diff --git a/libs/langchain-community/src/llms/googlepalm.ts b/libs/langchain-community/src/llms/googlepalm.ts index 0839b2376aac..af2854ab9ed1 100644 --- a/libs/langchain-community/src/llms/googlepalm.ts +++ b/libs/langchain-community/src/llms/googlepalm.ts @@ -10,9 +10,17 @@ export interface GooglePaLMTextInput extends BaseLLMParams { /** * Model Name to use * + * Alias for `model` + * * Note: The format must follow the pattern - `models/{model}` */ modelName?: string; + /** + * Model Name to use + * + * Note: The format must follow the pattern - `models/{model}` + */ + model?: string; /** * Controls the randomness of the output. @@ -94,6 +102,8 @@ export class GooglePaLM extends LLM implements GooglePaLMTextInput { modelName = "models/text-bison-001"; + model = "models/text-bison-001"; + temperature?: number; // default value chosen based on model maxOutputTokens?: number; // defaults to 64 @@ -113,7 +123,8 @@ export class GooglePaLM extends LLM implements GooglePaLMTextInput { constructor(fields?: GooglePaLMTextInput) { super(fields ?? {}); - this.modelName = fields?.modelName ?? this.modelName; + this.modelName = fields?.model ?? fields?.modelName ?? this.model; + this.model = this.modelName; this.temperature = fields?.temperature ?? this.temperature; if (this.temperature && (this.temperature < 0 || this.temperature > 1)) { @@ -186,7 +197,7 @@ export class GooglePaLM extends LLM implements GooglePaLMTextInput { prompt: string ): Promise { const res = await this.client.generateText({ - model: this.modelName, + model: this.model, temperature: this.temperature, candidateCount: 1, topK: this.topK, diff --git a/libs/langchain-community/src/llms/togetherai.ts b/libs/langchain-community/src/llms/togetherai.ts index 837699e0adc8..d03d44a5c12b 100644 --- a/libs/langchain-community/src/llms/togetherai.ts +++ b/libs/langchain-community/src/llms/togetherai.ts @@ -50,8 +50,13 @@ export interface TogetherAIInputs extends BaseLLMParams { apiKey?: string; /** * The name of the model to query. + * Alias for `model` */ - modelName: string; + modelName?: string; + /** + * The name of the model to query. + */ + model?: string; /** * A decimal number that determines the degree of randomness in the response. * A value of 1 will always yield the same output. @@ -108,6 +113,7 @@ export interface TogetherAICallOptions Pick< TogetherAIInputs, | "modelName" + | "model" | "temperature" | "topP" | "topK" @@ -131,6 +137,8 @@ export class TogetherAI extends LLM { modelName: string; + model: string; + streaming = false; repetitionPenalty = 1; @@ -158,11 +166,15 @@ export class TogetherAI extends LLM { if (!apiKey) { throw new Error("TOGETHER_AI_API_KEY not found."); } + if (!inputs.model && !inputs.modelName) { + throw new Error("Model name is required for TogetherAI."); + } this.apiKey = apiKey; this.temperature = inputs?.temperature ?? this.temperature; this.topK = inputs?.topK ?? this.topK; this.topP = inputs?.topP ?? this.topP; - this.modelName = inputs.modelName; + this.modelName = inputs.model ?? inputs.modelName ?? ""; + this.model = this.modelName; this.streaming = inputs.streaming ?? this.streaming; this.repetitionPenalty = inputs.repetitionPenalty ?? this.repetitionPenalty; this.logprobs = inputs.logprobs; @@ -185,7 +197,7 @@ export class TogetherAI extends LLM { private constructBody(prompt: string, options?: this["ParsedCallOptions"]) { const body = { - model: options?.modelName ?? this?.modelName, + model: options?.model ?? options?.modelName ?? this?.model, prompt, temperature: this?.temperature ?? options?.temperature, top_k: this?.topK ?? options?.topK, diff --git a/libs/langchain-google-common/src/chat_models.ts b/libs/langchain-google-common/src/chat_models.ts index e9f794929247..bbfade9a5413 100644 --- a/libs/langchain-google-common/src/chat_models.ts +++ b/libs/langchain-google-common/src/chat_models.ts @@ -90,7 +90,6 @@ export abstract class ChatGoogleBase lc_serializable = true; - /** @deprecated Prefer `modelName` */ model = "gemini-pro"; modelName = "gemini-pro"; diff --git a/libs/langchain-google-common/src/connection.ts b/libs/langchain-google-common/src/connection.ts index 050dab3b204e..7469326af3e4 100644 --- a/libs/langchain-google-common/src/connection.ts +++ b/libs/langchain-google-common/src/connection.ts @@ -163,7 +163,6 @@ export abstract class GoogleAIConnection< extends GoogleHostConnection implements GoogleAIBaseLLMInput { - /** @deprecated Prefer `modelName` */ model: string; modelName: string; @@ -178,11 +177,12 @@ export abstract class GoogleAIConnection< ) { super(fields, caller, client, streaming); this.client = client; - this.modelName = fields?.modelName ?? fields?.model ?? this.modelName; + this.modelName = fields?.model ?? fields?.modelName ?? this.model; + this.model = this.modelName; } get modelFamily(): GoogleLLMModelFamily { - if (this.modelName.startsWith("gemini")) { + if (this.model.startsWith("gemini")) { return "gemini"; } else { return null; @@ -201,14 +201,14 @@ export abstract class GoogleAIConnection< async buildUrlGenerativeLanguage(): Promise { const method = await this.buildUrlMethod(); - const url = `https://generativelanguage.googleapis.com/${this.apiVersion}/models/${this.modelName}:${method}`; + const url = `https://generativelanguage.googleapis.com/${this.apiVersion}/models/${this.model}:${method}`; return url; } async buildUrlVertex(): Promise { const projectId = await this.client.getProjectId(); const method = await this.buildUrlMethod(); - const url = `https://${this.endpoint}/${this.apiVersion}/projects/${projectId}/locations/${this.location}/publishers/google/models/${this.modelName}:${method}`; + const url = `https://${this.endpoint}/${this.apiVersion}/projects/${projectId}/locations/${this.location}/publishers/google/models/${this.model}:${method}`; return url; } diff --git a/libs/langchain-google-common/src/llms.ts b/libs/langchain-google-common/src/llms.ts index a64da4efc9a3..87904a7ab117 100644 --- a/libs/langchain-google-common/src/llms.ts +++ b/libs/langchain-google-common/src/llms.ts @@ -87,6 +87,8 @@ export abstract class GoogleBaseLLM modelName = "gemini-pro"; + model = "gemini-pro"; + temperature = 0.7; maxOutputTokens = 1024; diff --git a/libs/langchain-google-common/src/tests/chat_models.test.ts b/libs/langchain-google-common/src/tests/chat_models.test.ts index eee6b4b5b40c..bd79dee5cf22 100644 --- a/libs/langchain-google-common/src/tests/chat_models.test.ts +++ b/libs/langchain-google-common/src/tests/chat_models.test.ts @@ -331,7 +331,7 @@ describe("Mock ChatGoogle", () => { }; const model = new ChatGoogle({ authOptions, - modelName: "gemini-pro-vision", + model: "gemini-pro-vision", }); const message: MessageContentComplex[] = [ diff --git a/libs/langchain-google-common/src/tests/llms.test.ts b/libs/langchain-google-common/src/tests/llms.test.ts index 092380eb8654..6b72dcd1a207 100644 --- a/libs/langchain-google-common/src/tests/llms.test.ts +++ b/libs/langchain-google-common/src/tests/llms.test.ts @@ -387,7 +387,7 @@ describe("Mock Google LLM", () => { const model = new GoogleLLM({ authOptions, - modelName: "gemini-pro-vision", + model: "gemini-pro-vision", }); const message: MessageContentComplex[] = [ @@ -439,7 +439,7 @@ describe("Mock Google LLM", () => { const model = new GoogleLLM({ authOptions, - modelName: "gemini-pro-vision", + model: "gemini-pro-vision", }); const message: MessageContentComplex[] = [ @@ -491,7 +491,7 @@ describe("Mock Google LLM", () => { }; const model = new GoogleLLM({ authOptions, - modelName: "gemini-pro-image", + model: "gemini-pro-image", }); const message: MessageContentComplex[] = [ diff --git a/libs/langchain-google-common/src/types.ts b/libs/langchain-google-common/src/types.ts index f004bb153725..fc73afda4453 100644 --- a/libs/langchain-google-common/src/types.ts +++ b/libs/langchain-google-common/src/types.ts @@ -48,9 +48,12 @@ export interface GoogleAISafetySetting { } export interface GoogleAIModelParams { - /** @deprecated Prefer `modelName` */ - model?: string; /** Model to use */ + model?: string; + /** + * Model to use + * Alias for `model` + */ modelName?: string; /** Sampling temperature to use */ diff --git a/libs/langchain-google-common/src/utils/common.ts b/libs/langchain-google-common/src/utils/common.ts index a0aa100d8785..3bf41000653b 100644 --- a/libs/langchain-google-common/src/utils/common.ts +++ b/libs/langchain-google-common/src/utils/common.ts @@ -21,8 +21,9 @@ export function copyAIModelParamsInto( target: GoogleAIModelParams ): GoogleAIModelRequestParams { const ret: GoogleAIModelRequestParams = target || {}; - - ret.modelName = options?.modelName ?? params?.modelName ?? target.modelName; + const model = options?.model ?? params?.model ?? target.model; + ret.modelName = + model ?? options?.modelName ?? params?.modelName ?? target.modelName; ret.temperature = options?.temperature ?? params?.temperature ?? target.temperature; ret.maxOutputTokens = @@ -115,7 +116,8 @@ export function validateModelParams( params: GoogleAIModelParams | undefined ): void { const testParams: GoogleAIModelParams = params ?? {}; - switch (modelToFamily(testParams.modelName)) { + const model = testParams.model ?? testParams.modelName; + switch (modelToFamily(model)) { case "gemini": return validateGeminiParams(testParams); default: diff --git a/libs/langchain-google-genai/src/chat_models.ts b/libs/langchain-google-genai/src/chat_models.ts index 11395b53c13f..5e62472c4c48 100644 --- a/libs/langchain-google-genai/src/chat_models.ts +++ b/libs/langchain-google-genai/src/chat_models.ts @@ -36,9 +36,17 @@ export interface GoogleGenerativeAIChatInput extends BaseChatModelParams { /** * Model Name to use * + * Alias for `model` + * * Note: The format must follow the pattern - `{model}` */ modelName?: string; + /** + * Model Name to use + * + * Note: The format must follow the pattern - `{model}` + */ + model?: string; /** * Controls the randomness of the output. @@ -157,6 +165,8 @@ export class ChatGoogleGenerativeAI modelName = "gemini-pro"; + model = "gemini-pro"; + temperature?: number; // default value chosen based on model maxOutputTokens?: number; @@ -176,14 +186,17 @@ export class ChatGoogleGenerativeAI private client: GenerativeModel; get _isMultimodalModel() { - return this.modelName.includes("vision"); + return this.model.includes("vision"); } constructor(fields?: GoogleGenerativeAIChatInput) { super(fields ?? {}); this.modelName = - fields?.modelName?.replace(/^models\//, "") ?? this.modelName; + fields?.model?.replace(/^models\//, "") ?? + fields?.modelName?.replace(/^models\//, "") ?? + this.model; + this.model = this.modelName; this.maxOutputTokens = fields?.maxOutputTokens ?? this.maxOutputTokens; @@ -237,7 +250,7 @@ export class ChatGoogleGenerativeAI this.streaming = fields?.streaming ?? this.streaming; this.client = new GenerativeAI(this.apiKey).getGenerativeModel({ - model: this.modelName, + model: this.model, safetySettings: this.safetySettings as SafetySetting[], generationConfig: { candidateCount: 1, diff --git a/libs/langchain-google-genai/src/embeddings.ts b/libs/langchain-google-genai/src/embeddings.ts index d8ce913467c6..42c157b15993 100644 --- a/libs/langchain-google-genai/src/embeddings.ts +++ b/libs/langchain-google-genai/src/embeddings.ts @@ -12,9 +12,17 @@ export interface GoogleGenerativeAIEmbeddingsParams extends EmbeddingsParams { /** * Model Name to use * + * Alias for `model` + * * Note: The format must follow the pattern - `{model}` */ modelName?: string; + /** + * Model Name to use + * + * Note: The format must follow the pattern - `{model}` + */ + model?: string; /** * Type of task for which the embedding will be used @@ -71,6 +79,8 @@ export class GoogleGenerativeAIEmbeddings modelName = "embedding-001"; + model = "embedding-001"; + taskType?: TaskType; title?: string; @@ -85,7 +95,10 @@ export class GoogleGenerativeAIEmbeddings super(fields ?? {}); this.modelName = - fields?.modelName?.replace(/^models\//, "") ?? this.modelName; + fields?.model?.replace(/^models\//, "") ?? + fields?.modelName?.replace(/^models\//, "") ?? + this.modelName; + this.model = this.modelName; this.taskType = fields?.taskType ?? this.taskType; @@ -108,7 +121,7 @@ export class GoogleGenerativeAIEmbeddings } this.client = new GoogleGenerativeAI(this.apiKey).getGenerativeModel({ - model: this.modelName, + model: this.model, }); } diff --git a/libs/langchain-groq/src/chat_models.ts b/libs/langchain-groq/src/chat_models.ts index a2465714070d..d02848b8f808 100644 --- a/libs/langchain-groq/src/chat_models.ts +++ b/libs/langchain-groq/src/chat_models.ts @@ -69,14 +69,26 @@ export interface ChatGroqInput extends BaseChatModelParams { apiKey?: string; /** * The name of the model to use. + * Alias for `model` * @default "llama2-70b-4096" */ modelName?: string; + /** + * The name of the model to use. + * @default "llama2-70b-4096" + */ + model?: string; /** * Up to 4 sequences where the API will stop generating further tokens. The * returned text will not contain the stop sequence. + * Alias for `stopSequences` */ stop?: string | null | Array; + /** + * Up to 4 sequences where the API will stop generating further tokens. The + * returned text will not contain the stop sequence. + */ + stopSequences?: Array; /** * Whether or not to stream responses. */ @@ -208,10 +220,14 @@ export class ChatGroq extends BaseChatModel { modelName = "llama2-70b-4096"; + model = "llama2-70b-4096"; + temperature = 0.7; stop?: string[]; + stopSequences?: string[]; + maxTokens?: number; streaming = false; @@ -247,10 +263,14 @@ export class ChatGroq extends BaseChatModel { dangerouslyAllowBrowser: true, }); this.temperature = fields?.temperature ?? this.temperature; - this.modelName = fields?.modelName ?? this.modelName; + this.modelName = fields?.model ?? fields?.modelName ?? this.model; + this.model = this.modelName; this.streaming = fields?.streaming ?? this.streaming; this.stop = - (typeof fields?.stop === "string" ? [fields.stop] : fields?.stop) ?? []; + fields?.stopSequences ?? + (typeof fields?.stop === "string" ? [fields.stop] : fields?.stop) ?? + []; + this.stopSequences = this.stop; this.maxTokens = fields?.maxTokens; } @@ -288,8 +308,8 @@ export class ChatGroq extends BaseChatModel { } return { ...params, - stop: options.stop ?? this.stop, - model: this.modelName, + stop: options.stop ?? this.stopSequences, + model: this.model, temperature: this.temperature, max_tokens: this.maxTokens, }; diff --git a/libs/langchain-mistralai/src/chat_models.ts b/libs/langchain-mistralai/src/chat_models.ts index 2521aa7542c3..9ccf29979ba4 100644 --- a/libs/langchain-mistralai/src/chat_models.ts +++ b/libs/langchain-mistralai/src/chat_models.ts @@ -110,9 +110,15 @@ export interface ChatMistralAIInput extends BaseChatModelParams { apiKey?: string; /** * The name of the model to use. + * Alias for `model` * @default {"mistral-small-latest"} */ modelName?: string; + /** + * The name of the model to use. + * @default {"mistral-small-latest"} + */ + model?: string; /** * Override the default endpoint. */ @@ -153,8 +159,13 @@ export interface ChatMistralAIInput extends BaseChatModelParams { safePrompt?: boolean; /** * The seed to use for random sampling. If set, different calls will generate deterministic results. + * Alias for `seed` */ randomSeed?: number; + /** + * The seed to use for random sampling. If set, different calls will generate deterministic results. + */ + seed?: number; } function convertMessagesToMistralMessages( @@ -304,6 +315,8 @@ export class ChatMistralAI< modelName = "mistral-small-latest"; + model = "mistral-small-latest"; + apiKey: string; endpoint?: string; @@ -325,6 +338,8 @@ export class ChatMistralAI< randomSeed?: number; + seed?: number; + lc_serializable = true; constructor(fields?: ChatMistralAIInput) { @@ -343,8 +358,10 @@ export class ChatMistralAI< this.maxTokens = fields?.maxTokens ?? this.maxTokens; this.safeMode = fields?.safeMode ?? this.safeMode; this.safePrompt = fields?.safePrompt ?? this.safePrompt; - this.randomSeed = fields?.randomSeed ?? this.randomSeed; - this.modelName = fields?.modelName ?? this.modelName; + this.randomSeed = fields?.seed ?? fields?.randomSeed ?? this.seed; + this.seed = this.randomSeed; + this.modelName = fields?.model ?? fields?.modelName ?? this.model; + this.model = this.modelName; } _llmType() { @@ -367,12 +384,12 @@ export class ChatMistralAI< }) .flat(); const params: Omit = { - model: this.modelName, + model: this.model, tools: mistralAITools, temperature: this.temperature, maxTokens: this.maxTokens, topP: this.topP, - randomSeed: this.randomSeed, + randomSeed: this.seed, safeMode: this.safeMode, safePrompt: this.safePrompt, toolChoice: tool_choice, diff --git a/libs/langchain-mistralai/src/embeddings.ts b/libs/langchain-mistralai/src/embeddings.ts index 64c313adea92..f750f53cf5a8 100644 --- a/libs/langchain-mistralai/src/embeddings.ts +++ b/libs/langchain-mistralai/src/embeddings.ts @@ -15,9 +15,15 @@ export interface MistralAIEmbeddingsParams extends EmbeddingsParams { apiKey?: string; /** * The name of the model to use. + * Alias for `model`. * @default {"mistral-embed"} */ modelName?: string; + /** + * The name of the model to use. + * @default {"mistral-embed"} + */ + model?: string; /** * The format of the output data. * @default {"float"} @@ -49,6 +55,8 @@ export class MistralAIEmbeddings { modelName = "mistral-embed"; + model = "mistral-embed"; + encodingFormat = "float"; batchSize = 512; @@ -67,7 +75,8 @@ export class MistralAIEmbeddings } this.apiKey = apiKey; this.endpoint = fields?.endpoint; - this.modelName = fields?.modelName ?? this.modelName; + this.modelName = fields?.model ?? fields?.modelName ?? this.model; + this.model = this.modelName; this.encodingFormat = fields?.encodingFormat ?? this.encodingFormat; this.batchSize = fields?.batchSize ?? this.batchSize; this.stripNewLines = fields?.stripNewLines ?? this.stripNewLines; @@ -129,7 +138,7 @@ export class MistralAIEmbeddings const client = new MistralClient(this.apiKey, this.endpoint); return this.caller.call(async () => { const res = await client.embeddings({ - model: this.modelName, + model: this.model, input, }); return res; diff --git a/libs/langchain-nomic/src/embeddings.ts b/libs/langchain-nomic/src/embeddings.ts index 6d38a167db6e..0c168c00ef63 100644 --- a/libs/langchain-nomic/src/embeddings.ts +++ b/libs/langchain-nomic/src/embeddings.ts @@ -21,9 +21,15 @@ export interface NomicEmbeddingsParams extends EmbeddingsParams { apiKey?: string; /** * The name of the model to use. + * Alias for `model` * @default {"nomic-embed-text-v1"} */ modelName?: string; + /** + * The name of the model to use. + * @default {"nomic-embed-text-v1"} + */ + model?: string; /** * The task your embeddings should be specialized for: * search_query, search_document, clustering, classification. @@ -65,6 +71,8 @@ export class NomicEmbeddings { modelName = "nomic-embed-text-v1"; + model = "nomic-embed-text-v1"; + taskType: EmbeddingTaskType = "search_document"; batchSize = 400; @@ -88,7 +96,8 @@ export class NomicEmbeddings throw new Error("NOMIC_API_KEY is required."); } this.client = new AtlasUser({ apiKey }); - this.modelName = fields?.modelName ?? this.modelName; + this.modelName = fields?.model ?? fields?.modelName ?? this.model; + this.model = this.modelName; this.taskType = fields?.taskType ?? this.taskType; this.batchSize = fields?.batchSize ?? this.batchSize; this.stripNewLines = fields?.stripNewLines ?? this.stripNewLines; @@ -142,7 +151,7 @@ export class NomicEmbeddings ): Promise { return this.caller.call(async () => { const result = await this.client.apiCall(`/v1/embedding/text`, "POST", { - model: this.modelName, + model: this.model, texts: Array.isArray(input) ? input : [input], task_type: this.taskType, dimensionality: this.dimensionality, diff --git a/libs/langchain-openai/src/chat_models.ts b/libs/langchain-openai/src/chat_models.ts index f44f33166065..81189df8fe79 100644 --- a/libs/langchain-openai/src/chat_models.ts +++ b/libs/langchain-openai/src/chat_models.ts @@ -230,7 +230,7 @@ export interface ChatOpenAICallOptions * // Create a new instance of ChatOpenAI with specific temperature and model name settings * const model = new ChatOpenAI({ * temperature: 0.9, - * modelName: "ft:gpt-3.5-turbo-0613:{ORG_NAME}::{MODEL_ID}", + * model: "ft:gpt-3.5-turbo-0613:{ORG_NAME}::{MODEL_ID}", * }); * * // Invoke the model with a message and await the response @@ -270,6 +270,7 @@ export class ChatOpenAI< get lc_secrets(): { [key: string]: string } | undefined { return { openAIApiKey: "OPENAI_API_KEY", + apiKey: "OPENAI_API_KEY", azureOpenAIApiKey: "AZURE_OPENAI_API_KEY", organization: "OPENAI_ORGANIZATION", }; @@ -279,6 +280,7 @@ export class ChatOpenAI< return { modelName: "model", openAIApiKey: "openai_api_key", + apiKey: "openai_api_key", azureOpenAIApiVersion: "azure_openai_api_version", azureOpenAIApiKey: "azure_openai_api_key", azureOpenAIApiInstanceName: "azure_openai_api_instance_name", @@ -300,10 +302,14 @@ export class ChatOpenAI< modelName = "gpt-3.5-turbo"; + model = "gpt-3.5-turbo"; + modelKwargs?: OpenAIChatInput["modelKwargs"]; stop?: string[]; + stopSequences?: string[]; + user?: string; timeout?: number; @@ -318,6 +324,8 @@ export class ChatOpenAI< openAIApiKey?: string; + apiKey?: string; + azureOpenAIApiVersion?: string; azureOpenAIApiKey?: string; @@ -346,13 +354,16 @@ export class ChatOpenAI< super(fields ?? {}); this.openAIApiKey = - fields?.openAIApiKey ?? getEnvironmentVariable("OPENAI_API_KEY"); + fields?.apiKey ?? + fields?.openAIApiKey ?? + getEnvironmentVariable("OPENAI_API_KEY"); + this.apiKey = this.openAIApiKey; this.azureOpenAIApiKey = fields?.azureOpenAIApiKey ?? getEnvironmentVariable("AZURE_OPENAI_API_KEY"); - if (!this.azureOpenAIApiKey && !this.openAIApiKey) { + if (!this.azureOpenAIApiKey && !this.apiKey) { throw new Error("OpenAI or Azure OpenAI API key not found"); } @@ -376,7 +387,8 @@ export class ChatOpenAI< fields?.configuration?.organization ?? getEnvironmentVariable("OPENAI_ORGANIZATION"); - this.modelName = fields?.modelName ?? this.modelName; + this.modelName = fields?.model ?? fields?.modelName ?? this.model; + this.model = this.modelName; this.modelKwargs = fields?.modelKwargs ?? {}; this.timeout = fields?.timeout; @@ -389,7 +401,8 @@ export class ChatOpenAI< this.topLogprobs = fields?.topLogprobs; this.n = fields?.n ?? this.n; this.logitBias = fields?.logitBias; - this.stop = fields?.stop; + this.stop = fields?.stopSequences ?? fields?.stop; + this.stopSequences = this?.stop; this.user = fields?.user; this.streaming = fields?.streaming ?? false; @@ -404,11 +417,11 @@ export class ChatOpenAI< if (!this.azureOpenAIApiVersion) { throw new Error("Azure OpenAI API version not found"); } - this.openAIApiKey = this.openAIApiKey ?? ""; + this.apiKey = this.apiKey ?? ""; } this.clientConfig = { - apiKey: this.openAIApiKey, + apiKey: this.apiKey, organization: this.organization, baseURL: configuration?.basePath ?? fields?.configuration?.basePath, dangerouslyAllowBrowser: true, @@ -443,7 +456,7 @@ export class ChatOpenAI< OpenAIClient.Chat.ChatCompletionCreateParams, "messages" > = { - model: this.modelName, + model: this.model, temperature: this.temperature, top_p: this.topP, frequency_penalty: this.frequencyPenalty, @@ -453,7 +466,7 @@ export class ChatOpenAI< top_logprobs: this.topLogprobs, n: this.n, logit_bias: this.logitBias, - stop: options?.stop ?? this.stop, + stop: options?.stop ?? this.stopSequences, user: this.user, stream: this.streaming, functions: options?.functions, @@ -477,7 +490,7 @@ export class ChatOpenAI< model_name: string; } & ClientOptions { return { - model_name: this.modelName, + model_name: this.model, ...this.invocationParams(), ...this.clientConfig, }; @@ -724,7 +737,7 @@ export class ChatOpenAI< let tokensPerName = 0; // From: https://github.com/openai/openai-cookbook/blob/main/examples/How_to_format_inputs_to_ChatGPT_models.ipynb - if (this.modelName === "gpt-3.5-turbo-0301") { + if (this.model === "gpt-3.5-turbo-0301") { tokensPerMessage = 4; tokensPerName = -1; } else { diff --git a/libs/langchain-openai/src/embeddings.ts b/libs/langchain-openai/src/embeddings.ts index 6b2c956623b6..4e0e0cd2227d 100644 --- a/libs/langchain-openai/src/embeddings.ts +++ b/libs/langchain-openai/src/embeddings.ts @@ -15,8 +15,13 @@ import { wrapOpenAIClientError } from "./utils/openai.js"; * defines additional parameters specific to the OpenAIEmbeddings class. */ export interface OpenAIEmbeddingsParams extends EmbeddingsParams { - /** Model name to use */ + /** + * Model name to use + * Alias for `model` + */ modelName: string; + /** Model name to use */ + model: string; /** * The number of dimensions the resulting output embeddings should have. @@ -64,6 +69,8 @@ export class OpenAIEmbeddings { modelName = "text-embedding-ada-002"; + model = "text-embedding-ada-002"; + batchSize = 512; // TODO: Update to `false` on next minor release (see: https://github.com/langchain-ai/langchainjs/pull/3612) @@ -97,7 +104,13 @@ export class OpenAIEmbeddings fields?: Partial & Partial & { verbose?: boolean; + /** + * The OpenAI API key to use. + * Alias for `apiKey`. + */ openAIApiKey?: string; + /** The OpenAI API key to use. */ + apiKey?: string; configuration?: ClientOptions; }, configuration?: ClientOptions & LegacyOpenAIInput @@ -107,6 +120,7 @@ export class OpenAIEmbeddings super(fieldsWithDefaults); let apiKey = + fieldsWithDefaults?.apiKey ?? fieldsWithDefaults?.openAIApiKey ?? getEnvironmentVariable("OPENAI_API_KEY"); @@ -139,7 +153,9 @@ export class OpenAIEmbeddings fieldsWithDefaults?.configuration?.organization ?? getEnvironmentVariable("OPENAI_ORGANIZATION"); - this.modelName = fieldsWithDefaults?.modelName ?? this.modelName; + this.modelName = + fieldsWithDefaults?.model ?? fieldsWithDefaults?.modelName ?? this.model; + this.model = this.modelName; this.batchSize = fieldsWithDefaults?.batchSize ?? (azureApiKey ? 1 : this.batchSize); this.stripNewLines = @@ -192,7 +208,7 @@ export class OpenAIEmbeddings const batchRequests = batches.map((batch) => { const params: OpenAIClient.EmbeddingCreateParams = { - model: this.modelName, + model: this.model, input: batch, }; if (this.dimensions) { @@ -221,7 +237,7 @@ export class OpenAIEmbeddings */ async embedQuery(text: string): Promise { const params: OpenAIClient.EmbeddingCreateParams = { - model: this.modelName, + model: this.model, input: this.stripNewLines ? text.replace(/\n/g, " ") : text, }; if (this.dimensions) { diff --git a/libs/langchain-openai/src/legacy.ts b/libs/langchain-openai/src/legacy.ts index 1630eb9a9bc0..cf1ed50ee7f1 100644 --- a/libs/langchain-openai/src/legacy.ts +++ b/libs/langchain-openai/src/legacy.ts @@ -113,6 +113,8 @@ export class OpenAIChat modelName = "gpt-3.5-turbo"; + model = "gpt-3.5-turbo"; + prefixMessages?: OpenAIClient.Chat.ChatCompletionMessageParam[]; modelKwargs?: OpenAIChatInput["modelKwargs"]; diff --git a/libs/langchain-openai/src/llms.ts b/libs/langchain-openai/src/llms.ts index 9ec3944c4df1..b9cb55fac806 100644 --- a/libs/langchain-openai/src/llms.ts +++ b/libs/langchain-openai/src/llms.ts @@ -87,6 +87,7 @@ export class OpenAI get lc_secrets(): { [key: string]: string } | undefined { return { openAIApiKey: "OPENAI_API_KEY", + apiKey: "OPENAI_API_KEY", azureOpenAIApiKey: "AZURE_OPENAI_API_KEY", organization: "OPENAI_ORGANIZATION", }; @@ -96,6 +97,7 @@ export class OpenAI return { modelName: "model", openAIApiKey: "openai_api_key", + apiKey: "openai_api_key", azureOpenAIApiVersion: "azure_openai_api_version", azureOpenAIApiKey: "azure_openai_api_key", azureOpenAIApiInstanceName: "azure_openai_api_instance_name", @@ -121,6 +123,8 @@ export class OpenAI modelName = "gpt-3.5-turbo-instruct"; + model = "gpt-3.5-turbo-instruct"; + modelKwargs?: OpenAIInput["modelKwargs"]; batchSize = 20; @@ -129,12 +133,16 @@ export class OpenAI stop?: string[]; + stopSequences?: string[]; + user?: string; streaming = false; openAIApiKey?: string; + apiKey?: string; + azureOpenAIApiVersion?: string; azureOpenAIApiKey?: string; @@ -160,10 +168,10 @@ export class OpenAI /** @deprecated */ configuration?: ClientOptions & LegacyOpenAIInput ) { + let model = fields?.model ?? fields?.modelName; if ( - (fields?.modelName?.startsWith("gpt-3.5-turbo") || - fields?.modelName?.startsWith("gpt-4")) && - !fields?.modelName?.includes("-instruct") + (model?.startsWith("gpt-3.5-turbo") || model?.startsWith("gpt-4")) && + !model?.includes("-instruct") ) { // eslint-disable-next-line no-constructor-return return new OpenAIChat( @@ -172,15 +180,19 @@ export class OpenAI ) as unknown as OpenAI; } super(fields ?? {}); + model = model ?? this.model; this.openAIApiKey = - fields?.openAIApiKey ?? getEnvironmentVariable("OPENAI_API_KEY"); + fields?.apiKey ?? + fields?.openAIApiKey ?? + getEnvironmentVariable("OPENAI_API_KEY"); + this.apiKey = this.openAIApiKey; this.azureOpenAIApiKey = fields?.azureOpenAIApiKey ?? getEnvironmentVariable("AZURE_OPENAI_API_KEY"); - if (!this.azureOpenAIApiKey && !this.openAIApiKey) { + if (!this.azureOpenAIApiKey && !this.apiKey) { throw new Error("OpenAI or Azure OpenAI API key not found"); } @@ -206,7 +218,8 @@ export class OpenAI fields?.configuration?.organization ?? getEnvironmentVariable("OPENAI_ORGANIZATION"); - this.modelName = fields?.modelName ?? this.modelName; + this.modelName = model; + this.model = model; this.modelKwargs = fields?.modelKwargs ?? {}; this.batchSize = fields?.batchSize ?? this.batchSize; this.timeout = fields?.timeout; @@ -219,7 +232,8 @@ export class OpenAI this.n = fields?.n ?? this.n; this.bestOf = fields?.bestOf ?? this.bestOf; this.logitBias = fields?.logitBias; - this.stop = fields?.stop; + this.stop = fields?.stopSequences ?? fields?.stop; + this.stopSequences = fields?.stopSequences; this.user = fields?.user; this.streaming = fields?.streaming ?? false; @@ -238,11 +252,11 @@ export class OpenAI if (!this.azureOpenAIApiVersion) { throw new Error("Azure OpenAI API version not found"); } - this.openAIApiKey = this.openAIApiKey ?? ""; + this.apiKey = this.apiKey ?? ""; } this.clientConfig = { - apiKey: this.openAIApiKey, + apiKey: this.apiKey, organization: this.organization, baseURL: configuration?.basePath ?? fields?.configuration?.basePath, dangerouslyAllowBrowser: true, @@ -264,7 +278,7 @@ export class OpenAI options?: this["ParsedCallOptions"] ): Omit { return { - model: this.modelName, + model: this.model, temperature: this.temperature, max_tokens: this.maxTokens, top_p: this.topP, @@ -273,7 +287,7 @@ export class OpenAI n: this.n, best_of: this.bestOf, logit_bias: this.logitBias, - stop: options?.stop ?? this.stop, + stop: options?.stop ?? this.stopSequences, user: this.user, stream: this.streaming, ...this.modelKwargs, @@ -285,7 +299,7 @@ export class OpenAI model_name: string; } & ClientOptions { return { - model_name: this.modelName, + model_name: this.model, ...this.invocationParams(), ...this.clientConfig, }; @@ -336,7 +350,7 @@ export class OpenAI params.max_tokens = await calculateMaxTokens({ prompt: prompts[0], // Cast here to allow for other models that may not fit the union - modelName: this.modelName as TiktokenModel, + modelName: this.model as TiktokenModel, }); } diff --git a/libs/langchain-openai/src/tools/dalle.ts b/libs/langchain-openai/src/tools/dalle.ts index 7ccae59dc0fd..ceff03aad2ef 100644 --- a/libs/langchain-openai/src/tools/dalle.ts +++ b/libs/langchain-openai/src/tools/dalle.ts @@ -8,14 +8,26 @@ import { Tool, ToolParams } from "@langchain/core/tools"; export interface DallEAPIWrapperParams extends ToolParams { /** * The OpenAI API key + * Alias for `apiKey` */ openAIApiKey?: string; + /** + * The OpenAI API key + */ + apiKey?: string; /** * The model to use. + * Alias for `model` * @params "dall-e-2" | "dall-e-3" * @default "dall-e-3" */ modelName?: string; + /** + * The model to use. + * @params "dall-e-2" | "dall-e-3" + * @default "dall-e-3" + */ + model?: string; /** * The style of the generated images. Must be one of vivid or natural. * Vivid causes the model to lean towards generating hyper-real and dramatic images. @@ -77,7 +89,7 @@ export class DallEAPIWrapper extends Tool { static readonly toolName = "dalle_api_wrapper"; - private modelName = "dall-e-3"; + private model = "dall-e-3"; private style: "natural" | "vivid" = "vivid"; @@ -99,7 +111,9 @@ export class DallEAPIWrapper extends Tool { constructor(fields?: DallEAPIWrapperParams) { super(fields); const openAIApiKey = - fields?.openAIApiKey ?? getEnvironmentVariable("OPENAI_API_KEY"); + fields?.apiKey ?? + fields?.openAIApiKey ?? + getEnvironmentVariable("OPENAI_API_KEY"); const organization = fields?.organization ?? getEnvironmentVariable("OPENAI_ORGANIZATION"); @@ -110,7 +124,7 @@ export class DallEAPIWrapper extends Tool { dangerouslyAllowBrowser: true, }; this.client = new OpenAIClient(clientConfig); - this.modelName = fields?.modelName ?? this.modelName; + this.model = fields?.model ?? fields?.modelName ?? this.model; this.style = fields?.style ?? this.style; this.quality = fields?.quality ?? this.quality; this.n = fields?.n ?? this.n; @@ -122,7 +136,7 @@ export class DallEAPIWrapper extends Tool { /** @ignore */ async _call(input: string): Promise { const response = await this.client.images.generate({ - model: this.modelName, + model: this.model, prompt: input, n: this.n, size: this.size, diff --git a/libs/langchain-openai/src/types.ts b/libs/langchain-openai/src/types.ts index 100004cdfe10..6580df660dbd 100644 --- a/libs/langchain-openai/src/types.ts +++ b/libs/langchain-openai/src/types.ts @@ -38,8 +38,13 @@ export declare interface OpenAIBaseInput { /** Whether to stream the results or not. Enabling disables tokenUsage reporting */ streaming: boolean; - /** Model name to use */ + /** + * Model name to use + * Alias for `model` + */ modelName: string; + /** Model name to use */ + model: string; /** Holds any additional parameters that are valid to pass to {@link * https://platform.openai.com/docs/api-reference/completions/create | @@ -48,8 +53,13 @@ export declare interface OpenAIBaseInput { // eslint-disable-next-line @typescript-eslint/no-explicit-any modelKwargs?: Record; - /** List of stop words to use when generating */ + /** + * List of stop words to use when generating + * Alias for `stopSequences` + */ stop?: string[]; + /** List of stop words to use when generating */ + stopSequences?: string[]; /** * Timeout to use when making requests to OpenAI. @@ -59,8 +69,14 @@ export declare interface OpenAIBaseInput { /** * API key to use when making requests to OpenAI. Defaults to the value of * `OPENAI_API_KEY` environment variable. + * Alias for `apiKey` */ openAIApiKey?: string; + /** + * API key to use when making requests to OpenAI. Defaults to the value of + * `OPENAI_API_KEY` environment variable. + */ + apiKey?: string; } // TODO use OpenAI.Core.RequestOptions when SDK is updated to make it available