Langchain 代理 (Agents) ,赋能超级 LLMs

大型语言模型(LLMs)存在逻辑、计算和搜索等能力缺陷,LangChain代理(Agents)可解决这些问题。本文介绍了代理的概念、使用所需的要素,还阐述了Zero Shot ReAct、会话式ReAct、ReAct文档存储、使用搜索自问等常见代理类型,展现了其增强LLMs能力的潜力。

Langchain 代理 (Agents) ,赋能超级 LLMs

原文:Langchain 代理 (Agents) ,赋能超级 LLMs - 知乎

大型语言模型(LLMs) 非常强大,但它们缺乏“最笨”的计算机程序可以轻松处理的特定能力。逻辑、计算和搜索是计算机通常擅长的领域,但 LLMs 却遇到了困难。 计算机可以解决非常复杂的数学问题,但如果我们让 GPT-4 告诉我们 4.1 * 7.9 的答案,它就失败了:

GPT 4 对简单计算的响应

要求 GPT-4 执行简单的计算通常会得到一个错误的答案。一个简单的计算器可以毫无问题地执行相同的计算。

根据一个简单的计算器,答案是 19.357,保留三位小数。一个简单的计算器程序可以做到这一点,但一个非常复杂的 AI 引擎却失败了,这是不是很有趣?

这还不是全部。如果我问 GPT-4,“我如何在 LangChain 中使用 LLMChain?”它又遇到了困难:

GPT-4 无法回答关于最近事件、技术等的问题

这里谈到的 LangChain 并不是我们所知道的 LangChain。它是一个旧的区块链项目。回答既过时又充满错误的信息。

没错。LangChain 确实是一个区块链项目 [1][2]。然而,似乎没有“ LLMChain ”组件或“ LANG 代币 ”——这两者都是幻觉。

GPT-4 无法告诉我们关于 LangChain 的信息,这是因为它与外部世界没有联系。它的唯一知识来自于它的训练数据,而训练数据在 2021 年末截止。

在当今的 LLMs 一代中存在重大缺陷,我们必须找到解决这些问题的方法。一种“解决方案套件”以“代理 (Agents) ”形式提供。

这些代理 (Agents) 不仅解决了我们上面看到的问题,还解决了 许多 其他问题。事实上,添加代理 (Agents) 在增强 LLMs 的能力方面几乎没有上限。

在本章中,我们将讨论代理 (Agents) 。我们将学习它们是什么,它们如何工作,以及如何在 LangChain 库中使用它们来为我们的 LLMs 增添超能力。


什么是代理 (Agents) ?

我们可以将代理 (Agents) 视为 LLMs 的工具 (Tools) 。就像人类使用计算器进行数学计算或在 Google 中搜索信息一样,代理 (Agents) 允许 LLM 做同样的事情。

LangChain LLM 代理 (Agents)

代理 (Agents) 是可以使用计算器、搜索或执行代码的 LLMs。

使用代理 (Agents) ,LLM 可以编写和执行 Python 代码。它可以搜索信息,甚至查询 SQL 数据库。

让我们看一个简单的例子。我们将从一个 “Zero-shot” 代理 (Agents) 开始(稍后会详细介绍),它允许我们的 LLM 使用计算器。

代理 (Agents) 和工具

要使用代理 (Agents) ,我们需要三样东西:

  • 一个基本的 LLM,
  • 我们将要进行交互的工具 Tools,
  • 一个控制交互的代理 (Agents) 。

让我们从安装 langchain 并初始化我们的基本 LLM 开始。

from langchain import OpenAI

llm = OpenAI(
    openai_api_key="OPENAI_API_KEY",
    temperature=0,
    model_name="text-davinci-003"
)

现在初始化计算器工具。

在初始化工具 Tool 时,我们可以创建自定义工具 Tool 或加载预构建工具 Tool。

无论哪种情况,"工具 Tool" 都是一个给定工具 名称 name 和 描述 description 的 实用链

例如,我们可以从现有的 llm_math 链创建一个新的计算器工具:

In [3]:

from langchain.chains import LLMMathChain
from langchain.agents import Tool

llm_math = LLMMathChain(llm = llm)

# initialize the math tool
math_tool = Tool(
    name ='Calculator',
    func = llm_math.run,
    description ='Useful for when you need to answer questions about math.'
)
# when giving tools to LLM, we must pass as list of tools
tools = [math_tool]

In [4]:

tools [0].name, tools [0].description

Out [4]:

('Calculator', 'Useful for when you need to answer questions about math.')

在使用自定义工具时,我们必须遵循此过程。然而,一个预构建的 llm_math 工具可以做同样的事情。所以,我们可以这样做:

In [5]:

from langchain.agents import load_tools

tools = load_tools(
    ['llm-math'],
    llm = llm
)

In [6]:

tools [0].name, tools [0].description

Out [6]:

('Calculator', 'Useful for when you need to answer questions about math.')

如果我们的用例存在一个预构建的工具,我们只能按照第二种方法进行。

现在我们有了 LLM 和工具,但没有 代理 (Agents) 

要初始化一个简单的代理 (Agents) ,我们可以这样做:

from langchain.agents import initialize_agent

zero_shot_agent = initialize_agent(
    agent = "zero-shot-react-description",
    tools = tools,
    llm = llm,
    verbose = True,
    max_iterations = 3
)

这里使用的 *代理 (Agents) * 是一个 "zero-shot-react-description" 代理 (Agents) 。

Zero-shot 意味着代理 (Agents) 仅在当前操作上起作用——它没有 记忆

它使用 ReAct 框架根据工具的 描述 description 来决定使用哪个工具。

我们不会在本章中讨论 * ReAct 框架 ,但您可以将其视为 LLM 可以循环进行 * Re asoning 和 * Act ion 步骤的过程。它启用了一个多步骤的过程来识别答案。*

初始化了我们的代理 (Agents) 后,我们可以开始使用它。让我们尝试一些提示,看看代理 (Agents) 如何回应。

In [8]:

zero_shot_agent(" what is (4.5*2.1)^2.2?")

Out [8]:

[1m > Entering new AgentExecutor chain...[0m
[32; 1m [1; 3m I need to calculate this expression
Action: Calculator
Action Input: (4.5*2.1)^2.2 [0m
Observation: [36; 1m [1; 3mAnswer: 139.94261298333066
[0m
Thought: [32; 1m [1; 3m I now know the final answer
Final Answer: 139.94261298333066 [0m
[1m > Finished chain.[0m
{'input': 'what is (4.5*2.1)^2.2?', 'output': '139.94261298333066'}

In [9]:

(4.5 *2.1)**2.2

Out [9]:

139.94261298333066

这里的答案是正确的。让我们再试一次:

In [10]:

zero_shot_agent("if Mary has four apples and Giorgio brings two and a half apple "
                "boxes (apple box contains eight apples), how many apples do we "
                "have?")

Out [10]:

[1m > Entering new AgentExecutor chain...[0m
[32; 1m [1; 3m I need to 
### LangChain Agents 模块支持多轮对话的实现方式 LangChainAgents 模块通过结合大语言模型(LLM)、工具链和记忆功能,能够实现复杂的多轮对话系统。以下是关于 LangChainAgents 模块支持多轮对话的具体实现方式: #### 1. **Agent 类型选择** LangChain 提供了多种 Agent 类型,每种类型都针对不同的任务场景进行了优化。例如: - **ZeroShotAgent**:适用于简单的单轮或少量轮次的对话任务[^1]。 - **ConversationalChatAgent** 和 **StructuredChatAgent**:更适合需要长期上下文记忆和复杂逻辑处理的多轮对话场景[^1]。 #### 2. **记忆模块 (Memory) 的集成** 为了支持多轮对话,LangChain 提供了记忆模块,用于存储和管理对话历史。记忆模块可以确保 LLM 在生成响应时考虑到之前的对话内容,从而实现连贯的多轮交互。常见的记忆模块包括: - **ConversationBufferMemory**:简单地将对话历史存储为字符串,并传递给 LLM[^3]。 - **VectorStoreMemory**:将对话历史嵌入向量空间,适合大规模和复杂的对话场景[^3]。 以下是一个使用 `ConversationBufferMemory` 的示例代码: ```python from langchain.memory import ConversationBufferMemory from langchain.agents import initialize_agent, Tool from langchain.llms import OpenAI # 初始化 LLM 和工具 llm = OpenAI(temperature=0) tools = [ Tool( name="Search", func=lambda query: f"Search result for '{query}'", description="Useful for when you need to search the internet." ) ] # 创建带有记忆的 Agent memory = ConversationBufferMemory(memory_key="chat_history") agent = initialize_agent(tools, llm, agent="conversational-react-description", memory=memory) # 测试多轮对话 response = agent.run("What is LangChain?") print(response) response = agent.run("Can you give me more details about its agents?") print(response) ``` #### 3. **提示模板 (Prompt Template) 的设计** 提示模板在多轮对话中起着关键作用,它决定了 LLM 如何理解当前的任务和上下文。LangChain 提供了灵活的提示模板机制,允许开发者根据具体需求自定义提示。例如,`react-chat-json` 是一个常用的提示模板,适用于 JSON 格式的多轮对话任务[^4]。 #### 4. **工具链 (Tool Chain) 的扩展** Agents 可以集成外部工具链,以增强其功能。例如,在多轮对话中,Agent 可能需要调用搜索引擎、数据库查询或其他 API 来获取相关信息。通过合理设计工具链,可以显著提升对话系统的实用性和智能化水平[^1]。 #### 5. **角色扮演框架的应用** 除了内置的 Agent 类型,LangChain 还可以通过角色扮演框架实现更复杂的多轮对话。例如,CAMEL 框架允许多个 Agent 之间进行自主合作,模拟人类之间的对话过程。这种方法特别适合需要多角色协作的任务场景[^2]。 ### 示例代码:基于 LangChain 的多轮对话实现 以下是一个完整的多轮对话实现示例,结合了 `ConversationalChatAgent` 和 `ConversationBufferMemory`: ```python from langchain.agents import create_conversational_chat_agent, AgentExecutor from langchain.memory import ConversationBufferMemory from langchain.llms import OpenAI from langchain.tools import Tool # 定义工具 def search(query): return f"Search result for '{query}'" tools = [ Tool( name="Search", func=search, description="Useful for when you need to search the internet." ) ] # 初始化 LLM 和记忆模块 llm = OpenAI(temperature=0) memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True) # 创建 Agent agent = create_conversational_chat_agent(llm, tools, memory=memory) agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True) # 测试多轮对话 response = agent_executor.invoke({"input": "What is LangChain?"}) print(response.get("output")) response = agent_executor.invoke({"input": "How does it work with agents?"}) print(response.get("output")) ``` #### 注意事项 - 确保正确配置 LLM 和工具链,以满足具体任务需求。 - 使用合适的记忆模块,避免因对话历史过长导致性能下降[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值