什么是代理(Agent)秩铆?
在編程中竖席,代理的核心思想是使用一個(gè)大型語言模型(LLM)來選擇執(zhí)行的一系列動作。在傳統(tǒng)的鏈?zhǔn)骄幊蹋╟hains)中油昂,這些動作通常被硬編碼在代碼中革娄。而在代理模式中,一個(gè)語言模型被用作推理引擎冕碟,來確定要采取哪些動作以及以何種順序執(zhí)行拦惋。
代理的關(guān)鍵概念:
AgentAction(代理動作): 這是一個(gè)數(shù)據(jù)類,代表了代理應(yīng)該執(zhí)行的動作安寺。它包含一個(gè)
tool
屬性厕妖,表示應(yīng)該調(diào)用的工具的名稱,以及一個(gè)tool_input
屬性挑庶,表示該工具的輸入言秸。AgentFinish(代理完成): 這是一個(gè)數(shù)據(jù)類,表示代理已經(jīng)完成任務(wù)迎捺,應(yīng)該將結(jié)果返回給用戶举畸。它具有一個(gè)
return_values
參數(shù),是一個(gè)要返回的字典凳枝。通常抄沮,它只包含一個(gè)鍵 -output
- 代表一個(gè)字符串,因此通常只返回這個(gè)鍵。Intermediate Steps(中間步驟): 這些代表了先前代理動作和相應(yīng)的輸出叛买,它們會被傳遞下去砂代。這對于將來的迭代非常重要,因?yàn)榇硇枰浪呀?jīng)完成了哪些任務(wù)率挣。這個(gè)類型被定義為
List[Tuple[AgentAction, Any]]
刻伊。需要注意,observation
目前被定義為Any
類型难礼,以確保最大的靈活性娃圆。實(shí)際上,它通常是一個(gè)字符串蛾茉。
在Langchain中讼呢,代理可以根據(jù)需求進(jìn)行自定義,也可以使用官方提供的代理谦炬。下面是一個(gè)示例代碼悦屏,演示了如何使用Langchain的代理功能:
# 導(dǎo)入必要的模塊和工具
from langchain.agents import initialize_agent, Tool
from langchain.agents import load_tools
from langchain.llms import OpenAI
from langchain.agents import AgentType
from langchain import hub
from langchain.tools.render import render_text_description
# 初始化配置
import os
import config
config.init(os)
# 定義查詢
query = "對比下InternLM-123B和gpt4"
# 初始化LLM模型和工具
llm = OpenAI(temperature=0, verbose=True)
tools = load_tools(["serpapi", "llm-math"], llm=llm)
llm_with_stop = llm.bind(stop=["\nObservation"])
prompt = hub.pull("hwchase17/react")
prompt = prompt.partial(
tools=render_text_description(tools),
tool_names=", ".join([t.name for t in tools]),
)
# 定義代理
agent = {
"input": lambda x: x["input"],
"agent_scratchpad": lambda x: format_log_to_str(x['intermediate_steps'])
} | prompt | llm_with_stop | ReActSingleInputOutputParser()
# 初始化代理執(zhí)行器
agent_executor = initialize_agent(tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True)
# 執(zhí)行查詢
agent_executor.invoke({"input": query})
以上代碼演示了如何使用Langchain的代理功能,通過LLM的代理增加了數(shù)學(xué)運(yùn)算和搜索兩種能力键思。這個(gè)例子展示了Langchain代理的靈活性和強(qiáng)大功能础爬。
但是你如果稍微深入點(diǎn)研究會發(fā)現(xiàn)agent的Tool只能傳入2個(gè),超過了就會崩潰吼鳞。
而且還有其他問題看蚜,我嘗試問了他100以內(nèi)的素?cái)?shù),它居然報(bào)錯(cuò)了
ValueError: unknown format from LLM: This cannot be solved using the numexpr library.
我把同樣的問題給了gpt3.5他就給出了結(jié)果赔桌,原因是因?yàn)閘lm-math這個(gè)Tool接管這個(gè)邏輯分支供炎,名字叫l(wèi)lm-math怎么敢啊疾党?
然后我把這個(gè)Tool刪除之后它就運(yùn)行正常了音诫。