如何使用预构建的 ReAct 智能体¶
在本操作指南中,我们将创建一个简单的 ReAct 智能体应用程序,可以检查天气。该应用程序由一个智能体(LLM)和工具组成。当我们与应用程序交互时,我们将首先调用智能体(LLM)来决定是否应该使用工具。然后我们将运行一个循环
- 如果智能体表示要采取操作(即调用工具),我们将运行工具并将结果传递回智能体
- 如果智能体没有要求运行工具,我们将完成(回复用户)
预构建智能体
请注意,这里我们将使用预构建的智能体。LangGraph 的一大优势在于您可以轻松创建自己的智能体架构。因此,虽然从这里开始快速构建智能体是可以的,但我们强烈建议您学习如何构建自己的智能体,以便您可以充分利用 LangGraph。阅读 本指南 以了解如何从头开始创建自己的 ReAct 智能体。
设置¶
首先,我们需要安装所需的软件包。
yarn add @langchain/langgraph @langchain/openai @langchain/core
本指南将使用 OpenAI 的 GPT-4o 模型。我们将选择性地设置我们的 API 密钥以用于 LangSmith 追踪,这将为我们提供一流的可观察性。
在 [ ]
已复制!
// process.env.OPENAI_API_KEY = "sk_...";
// Optional, add tracing in LangSmith
// process.env.LANGCHAIN_API_KEY = "ls__..."
// process.env.LANGCHAIN_CALLBACKS_BACKGROUND = "true";
process.env.LANGCHAIN_CALLBACKS_BACKGROUND = "true";
process.env.LANGCHAIN_TRACING_V2 = "true";
process.env.LANGCHAIN_PROJECT = "ReAct Agent: LangGraphJS";
// process.env.OPENAI_API_KEY = "sk_..."; // 可选,在 LangSmith 中添加追踪 // process.env.LANGCHAIN_API_KEY = "ls__..." // process.env.LANGCHAIN_CALLBACKS_BACKGROUND = "true"; process.env.LANGCHAIN_CALLBACKS_BACKGROUND = "true"; process.env.LANGCHAIN_TRACING_V2 = "true"; process.env.LANGCHAIN_PROJECT = "ReAct Agent: LangGraphJS";
ReAct Agent: LangGraphJS
代码¶
现在我们可以使用预构建的 createReactAgent
函数来设置我们的智能体
在 [17]
已复制!
import { ChatOpenAI } from "@langchain/openai";
import { tool } from '@langchain/core/tools';
import { z } from 'zod';
import { createReactAgent } from "@langchain/langgraph/prebuilt";
const model = new ChatOpenAI({
model: "gpt-4o",
});
const getWeather = tool((input) => {
if (['sf', 'san francisco', 'san francisco, ca'].includes(input.location.toLowerCase())) {
return 'It\'s 60 degrees and foggy.';
} else {
return 'It\'s 90 degrees and sunny.';
}
}, {
name: 'get_weather',
description: 'Call to get the current weather.',
schema: z.object({
location: z.string().describe("Location to get the weather for."),
})
})
const agent = createReactAgent({ llm: model, tools: [getWeather] });
import { ChatOpenAI } from "@langchain/openai"; import { tool } from '@langchain/core/tools'; import { z } from 'zod'; import { createReactAgent } from "@langchain/langgraph/prebuilt"; const model = new ChatOpenAI({ model: "gpt-4o", }); const getWeather = tool((input) => { if (['sf', 'san francisco', 'san francisco, ca'].includes(input.location.toLowerCase())) { return 'It\'s 60 degrees and foggy.'; } else { return 'It\'s 90 degrees and sunny.'; } }, { name: 'get_weather', description: 'Call to get the current weather.', schema: z.object({ location: z.string().describe("Location to get the weather for."), }) }) const agent = createReactAgent({ llm: model, tools: [getWeather] });
用法¶
首先,让我们可视化我们刚刚创建的图
在 [18]
已复制!
import * as tslab from "tslab";
const graph = agent.getGraph();
const image = await graph.drawMermaidPng();
const arrayBuffer = await image.arrayBuffer();
await tslab.display.png(new Uint8Array(arrayBuffer));
import * as tslab from "tslab"; const graph = agent.getGraph(); const image = await graph.drawMermaidPng(); const arrayBuffer = await image.arrayBuffer(); await tslab.display.png(new Uint8Array(arrayBuffer));
让我们使用需要工具调用的输入来运行应用程序
在 [19]
已复制!
let inputs = { messages: [{ role: "user", content: "what is the weather in SF?" }] };
let stream = await agent.stream(inputs, {
streamMode: "values",
});
for await (const { messages } of stream) {
let msg = messages[messages?.length - 1];
if (msg?.content) {
console.log(msg.content);
} else if (msg?.tool_calls?.length > 0) {
console.log(msg.tool_calls);
} else {
console.log(msg);
}
console.log("-----\n");
}
let inputs = { messages: [{ role: "user", content: "what is the weather in SF?" }] }; let stream = await agent.stream(inputs, { streamMode: "values", }); for await (const { messages } of stream) { let msg = messages[messages?.length - 1]; if (msg?.content) { console.log(msg.content); } else if (msg?.tool_calls?.length > 0) { console.log(msg.tool_calls); } else { console.log(msg); } console.log("-----\n"); }
what is the weather in sf? ----- [ { name: 'get_weather', args: { location: 'San Francisco, CA' }, type: 'tool_call', id: 'call_wfXCh5IhSp1C0Db3gaJWDbRP' } ] ----- It's 60 degrees and foggy. ----- The weather in San Francisco is currently 60 degrees and foggy. -----
现在让我们尝试一个不需要工具的问题
在 [20]
已复制!
inputs = { messages: [{ role: "user", content: "who built you?" }] };
stream = await agent.stream(inputs, {
streamMode: "values",
});
for await (
const { messages } of stream
) {
let msg = messages[messages?.length - 1];
if (msg?.content) {
console.log(msg.content);
} else if (msg?.tool_calls?.length > 0) {
console.log(msg.tool_calls);
} else {
console.log(msg);
}
console.log("-----\n");
}
inputs = { messages: [{ role: "user", content: "who built you?" }] }; stream = await agent.stream(inputs, { streamMode: "values", }); for await ( const { messages } of stream ) { let msg = messages[messages?.length - 1]; if (msg?.content) { console.log(msg.content); } else if (msg?.tool_calls?.length > 0) { console.log(msg.tool_calls); } else { console.log(msg); } console.log("-----\n"); }
who built you? ----- I was developed by OpenAI, an AI research and deployment company. -----
完美!智能体正确地没有调用任何工具,而是直接回复了用户。