langchian入门四:LLM+Agents代理=贾维斯?让大模型拥有三头六臂

什么是Agent

在日常生活中,不难发现,chatgpt通过文本输入进行处理后返回的也是文本内容,就像是一个只有头的人,能听能思考能说话,但是无法行动.而Agent是一种能够自主决策、采取行动以达到某种目标的实体。被解释为"智能体"或者"代理".

代理的核心思想是通过大模型来选择要采取的一系列行动.在常规结构下,一系列行动都是硬编码,是已规定好的行为路线,而在代理中,是用大模型作为推理引擎来确定并采取行动的.通俗的讲就是给大模型配备工具,让大模型自己去判断在当前场景需要使用什么工具.

代理的效果与模型的智慧程度有关,大模型的训练集越大,代理的效果越好,差的模型进行代理会陷入某一个自问自答而死循环,好的模型会进行自我验证,验证这个答案是否与最初的问题相关,不相关进行修正.

举个例子:

链式结构下,我会拿着螺丝刀去拧螺丝,拿着钥匙开锁,拿着斧头砍木头.我不会选择工具,而是按照规划的路线行动.

代理情况下,我有螺丝刀,钥匙,斧头等工具,我遇到了一颗螺丝,我会用螺丝刀去拧螺丝. 遇到了一把锁,我会用钥匙去开锁,遇到了木头,我会用斧头去砍木头.在不同的场景或者问题下会进行推理选择.

总而言之:Agent= LLM(思考决策)+ memory(记忆)+ tools(执行)

langchain中代理的关键组成

  • Agent代理
  • llm大模型
  • Tool工具
  • prompt提示词
  • Toolkit工具包
  • AgentExecutor代理执行器

这里使用的是openai的大模型,想要白嫖阿里云的通义千问大模型,还不会prompt提示词以及记忆组件memory的请移步传送门

传送门:

代理的类型

  • Zero-shot ReAct:利用工具的描述来决定使用哪个工具,可以有多个工具,每个工具都要提供描述信息。选择单纯依靠描述信息
  • Structured Input ReAct:通过工具的参数schema创建结构化的动作输入
  • Open AI Functions:与openai function call机制配合工作
  • Conversational:为对话场景设计,使用具有对话性提示词,利用ReAct框架选择工具,并利用记忆功能来保存对话历史
  • Self ask with seach:利用工具查找事实性答案

Tool

代理调用的功能,相当于手的部分,与外部世界交互 ,LangChain 提供了一系列工具,比如 Search 工具,AWS 工具,Wikipedia 工具等。这些工具都是 BaseTool 的子类。通过调用 run 函数,执行工具的功能。

如何创建工具

  1. 加载langchain内置的工具
python 复制代码
from langchain.tools import load_tools
tools = load_tools(["serpapi"],llm=llm)#谷歌的搜索引擎
  1. 通过tool装饰器,自定义工具,在函数中需要描述这个工具
python 复制代码
from langchain.agents import tool
@tool
def serpapi_search(query:str)->str:
    '''使用serpapi搜索引擎获取搜索结果'''
    from serpapi import GoogleSearch
    params = {
        "q": query,
        "api_key": "serpapi-api-key"
    }
    search = GoogleSearch(params)
    results = search.get_dict()
    return results['organic_results'][0]['snippet']
 tools = [serpapi_search]

Tollkit

工具包,一组工具的集合,tools = [serpapi_search]tools = load_tools(["serpapi"],llm=llm)都是工具包.

AgentExecutor

代理执行器是代理执行时,由它来选择并执行其他选择的动作。

  1. 处理代理选择不存在的工具的情况
  2. 处理工具发生错误的情况
  3. 处理代理生成无法解析为工具调用的输出的情况
  4. 在所有级别上记录和可观察性(代理决策,工具调用)

思考的过程

  • Action:就是根据用户的输入,选用哪个Tool,然后行动
  • Action Input:根据需要使用的Tool,从用户的输入里提取相关的内容,可以输入到Tool里面
  • Observation:就是观察通过使用 Tool 得到的一个输出结果。稳定版本之前有展示,稳定版本之后就没有了,但是步骤仍然存在
  • Thought:就是再看一眼用户的输入,判断一下该怎么做,同样是稳定版本之前有展示,稳定版本之后就没有了,仍然存在
  • Final Answer:就是 Thought 在看到 Obersavation 之后,给出的最终输出,

创建一个代理

这里来创建一个react代理,给他配备一个谷歌的搜索引擎,让他能去搜索网络上的内容,但是他对中文不友好,用Translator翻译翻译.还配备了一个运算工具,看看他是否在不同情景下能推理并且选择工具

python 复制代码
# 代理模块,用于调用openai的模型进行对话并执行操作
import os
from dotenv import find_dotenv, load_dotenv
load_dotenv(find_dotenv())
os.environ["OPENAI_API_BASE"] 
os.environ["OPENAI_API_KEY"] 
os.environ["SERPAPI_API_KEY"]
from langchain_openai import ChatOpenAI
#引入集成的工具,包含langchain中内置的各种工具。官方文档中查找
from langchain.agents import create_react_agent,AgentExecutor,tool
#引入hub模块,用于调用hub中的模型
from langchain import hub
#引入工具加载器,用于加载工具
from langchain.tools import load_tools
#引入翻译工具
from translate import Translator
#实例化一个大模型
llm=ChatOpenAI(temperature=0, model="gpt-3.5-turbo")
#从hub中拉取模型
prompt = hub.pull("hwchase17/react")

#创建工具

#搜索引擎
@tool
def serpapi_search(query:str)->str:
    '''使用serpapi搜索引擎获取搜索结果'''#工具描述
    from serpapi import GoogleSearch
    params = {
        "q": query,
        "api_key": os.getenv("SERPAPI_API_KEY")
    }
    search = GoogleSearch(params)
    results = search.get_dict()
    return results['organic_results'][0]['snippet']

#运算工具
@tool
def calculate(expression:str)->str:
    '''计算表达式'''
    return str(eval(expression))


# tools = load_tools(["serpapi"],llm=llm)#加载内置工具
tools=[serpapi_search,calculate]#工具包
#创建agent
agent=create_react_agent(
    llm,
    tools,
    prompt,
)
#代理执行器
agent_executor=AgentExecutor(agent=agent,
                              tools=tools,#工具包
                              verbose=True,#执行的详细过程
                              )
                              
def agent_invoke(huamn_input:str):
    text=agent_executor.invoke({"input":huamn_input})
    res=Translator(from_lang="en",to_lang="zh").translate(text['output'])
    return res

if __name__ == "__main__":
    text=input()
    print(agent_invoke(text))

.env文件内容为:

python 复制代码
# 代理地址
OPENAI_API_BASE = ""
# 代理密钥
OPENAI_API_KEY = ""
#谷歌引擎
SERPAPI_API_KEY=""

搜索一下最近发生的事儿,看看结果:

搜索一下时事 再来一个 来个简单的计算题 根据问题情景,大模型能够进行推理选择工具,关于时事的它能够选择搜索工具进行搜索,关于计算的问题,它能够选择运算工具进行回答,也回答正确了.并且我在问题中没有提示他该选择什么工具.

总结

代理就是让大模型具备了行动的能力,大模型不仅仅局限于进行文本回答,在回答的同时还能进行一系列行动.openai的chatgpt把agent推向了一个新的高度,使得agent更接近于一个'智能体'.通过各种工具将大模型武装起来,或许这个工具,不仅仅是软件也可以是硬件,将大模型与嵌入式结合或许能做成一个能思考能行动的智能机器人,或许在不久的将来,私人AI助理-贾维斯就可以变成现实.

参考资料: LangChain

相关推荐
大模型铲屎官1 小时前
【Python-Day 14】玩转Python字典(上篇):从零开始学习创建、访问与操作
开发语言·人工智能·pytorch·python·深度学习·大模型·字典
yunvwugua__1 小时前
Python训练营打卡 Day27
开发语言·python
Stara05112 小时前
基于多头自注意力机制(MHSA)增强的YOLOv11主干网络—面向高精度目标检测的结构创新与性能优化
人工智能·python·深度学习·神经网络·目标检测·计算机视觉·yolov11
那雨倾城3 小时前
使用 OpenCV 将图像中标记特定颜色区域
人工智能·python·opencv·计算机视觉·视觉检测
LuckyTHP5 小时前
java 使用zxing生成条形码(可自定义文字位置、边框样式)
java·开发语言·python
mahuifa7 小时前
(7)python开发经验
python·qt·pyside6·开发经验
学地理的小胖砸8 小时前
【Python 操作 MySQL 数据库】
数据库·python·mysql
安迪小宝8 小时前
6 任务路由与负载均衡
运维·python·celery
Blossom.1188 小时前
使用Python实现简单的人工智能聊天机器人
开发语言·人工智能·python·低代码·数据挖掘·机器人·云计算
lisw058 小时前
Python高级进阶:Vim与Vi使用指南
python·vim·excel