一、代理概述
代理(Agent)是LangChain中的一个组件,它能够调用一系列工具来完成任务。代理通过与语言模型(LLM)交互,根据任务需求选择合适的工具,并执行相应的操作。代理的工作流程可以分为以下几个步骤:
- 思考(Thought) :模型根据任务需求思考下一步应该做什么。
- 行动(Action) :模型选择一个工具并执行相应的操作。
- 观察(Observation) :模型观察工具执行的结果。
- 最终答案(Final Answer) :模型根据观察结果给出最终答案。
二、使用预定义工具
LangChain提供了一些预定义的工具,这些工具可以直接在代理中使用。以下是一个示例,展示了如何使用预定义的工具来完成任务。
示例:将中文名字转换为拼音
- 导入必要的模块:
const { initializeAgent, AgentType } = require('langchain/agents');
const { OpenAI } = require('langchain/llms');
const { PythonREPL } = require('langchain/tools');
- 初始化语言模型:
const llm = new OpenAI({ temperature: 0.7 });
- 初始化代理:
const agent = initializeAgent(
[new PythonREPL()], // 使用预定义的PythonREPL工具
llm, // 初始化的模型
AgentType.CHAT_ZERO_SHOT_REACT_DESCRIPTION, // 代理类型
{ handleParsingErrors: true, verbose: true } // 处理解析错误并输出中间步骤
);
- 使用代理执行任务:
const names = ["小明", "小黄", "小红", "小蓝", "小橘", "小绿"];
const result = await agent.run(`将以下中文名字转换为拼音:${names.join(', ')}`);
console.log(result);
三、定义自己的工具并在代理中使用
在本节中,我们将创建和使用自定义时间工具。LangChain的tool函数装饰器可以应用于任何函数,将函数转化为LangChain工具,使其成为代理可调用的工具。我们需要给函数加上非常详细的文档字符串,以便代理知道在什么情况下、如何使用该函数/工具。
示例:创建自定义时间工具
- 定义自定义工具:
const { tool } = require('langchain/agents');
const { date } = require('date-fns');
@tool
function time(text) {
/**
* 返回今天的日期,用于任何需要知道今天日期的问题。
* 输入应该总是一个空字符串,
* 这个函数将总是返回今天的日期,任何日期计算应该在这个函数之外进行。
*/
return date.format(new Date(), 'yyyy-MM-dd');
}
- 初始化代理:
const agent = initializeAgent(
[time], // 将刚刚创建的时间工具加入代理
llm, // 初始化的模型
AgentType.CHAT_ZERO_SHOT_REACT_DESCRIPTION, // 代理类型
{ handleParsingErrors: true, verbose: true } // 处理解析错误并输出中间步骤
);
- 使用代理询问今天的日期:
const result = await agent.run('今天的日期是?');
console.log(result);
四、总结
通过本篇文章的学习,我们掌握了如何使用LangChain构建代理,并利用预定义工具和自定义工具来完成各种任务。以下是本文的主要内容总结:
-
代理的工作流程:
- 思考(Thought)
- 行动(Action)
- 观察(Observation)
- 最终答案(Final Answer)
-
使用预定义工具:
- 我们展示了如何使用LangChain提供的预定义工具,例如
PythonREPL,来完成任务。通过将这些工具集成到代理中,我们可以利用它们的功能来处理复杂的问题。 - 示例中,我们将中文名字转换为拼音,展示了如何使用预定义工具来实现这一任务。
- 我们展示了如何使用LangChain提供的预定义工具,例如
-
定义和使用自定义工具:
- 我们学习了如何创建自定义工具,并将其集成到代理中。自定义工具可以针对特定任务进行优化,提供更灵活和强大的功能。
- 示例中,我们创建了一个自定义的时间工具,用于返回今天的日期。通过将这个工具集成到代理中,我们可以轻松地获取当前日期。
-
代码示例:
- 预定义工具示例:将中文名字转换为拼音。
- 自定义工具示例:创建并使用自定义时间工具来获取今天的日期。