LangChain代理

368 阅读3分钟

一、代理概述

代理(Agent)是LangChain中的一个组件,它能够调用一系列工具来完成任务。代理通过与语言模型(LLM)交互,根据任务需求选择合适的工具,并执行相应的操作。代理的工作流程可以分为以下几个步骤:

  1. 思考(Thought) :模型根据任务需求思考下一步应该做什么。
  2. 行动(Action) :模型选择一个工具并执行相应的操作。
  3. 观察(Observation) :模型观察工具执行的结果。
  4. 最终答案(Final Answer) :模型根据观察结果给出最终答案。

二、使用预定义工具

LangChain提供了一些预定义的工具,这些工具可以直接在代理中使用。以下是一个示例,展示了如何使用预定义的工具来完成任务。

示例:将中文名字转换为拼音
  1. 导入必要的模块
const { initializeAgent, AgentType } = require('langchain/agents');
const { OpenAI } = require('langchain/llms');
const { PythonREPL } = require('langchain/tools');
  1. 初始化语言模型
const llm = new OpenAI({ temperature: 0.7 });
  1. 初始化代理
const agent = initializeAgent(
    [new PythonREPL()], // 使用预定义的PythonREPL工具
    llm, // 初始化的模型
    AgentType.CHAT_ZERO_SHOT_REACT_DESCRIPTION, // 代理类型
    { handleParsingErrors: true, verbose: true } // 处理解析错误并输出中间步骤
);
  1. 使用代理执行任务
const names = ["小明", "小黄", "小红", "小蓝", "小橘", "小绿"];
const result = await agent.run(`将以下中文名字转换为拼音:${names.join(', ')}`);
console.log(result);

三、定义自己的工具并在代理中使用

在本节中,我们将创建和使用自定义时间工具。LangChain的tool函数装饰器可以应用于任何函数,将函数转化为LangChain工具,使其成为代理可调用的工具。我们需要给函数加上非常详细的文档字符串,以便代理知道在什么情况下、如何使用该函数/工具。

示例:创建自定义时间工具
  1. 定义自定义工具
const { tool } = require('langchain/agents');
const { date } = require('date-fns');

@tool
function time(text) {
    /**
     * 返回今天的日期,用于任何需要知道今天日期的问题。
     * 输入应该总是一个空字符串,
     * 这个函数将总是返回今天的日期,任何日期计算应该在这个函数之外进行。
     */
    return date.format(new Date(), 'yyyy-MM-dd');
}
  1. 初始化代理
const agent = initializeAgent(
    [time], // 将刚刚创建的时间工具加入代理
    llm, // 初始化的模型
    AgentType.CHAT_ZERO_SHOT_REACT_DESCRIPTION, // 代理类型
    { handleParsingErrors: true, verbose: true } // 处理解析错误并输出中间步骤
);
  1. 使用代理询问今天的日期
const result = await agent.run('今天的日期是?');
console.log(result);

四、总结

通过本篇文章的学习,我们掌握了如何使用LangChain构建代理,并利用预定义工具和自定义工具来完成各种任务。以下是本文的主要内容总结:

  1. 代理的工作流程

    • 思考(Thought)
    • 行动(Action)
    • 观察(Observation)
    • 最终答案(Final Answer)
  2. 使用预定义工具

    • 我们展示了如何使用LangChain提供的预定义工具,例如PythonREPL,来完成任务。通过将这些工具集成到代理中,我们可以利用它们的功能来处理复杂的问题。
    • 示例中,我们将中文名字转换为拼音,展示了如何使用预定义工具来实现这一任务。
  3. 定义和使用自定义工具

    • 我们学习了如何创建自定义工具,并将其集成到代理中。自定义工具可以针对特定任务进行优化,提供更灵活和强大的功能。
    • 示例中,我们创建了一个自定义的时间工具,用于返回今天的日期。通过将这个工具集成到代理中,我们可以轻松地获取当前日期。
  4. 代码示例

    • 预定义工具示例:将中文名字转换为拼音。
    • 自定义工具示例:创建并使用自定义时间工具来获取今天的日期。