一架梯子,一头程序猿,仰望星空!
LangChain教程(Python版本) > 内容正文

LangChain Agent入门教程


LangChain Agent代理的核心思想是使用LLM作为大脑自动思考,自动决策选择执行不同的动作,最终完成我们的目标任务。

提示:从开发角度理解,就是我们提前开发好各种各样功能的API,然后给Agent一个任务,让LLM自己分析要调用哪个API可以完成任务。

举个例子方便理解LangChain Agent要解决的问题。

例如:

我们要调研下“docker是否可以作为生产环境部署方案”,我们首先会去百度搜索”docker介绍”,浏览下搜索结果,然后进一步搜索”docker部署的优缺点”,浏览下结果等等,最后得出结论。

LangChain Agent就是要模拟这个过程,我可以提前封装一序列工具(例如:百度搜索、提取URL内容等工具),然后给通过Agent下发一个目标任务“docker是否可以作为生产环境部署方案”,Agent就会构造提示词去调用大语言模型LLM,要实现这个目标任务,下一步执行什么动作(就是要调用那个工具),AI就会返回要调用的工具,代码就去执行这个工具,然后把工具执行的结果,回传给AI,再问下一步执行什么工具,反复执行这个过程就可以完成前面提到的任务。

提示:这个是自从GPT模型发布以来,相当炸裂的能力,让LLM作为大脑,主动思考,然后调用我们开发好的各种API,这样LLM的能力就相当强大,目前这个特性还在实验阶段,会反复调用LLM所以相当费token,执行一个任务下来分分钟几万个token,想省钱,建议先让LLM执行简单的逻辑判断任务。

核心概念

下面介绍相关的组件&概念

Agent(代理)

Agent可以理解成我们的助手,代理我们去做一些决策,在LangChain agent底层实现就是通过LLM决定下一步执行什么动作(或者说调用什么API),这里有个知名的ReAct模式,就是描述AI决策过程,感兴趣的同学可以去了解下。

LangChain针对不同的场景提供了几种不同类型的代理类型。

Tools(工具)

Tools我觉得理解成API更合适,就是我们提前封装好的各种功能的API,目的是扩展LLM的能力,由LLM根据问题决定调用那个具体的API来完成任务。

Toolkits(工具集合)

工具集合,通常提供给LLM的工具不会是一个、两个,会提供一组可用的工具给LLM,让LLM完成任务的时候有更多的能力选择。

AgentExecutor

代理执行器是负责执行LLM选择的工具(API)。以下是此运行时的伪代码:

# 通过LLM拿到需要执行的工具
next_action = agent.get_action(...)
# 如果没有完成任务,循环执行
while next_action != AgentFinish:
      # 执行动作
    observation = run(next_action)
    # 执行下一步要执行的工具
    next_action = agent.get_action(..., next_action, observation)
return next_action

执行过程虽然不复杂,执行器处理了很多细节问题主要包括:

  1. 处理agent选择不存在的工具的情况
  2. 处理工具出错的情况
  3. 处理agent产生无法解析为工具调用的输出的情况
  4. 调试问题。

快速开始

本节介绍LangChain的Agent的基础用法

设置Agent

这里使用OpenAIFunctionsAgent。这是最简单的Agent,它使用的是openai的function call功能,当然LangChain也支持使用其他模型实现的Agent。

首先,加载openai的chat模型。

from langchain.chat_models import ChatOpenAI
llm = ChatOpenAI(temperature=0)

接下来,我们定义一个工具(API)让LLM调用。这里实现一个非常简单的 Python 函数,可以计算传入的单词的长度。

from langchain.agents import tool

@tool
def get_word_length(word: str) -> int:
    """返回word的字符串长度."""
    return len(word)

tools = [get_word_length]

现在创建提示词模板。这里使用 OpenAIFunctionsAgent.create_prompt 函数来自动创建提示词模版。

from langchain.schema import SystemMessage
# 我们使用的是chat模型,这里定义AI扮演的角色
system_message = SystemMessage(content="你是一个AI助手,但是你不擅长计算单词的字符串长度")
prompt = OpenAIFunctionsAgent.create_prompt(system_message=system_message)

将前面定义的提示词模板和llm组合在一起,定义Agent

from langchain.agents import OpenAIFunctionsAgent
# 定义openai的function agent
# 指定llm可以调用的工具集合tools
agent = OpenAIFunctionsAgent(llm=llm, tools=tools, prompt=prompt)

最后,我们创建AgentExecutor负责执行。

from langchain.agents import AgentExecutor
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)

测试,执行一个任务

agent_executor.run("字符串educa的长度是多少?")
# 执行日志,可以发现ai会主动调用我们前面定义的get_word_length函数,传入AI提取的参数
> Entering new AgentExecutor chain...

    Invoking: `get_word_length` with `{'word': 'educa'}`

    5

    "educa"字符串长度是5

    > Finished chain.

    '"educa"字符串长度是5.'


关联主题