开源模型应用落地-LangChain高阶-Tools工具-集成agents(四)

一、前言

    LangChain 的 tools 是一系列关键组件,它们提供了与外部世界进行交互的能力。通过适当的使用这些组件,可以简单实现如执行网络搜索以获取最新信息、调用特定的 API 来获取数据或执行特定的操作、与数据库进行交互以获取存储的信息等需求。

    本章基于agents进一步串联工具(tools ),从而将大语言模型的能力和本地、云服务能力结合。


二、术语

2.1. agent

    是 LangChain 中的代理模块,它可以使用语言模型(LLM)动态地调用行为链(Chains),根据用户的输入调用不同的行为。代理可以访问单一工具,并根据用户输入确定要使用的工具,也可以使用多个工具,并使用一个工具的输出作为下一个工具的输入。


三、前提条件 

3.1. 基础环境及前置条件

  1.  操作系统:centos7

3.2. 安装虚拟环境

conda create --name langchain python=3.10
conda activate langchain
pip install langchain langchain-openai

3.3. 创建Wolfram账号

开源模型应用落地-LangChain高阶-Tools工具-WolframAlpha(二)

3.4. 创建serper账号

开源模型应用落地-LangChain高阶-Tools工具-GoogleSerperAPIWrapper(三)


四、技术实现

4.1.询问广州白云山位置

# -*-  coding = utf-8 -*-
import json
import os
import warnings
import traceback
from langchain.agents import initialize_agent, Tool, AgentType
from langchain_community.utilities.wolfram_alpha import WolframAlphaAPIWrapper
from langchain_openai import ChatOpenAI
from langchain_community.utilities import GoogleSerperAPIWrapperwarnings.filterwarnings("ignore")os.environ["SERPER_API_KEY"] = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
os.environ["WOLFRAM_ALPHA_APPID"] = "xxxxxx-xxxxxx"API_KEY = "sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
os.environ["OPENAI_API_KEY"] = API_KEYdef query_location(region):# print(f'region: {region}')search = GoogleSerperAPIWrapper(type="places")results = search.results(region)# print(f'results: {results}')try:places = results['places']# places_object = json.loads(places)if len(places) > 0:place = places[0]address = place['address']latitude = place['latitude']longitude = place['longitude']print(f'address: {address}, latitude: {latitude}, longitude: {longitude}')return addresselse:return 'unknown'except Exception as e:traceback.print_exc()return 'unknown'def mathematical_calculations(info):wolfram = WolframAlphaAPIWrapper()result = wolfram.run(info)return resulttools = [Tool(name = "query_location",func=query_location,description="This function is used to query the location of a specified region, with the input parameter being the region"),Tool(name = "mathematical_calculations",func=mathematical_calculations,description="This function is used for mathematical calculations, and the input parameters are mathematical expressions")
]if __name__ == '__main__':llm = ChatOpenAI(model_name='gpt-3.5-turbo-1106', temperature=0.9, max_tokens=1024)agent = initialize_agent(tools,llm,agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,max_iterations=3,verbose=True)result = agent.run('广州白云山在哪里?')print(f'result: {result}')

调用结果:

4.2.求解数学表达式

# -*-  coding = utf-8 -*-
import json
import os
import warnings
import traceback
from langchain.agents import initialize_agent, Tool, AgentType
from langchain_community.utilities.wolfram_alpha import WolframAlphaAPIWrapper
from langchain_openai import ChatOpenAI
from langchain_community.utilities import GoogleSerperAPIWrapperwarnings.filterwarnings("ignore")os.environ["SERPER_API_KEY"] = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
os.environ["WOLFRAM_ALPHA_APPID"] = "xxxxxx-xxxxxx"API_KEY = "sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
os.environ["OPENAI_API_KEY"] = API_KEYdef query_location(region):# print(f'region: {region}')search = GoogleSerperAPIWrapper(type="places")results = search.results(region)# print(f'results: {results}')try:places = results['places']# places_object = json.loads(places)if len(places) > 0:place = places[0]address = place['address']latitude = place['latitude']longitude = place['longitude']print(f'address: {address}, latitude: {latitude}, longitude: {longitude}')return addresselse:return 'unknown'except Exception as e:traceback.print_exc()return 'unknown'def mathematical_calculations(info):wolfram = WolframAlphaAPIWrapper()result = wolfram.run(info)return resulttools = [Tool(name = "query_location",func=query_location,description="This function is used to query the location of a specified region, with the input parameter being the region"),Tool(name = "mathematical_calculations",func=mathematical_calculations,description="This function is used for mathematical calculations, and the input parameters are mathematical expressions")
]if __name__ == '__main__':llm = ChatOpenAI(model_name='gpt-3.5-turbo-1106', temperature=0.9, max_tokens=1024)agent = initialize_agent(tools,llm,agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,max_iterations=3,verbose=True)result = agent.run('求解:2x + 5 = -3x + 7')print(f'result: {result}')

调用结果:


五、附带说明

5.1.AgentType取值

  • AgentType.ZERO_SHOT_REACT_DESCRIPTION表示零样本反应式描述代理,它利用 ReAct 框架根据工具的描述来决定使用哪个工具。这种代理可以使用多个工具,但需要为每个工具提供描述信息。工具的选择单纯依靠工具的描述信息。
  • AgentType.SELF_ASK_WITH_SEARCH表示 Self-Ask with Search 代理类型。这种代理使用一个名为“中间应答”的工具,该工具能够查找问题的真实答案。它的工作原理是利用网络搜索 API 进行搜索,并将搜索结果作为中间答案,然后继续进行提问和搜索,直到找到最终的答案。
  • AgentType.REACT_DOCSTORE使用 ReAct 框架与文档存储进行交互。适用于需要从文档存储中获取信息并进行处理的任务。通过使用“Search”和“Lookup”工具,它可以实现对文档的搜索和查找功能,帮助用户快速找到所需的信息。
  • AgentType.CONVERSATIONAL_REACT_DESCRIPTION主要用于对话场景。它使用 ReAct 框架来决定使用哪个工具,并使用内存来记忆先前的对话交互。这种代理类型的设计旨在使代理能够进行对话并提供帮助。通过使用 ReAct 框架,它可以根据对话的上下文和需求选择合适的工具来执行任务,并将工具执行的结果作为上下文反馈给代理,以便其继续进行推理和回答。

5.2.Agent的执行流程

  1. 接收用户输入:接收用户的输入,并将其作为执行的起点。
  2. 规划动作:根据用户输入和当前状态,agent 会规划下一步的动作。这可能包括选择使用哪个工具、确定工具的输入等。
  3. 执行动作:使用所选的工具执行动作,并记录动作的结果。
  4. 处理结果:处理动作的结果,并根据结果决定下一步的动作。
  5. 重复步骤:不断重复上述步骤,直到达到最终的目标或满足特定的条件。

    注意:具体的执行流程可能因 agent 的类型和配置而有所不同。

5.3.注意事项

  1. 工具选择和配置:要确保选择合适的工具,并正确配置它们。
  2. 输入处理:仔细处理用户输入,确保其清晰和准确。
  3. 工具依赖:注意工具之间的依赖关系,避免不必要的冲突。
  4. 性能和效率:关注执行过程中的性能和效率,优化可能的瓶颈。
  5. 错误处理:做好错误处理,应对可能出现的异常情况。
  6. 环境适应性:根据不同的应用场景,调整 Agent 的行为和策略。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/6598.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安装vscode基础配置,es6基础语法,

https://code.visualstudio.com/ es6 定义变量 const声明常量(只读变量) // 1、声明之后不允许改变 const PI “3.1415926” PI 3 // TypeError: Assignment to constant variable. // 2、一但声明必须初始化,否则会报错 const MY_AGE /…

01-MySQL 基础篇笔记

一、MySQL 概述 1.1 数据库相关概念 数据库:(DB:DataBase) 存储数据的仓库,数据是有组织的进行存储 数据库管理系统:(DBMS:DataBase Management System) 操作和管理数…

java spring 09 Bean的销毁过程

1.Bean销毁是发送在Spring容器关闭过程中的 AnnotationConfigApplicationContext context new AnnotationConfigApplicationContext(AppConfig.class);UserService userService (UserService) context.getBean("userService");userService.test();// 容器关闭cont…

手撕spring框架(5)

手撕spring框架(5) 相关系列 手撕spring框架(1) 手撕spring框架(2) 手撕spring框架(3) 手撕spring框架(4) 这是本专题最后一节了,主要是讲述自定义一个注解,实…

14_Scala面向对象编程_属性

属性 1.类中属性声明 // 1.给Scala声明属性;var name :String "zhangsan"val age :Int 302.系统默认赋值 scala由于初始化变量必须赋值,为了解决此问题可以采用下划线赋值,表示系统默认赋值 , –但是此方法局限于变量&…

太阳能光伏光热综合利用(PVT)

PVT系统介绍 传统太阳能系统是太阳光直接加热水,效率高,但是需要有防冻措施,且在太阳光不充足时需要增加电辅热,受天气影响大,且电加热能耗高。传统发电是将直流电转化为交流电,再提供给用户使用。此PVT技…

特斯拉全自动驾驶系统Tesla‘s Full-Self Driving (FSD)

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl Overview Tesla’s FSD is a suite of features that includes Autopilot, Navigate on Autopilot, Auto Lane Change, Autopark, Summon, and Traffic Light and Stop Sig…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-12-蜂鸣器

前言: 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM(MX6U)裸机篇”视频的学习笔记,在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

力扣每日一题104:二叉树的最大深度

题目 给定一个二叉树 root ,返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:3示例 2: 输入:root [1,null,2…

C#中.net8WebApi加密解密

尤其在公网之中,数据的安全及其的重要,除过我们使用jwt之外,还可以对传送的数据进行加密,就算别人使用抓包工具,抓到数据,一时半会儿也解密不了数据,当然,加密也影响了效率&#xff…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-11.1,11.2-BSP文件目录组织

前言: 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM(MX6U)裸机篇”视频的学习笔记,在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

Redis-三主三从高可用集群搭建

正式搭建之前,注意事项(坑)提前放到最开始,也可以出问题回来看, (1)第二步中最好将配置文件中的logfile自定义一个目录,以便于在第五步中启动出错的时候迅速定位错误。 &#xff0…

2024五一赛数学建模A题B题C题完整思路+数据代码+参考论文

A题 钢板最优切割路径问题 (完整资料在文末获取) 1. 建立坐标系和表示方法: 在建模之前,我们需要将切割布局转换为数学表示。首先,我们可以将布局中的每个点表示为二维坐标系中的一个点。例如,B1可以表示…

计算机毕业设计Python+Spark知识图谱高考志愿推荐系统 高考数据分析 高考可视化 高考大数据 大数据毕业设计

毕业设计(论文)任务书 毕业设计(论文)题目: 基于大数据的高考志愿推荐系统 设计(论文)的主要内容与要求: 主要内容: 高…

OpenCV如何为我们的应用程序添加跟踪栏(71)

返回:OpenCV系列文章目录(持续更新中......) 上一篇:OpenCV的周期性噪声去除滤波器(70) 下一篇 :OpenCV系列文章目录(持续更新中......) 在前面的教程中(关于使用 OpenCV 添加(混合)两个图像和…

【Leetcode每日一题】 综合练习 - 全排列 II(难度⭐⭐)(71)

1. 题目解析 题目链接:47. 全排列 II 这个问题的理解其实相当简单,只需看一下示例,基本就能明白其含义了。 2.算法原理 算法思路梳理 为了生成给定数组nums的全排列,同时避免由于重复元素导致的重复排列,我们可以遵…

关于YOLO8学习(五)安卓部署ncnn模型--视频检测

前文 关于YOLO8学习(一)环境搭建,官方检测模型部署到手机 关于YOLO8学习(二)数据集收集,处理 关于YOLO8学习(三)训练自定义的数据集 关于YOLO8学习(四)模型转换为ncnn 简介 本文将会讲解: (1)使用前文生成的ncnn模型,部署到安卓端,并且实现视频中,人脸的检测…

02_Java综述

目录 面向对象编程两种范式抽象OOP 三原则封装继承多态多态、封装与继承协同工作 面向对象编程 面向对象编程(Object-Oriented Programming,OOP)在Java中核心地位。几乎所有的Java程序至少在某种程度上都是面向对象的。OOP与java是密不可分的。下面说一下OOP的理论…

【Java探索之旅】内部类 静态、实例、局部、匿名内部类全面解析

文章目录 📑前言一、内部类1.1 概念1.2 静态内部类1.3 实例内部类1.4 局部内部类1.5 匿名内部类 🌤️全篇总结 📑前言 在Java编程中,内部类是一种强大的特性,允许在一个类的内部定义另一个类,从而实现更好的…

SFOS1:开发环境搭建

一、简介 最近在学习sailfish os的应用开发,主要内容是QmlPython。所以,在开发之前需要对开发环境(virtualBox官方SDKcmake编译器python)进行搭建。值得注意的是,我的开发环境是ubuntu22.04。如果是windows可能大同小异…