赞
踩
在我前面的MetaGPT系列文章中,已经对智能体有了一个认知,重温一下:
智能体 = LLM+观察+思考+行动+记忆
- 将大语言模型作为一个推理引擎。给定一个任务,智能体自动生成完成任务所需的步骤,执行相应动作(例如选择并调用工具),直到任务完成。
本文我们来学习下LangChain中的智能体模块怎么用。
下面,我们以一个Google搜索的例子来直观认识下LangChain的Agent。
Google搜索需要借助 Serpapi 来进行实现,Serpapi 提供了 Google 搜索的 API 接口。
(1)去官网:[serpapi.com/]注册一个账号,获取自己的key
(2)像OpenAI的key一样添加到环境变量的配置文件中。
(3)安装google检索依赖的Python包
pip install google-search-results
咱们先不看LangChain的Agent的概念、接口及原理,先来一个简单的使用示例,运行起来,看下LangChain的Agent都能干什么。
import os # 加载 .env 到环境变量 from dotenv import load_dotenv, find_dotenv _ = load_dotenv(find_dotenv()) from langchain_openai import ChatOpenAI llm = ChatOpenAI() # 默认是gpt-3.5-turbo # 定义 tools from langchain.agents import load_tools tools = load_tools(["serpapi"]) from langchain.agents import initialize_agent from langchain.agents import AgentType # 工具加载后都需要初始化,verbose 参数为 True,会打印全部的执行详情 agent = initialize_agent(tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True) # 运行 agent agent.run("今天的日期是什么? 历史上的今天发生了什么大事?用中文回答")
从上面运行结果可以看到此Agent的运行过程: (1)先总结了任务和思考了步骤:检索当前日期,然后检索这个日期上发生的历史事件 (2)执行检索当前日期的步骤:Action是Search,输入是“今天的日期” (3)得到了今天的日期:Observation的结果 (4)再一次思考:我现在已经知道了当前日期 (5)执行第二步:Action是Search,输入是“历史上的今天发生了什么大事” (6)得到了第二步的结果 (7)再思考:知道了历史上的今天发生了什么 (8)总结输出最终回复
简单概括:思考 —> 得到结果 —> 思考 —> 得到结果 —> … —> 思考 —> 总结
到这里,相信你已经大体知道Agent是干什么的了。下面,我们拆解下Agent的实现。
在上面的例子中,我们使用了官方内置的Tool:serpapi,这也是可以自己定义的。例如下面的代码,自定义了一个weekday的工具。
import calendar
import dateutil.parser as parser
from datetime import date
from langchain.tools import Tool, tool
# 自定义工具
@tool("weekday")
def weekday(date_str: str) -> str:
"""Convert date to weekday name"""
d = parser.parse(date_str)
return calendar.day_name[d.weekday()]
tools += [weekday] ## 将自定义的tool添加到tools数组中
要想写好Agent,Prompt模板也不可或缺。LangChain提供了一些Prompt模板,可以直接下载修改使用。再也不用绞尽脑汁自己从零开始写Prompt了!
先安装下Python包:
pip install langchainhub
执行以下代码:
from langchain import hub
import json
# 下载一个现有的 Prompt 模板
prompt = hub.pull("hwchase17/react")
print(prompt.template)
获得Prompt模板内容(我觉得比90%的人自己写的要好):
当然,这类Prompt模板可能不完全符合你的需求,所以你需要在此基础上作一些补充或修改。但是,总比自己从零开始写要好得多。
如果要修改,可以参考我下面的方式,主要注意点是prompt应该是一个PromptTemplate类型,而不是一个字符串
# from langchain import hub # import json # # 下载一个现有的 Prompt 模板 # prompt = hub.pull("hwchase17/react") # print(prompt.template) from langchain_core.prompts import ChatPromptTemplate prompt_template = """ Answer the following questions as best you can. You have access to the following tools: {tools} Use the following format: Question: the input question you must answer Thought: you should always think about what to do Action: the action to take, should be one of [{tool_names}] Action Input: the input to the action,如果其中有日期,请确保只输入日期,格式为:YYYY-MM-DD,不要有任何其它字符 Observation: the result of the action,如果其中有日期,请确保输出的日期格式为:YYYY-MM-DD,不要有任何其它字符 ... (this Thought/Action/Action Input/Observation can repeat N times) Thought: I now know the final answer Final Answer: the final answer to the original input question Begin! Let's think step by step. Take a deep breath. Question: {input} Thought:{agent_scratchpad} """ prompt = ChatPromptTemplate.from_template(prompt_template)
准备好llm、tools、prompt之后,创建Agent
from langchain.agents import create_react_agent
agent = create_react_agent(llm, tools, prompt)
可能会报错:ImportError: cannot import name ‘create_react_agent’ from ‘langchain.agents’,解决方法:
pip install langchain --upgrade
from langchain.agents import AgentExecutor
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
- 不理解:为什么在创建Agent时传入了tools,这里创建Agent执行器还要再传入一遍tools?难道为多Agent区分各自tools ?
agent_executor.invoke({"input": "周杰伦生日那天是星期几"})
运行结果如下:
遇到的坑:
(1)无法识别出第一步应该先检索当前日期,直接就调用了weekday工具
不得不说,这两句是真好使
(2)weekday工具的输入不符合要求
目前大模型规划的能力还是不行。以上例子中Agent主要是依靠大模型来进行流程控制,具有很大的不确定性和不可控性。
LangChain的Agent模块封装了多种Agent类型可供使用。详细可参考:
Agent Type | 预期模型类型 | 支持聊天历史记录 | 支持多输入工具 | 支持并行函数调用 | 需要的模型参数 | 何时使用 |
---|---|---|---|---|---|---|
OpenAI Tools | 聊天 | ✅ | ✅ | ✅ | 工具 | 如果您正在使用最新的 OpenAI 模型(从 1106 开始) |
OpenAI Functions | 聊天 | ✅ | ✅ | 函数 | 如果您正在使用一个 OpenAI 模型,或者一个已经针对函数调用进行了微调并且公开了与 OpenAI 相同函数参数的开源模型 | |
XML | LLM | ✅ | 如果您正在使用 Anthropic 模型,或其他擅长处理 XML 的模型 | |||
Structured Chat | 聊天 | ✅ | ✅ | 如果您需要支持具有多个输入工具的场景 | ||
JSON Chat | 聊天 | ✅ | 如果您正在使用擅长处理 JSON 的模型 | |||
ReAct | LLM | ✅ | 如果您使用的是简单模型 | |||
Self Ask With Search | LLM | 如果您使用的是简单模型,并且只有一个搜索工具 |
# Get the prompt to use - you can modify this!
prompt = hub.pull("hwchase17/openai-functions-agent")
# Get the prompt to use - you can modify this!
prompt = hub.pull("hwchase17/openai-tools-agent")
# Get the prompt to use - you can modify this!
prompt = hub.pull("hwchase17/xml-agent-convo")
# Get the prompt to use - you can modify this!
prompt = hub.pull("hwchase17/react-chat-json")
# Get the prompt to use - you can modify this!
prompt = hub.pull("hwchase17/structured-chat-agent")
# Get the prompt to use - you can modify this!
prompt = hub.pull("hwchase17/react")
# Get the prompt to use - you can modify this!
prompt = hub.pull("hwchase17/self-ask-with-search")
本文就到这里了。咱们对LangChain的Agent模块有了一个初步的认识,并且学会了如何利用LangChain实现一个简单的Agent,如何自定义自己的tool等。
当然,Agent不止于此,LangChain的Agent模块也不止于此,还需要更加细致的学习和挖掘。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;
第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;
第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;
第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;
第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;
第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;
第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。