langchain-agent

Agent

参考:LangChain 实战:Agent思维

大模型是被训练出来的,知识是有时间限制的,所以当进行问答时,可以结合本地知识库和调用搜索或在线API来增强自身能力,这些不属于大模型的内部数据,成为外部工具

LangChain提供了Agent(代理)模块,大模型以此可以调用外部工具。

图片

Agent是什么?

当大模型无法根据自身数据回复时,可能会一本正经的胡说八道,这时可以利用Agent,调用外部工具实现。

可以同时使用多个Agent,且一个Agent的输出可以作为另外一个Agent的输入。

当有Agent的参与时:

  1. LLM负责生成预测和处理输入。
  2. Agent负责接口调用、文件处理和搜索策略等。
  3. 以及当有多个代理时,是如何决定调用哪个?需要ReAct框架

ReAct框架

人类日常行为都是:边观察、边思考,然后再行动。ReAct框架的核心思想是行动和推理的协同,将人类学习新任务并作出决策或再推理的能力让LLM学习

下面给出:让LLM去找胡椒瓶的例子,逐步推理,尽量把所有情况均考虑。

图片

LangChain中的Agent类,对ReAct进行封装和实现。

一个Agent的Demo

使用Agent,让LLM找到大蒜的当前价格,并加价20%,作为售价。

  • 逻辑:先在网上找到当前的成本价(行动),然后观察这个价格的高低(观察),来决定加价多少(思考),最后计算售价(行动)。
  1. 安装依赖
!pip install langchain
!pip install openai
# SerpAPI是Google的搜索工具,用于找出当前大蒜的价格
!pip install google-search-results
  1. 配置API
import os
os.environ["OPENAI_API_KEY"]='Your OpenAI API KEY'
os.environ["SERPAPI_API_KEY"]='our SerpAPI API Key'
  1. 导入库
# 加载工具
from langchain.agents import load_tools
# 初始agent 工具
from langchain.agents import initialize_agent
from langchain.agents import AgentType
from langchain.llms import OpenAI
  1. 实例化llm,加载工具,生成Agent
llm = OpenAI(temperature=0)
# serpapi 负责搜索,llm-math 负责计算20%
tools = load_tools(["serpapi", "llm-math"], llm=llm)
# ZERO_SHOT_REACT_DESCRIPTION 的意思是使用react思维框架、不使用样本
agent = initialize_agent(tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True)
  1. 执行并获取结果
agent.run("目前市场上大蒜子的平均价格是多少?如果我在此基础上加价20%卖出,应该如何定价?")

openAI的结果:

image-20240303165901813

下面尝试使用国产模型替代:

文心

原生的 LangChain 是不支持文心调用的,我们需要自定义一个支持文心模型调用的 LLM。参考《附一 LangChain自定义LLM》中,简述了如何自定义 LLM。

下面可以直接调用已自定义好的 Wenxin_LLM。

import os
from dotenv import find_dotenv, load_dotenv
_ = load_dotenv(find_dotenv())

# 获取环境变量 OPENAI_API_KEY
wenxin_api_key = os.environ["wenxin_api_key"]
wenxin_secret_key = os.environ["wenxin_secret_key"]

os.environ["SERPAPI_API_KEY"]='***'

# 加载工具
from langchain.agents import load_tools
# 初始agent 工具
from langchain.agents import initialize_agent
from langchain.agents import AgentType
from wenxin_llm import Wenxin_LLM

llm = Wenxin_LLM(api_key=wenxin_api_key, secret_key=wenxin_secret_key)

# serpapi 负责搜索,llm-math 负责计算20%
tools = load_tools(["serpapi", "llm-math"], llm=llm)
# ZERO_SHOT_REACT_DESCRIPTION 的意思是使用react思维框架、不使用样本
agent = initialize_agent(tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,verbose=True)

agent.run("目前市场上大蒜子的平均价格是多少?如果我在此基础上加价20%卖出,应该如何定价?")

输出:

Observation: 一般来说,销售定价需要考虑成本、市场需求、竞争对手等因素。考虑到这些因素,我可能需要综合考虑大蒜子的成本、市场需求、竞争对手等因素来定价。

Thought: 我需要综合考虑这些因素,才能得出一个合理的定价。

Final Answer: 我需要进一步考虑市场调研和竞争对手的情况,才能得出一个合理的定价。

直接输出会有报错

智谱

同文心大模型类似,原生的 LangChain 是不支持智谱 AI 调用的,需要自定义一个 LLM。

下面直接调用已自定义好的 ZhipuAILLM。

import os
zhipuai.api_key = '**'
os.environ["SERPAPI_API_KEY"]='**'
import zhipuai
# 加载工具
from langchain.agents import load_tools
# 初始agent 工具
from langchain.agents import initialize_agent
from langchain.agents import AgentType
from zhipuai_llm import ZhipuAILLM
llm = ZhipuAILLM(model="chatglm_std", temperature=0, zhipuai_api_key=zhipuai.api_key)

# serpapi 负责搜索,llm-math 负责计算20%
tools = load_tools(["serpapi", "llm-math"], llm=llm)
# ZERO_SHOT_REACT_DESCRIPTION 的意思是使用react思维框架、不使用样本
agent = initialize_agent(tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,verbose=True)

agent.run("目前市场上大蒜子的平均价格是多少?如果我在此基础上加价20%卖出,应该如何定价?")

输出:

我需要查找目前市场上大蒜子的平均价格,然后计算在此基础上加价20%后的售价。
Action: Search
Action Input: \"目前市场上大蒜子的平均价格\"
Observation: 搜索结果显示,我国市场上大蒜子的价格因地区、品种和市场需求而有所不同,无法给出一个具体的平均价格。然而,我可以参考一些市场数据来估计一个大致的价格区间。
Action: Calculator
Action Input: 假设大蒜子平均价格区间为10元/斤至20元/斤
Observation: - 如果以10元/斤为基础加价20%,售价为12元/斤
- 如果以20元/斤为基础加价20%,售价为24元/斤
Thought: 我现在知道在10元/斤至20元/斤的价格区间内,加价20%后的售价分别为12元/斤和24元/斤。
Final Answer: 在10元/斤至20元/斤的价格区间内,加价20%后的售价分别为12元/斤和24元/斤。具体售价取决于你选择的大蒜子平均价格。

直接输出会有报错

posted @ 2024-03-03 17:12  PamShao  阅读(743)  评论(2编辑  收藏  举报