LangChain之Agent代理(下)

LangChain之Agent代理

  • OpenAI Functions Agent
    • 概述
    • 配置环境变量
    • 基本使用
    • 实际应用示例
  • OpenAI Tools Agent
    • 概述
    • 基本使用
    • 实际应用示例
  • ReAct Agent
    • 概述
    • Google搜索API
    • initialize_agent
    • create_react_agent
  • Structured Chat Agent
  • Self-Ask with Search Agent

OpenAI Functions Agent

概述

某些OpenAI模型(如gpt-3.5-turbo-0613和gpt-4-0613)已经过微调,可以检测何时应该调用特定的函数,并应该将该函数的正确输入进行响应。在API调用中,您可以描述想要调用的函数,然后让模型智能地选择输出包含调用这些函数所需参数的JSON对象。

在LangChain中,create_openai_functions_agent是一个便捷的函数,用于创建能够与OpenAI提供的函数交互的代理。这使得开发人员可以创建智能应用程序,通过代理与用户进行更自然、更有效的对话。

配置环境变量

访问Tavily(用于在线搜索)注册账号并登录,获取API 密钥

设置OpenAI和TAVILY的API密钥

import os# 设置OpenAI的BASE_URL、API_Key
os.environ["OPENAI_BASE_URL"] = "https://xxx.com/v1"
os.environ["OPENAI_API_KEY"] = "sk-BGFnOL9Q4c1234fsfsdaf9b4813bc437B82c2"# 设置tavily
os.environ["TAVILY_API_KEY"] = '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'

基本使用

from langchain import hub
from langchain.agents import create_openai_functions_agent, AgentExecutor
from langchain_community.tools.tavily_search import TavilySearchResults
from langchain_core.messages import HumanMessage, AIMessage
from langchain_openai import ChatOpenAI# 初始化工具
tools = [TavilySearchResults(max_results=1)]# 获取使用的提示
prompt = hub.pull("hwchase17/openai-functions-agent")# 选择将驱动代理的LLM
llm = ChatOpenAI(model="gpt-3.5-turbo-1106")# 构建OpenAI函数代理
agent = create_openai_functions_agent(llm, tools, prompt)# 通过传入代理和工具创建代理执行器
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)# 执行
agent_executor.invoke({"input":"我叫什么名字?","chat_history":[HumanMessage(content="你好!我叫鲍勃"),AIMessage(content="你好鲍勃!我今天能帮你什么?"),],}
)

在这里插入图片描述

实际应用示例

创建一个代理,它能够处理用户的常见问题,并且能够根据用户的问题进行动态响应。

from langchain import hub
from langchain.agents import create_openai_functions_agent, AgentExecutor
from langchain_community.tools.tavily_search import TavilySearchResults
from langchain_openai import ChatOpenAI
from langchain_core.tools import Tool# 定义查询订单状态的函数
def query_order_status(order_id):if order_id == "12345":return "订单 12345 的状态是:已发货,预计送达时间是 3-5 个工作日。"else:return f"未找到订单 {order_id} 的信息,请检查订单号是否正确。"# 定义退款政策说明函数
def refund_policy(keyword):print("keyword = ", keyword)return "我们的退款政策是:在购买后30天内可以申请全额退款,需提供购买凭证。"# 初始化工具
tools = [TavilySearchResults(max_results=1),Tool(name="queryOrderStatus",func=query_order_status,description="根据订单ID查询订单状态"),Tool(name="refundPolicy",func=refund_policy,description="查询退款政策内容"),]# 获取使用的提示
prompt = hub.pull("hwchase17/openai-functions-agent")# 选择将驱动代理的LLM
llm = ChatOpenAI(model="gpt-3.5-turbo-1106")# 构建OpenAI函数代理
agent = create_openai_functions_agent(llm, tools, prompt)# 通过传入代理和工具创建代理执行器
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)# 定义一些测试询问
queries = ["请问订单12345的状态是什么?","你们的退款政策是什么?"
]# 运行代理并输出结果
for input in queries:response = agent_executor.invoke({"input": input})print(f"客户提问:{input}")print(f"代理回答:{response}\n")

在这里插入图片描述

OpenAI Tools Agent

概述

某些OpenAI模型可以检测何时应该调用一个或多个函数,并使用应该传递给函数的输入进行响应。在API调用中,可以描述函数,并让模型智能地选择输出包含参数的JSON对象来调用这些函数。这与函数调用非常相似。

OpenAI将调用单个函数的能力称为函数,将调用一个或多个函数的能力称为工具。

基本使用

from langchain import hub
from langchain.agents import AgentExecutor, create_openai_tools_agent
from langchain_community.tools.tavily_search import TavilySearchResults
from langchain_openai import ChatOpenAI#  使用Tavily搜索工具
tools = [TavilySearchResults(max_results=1)]# 获取要使用的提示
prompt = hub.pull("hwchase17/openai-tools-agent")# 初始化大模型
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)# 构建 OpenAI 工具代理
agent = create_openai_tools_agent(llm, tools, prompt)# 通过传入代理和工具创建代理执行程序
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)# 运行代理
agent_executor.invoke({"input": "目前市场上黄金的平均售价是多少?"})

在这里插入图片描述

实际应用示例

创建一个能帮助用户进行搜索与获取天气信息的智能代理。

import requests
from langchain_core.tools import Tool
from langchain import hub
from langchain.agents import AgentExecutor, create_openai_tools_agent
from langchain_community.tools.tavily_search import TavilySearchResults
from langchain_openai import ChatOpenAI# 获取天气信息的函数
def get_weather(city):url = f"https://xxx.com/api/weather?city={city}"response = requests.get(url)if response.status_code == 200:jsonData = response.json()data = jsonData['data']type = data['type']low = data['low']high = data['high']return f"{city} 的天气是 {type},最低温度是 {low}°C,最高温度是 {high}°C。"else:return "无法获取天气信息,请检查城市名称。"# 初始化工具
tools = [TavilySearchResults(max_results=1),Tool(name="getWeather",func=get_weather,description="根据城市名称查询天气情况")]# 获取要使用的提示
prompt = hub.pull("hwchase17/openai-tools-agent")# 初始化大模型
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)# 构建 OpenAI 工具代理
agent = create_openai_tools_agent(llm, tools, prompt)# 通过传入代理和工具创建代理执行程序
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)# 定义一些测试询问
queries = ["成都今天天气情况?","目前市场上黄金的平均售价是多少?"
]# 运行代理并输出结果
for input in queries:response = agent_executor.invoke({"input": input})print(f"提问:{input}")print(f"回答:{response}\n")

在这里插入图片描述

ReAct Agent

概述

ReAct (Reflective Agent) 是 LangChain 中的一种聊天代理(Agent)类型。它具有以下独特的特点:

反思能力:ReAct 代理在给出响应之前,会先对自己的行为和预测进行深入的反思和评估。它会检查自己是否遵循了预先设定的规则和指令,是否达到了预期的目标。自我纠错:如果 ReAct 代理在反思过程中发现自己存在问题或疏漏,它会主动尝试对自己的行为进行纠正和改正,以修复错误,提高自身的表现。迭代学习:通过不断的反思和自我纠错,ReAct 代理可以在与用户的交互中逐步学习和优化自己的行为方式,不断提高回答的质量和准确性。可解释性:ReAct 代理在给出最终响应时,会同时提供自己的思考过程和决策依据,使得它的行为更加透明和可解释。

ReAct 代理具有更强的自我意识和自我管理能力。它可以主动思考自己的行为,发现问题并及时修正,从而提供更加可靠和合理的响应。

这种具备反思和自我纠错能力的 ReAct 代理,在需要较高可靠性和稳定性的应用场景中很有优势,例如智能客服、问答系统、任务执行等。它可以通过持续的自我学习和优化,为用户提供更加智能和可信的交互体验。

Google搜索API

访问 SerpApi ,注册账号,选择相应的订阅计划(Free),然后获取API Key,利用这个API为大模型提供Google搜索工具。

安装SerpAPI库

pip install google-search-results  -i https://pypi.org/simple

设置好OpenAI和SerpAPI的API密钥

import osos.environ["OPENAI_BASE_URL"] = "https://xxx.com/v1"
os.environ["OPENAI_API_KEY"] = "sk-BGFnOL9Q4c99B9Q4c1234fsfsdaf9b4813bc437B82c2"os.environ["SERPAPI_API_KEY"] = 'a871b9e551299Q4c1234fsfsdaf9b4813bc47233d796de36'

initialize_agent

from langchain.agents import load_tools
from langchain.agents import initialize_agent
from langchain.agents import AgentType
from langchain_openai import ChatOpenAIimport langchain# 开启DEBUG 显示具体的日志信息
# langchain.debug = True
# langchain.verbose = True# 初始化大模型:语言模型控制代理
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)# 设置工具:加载使用的工具,serpapi:调用Google搜索引擎 llm-math:通过LLM进行数学计算的工具
tools = load_tools(["serpapi", "llm-math"], llm=llm)
# 初始化Agent:使用工具、语言模型和代理类型来初始化代理
agent = initialize_agent(tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True)# 让代理来回答提出的问题
agent.invoke({"input": "目前市场上苹果手机15的平均售价是多少?如果我在此基础上加价5%卖出,应该如何定价?"})

大模型成功遵循了ReAct框架,它输出的思考与行动轨迹如下:

> Entering new AgentExecutor chain...
I need to find the average selling price of the iPhone 15 on the market and then calculate a 5% markup.
Action: Search
Action Input: "average selling price of iPhone 15"
Observation: How much does an iPhone 15 cost? iPhone 15 prices start at $535 and cost $716 on average as of April 2024. iPhone 15 prices will continue to get cheaper over time. Apple phones hold their value well, but prices will continue to drop as time passes and new models are announced.
Thought:I need to calculate a 5% markup on the average selling price of $716.
Action: Calculator
Action Input: 716 * 1.05
Observation: Answer: 751.8000000000001
Thought: I now know that if I add a 5% markup to the average selling price of iPhone 15, I should price it at $751.80.
Final Answer: $751.80> Finished chain.

执行发现有如下警告:

initialize_agent在新版本中不推荐使用并在将来会删除,推荐使用create_react_agent, create_json_agent, create_structured_chat_agent等初始化Agent

LangChainDeprecationWarning: The function `initialize_agent` was deprecated in LangChain 0.1.0 and will be removed in 0.2.0. Use Use new agent constructor methods like create_react_agent, create_json_agent, create_structured_chat_agent, etc. instead.warn_deprecated(

create_react_agent

# 加载所需的库
from langchain.agents import load_tools, AgentExecutor
from langchain.agents import create_react_agent
from langchain_openai import ChatOpenAI
from langchain import hub# 初始化大模型:语言模型控制代理
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)# 设置工具:加载使用的工具,serpapi:调用Google搜索引擎 llm-math:通过LLM进行数学计算的工具
tools = load_tools(["serpapi", "llm-math"], llm=llm)# 获取使用提示
prompt = hub.pull("hwchase17/react")
print(prompt)# 初始化Agent:使用工具、语言模型和代理类型来初始化代理
agent = create_react_agent(llm, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)# 让代理来回答提出的问题
agent_executor.invoke({"input": "目前市场上苹果手机15的平均售价是多少?如果我在此基础上加价5%卖出,应该如何定价?"})
> Entering new AgentExecutor chain...
I need to find the average selling price of the iPhone 15 on the current market and then calculate a 5% markup.
Action: Search
Action Input: "average selling price of iPhone 15"How much does an iPhone 15 cost? iPhone 15 prices start at $535 and cost $724 on average as of April 2024. iPhone 15 prices will continue to get cheaper over time. Apple phones hold their value well, but prices will continue to drop as time passes and new models are announced.I need to calculate a 5% markup on the average selling price of $724.
Action: Calculator
Action Input: $724 * 1.05Answer: 760.2I now know the final answer.
Final Answer: The average selling price of the iPhone 15 on the current market is $724. To sell it with a 5% markup, I should price it at $760.20.> Finished chain.

使用聊天记录

# 与聊天记录一起使用
agent_executor.invoke({"input": "what's my name?","chat_history": "Human: My name is Bob\nAI: Hello Bob!",}
)

Structured Chat Agent

create_structured_chat_agent 是 LangChain 提供的一个函数,用于创建结构化聊天代理。这种代理能够根据用户的输入调用预定义的工具函数,并将结果返回给用户。

# 使用 Tavily Search 测试代理
from langchain_community.tools.tavily_search import TavilySearchResultstools = [TavilySearchResults(max_results=1)]# 初始化大模型
from langchain_openai import ChatOpenAIllm = ChatOpenAI(temperature=0.5)# 创建代理Agent
from langchain.agents import create_structured_chat_agent, AgentExecutor
from langchain import hub# 获取使用提示,也可以自己写
prompt = hub.pull("hwchase17/structured-chat-agent")
# 初始化Agent
agent = create_structured_chat_agent(llm,tools,prompt
)# 输入代理和工具,创建代理执行器
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True, handle_parsing_errors=True
)# 运行代理Agent
response = agent_executor.invoke({"input": "网站https://www.runoob.com中有哪些教程?"})
print(response)
> Entering new AgentExecutor chain...
{"action": "tavily_search_results_json","action_input": {"query": "site:runoob.com 教程"}
}[{'url': 'https://www.runoob.com/', 'content': '菜鸟教程(www.runoob.com)提供了编程的基础技术教程, 介绍了HTML、CSS、Javascript、Python,Java,Ruby,C,PHP , MySQL等各种编程语言的基础知识。 同时本站中也提供了大量的在线实例,通过实例,您可以更好的学习编程。'}]{"action": "Final Answer","action_input": "菜鸟教程(www.runoob.com)提供了编程的基础技术教程,介绍了HTML、CSS、Javascript、Python,Java,Ruby,C,PHP,MySQL等各种编程语言的基础知识。同时本站中也提供了大量的在线实例,通过实例,您可以更好地学习编程。"
}> Finished chain.
{'input': '网站https://www.runoob.com中有哪些教程?', 'output': '菜鸟教程(www.runoob.com)提供了编程的基础技术教程,介绍了HTML、CSS、Javascript、Python,Java,Ruby,C,PHP,MySQL等各种编程语言的基础知识。同时本站中也提供了大量的在线实例,通过实例,您可以更好地学习编程。'}

Self-Ask with Search Agent

Self-Ask with Search是一个通过搜索自我询问的代理,通过询问+答案的机制来帮助大模型寻找事实性问题的过渡性答案,从而引出最终答案。

from langchain import hub
from langchain.agents import AgentExecutor, create_self_ask_with_search_agent
from langchain_community.tools.tavily_search import TavilyAnswer# 将初始化工具,让它提供答案而不是文档
tools = [TavilyAnswer(max_results=1, name="Intermediate Answer", description="Answer Search")]# 初始化大模型
llm = ChatOpenAI(temperature=0)# 获取使用提示 可以修改此提示
prompt = hub.pull("hwchase17/self-ask-with-search")# 使用搜索代理构建自助询问
agent = create_self_ask_with_search_agent(llm, tools, prompt)# 通过传入代理和工具创建代理执行程序
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True, handle_parsing_errors=True)# 运行代理
agent_executor.invoke({"input": "中国有哪些省份呢?"})

在这里插入图片描述

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

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

相关文章

stl之string

构造函数 void test1() {string s1;//不传参cout << s1 << endl;string s2("123456");cout << s2 << endl;string s3(s2);cout << s3 << endl;string s4(s2, 1, 5);cout << s4 << endl;string s5("123456&quo…

LLM vs SLM 大模型和小模型的对比

语言模型是能够生成自然人类语言的人工智能计算模型。这绝非易事。 这些模型被训练为概率机器学习模型——预测适合在短语序列中生成的单词的概率分布&#xff0c;试图模仿人类智能。语言模型在科学领域的重点有两个方面&#xff1a; 领悟情报的本质。 并将其本质体现为与真实…

gin-vue-amdin 新增路由

1&#xff1a;在api目录的example 下新建controller 层如下图&#xff08;&#xff09;&#xff1a; 在enter.go 中 加入 这个新建的结构体&#xff1a; 2&#xff1a;在router 的example 文件夹下 新建对应的路由文件 3&#xff1a;在initlize 的router 中 添加对应的代码&a…

推动多模态智能模型发展:大型视觉语言模型综合多模态评测基准

随着人工智能技术的飞速发展&#xff0c;大型视觉语言模型&#xff08;LVLMs&#xff09;在多模态应用领域取得了显著进展。然而&#xff0c;现有的多模态评估基准测试在跟踪LVLMs发展方面存在不足。为了填补这一空白&#xff0c;本文介绍了MMT-Bench&#xff0c;这是一个全面的…

【数学建模】——【python库】——【Pandas学习】

专栏&#xff1a;数学建模学习笔记 pycharm专业版免费激活教程见资源&#xff0c;私信我给你发 python相关库的安装&#xff1a;pandas,numpy,matplotlib&#xff0c;statsmodels 总篇&#xff1a;【数学建模】—【新手小白到国奖选手】—【学习路线】 第一卷&#xff1a;【数学…

互联网信息服务算法备案流程与要求

一、备案申请的办理流程 企业通过网信办的互联网信息服务算法备案系统&#xff08;https://beian.cac.gov.cn/#/index&#xff09;提交算法备案申请。填报信息包括三部分&#xff0c;分别是算法主体信息、产品及功能信息、算法信息。备案中比较重要的文件包括主体信息中的《落…

▶《强化学习的数学原理》(2024春)_西湖大学赵世钰 Ch5 蒙特卡洛方法【model-based ——> model-free】

PPT 截取必要信息。 课程网站做习题。总体 MOOC 过一遍 1、视频 学堂在线 习题 2、 过 电子书 是否遗漏 【下载&#xff1a;本章 PDF GitHub 页面链接 】 【第二轮 才整理的&#xff0c;忘光了。。。又看了一遍视频】 3、 过 MOOC 习题 看 PDF 迷迷糊糊&#xff0c; 恍恍惚惚。…

深度学习 - Transformer 组成详解

整体结构 1. 嵌入层&#xff08;Embedding Layer&#xff09; 生活中的例子&#xff1a;字典查找 想象你在读一本书&#xff0c;你不认识某个单词&#xff0c;于是你查阅字典。字典为每个单词提供了一个解释&#xff0c;帮助你理解这个单词的意思。嵌入层就像这个字典&#xf…

道路救援入驻派单小程序开源版开发

道路救援入驻派单小程序开源版开发 1、用户立即救援 2、后台收到救援通知&#xff0c;派单救援师傅. 道路救援入驻派单小程序通常会包含一系列功能&#xff0c;旨在方便救援服务提供商、用户和后台管理系统之间的交互。以下是一个可能的功能列表&#xff1a; 用户端功能&…

Camera开发-相机输出常用数据格式

作者简介&#xff1a; 一个平凡而乐于分享的小比特&#xff0c;中南民族大学通信工程专业研究生在读&#xff0c;研究方向无线联邦学习 擅长领域&#xff1a;驱动开发&#xff0c;嵌入式软件开发&#xff0c;BSP开发 作者主页&#xff1a;一个平凡而乐于分享的小比特的个人主页…

OpenGL-ES 学习(6)---- 立方体绘制

目录 立方体绘制基本原理立方体的顶点坐标和绘制顺序立方体颜色和着色器实现效果和参考代码 立方体绘制基本原理 一个立方体是由8个顶点组成&#xff0c;共6个面&#xff0c;所以绘制立方体本质上就是绘制这6个面共12个三角形 顶点的坐标体系如下图所示&#xff0c;三维坐标…

【极速入门版】编程小白也能轻松上手Comate AI编程插件

文章目录 概念使用错误检测与修复能力API生成代码生成json格式做开发测试 在目前的百模大战中&#xff0c;AI编程助手是程序员必不可少的东西&#xff0c;市面上琳琅满目的产品有没有好用一点的&#xff0c;方便一点的呢&#xff1f;今天工程师令狐向大家介绍一款极易入门的国产…

three.js - MeshStandardMaterial(标准网格材质)- 金属贴图、粗糙贴图

金属贴图、粗糙贴图 金属贴图&#xff1a;metalnessMap 和 粗糙贴图&#xff1a;roughnessMap&#xff0c;是用于模拟物体表面属性的两种重要贴图技术&#xff0c;这两种贴图&#xff0c;通常与基于物理的渲染&#xff08;PBR&#xff09;材质&#xff08;如&#xff1a;MeshSt…

nuxt3项目打包后获取.env设置的环境变量无效的解决办法

问题描述 在nuxt3项目开发过程中&#xff0c;设置了开发环境变量和生产环境变量&#xff0c;在本地开发时都能正常获取&#xff0c;但打包部署时获取不到&#xff0c;设置如下&#xff1a; //.env.development文件示例 SERVER_API_PATHhttp://192.168.25.100//.env.productio…

Elasticsearch环境搭建|ES单机|ES单节点模式启动|ES集群搭建|ES集群环境搭建

文章目录 版本选择单机ES安装与配置创建非root用户导入安装包安装包解压配置JDK环境变量配置single-node配置JVM参数后台启动|启动日志查看启动成功&#xff0c;访问终端访问浏览器访问 Kibana安装修改配置后台启动|启动日志查看浏览器访问 ES三节点集群搭建停止es服务域名配置…

小区物业管理收费系统源码小程序

便捷、透明、智能化的新体验 一款基于FastAdminUniApp开发的一款物业收费管理小程序。包含房产管理、收费标准、家属管理、抄表管理、在线缴费、业主公告、统计报表、业主投票、可视化大屏等功能。为物业量身打造的小区收费管理系统&#xff0c;贴合物业工作场景&#xff0c;轻…

未来20年人工智能将如何塑造社会

照片由Brian McGowan在Unsplash上拍摄 更多资讯&#xff0c;请访问 2img.ai “人工智能会成为我们的救星还是我们的末日&#xff1f;” 几十年来&#xff0c;这个问题一直困扰着哲学家、科学家和科幻爱好者。 当我们踏上技术革命的边缘时&#xff0c;是时候透过水晶球&#x…

【java算法专场】双指针(上)

目录 前言 基本原理 对撞指针 快慢指针 移动零 算法思路 算法步骤 代码实现 算法分析 复写零 算法思路 算法步骤 代码实现 快乐数 算法思路 算法步骤 代码实现 盛最多水的容器 ​编辑算法思路 代码实现 前言 双指针是一种在数组或链表等线性数据结构中高效…

CV每日论文--2024.6.26

1、StableNormal: Reducing Diffusion Variance for Stable and Sharp Normal 中文标题&#xff1a;StableNormal&#xff1a;减少扩散方差以实现稳定且锐利的法线 简介&#xff1a;本文介绍了一种创新解决方案&#xff0c;旨在优化单目彩色输入&#xff08;包括静态图片与动态…

CCS的安装步骤

CCS的安装步骤 安装之前有几件重要的事情要做&#xff1a; 首先肯定是要下载安装包啦&#xff01;点击此处是跳到官网下载地址安装包不能处的路径中不能包含中文关闭病毒防护和防火墙&#xff0c;以及其他杀毒软件最后是在重启后进行安装 主要的步骤如下&#xff1a; 找到安…