字节跳动青训营 | LangChain实战课学习笔记--代理

138 阅读5分钟

一、LangChain中的代理与ReAct框架

1.1 思维链(CoT)与大模型的局限性

  • 思维链(CoT)展示了LLMs执行推理轨迹的能力。

  • 与少样本提示结合,LLMs能完成复杂推理任务。

  • 大模型的固有问题:无法主动更新知识,导致事实幻觉。

1.2 解决方案:外部工具与代理

  • 让大模型在本地知识库中搜索,检查信息真实性。

  • 如果本地知识库找不到信息,调用外部搜索工具。

  • 外部工具:本地知识库、搜索引擎等。

  • 代理(Agent):多功能接口,决定调用哪些工具。

1.3 代理的作用

  • 代理根据用户输入,决定调用哪些工具。

  • 代理可以同时使用多种工具,并将一个工具的输出作为另一个工具的输入。

1.4 LangChain中的代理

  • 理解三个元素:大模型、外部工具、控制交互的代理。

  • 代理自主判断下一步行为,引导大模型进行操作。

1.5 ReAct框架

  • 灵感来自“行动”和“推理”之间的协同作用。

  • 引导模型生成任务解决轨迹:观察-思考-行动。

  • ReAct框架:推理(Reasoning)和行动(Acting)的协同。

1.6 ReAct框架的实现--通过代理实现

理解ReAct框架

  • ReAct框架是一种指导大语言模型(LLMs)进行推理和行动的思维框架,它强调“观察-思考-行动”的循环,即Reasoning-Acting。
  • 该框架通过引导模型生成推理痕迹和任务特定行动,实现内部知识和外部信息的结合,提高模型的可解释性和可信度。

代理的作用

  • 代理(Agent)作为一个多功能接口,能够接触并使用一套工具,根据用户输入决定调用哪些工具。
  • 代理可以同时使用多种工具,并将一个工具的输出作为另一个工具的输入。

LangChain中的代理

  • 在LangChain中,代理通过理解三个元素来工作:大模型、与之交互的外部工具、控制交互的代理本身。
  • 代理负责调用适当的外部工具,并管理整个交互过程。

实现ReAct框架

  • 使用LangChain中的ZERO_SHOT_REACT_DESCRIPTION类型的代理来实现ReAct框架。
  • 代理需要注册并获取Google搜索工具的API密钥,并安装必要的包。

设置和初始化

  • 设置OpenAI和SerpAPI的API密钥。
  • 导入所需的库,并加载将用于控制代理的语言模型。
  • 加载要使用的工具,如serpapi和llm-math。
  • 使用工具、语言模型和代理类型来初始化代理。

代理执行任务

  • 代理根据任务需求,自动形成思考与行动链条,通过搜索和计算等操作完成任务。
  • 代理的每一步推理过程都会被详细记录,以提高可解释性和可信度。

ReAct框架的优势

  • ReAct框架使得大模型能够自主判断下一步行为,提高了模型的自主性。
  • 该框架在各种语言和决策任务中都得到了很好的效果,具有巨大的发展潜力。

二、AgentExecutor运行机制

2.1 代理与链的差异

  • :操作硬编码在代码中。

  • 代理:语言模型决定操作和执行顺序。

2.2 LangChain核心理念

  • 操作序列由语言模型选择,而非硬编码。

2.3 代理的关键组件

  1. 代理(Agent):由语言模型和提示驱动,决定下一步操作。

  2. 工具(Tools):代理调用的函数,需要正确提供和描述。

  3. 工具包(Toolkits):完成特定目标的相关工具集合。

  4. 代理执行器(AgentExecutor):代理的运行环境,调用代理并执行选择的操作。

2.4 AgentExecutor运行机制

  • 深入LangChain源代码,理解代理如何自动决策。

2.5 关键代码

llm = OpenAI(temperature=0)  # 大语言模型
tools = load_tools(["serpapi", "llm-math"], llm=llm)  # 工具-搜索和数学运算
agent = initialize_agent(tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True)  # 代理
agent.run("目前市场上玫瑰花的平均价格是多少?如果我在此基础上加价15%卖出,应该如何定价?")  # 运行代理

2.6 Debug过程

第一轮思考:模型决定搜索

   - AgentExecutor_take_next_step方法控制下一步调用。

   - self.agent.plan方法被调用,开始计划。

   - LLMChain类的generate方法中提示的具体内容。

第二轮思考:模型决定计算

   - 根据搜索结果,模型决定下一步行动是计算。

第三轮思考:模型完成任务

   - 模型判断任务完成,输出最终答案。

2.7 模型输出

  • 模型根据提示进行搜索和计算,最终得出答案。

三、LangChain高级代理类型及应用

3.1 代理类型与介绍

  • Structured Tool Chat(结构化工具对话)代理:允许复杂交互,调用一系列复杂工具。

  • Self-Ask with Search(自主询问搜索)代理:使用追问和中间答案技巧,解决多跳问题。

  • Plan and Execute(计划与执行)代理:先计划再执行子任务,实现目标。

3.2 结构化工具对话代理

  • 背景:LangChain 2023年初引入多操作代理框架,允许代理计划执行多个操作。

  • 应用:文件管理、Web浏览器等工具集。

  • PlayWright工具包:模拟用户操作网页,自动化网页交互和测试。

3.3 PlayWright基本使用

from playwright.sync_api import sync_playwright
def run():
    with sync_playwright() as p:
        browser = p.chromium.launch()
        page = browser.new_page()
        page.goto('https://langchain.com/')
        title = page.title()
        print(f"Page title is: {title}")
        browser.close()
if __name__ == "__main__":
    run()

3.4 自主询问搜索代理

  • 特点:解决多跳问题,逐步逼近最终答案。

  • 工具集合:包含搜索工具,查询和验证多个信息点。

3.5 计划与执行代理

  • 特点:受Plan-and-Solve论文启发,分为计划和执行两个阶段。

  • 应用:Planner和Executor可以是不同的模型。