教 ChatGPT 学会使用工具 —— LangChain Agent 调研

导语 “人类区别于动物的根本标志在于制造和使用工具并进行劳动。 ” Agent 赋予了大语言模型使用工具的能力。

LangChain 是一个大语言模型(LLM)驱动的应用程序框架,对 LLM 的使用进行了一些抽象和封装。其中有一些设计很巧妙,能够帮助我们更好的应用 LLM。本文主要调研了 LangChain 中的 Agent 如何将 LLM 和外部工具连接。

LLM 擅长处理语言和知识。但是也存在一些局限性,比如不擅长进行数学运算、无法从互联网上查询信息等。Agent 能够教会 LLM 使用工具从而实现更强大的功能。

下边的例子中我们提供了三个工具:搜索引擎、日历、股价查询。首先 Agent 决定解决这个问题需要按照什么样的顺序调用哪些工具,拿到工具的输出后再将工具的输出和原问题以及交给 LLM 处理,最终得到问题的答案。

在这里插入图片描述

图1 Agent 示例

制定使用工具的计划,执行这些步骤并得到问题最终解答的过程在 Langchains 中被称作 Agent。

Agent 分类

LangChains 把 Agent 分为两大类,Action Agents 和 Plan-and-Execute Agents。

名词解释

Tool: 实现特定功能的函数,输入和输出都为字符串

Action: 包含 Tool 名和 Tool 输入的结构体

Step: 包含 Action 和 Tool 输出的结构体

Action Agents

Action Agents 一次决定一个要执行的 Action,并且执行。伪代码如下:

  • 接收到用户输入
  • Agent 决定要使用的 Tool 和 Tool 的输入
  • 调用 Tool,并记录 Tool 的输出结果
  • 把 Tool 的调用历史传回给 Agent,Agent 决定下一步采取什么行动
  • 重复上边的步骤直到 Agent 决定不再使用 Tool,然后把最终结果输出给用户

Plan-and-Execute Agents

Plan-and-Execute Agents 一次性计划出所有要执行的 Actions,一次性执行所有 Actions。伪代码如下:

  • 接收到用户输入
  • Agent 决定解决这个问题需要的步骤
  • 按照上边的步骤一个一个执行,执行完毕后输出结果

MRKL Agent

我们以 Action Agents 中的 Chat MRKL Agent 为例,分析 LangChains 的实现。

MRKL 指符号神经网络,是将符号系统和神经网络结合起来。目前最广泛的实现就是,在神经网络前加一个路由器(router)或称适配器(adapter),将输入派遣到适合的神经网络上。通俗的讲就是让大模型能够调用外部工具以获得更准确的信息。

对于 MRKL Agent ,图 1 中的流程变成了下图:

在这里插入图片描述
图2 MRKL Agent

区别在于 MRKL 通过 LLM 进行计划,决定需要使用哪些工具和每个工具的输入。

LangChains 中采用 ReAct 框架 实现 MRKL。ReAct和其他方法的主要区别在于它能够将推理和行动结合起来,实现协同处理。传统的方法通常只关注推理过程,而忽略了行动的重要性。例如,在问答任务中,传统方法可能只生成答案,而不考虑如何采取行动来验证答案的正确性。相比之下,ReAct可以生成一系列与任务相关的行动,并将其与推理过程交替进行,从而更好地解决任务。

举个例子,在一个问答任务中,如果问题需要模型在维基百科上查找相关信息并进行推理,那么传统方法可能会仅仅依靠模型自身的知识库进行推理。但是ReAct可以通过生成一系列与任务相关的行动(例如打开维基百科页面、搜索特定关键字等),并将这些行动与推理过程交替进行来完成任务。这种协同处理方式可以提高模型在各种任务上的表现,并提供更好的人类可解释性和可信度。

示例分析

首先我们提出一个问题是:

Who is Olivia Wilde’s boyfriend? What is his current age raised to the 0.23 power?

对于这个问题,需要从互联网搜索 Olivia Wilde’s 的男朋友是谁,并且找到他的年龄。然后利用计算器算出 age ** 0.23 。最终给出结果。

我们来分析一下 Chat MRKL Agent 如何引导 LLM 思考和行动:

首先预设了一个 Prompt ,要求 LLM 可以使用指定工具(搜索和计算器)、按照 ReAct 框架(Thought、Action、Observation 的结构)引导 LLM 思考并行动并且按照指定格式输出结果。

为了方便测试,搜索工具 mock 实现:

scala
 代码解读

class Search extends Tool {
  // mock 搜索 API
  name = "search";
  description =
  "a search engine. useful for when you need to answer questions about current events. input should be a search query.";
  call(question = '') {
    // 带有关键词 age 时返回 27
    if(question.includes('age')) return Promise.resolve(27)
    // 带有关键词 boyfriend 时返回 Hello Kitty
    if(question.includes('boyfriend')) return Promise.resolve('Hello Kitty')
    // 其他情况不返回任何内容
}

Prompt:

vbnet
 代码解读

Answer the following questions as best you can. You have access to the following tools:

search: a search engine. useful for when you need to answer questions about current events. input should be a search query.
calculator: Useful for getting the result of a math expression. The input to this tool should be a valid mathematical expression that could be executed by a simple calculator.

The way you use the tools is by specifying a json blob, denoted below by $JSON_BLOB
Specifically, this $JSON_BLOB should have a "action" key (with the name of the tool to use) and a "action_input" key (with the input to the tool going here).
The $JSON_BLOB should only contain a SINGLE action, do NOT return a list of multiple actions. Here is an example of a valid $JSON_BLOB:

```
{
"action": "calculator",
"action_input": "1 + 2"
}
```

ALWAYS use the following format:

Question: the input question you must answer
Thought: you should always think about what to do
Action:
```
$JSON_BLOB
```
Observation: the result of the action
... (this Thought/Action/Observation can repeat N times)
Thought: I now know the final answer
Final Answer: the final answer to the original input question

Begin! Reminder to always use the exact characters `Final Answer` when responding.

Who is Olivia Wilde's boyfriend? What is his current age raised to the 0.23 power?

LLM 回答,表示需要调用 search 工具,输入是 Olivia Wilde boyfriend

vbnet
 代码解读

Thought: I need to use a search engine to find Olivia Wilde's boyfriend and then use a calculator to raise his age to the 0.23 power.
Action:
```
{
"action": "search",
"action_input": "Olivia Wilde boyfriend"
}

LangChains 代码调用搜索工具,得到结果是 Hello Kitty,带着历史记录继续向 LLM 提问

makefile
 代码解读

...(省略历史记录)
Action:
```
{
"action": "search",
"action_input": "Olivia Wilde boyfriend"
}
```

Observation: Hello Kitty
Thought:

LLM 回答, 表示答案中没有自己想要的年龄信息,要求继续用关键词 Olivia Wilde partner 调用 search 工具。

sql
 代码解读

Thought: The search result did not provide the information I needed. I need to refine my search query.
Action:
```
{
"action": "search",
"action_input": "Olivia Wilde partner"
}

LangChains 代码调用搜索工具,未得到任何结果,带着历史记录继续向 LLM 提问

makefile
 代码解读

...(省略历史记录)
Action:
```
{
"action": "search",
"action_input": "Olivia Wilde boyfriend"
}
```

Observation: undefined
Thought:

LLM 回答, 表示答案中没有自己的信息,要求进一步关键词 Olivia Wilde boyfriend age 调用 search 工具。

vbnet
 代码解读

Thought: I need to try a different approach. Maybe I can find Olivia Wilde's boyfriend's age and then use a calculator to raise it to the 0.23 power.
Action:
```
{
"action": "search",
"action_input": "Olivia Wilde boyfriend age"
}

LangChains 调用是search 工具,得到结果 27,带着历史记录继续向 LLM 提问

makefile
 代码解读

...(省略历史记录)
Action:
```
{
"action": "search",
"action_input": "Olivia Wilde boyfriend age"
}
```

Observation: 27
Thought:

LLM 回答, 表示自己已经得到了 Olivia Wilde’s boyfriend’s age 的年龄,下一步需要调用 calculator 工具 ,输入是 27^(0.23)

css
 代码解读

Now that I have found Olivia Wilde's boyfriend's age, I can use a calculator to raise it to the 0.23 power.
Action:
```
{
"action": "calculator",
"action_input": "27^(0.23)"
}
```

LangChains 代码调用 calculator 工具,得到结果 2.1340945944237553,带着历史记录继续向 LLM 提问

makefile
 代码解读

...(省略历史记录)
Action:
```
{
"action": "calculator",
"action_input": "27^(0.23)"
}
```
Observation: 2.1340945944237553
Thought:

LLM 回答, 表示自己已经得到了最终答案 2.1340945944237553

css
 代码解读
I have successfully calculated the answer to the question.
Final Answer: 2.1340945944237553

Langchainjs Agent 源码:

langchainjs/langchain/src/agents at main · hwchase17/langchainjs · GitHub

应用展望

Agent 赋予了 LLM 使用外部工具的能力,有很广阔的应用空间。与搜索引擎结合,让 LLM 能实时的从互联网上获取信息;与浏览器工具结合,让 LLM 能够使用浏览器,做一些自动化的操作;与文件系统结合,让 LLM 能与本地文件系统交互;甚至可以实现一个查询你个人信息的 Tool,与 LLM 结合就可以制作一个属于你自己的 J.A.R.V.I.S.。

如何系统的去学习大模型LLM ?

大模型时代,火爆出圈的LLM大模型让程序员们开始重新评估自己的本领。 “AI会取代那些行业?”“谁的饭碗又将不保了?”等问题热议不断。

事实上,抢你饭碗的不是AI,而是会利用AI的人。

科大讯飞、阿里、华为等巨头公司发布AI产品后,很多中小企业也陆续进场!超高年薪,挖掘AI大模型人才! 如今大厂老板们,也更倾向于会AI的人,普通程序员,还有应对的机会吗?

与其焦虑……

不如成为「掌握AI工具的技术人」,毕竟AI时代,谁先尝试,谁就能占得先机!

但是LLM相关的内容很多,现在网上的老课程老教材关于LLM又太少。所以现在小白入门就只能靠自学,学习成本和门槛很高。

针对所有自学遇到困难的同学们,我帮大家系统梳理大模型学习脉络,将这份 LLM大模型资料 分享出来:包括LLM大模型书籍、640套大模型行业报告、LLM大模型学习视频、LLM大模型学习路线、开源大模型学习教程等, 😝有需要的小伙伴,可以 扫描下方二维码领取🆓↓↓↓

👉CSDN大礼包🎁:全网最全《LLM大模型入门+进阶学习资源包》免费分享(安全链接,放心点击)👈

一、LLM大模型经典书籍

AI大模型已经成为了当今科技领域的一大热点,那以下这些大模型书籍就是非常不错的学习资源。

在这里插入图片描述

二、640套LLM大模型报告合集

这套包含640份报告的合集,涵盖了大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。(几乎涵盖所有行业)

在这里插入图片描述

三、LLM大模型系列视频教程

在这里插入图片描述

四、LLM大模型开源教程(LLaLA/Meta/chatglm/chatgpt)

在这里插入图片描述

LLM大模型学习路线

阶段1:AI大模型时代的基础理解

  • 目标:了解AI大模型的基本概念、发展历程和核心原理。

  • 内容

    • L1.1 人工智能简述与大模型起源
    • L1.2 大模型与通用人工智能
    • L1.3 GPT模型的发展历程
    • L1.4 模型工程
    • L1.4.1 知识大模型
    • L1.4.2 生产大模型
    • L1.4.3 模型工程方法论
    • L1.4.4 模型工程实践
    • L1.5 GPT应用案例

阶段2:AI大模型API应用开发工程

  • 目标:掌握AI大模型API的使用和开发,以及相关的编程技能。

  • 内容

    • L2.1 API接口
    • L2.1.1 OpenAI API接口
    • L2.1.2 Python接口接入
    • L2.1.3 BOT工具类框架
    • L2.1.4 代码示例
    • L2.2 Prompt框架
    • L2.3 流水线工程
    • L2.4 总结与展望

阶段3:AI大模型应用架构实践

  • 目标:深入理解AI大模型的应用架构,并能够进行私有化部署。

  • 内容

    • L3.1 Agent模型框架
    • L3.2 MetaGPT
    • L3.3 ChatGLM
    • L3.4 LLAMA
    • L3.5 其他大模型介绍

阶段4:AI大模型私有化部署

  • 目标:掌握多种AI大模型的私有化部署,包括多模态和特定领域模型。

  • 内容

    • L4.1 模型私有化部署概述
    • L4.2 模型私有化部署的关键技术
    • L4.3 模型私有化部署的实施步骤
    • L4.4 模型私有化部署的应用场景

这份 LLM大模型资料 包括LLM大模型书籍、640套大模型行业报告、LLM大模型学习视频、LLM大模型学习路线、开源大模型学习教程等, 😝有需要的小伙伴,可以 扫描下方二维码领取🆓↓↓↓

👉CSDN大礼包🎁:全网最全《LLM大模型入门+进阶学习资源包》免费分享(安全链接,放心点击)👈

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值