
前言前三章我们分别介绍了思维链的使用原理和在小模型上的使用。这一章我们正式进入应用层面聊聊如何把思维链和工具使用结合得到人工智能代理。要回答我们为什么需要AI代理代理可以解决哪些问题可以有以下两个视角首先是我们赋能模型如果说LLM是大脑那Agent提供了手脚和感官感官获取真实世界的信息包括实时信息像天气情况金融市场交通状况包括私有信息例如用户个人数据包括多模态信息像声音和图像手脚获得和真实世界交互的能力例如运行python脚本调用搜索引擎预定机票酒店。其次是模型赋能我们Agent加持的大模型作为更优的数据和任务中介/代理赋予了我们和任意数据类型交互的能力大模型正在重构数据和信息的处理方式。从之前的结构化数据为主向更多的非结构化数据转变。OpenAI应用研究主管LilianWeng写的LLM Powered Autonomous Agents把人工智能代理(AI Agent)分成了以下3个部分规划模块工具调用模块和记忆模块。之后几章我们会聊到AI代理方案的主要差异也在这三个方向规划如何对问题进行拆解得到解决路径既模型推理步骤工具支持哪些工具使用如何进行工具选择并生成调用工具的请求记忆短期记忆包括工具的返回值已经完成的推理路径长期记忆包括可访问的外部长期存储例如知识库第一篇我们结合langchain介绍无需微调使用few-shotzero-shot prompt来生成推理和工具调用模板的两个方案ReAct和SelfASk。个人对langchain是又爱又恨爱的是它集成了很多前沿的大模型应用方案恨是感觉它有些过度封装有点简单问题复杂设计的感觉。因此推荐使用langchain来理解每种方案的实现原理然后脱离langchain自己写或者只使用langchain的基础组件来实现不要去使用它的高级API。Self AskSelf-ask: MEASURING AND NARROWING THE COMPOSITIONALITY GAP IN LANGUAGE MODELShttps://ofir.io/Self-ask-prompting/原理Self Ask提出了一种把问题拆解成子问题的Prompt范式每一步模型都会自我提问是否可以把问题改写/拆解成一个简单的子问题并进行回答回答时可以调佣搜索工具来获得答案然后根据工具返回结果继续进行自我提问直到获得最终答案。其实自我提问的推理形式并不是核心核心是引导模型来进行问题拆解也就是开头提到的规划能力。论文提出之所以需要把原始的思维链改造成一步步自我提问的形式是因为发现模型在回答复杂问题的时候模型虽然可以正确回答其中的子问题但是却无法回答由子问题组合起来的复杂问题作者称之为Compositionality Gap。举个栗子模型可以正确回答贾斯汀比伯是哪年出生的? 以及谁是94年大师赛的冠军 但是模型无法回答谁是贾斯汀比伯出生那一年的大师赛的冠军而通过引入问题拆解的推理方式可以很好解决这个问题应用我们来看下langchain的Self Ask实现官网Demo是直接用initialize_agent来初始化代理这里我们把中间步骤拆解开。以下使用了SerpAPI的google搜索工具和GPT3.5都需要先去官网申请Keyimportosfromlangchain.agents.loadingimportAGENT_TO_CLASSfromlangchain.agents.agentimportAgentExecutorfromlangchain.agentsimportAgentType,ToolfromlangchainimportOpenAI,SerpAPIWrapper## 需要科学上个网os.environ[http_proxy]http://127.0.0.1:7890os.environ[https_proxy]http://127.0.0.1:7890## 定义大模型和搜索工具llmOpenAI(temperature0,openai_api_key$你的Key)searchSerpAPIWrapper(params{engine:google,gl:us,hl:zh-cn,},serpapi_api_key$你的Key)“”“ 以下的工具初始化方式对齐了Self Ask 的Prompt模板 ”“” tools[Tool(nameIntermediate Answer,funcsearch.run,descriptionuseful for when you need to ask with search)]## 组装初始化agent和Chainagent_clsAGENT_TO_CLASS[AgentType.SELF_ASK_WITH_SEARCH]agentagent_cls.from_llm_and_tools(llm,tools)chainAgentExecutor.from_agent_and_tools(agent,tools,return_intermediate_stepsTrue)AGENT_TO_CLASS里面定义了所有的Agent类型其中SelfAskWithSearchAgent是Self Ask的实现但其实不同Agent的差异主要是以下few-shot prompt和对应的parser不同。fromlangchain.agents.self_ask_with_search.output_parserimportSelfAskOutputParserfromlangchain.agents.self_ask_with_search.promptimportPROMPT其中SelfAsk的few-shot prompt 如下few-shot除了提供解码的格式之外还提示了模型要对问题进行拆解_DEFAULT_TEMPLATEQuestion: 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我们来跑一个问题看下模型的中间返回结果# chain.run是用于直接返回最终结果直接调用callable可以返回中间过程 output chain(昨日A股市场涨幅最高的板块成交量如何)以下是带中间结果的返回值可以发现few-shot-prompt引导模型把问题昨日A股市场涨幅最高的板块成交量如何拆分成了“昨日A股市场涨幅最高的板块?”并通过谷歌搜索得到是券商板块后继续提问券商板块昨日成交量得到最终结果这里只展示了一个goodcase因为badcase太多啦哈哈~SelfAsk结果不好的两个主要原因有搜索没有返回有效结果当前搜索引擎的返回结果并非为大模型回答设计而还是为传统搜索引擎设计返回结果不可用可能是抽取的文章摘要(snippet)不合理或者排序逻辑返回的Top1答案不合适再或者回答的时效性错误等等这里存在很大的优化空间模型拆解问题有误SelfAsk当前主要针对组合类问题如果你的问题拆解方式不同需要对以上few-shot-prompt进行调整或者进一步通过COT finetune来注入问题拆解的方式Self Ask是一类最简单的工具调用模板只支持单一搜索工具的使用不支持工具选择。下面我们看下支持多种工具调用的ReAct范式~ReActReAct: SYNERGIZING REASONING AND ACTING IN LANGUAGE MODELShttps://tsmatz.wordpress.com/2023/03/07/react-with-openai-gpt-and-langchain/原理ReAct文如其名模型推理分成了两个部分Reason和Action。Reason生成分析步骤Action生成工具调用请求二者交替进行直到得到最终的结果。和SelfAsk对比ReAct进一步把推理和工具调用进行了解耦, 在Self Ask中自我提问既是推理步骤也是搜索工具的请求query而在ReAct中工具调用的请求在推理步骤之后这样可以更好的支持搜索以外的其他工具。ReAct在文档问答上给出的few-shot-cot推理模板如下应用同样是AGENT_TO_CLASSReActDocstoreAgent和ZeroShotAgent是基于ReAct开发的。为了保持一致性我们用和以上Self Ask相同的方式来初始化以下两个Agent更简洁的初始化代码详见官网ReAct, ReActDocument StoreZeroShotAgent需要提供可以使用的工具列表以及每种工具的描述LLM完全基于上下文根据工具的描述进行工具选择适用于没有固定推理套路的场景。为了和SelfAsk对比这里我们还是使用谷歌搜索再额外加入Wolfram Alpha工具代码部分只用替换工具定义的部分和agent class其余部分完全一样。 需要提供工具的描述description用于工具选择和工具请求的生成 同时tool.name从selfAsk中统一的Intermediate Answer,调整为工具本身的名称用于生成工具调用的前缀 importosfromlangchain.agents.loadingimportAGENT_TO_CLASSfromlangchain.agents.agentimportAgentExecutorfromlangchain.agentsimportAgentType,ToolfromlangchainimportOpenAI,SerpAPIWrapperfromlangchain.utilities.wolfram_alphaimportWolframAlphaAPIWrapper## 需要科学上个网os.environ[http_proxy]http://127.0.0.1:7890os.environ[https_proxy]http://127.0.0.1:7890os.environ[WOLFRAM_ALPHA_APPID]你的key## 定义大模型和搜索工具llmOpenAI(temperature0,openai_api_key$你的key)searchSerpAPIWrapper(params{engine:google,gl:us,hl:zh-cn,},serpapi_api_key$你的key)wolframWolframAlphaAPIWrapper()tools[Tool(name搜索,description搜索引擎当你需要回答当前问题的时候调用输入是检索query,funcsearch.run),Tool(nameWolfram,descriptionWolfram Alpha当你需要回答和数学科学科技文化社会日常生活相关的问题时调用输入是检索query,funcwolfram.run),]agent_clsAGENT_TO_CLASS[AgentType.ZERO_SHOT_REACT_DESCRIPTION]agentagent_cls.from_llm_and_tools(llm,tools)chainAgentExecutor.from_agent_and_tools(agent,tools,return_intermediate_stepsTrue)outputchain(昨日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[4]提出的并行推理槽位填充的方案~针对更复杂多样的工具调用和更有针对性/复杂的模型规划能力我们下一章介绍基于指令微调的工具调用方案。最后感谢你们的阅读和喜欢我收藏了很多技术干货可以共享给喜欢我文章的朋友们如果你肯花时间沉下心去学习它们一定能帮到你。因为这个行业不同于其他行业知识体系实在是过于庞大知识更新也非常快。作为一个普通人无法全部学完所以我们在提升技术的时候首先需要明确一个目标然后制定好完整的计划同时找到好的学习方法这样才能更快的提升自己。这份完整版的大模型 AI 学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】一、全套AGI大模型学习路线AI大模型时代的学习之旅从基础到前沿掌握人工智能的核心技能二、640套AI大模型报告合集这套包含640份报告的合集涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师还是对AI大模型感兴趣的爱好者这套报告合集都将为您提供宝贵的信息和启示。三、AI大模型经典PDF籍随着人工智能技术的飞速发展AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型如GPT-3、BERT、XLNet等以其强大的语言理解和生成能力正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。四、AI大模型商业化落地方案五、面试资料我们学习AI大模型必然是想找到高薪的工作下面这些面试题都是总结当前最新、最热、最高频的面试题并且每道题都有详细的答案面试前刷完这套面试题资料小小offer不在话下。这份完整版的大模型 AI 学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】