Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >解密Prompt系列12. LLM Agent零微调范式 ReAct & Self Ask

解密Prompt系列12. LLM Agent零微调范式 ReAct & Self Ask

原创
作者头像
风雨中的小七
修改于 2023-08-15 00:14:30
修改于 2023-08-15 00:14:30
5.9K00
代码可运行
举报
运行总次数:0
代码可运行

这一章我们正式进入应用层面,聊聊如何把思维链和工具使用结合得到人工智能代理。

要回答我们为什么需要AI代理?代理可以解决哪些问题?可以有以下两个视角

首先是我们赋能模型,如果说LLM是大脑,那Agent提供了手脚和感官

  1. 感官:获取真实世界的信息,包括实时信息像天气情况,金融市场,交通状况;包括私有信息例如用户个人数据;包括多模态信息像声音和图像
  2. 手脚:获得和真实世界交互的能力,例如运行python脚本,调用搜索引擎,预定机票酒店。

其次是模型赋能我们,Agent加持的大模型,作为更优的数据和任务中介/代理,赋予了我们和任意数据类型交互的能力,大模型正在重构数据和信息的处理方式。从之前的结构化数据为主向更多的非结构化数据转变。

OpenAI应用研究主管LilianWeng写的LLM Powered Autonomous Agents把人工智能代理(AI Agent)分成了以下3个部分:规划模块,工具调用模块和记忆模块。

之后几章我们会聊到AI代理方案的主要差异也在这三个方向

  1. 规划:如何对问题进行拆解得到解决路径,既模型推理步骤
  2. 工具:支持哪些工具使用,如何进行工具选择,并生成调用工具的请求
  3. 记忆:短期记忆包括工具的返回值,已经完成的推理路径,长期记忆包括可访问的外部长期存储例如知识库

第一篇我们结合langchain介绍无需微调,使用few-shot,zero-shot prompt来生成推理和工具调用模板的两个方案ReAct和SelfASk。个人对langchain是又爱又恨,爱的是它集成了很多前沿的大模型应用方案,恨是感觉它有些过度封装,有点简单问题复杂设计的感觉。因此推荐使用langchain来理解每种方案的实现原理,然后脱离langchain自己写,或者只使用langchain的基础组件来实现,不要去使用它的高级API

Self Ask

Self-ask: MEASURING AND NARROWING THE COMPOSITIONALITY GAP IN LANGUAGE MODELS https://ofir.io/Self-ask-prompting/

原理

Self Ask提出了一种把问题拆解成子问题的Prompt范式,每一步模型都会自我提问是否可以把问题改写/拆解成一个简单的子问题,并进行回答,回答时可以调佣搜索工具来获得答案,然后根据工具返回结果,继续进行自我提问,直到获得最终答案。其实自我提问的推理形式并不是核心,核心是引导模型来进行问题拆解,也就是开头提到的规划能力。

论文提出之所以需要把原始的思维链改造成一步步自我提问的形式,是因为发现模型在回答复杂问题的时候,模型虽然可以正确回答其中的子问题,但是却无法回答由子问题组合起来的复杂问题,作者称之为Compositionality Gap。举个栗子:模型可以正确回答贾斯汀比伯是哪年出生的? 以及谁是94年大师赛的冠军? 但是模型无法回答谁是贾斯汀比伯出生那一年的大师赛的冠军?而通过引入问题拆解的推理方式,可以很好解决这个问题

应用

我们来看下langchain的Self Ask实现,官网Demo是直接用initialize_agent来初始化代理,这里我们把中间步骤拆解开。以下使用了SerpAPI的google搜索工具和GPT3.5,都需要先去官网申请Key

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
import os
from langchain.agents.loading import AGENT_TO_CLASS
from langchain.agents.agent import AgentExecutor
from langchain.agents import AgentType, Tool
from langchain import OpenAI, SerpAPIWrapper
## 需要科学上个网
os.environ["http_proxy"] = "http://127.0.0.1:7890"
os.environ["https_proxy"] = "http://127.0.0.1:7890"
## 定义大模型和搜索工具
llm = OpenAI(temperature=0, openai_api_key=$你的Key)
search = SerpAPIWrapper(params={
    "engine": "google",
    "gl": "us",
    "hl": "zh-cn",
}, serpapi_api_key=$你的Key)

“”“
以下的工具初始化方式对齐了Self Ask 的Prompt模板
”“”

tools = [
    Tool(
        name="Intermediate Answer",
        func=search.run,
        description="useful for when you need to ask with search"
    )
]
## 组装:初始化agent和Chain
agent_cls = AGENT_TO_CLASS[AgentType.SELF_ASK_WITH_SEARCH]
agent = agent_cls.from_llm_and_tools(llm, tools)
chain = AgentExecutor.from_agent_and_tools(agent, tools, return_intermediate_steps=True)

AGENT_TO_CLASS里面定义了所有的Agent类型,其中SelfAskWithSearchAgent是Self Ask的实现,但其实不同Agent的差异,主要是以下few-shot prompt和对应的parser不同。

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
from langchain.agents.self_ask_with_search.output_parser import SelfAskOutputParser
from langchain.agents.self_ask_with_search.prompt import PROMPT

其中Self Ask的few-shot prompt 如下,few-shot除了提供解码的格式之外,还提示了模型要对问题进行拆解

代码语言:txt
AI代码解释
复制
_DEFAULT_TEMPLATE = """Question: Who lived longer, Muhammad Ali or Alan Turing?
Are follow up questions needed here: Yes.
Follow up: How old was Muhammad Ali when he died?
Intermediate answer: Muhammad Ali was 74 years old when he died.
Follow up: How old was Alan Turing when he died?
Intermediate answer: Alan Turing was 41 years old when he died.
So the final answer is: Muhammad Ali

Question: When was the founder of craigslist born?
Are follow up questions needed here: Yes.
Follow up: Who was the founder of craigslist?
Intermediate answer: Craigslist was founded by Craig Newmark.
Follow up: When was Craig Newmark born?
Intermediate answer: Craig Newmark was born on December 6, 1952.
So the final answer is: December 6, 1952

省略2个shot

Question: {input}
Are followup questions needed here:{agent_scratchpad}"""

构建完chain我们来跑一个问题看下模型的中间返回结果

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
# chain.run是用于直接返回最终结果,直接调用callable可以返回中间过程
output =  chain("昨日A股市场涨幅最高的板块成交量如何")

以下是带中间结果的返回值,可以发现few-shot-prompt引导模型把问题"昨日A股市场涨幅最高的板块成交量如何"拆分成了,"昨日A股市场涨幅最高的板块?"并通过谷歌搜索得到是券商板块后,继续提问"券商板块昨日成交量"得到最终结果

这里只展示了一个goodcase,因为badcase太多啦哈哈~SelfAsk结果不好的两个主要原因有

  • 搜索没有返回有效结果:当前搜索引擎的返回结果并非为大模型回答设计,而还是为传统搜索引擎设计,返回结果不可用可能是抽取的文章摘要(snippet)不合理,或者排序逻辑返回的Top1答案不合适,再或者回答的时效性错误等等,这里存在很大的优化空间
  • 模型拆解问题有误:Self Ask当前主要针对组合类问题,如果你的问题拆解方式不同,需要对以上few-shot-prompt进行调整,或者进一步通过COT finetune来注入问题拆解的方式

Self Ask是一类最简单的工具调用模板,只支持单一搜索工具的使用,不支持工具选择。下面我们看下支持多种工具调用的ReAct范式~

ReAct

ReAct: SYNERGIZING REASONING AND ACTING IN LANGUAGE MODELS https://tsmatz.wordpress.com/2023/03/07/react-with-openai-gpt-and-langchain/

原理

ReAct文如其名,模型推理分成了两个部分,Reason和Action。Reason生成分析步骤,Action生成工具调用请求,二者交替进行直到得到最终的结果。和Self Ask对比,ReAct进一步把推理和工具调用进行了解耦, 在Self Ask中,自我提问既是推理步骤也是搜索工具的请求query,而在ReAct中工具调用的请求在推理步骤之后,这样可以更好的支持搜索以外的其他工具。

ReAct在文档问答上给出的few-shot-cot推理模板如下

应用

同样是AGENT_TO_CLASS,ReActDocstoreAgent和ZeroShotAgent是基于ReAct开发的。为了保持一致性,我们用和以上SelfAsk相同的方式来初始化以下两个Agent,更简洁的初始化代码详见故官网ReAct, ReAct Document Store

  • ZeroShotAgent

需要提供可以使用的工具列表,以及每种工具的描述,LLM完全基于上下文,根据工具的描述进行工具选择,适用于没有固定推理套路的场景。为了和SelfAsk对比,这里我们还是使用谷歌搜索,再额外加入Wolfram Alpha工具,代码部分只用替换工具定义的部分和agent class,其余部分完全一样。

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
"""
需要提供工具的描述description:用于工具选择和工具请求的生成
同时tool.name从selfAsk中统一的Intermediate Answer,调整为工具本身的名称用于生成工具调用的前缀
"""
import os
from langchain.agents.loading import AGENT_TO_CLASS
from langchain.agents.agent import AgentExecutor
from langchain.agents import AgentType, Tool
from langchain import OpenAI, SerpAPIWrapper
from langchain.utilities.wolfram_alpha import WolframAlphaAPIWrapper
## 需要科学上个网
os.environ["http_proxy"] = "http://127.0.0.1:7890"
os.environ["https_proxy"] = "http://127.0.0.1:7890"
os.environ["WOLFRAM_ALPHA_APPID"] = "你的key"
## 定义大模型和搜索工具
llm = OpenAI(temperature=0, openai_api_key=$你的key)
search = SerpAPIWrapper(params={
    "engine": "google",
    "gl": "us",
    "hl": "zh-cn",
}, serpapi_api_key=$你的key)
wolfram = WolframAlphaAPIWrapper()
tools = [
    Tool(
        name="搜索",
        description="搜索引擎,当你需要回答当前问题的时候调用,输入是检索query",
        func=search.run
    ),
    Tool(
        name="Wolfram",
        description="Wolfram Alpha,当你需要回答和数学,科学,科技,文化,社会,日常生活相关的问题时调用,输入是检索query",
        func=wolfram.run
    ),
]
agent_cls = AGENT_TO_CLASS[AgentType.ZERO_SHOT_REACT_DESCRIPTION ]
agent = agent_cls.from_llm_and_tools(llm, tools)
chain = AgentExecutor.from_agent_and_tools(agent, tools, return_intermediate_steps=True)
output = chain("昨日A股市场涨幅最高的板块成交量多少") #chain.run不能返回中间结果,直接调用可以返回中间过程

加入谷歌搜索和Wolfram工具后,zero-shot prompt如下,包含工具的描述和Action部分可以调用的工具列表。

继续问:昨日A股市场涨幅最高的板块成交量如何?因为没有few-shot拆解问题的指引,只有以上zero-shot去描述工具选择,因此模型并没有正确拆解问题,不过正确选择了搜索工具。

当我们提问wolfram可以解决的问题领域,例如求解几何面积时,大模型会选择调用Wolfram来解决数学问题。

  • ReActDocstoreAgent

适用于文档问答的固定推理模板+固定工具使用,论文定义了两种工具Search检索,和Lookup在文档中查找关键词所在的句子。DocStore因为推理模板固定,可用的场景比较有限,我们就做不测试了,大家可以直接去看官网给出的Demo。

ReAct虽然本身是可以不经过模型指令微调直接使用的,但论文中也提出指令微调后效果会有提升,不过微调的方案我们会单独放一章来说。

总结

看完了SelfAsk和React的实现,不难发现二者存在一些局限性

  • 更适合简单的工具调用:这里的简单是指工具的输入和上文的文本语义比较符合,工具输入比较“自然语言”风格例如搜索。高度结构化和符号化的工具输入,使用Prompt实现,准确率比较有限。
  • 更适合少量的工具组合:受限于Prompt上文的长度,不能把几十个工具prompt全塞进去,因此更适合少量的工具组合一般是3~5个以内
  • 规划能力:在问题拆解上few-shot的效果会比zero-shot要好,不过要支持特定的问题拆解逻辑需要定制化领域few-shot。如果逻辑过于复杂或者多样性较高,只依赖固定prompt的效果也会比较一般。
  • 串行计算延时高:SelfAsk和React都是串行推理逻辑,每一步推理和工具调用都依赖上一步的推理结果,导致整体计算耗时太长。针对这个问题可以看下ReWOO提出的并行推理+槽位填充的方案~

针对更复杂多样的工具组合调用,和更有针对性/复杂的模型规划能力,我们下一章介绍基于指令微调的工具调用方案。

想看更全的大模型相关论文梳理·微调及预训练数据和框架·AIGC应用,移步Github >> DecryPrompt


Reference

  1. https://towardsdatascience.com/all-you-need-to-know-to-build-your-first-llm-app-eb982c78ffac#d5e4
  2. https://lilianweng.github.io/posts/2023-06-23-agent/
  3. MRKL Systems. A modular, neuro-symbolic architecture that combines large language, models, external knowledge sources and discrete reasoning
  4. ReWOO: Decoupling Reasoning from Observations for Efficient Augmented Language Models
  5. 拾象投研机构对LLM的调研报告(文中有两次PPT的申请链接)

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【LangChain系列6】【Agent模块详解】
总结: LangChain是一个用于开发由LLM支持的应用程序的框架,通过提供标准化且丰富的模块抽象,构建LLM的输入输出规范,主要是利用其核心概念chains,可以灵活地链接整个应用开发流程。(即,其中的每个模块抽象,都是源于对大模型的深入理解和实践经验,由许多开发者提供出来的标准化流程和解决方案的抽象,再通过灵活的模块化组合,才得到了langchain)
知冷煖
2025/01/13
6280
当下LLM中最火的思维链、LangChain 库等,这本书里都有
ChatGPT 不仅将改变我们日常的生活、工作和思维方式,而且将引领人类以前所未有的速度逼近通用人工智能。我们普通人能通过使用提示词让ChatGPT为我们做各种事情,如高效写代码:
博文视点Broadview
2023/09/07
1.2K0
当下LLM中最火的思维链、LangChain 库等,这本书里都有
【LangChain系列】第三节:Agent代理
大型语言模型 (LLM) 已成为能够理解和生成类似人类文本的有用 AI 系统。然而,它们的真正潜力在于它们能够充当推理引擎,处理新信息和回答复杂问题。LangChain的代理通过允许LLM与各种工具和数据库进行交互,协助推理和决策任务来释放这种潜力。在这篇博文中,我们将深入探讨LangChain的代理,探索如何使用内置工具配置它们并创建自定义工具来扩展其功能。
Freedom123
2024/05/19
6380
LangChain Agent:赋予 LLM 行动力的神秘力量
丹尼尔:蛋兄,我又来了。今天主要想跟你深入了解下 LangChain 中的 Agent
蛋先生DX
2024/04/02
1.1K1
LangChain Agent:赋予 LLM 行动力的神秘力量
LangChain Tools & Agent: Multimode 集成深度解析
在人工智能(AI)快速发展的今天,各种工具和框架层出不穷,为开发者提供了丰富的选择和便利。其中,LangChain作为一款强大的应用开发框架,凭借其灵活性和可扩展性,在AI领域受到了广泛的关注和应用。本文旨在深入探讨LangChain的工具(Tools)和代理(Agent)模块,特别是它们的多模式集成能力,包括数据处理、任务管理、插件使用等。通过本文的学习,读者将能够深入理解LangChain的工作原理,掌握其常规用法,并学会使用Java实现具体的功能。
小马哥学JAVA
2024/12/20
1800
LangChain:打造自己的LLM应用
导读 随着LLM的技术发展,其在业务上的应用越来越关键,通过LangChain大大降低了LLM应用开发的门槛。本文通过介绍LangChain是什么,LangChain的核心组件以及LangChain在实际场景下的使用方式,希望帮助大家能快速上手LLM应用的开发。
京东技术
2023/11/05
2.1K0
LangChain:打造自己的LLM应用
如何基于OpenAI大模型搭建提示词工程
前言:这是一篇很好地讲解了提示词工程的文章,提示词是fine tune大模型的一种比较经济适用的方式,基于提示词搭建一套agent可能是能形成未来生产力的关键一环。
山行AI
2023/09/08
9720
如何基于OpenAI大模型搭建提示词工程
大模型应用框架-LangChain
LangChain由 Harrison Chase 创建于2022年10月,它是围绕LLMs(大语言模型)建立的一个框架,LLMs使用机器学习算法和海量数据来分析和理解自然语言,GPT3.5、GPT4是LLMs最先进的代表,国内百度的文心一言、阿里的通义千问也属于LLMs。LangChain自身并不开发LLMs,它的核心理念是为各种LLMs实现通用的接口,把LLMs相关的组件“链接”在一起,简化LLMs应用的开发难度,方便开发者快速地开发复杂的LLMs应用。 LangChain目前有两个语言的实现:python、nodejs。
@小森
2024/06/04
3510
AI大模型全栈工程师课程笔记 - LangChain
LangChain 也是面向LLM的开发框架SDK,有 python 和 js 版的 https://python.langchain.com/docs/get_started
Michael阿明
2023/12/21
1.5K0
AI大模型全栈工程师课程笔记 - LangChain
解密Prompt系列14. LLM Agent之搜索应用设计:WebGPT & WebGLM & WebCPM
前两章,我们分别介绍了基于微调和prompt的工具调用方案,核心都是如何让大模型和工具进行交互,包括生成工具调用语句和处理工具调用请求。不过在实际应用中,想要设计一个可以落地的LLM Agent,需要更全面整体的系统设计。本章我们以搜索工具为例,介绍如何更好和搜索引擎进行交互的LLM Agent。
风雨中的小七
2023/08/31
3.3K0
解密Prompt系列14. LLM Agent之搜索应用设计:WebGPT & WebGLM & WebCPM
LangChain 学习路线图:从入门到实战的完整指南
在大型语言模型(LLM)如 ChatGPT、Claude 等快速发展的今天,开发者不仅希望能“使用”这些模型,还希望能将它们灵活集成到自己的应用中,实现更强大的对话能力、搜索增强问答(RAG)、工具调用(Tool Calling)、多轮推理等功能。
IT蜗壳-Tango
2025/04/08
7960
独家 | 开始使用LangChain:帮助你构建LLM驱动应用的新手教程
自从ChatGPT发布以来,大型语言模型 (LLMs) 已经获得了很大的普及。尽管你可能没有足够的资金和计算资源在你的地下室从头开始训练一个LLM,但你仍然可以使用预先训练的LLMs来构建一些很酷的东西,例如:
数据派THU
2023/08/08
1.4K0
独家 | 开始使用LangChain:帮助你构建LLM驱动应用的新手教程
LangChain库
链是通过以逻辑方式连接一个或多个大型语言模型(LLMs)而获得的。(链可以由LLMs之外的实体构建,但为了简单起见,让我们暂时使用这个定义)。
磐创AI
2024/03/12
3540
LangChain库
一文入门最热的LLM应用开发框架LangChain
LangChain 的作者是 Harrison Chase,最初是于 2022 年 10 月开源的一个项目,在 GitHub 上获得大量关注之后迅速转变为一家初创公司。2017 年 Harrison Chase 还在哈佛上大学,如今已是硅谷的一家热门初创公司的 CEO,这对他来说是一次重大而迅速的跃迁。Insider 独家报道,人工智能初创公司 LangChain 在种子轮一周后,再次获得红杉领投的 2000 万至 2500 万美元融资,估值达到 2 亿美元。
腾讯技术工程官方号
2023/08/18
3.4K1
一文入门最热的LLM应用开发框架LangChain
ChatGPT|LangChain Agent原理介绍
关于LangChain的介绍,可以参考上一篇文章(ChatGPT|LangChain介绍),本文主要详细介绍Agent的原理,LangChain是如何和ChatGPT结合实现问题拆分的。
用户1904552
2023/04/17
2.3K0
ChatGPT|LangChain Agent原理介绍
【AIGC】LangChain Agent最全教程学习
LangChain Agent的终极指南,本教程是您使用 Python 创建第一个agent的重要指南,请立即开始你的 LLM 开发之旅。
Freedom123
2024/05/05
1.8K0
洞悉LangChain:LangChain工程化设计,从API到智能Agent的全面探索
LangChain 是 2022 年 10 月底,由哈佛大学的 Harrison Chase 发起的基于开源大语言模型的 AI 工程开发框架。当然也可以问一下 AI:
汀丶人工智能
2024/07/25
1.2K0
洞悉LangChain:LangChain工程化设计,从API到智能Agent的全面探索
初识langchain[1]:Langchain实战教学,利用qwen2.1与GLM-4大模型构建智能解决方案[含Agent、tavily面向AI搜索]
大模型三大重点:算力、数据、算法,ReAct (reason推理+act行动)–思维链
汀丶人工智能
2024/07/25
1.5K0
初识langchain[1]:Langchain实战教学,利用qwen2.1与GLM-4大模型构建智能解决方案[含Agent、tavily面向AI搜索]
我为什么放弃了 LangChain?
如果你关注了过去几个月中人工智能的爆炸式发展,那你大概率听说过 LangChain。
机器之心
2023/08/08
1.2K0
我为什么放弃了 LangChain?
LangChain基础知识入门
LangChain由 Harrison Chase 创建于2022年10月,它是围绕LLMs(大语言模型)建立的一个框架,LLMs使用机器学习算法和海量数据来分析和理解自然语言,GPT3.5、GPT4是LLMs最先进的代表,国内百度的文心一言、阿里的通义千问也属于LLMs。LangChain自身并不开发LLMs,它的核心理念是为各种LLMs实现通用的接口,把LLMs相关的组件“链接”在一起,简化LLMs应用的开发难度,方便开发者快速地开发复杂的LLMs应用。LangChain目前有两个语言的实现:Python和Node.js
@小森
2024/06/10
4270
LangChain基础知识入门
推荐阅读
相关推荐
【LangChain系列6】【Agent模块详解】
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验