原文:人充当LLM Agent的工具(Human-In-The-Loop ),提升复杂问题解决成功率
在Agent开发过程中,LLM充当Agent的大脑,对问题进行规划、分解、推理,在执行过程中合理选择利用工具(Tool)解决某些具体领域的子问题。一般来说,大家习惯了选择使用搜索、计算器、code interperter之类的工具,但实际上,人也可以作为LLM的工具之一,被添加到解决问题的循环中,这被称作Human-In-The-Loop。
传统的聊天机器人如 IVR,它会尝试处理呼叫请求,如果无法处理,就会转接给人工完成请求。而在 "Human In loop "下,Agent专注完成为用户请求,而过程中的人工支持对用户是透明的。agent可以通过一次或多次迭代来收集人工协助,而所有这些用户是看不到的。
在具体使用上也比较简单直接,和前面文章一文探秘LLM应用开发(24)-Prompt(架构模式Agent)提到的写法也没有什么区别。
举例,让agent回答:科布斯-葛瑞林的生日是几月几号?
完整代码:
pip install langchain
pip install google-search-results
pip install openai
import os
os.environ['OPENAI_API_KEY'] = str("xxxxxxxxxx")
os.environ["SERPAPI_API_KEY"] = str("xxxxxxxxxx")
llm = OpenAI(temperature=0,model_name='gpt-4-0314')
import sys
from langchain.chat_models import ChatOpenAI
from langchain.llms import OpenAI
from langchain.agents import load_tools, initialize_agent
from langchain.agents import AgentType
llm = ChatOpenAI(temperature=0.0)
math_llm = OpenAI(temperature=0.0)
tools = load_tools(
["human", "llm-math"],
llm=math_llm,
)
agent_chain = initialize_agent(
tools,
llm,
agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
verbose=True,
)
agent_chain.run("In what month is Cobus Greyling's birthday?")
从下面代码可以看到,我们将human作为tool添加到agent可用的工具箱中。那么,什么情况可以使用human这个工具呢?这段源码可以看到答案。
class HumanInputRun(BaseTool):
"""Tool that adds the capability to ask user for input."""
name = "Human"
description = (
"You can ask a human for guidance when you think you "
"got stuck or you are not sure what to do next. "
"The input should be a question for the human."
)
prompt_func: Callable[[str], None] = Field(default_factory=lambda: _print_func)
input_func: Callable = Field(default_factory=lambda: input)
执行查看运行结果:
总之,这一思路非常新颖,可以很好解决那种开放环境下,与用户交互的复杂场景任务,通过寻求人工的帮助能够有效降低任务的失败。这在智能客服情境下有很大的应用前景,比如可以定义哪些问题,哪些时间点应该寻求人工支持。基于这个思路,还可以进一步扩展,比如完成专业角色问题的分发,多人协同,形成一个人+AI的Agent网络,这对于解决当前阶段Agent现实挑战(详见:一文探秘LLM应用开发(25)-Prompt(架构模式之Agent的现实挑战))有了一个过渡性方案。