Agent
大模型是被訓練出來的,知識是有時間限制的,所以當進行問答時,可以結合本地知識庫和調用搜索或在線API來增強自身能力,這些不屬於大模型的內部數據,成爲外部工具。
LangChain提供了Agent(代理)模塊,大模型以此可以調用外部工具。
Agent是什麼?
當大模型無法根據自身數據回覆時,可能會一本正經的胡說八道,這時可以利用Agent,調用外部工具實現。
可以同時使用多個Agent,且一個Agent的輸出可以作爲另外一個Agent的輸入。
當有Agent的參與時:
- LLM負責生成預測和處理輸入。
- Agent負責接口調用、文件處理和搜索策略等。
- 以及當有多個代理時,是如何決定調用哪個?需要ReAct框架
ReAct框架
人類日常行爲都是:邊觀察、邊思考,然後再行動。ReAct框架的核心思想是行動和推理的協同,將人類學習新任務並作出決策或再推理的能力讓LLM學習。
下面給出:讓LLM去找胡椒瓶的例子,逐步推理,儘量把所有情況均考慮。
LangChain中的Agent類,對ReAct進行封裝和實現。
一個Agent的Demo
使用Agent,讓LLM找到大蒜的當前價格,並加價20%,作爲售價。
- 邏輯:先在網上找到當前的成本價(行動),然後觀察這個價格的高低(觀察),來決定加價多少(思考),最後計算售價(行動)。
- 安裝依賴
!pip install langchain
!pip install openai
# SerpAPI是Google的搜索工具,用於找出當前大蒜的價格
!pip install google-search-results
- 配置API
import os
os.environ["OPENAI_API_KEY"]='Your OpenAI API KEY'
os.environ["SERPAPI_API_KEY"]='our SerpAPI API Key'
- 導入庫
# 加載工具
from langchain.agents import load_tools
# 初始agent 工具
from langchain.agents import initialize_agent
from langchain.agents import AgentType
from langchain.llms import OpenAI
- 實例化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)
- 執行並獲取結果
agent.run("目前市場上大蒜子的平均價格是多少?如果我在此基礎上加價20%賣出,應該如何定價?")
openAI的結果:
下面嘗試使用國產模型替代:
文心
原生的 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元/斤。具體售價取決於你選擇的大蒜子平均價格。
直接輸出會有報錯