自然语言处理从入门到应用——LangChain:代理(Agents)-[自定义MRKL代理]

分类目录:《自然语言处理从入门到应用》总目录


本文将介绍如何创建自己的自定义MRKL Agent。MRKL Agent由三个部分组成:

  • 工具:代理可用的工具。
  • LLMChain:生成以一定方式解析的文本,以确定要采取哪个动作。
  • 代理类本身:解析LLMChain的输出,以确定要采取哪个动作。

自定义LLMChain(Custom LLMChain)

本部分将介绍如何通过创建自定义LLMChain来创建自定义MRKL代理。创建自定义代理的第一种方法是使用现有的代理类,但使用自定义LLMCain。这也是创建自定义代理的最简单方法。强烈建议使用ZeroShotAgent ,因为目前这是最通用的一个。

创建自定义LLMCain的大部分工作都归结为提示符。因为我们使用的是一个现有的代理类来解析输出,所以提示符中要生成该格式的文本是非常重要的。此外,我们目前需要一个agent_scratchpad输入变量来记录以前的操作和观察结果,这几乎总是提示符的最后一部分。但是,除了这些说明之外,我们还可以根据需要自定义提示。为了确保提示符包含适当的指令,我们将在该类上使用helper方法。ZeroShotAgenthelper方法接受以下参数:

  • tools:座席将有权访问的工具列表,用于设置提示的格式。
  • prefix:要放在工具列表前面的字符串。
  • suffix:放在工具列表后面的字符串。
  • input_variables:最后提示所期望的输入变量列表。

在下面的示例中,我们将给予我们的代理访问Google搜索,我们将定制它,我们将让它回答为盗版。

dart 复制代码
from langchain.agents import ZeroShotAgent, Tool, AgentExecutor
from langchain import OpenAI, SerpAPIWrapper, LLMChain


search = SerpAPIWrapper()
tools = [
    Tool(
        name = "Search",
        func=search.run,
        description="useful for when you need to answer questions about current events"
    )
]


prefix = """Answer the following questions as best you can, but speaking as a pirate might speak. You have access to the following tools:"""
suffix = """Begin! Remember to speak as a pirate when giving your final answer. Use lots of "Args"
 
Question: {input}
{agent_scratchpad}"""
 
prompt = ZeroShotAgent.create_prompt(
    tools, 
    prefix=prefix, 
    suffix=suffix, 
    input_variables=["input", "agent_scratchpad"]
)

如果感到好奇,我们现在可以看看最终的提示模板,看看它看起来像当它的所有放在一起:

dart 复制代码
print(prompt.template)

输出:

dart 复制代码
Answer the following questions as best you can, but speaking as a pirate might speak. You have access to the following tools:
 
Search: useful for when you need to answer questions about current events
 
Use the following format:
 
Question: the input question you must answer
Thought: you should always think about what to do
Action: the action to take, should be one of [Search]
Action Input: the input to the action
Observation: the result of the action
... (this Thought/Action/Action Input/Observation can repeat N times)
Thought: I now know the final answer
Final Answer: the final answer to the original input question
 
Begin! Remember to speak as a pirate when giving your final answer. Use lots of "Args"
 
Question: {input}
{agent_scratchpad}

需要注意的是,我们能够为代理提供自定义的提示模板,即不限于由create_prompt函数生成的提示,假设它满足代理的要求。例如,对于ZeroShotAgent,我们需要确保它应该有一个以Action:开头的字符串和一个以Action Input:开头的字符串,并且两者都应该用换行符分隔。

dart 复制代码
llm_chain = LLMChain(llm=OpenAI(temperature=0), prompt=prompt)

tool_names = [tool.name for tool in tools]
agent = ZeroShotAgent(llm_chain=llm_chain, allowed_tools=tool_names)

agent_executor = AgentExecutor.from_agent_and_tools(agent=agent, tools=tools, verbose=True)

agent_executor.run("How many people live in canada as of 2023?")

输出:

dart 复制代码
> Entering new AgentExecutor chain...
Thought: I need to find out the population of Canada
Action: Search
Action Input: Population of Canada 2023
Observation: The current population of Canada is 38,661,927 as of Sunday, April 16, 2023, based on Worldometer elaboration of the latest United Nations data.
Thought: I now know the final answer
Final Answer: Arrr, Canada be havin' 38,661,927 people livin' there as of 2023!
 
> Finished chain.

"Arrr, Canada be havin' 38,661,927 people livin' there as of 2023!"

多路输入 (Multiple Inputs)

代理还可以处理需要多个输入的提示:

dart 复制代码
prefix = """Answer the following questions as best you can. You have access to the following tools:"""
suffix = """When answering, you MUST speak in the following language: {language}.
 
Question: {input}
{agent_scratchpad}"""
 
prompt = ZeroShotAgent.create_prompt(
    tools, 
    prefix=prefix, 
    suffix=suffix, 
    input_variables=["input", "language", "agent_scratchpad"]
)

llm_chain = LLMChain(llm=OpenAI(temperature=0), prompt=prompt)

agent = ZeroShotAgent(llm_chain=llm_chain, tools=tools)

agent_executor = AgentExecutor.from_agent_and_tools(agent=agent, tools=tools, verbose=True)

agent_executor.run(input="How many people live in canada as of 2023?", language="italian")

输出:

dart 复制代码
> Entering new AgentExecutor chain...
Thought: I should look for recent population estimates.
Action: Search
Action Input: Canada population 2023
Observation: 39,566,248
Thought: I should double check this number.
Action: Search
Action Input: Canada population estimates 2023
Observation: Canada's population was estimated at 39,566,248 on January 1, 2023, after a record population growth of 1,050,110 people from January 1, 2022, to January 1, 2023.
Thought: I now know the final answer.
Final Answer: La popolazione del Canada è stata stimata a 39.566.248 il 1° gennaio 2023, dopo un record di crescita demografica di 1.050.110 persone dal 1° gennaio 2022 al 1° gennaio 2023.
 
> Finished chain.

'La popolazione del Canada è stata stimata a 39.566.248 il 1° gennaio 2023, dopo un record di crescita demografica di 1.050.110 persone dal 1° gennaio 2022 al 1° gennaio 2023.'

参考文献:

[1] LangChain 🦜️🔗 中文网,跟着LangChain一起学LLM/GPT开发:https://www.langchain.com.cn/

[2] LangChain中文网 - LangChain 是一个用于开发由语言模型驱动的应用程序的框架:http://www.cnlangchain.com/

相关推荐
LZXCyrus5 分钟前
【杂记】vLLM如何指定GPU单卡/多卡离线推理
人工智能·经验分享·python·深度学习·语言模型·llm·vllm
我感觉。22 分钟前
【机器学习chp4】特征工程
人工智能·机器学习·主成分分析·特征工程
YRr YRr31 分钟前
深度学习神经网络中的优化器的使用
人工智能·深度学习·神经网络
DieYoung_Alive31 分钟前
一篇文章了解机器学习(下)
人工智能·机器学习
夏沫的梦33 分钟前
生成式AI对产业的影响与冲击
人工智能·aigc
goomind1 小时前
YOLOv8实战木材缺陷识别
人工智能·yolo·目标检测·缺陷检测·pyqt5·木材缺陷识别
只怕自己不够好1 小时前
《OpenCV 图像基础操作全解析:从读取到像素处理与 ROI 应用》
人工智能·opencv·计算机视觉
幻风_huanfeng1 小时前
人工智能之数学基础:线性代数在人工智能中的地位
人工智能·深度学习·神经网络·线性代数·机器学习·自然语言处理
嵌入式大圣1 小时前
嵌入式系统与OpenCV
人工智能·opencv·计算机视觉
ZOMI酱2 小时前
【AI系统】GPU 架构与 CUDA 关系
人工智能·架构